diff --git a/.hgignore b/.hgignore index aec0e31d131..9aab81ce35d 100644 --- a/.hgignore +++ b/.hgignore @@ -1,5 +1,6 @@ ^build/ ^dist/ +^.idea/ nbproject/private/ ^webrev ^.hgtip diff --git a/.hgtags b/.hgtags index 7f711e51df0..5618d206183 100644 --- a/.hgtags +++ b/.hgtags @@ -360,3 +360,4 @@ c84d0cce090e161d736de69e941830adf8c2f87a jdk-9+114 8d78fb40648dd221ce4ef19f9d5aa41ee1a3a884 jdk-9+115 84aba7335005a3a47751dcf1f37935f97df9f99a jdk-9+116 82b8d12a553f5617737c238cec060281d52e351c jdk-9+117 +7c04fcb12bd4a31570a238e663fa846dfa5ec3b8 jdk-9+118 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index bd47c1a0596..08fd371176c 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -360,3 +360,4 @@ f900d5afd9c83a0df8f36161c27c5e4c86a66f4c jdk-9+111 09617ce980b99d49abfd54dacfed353c47e2a115 jdk-9+115 6743a8e0cab7b5f6f4a0575f6664892f0ab740af jdk-9+116 e882bcdbdac436523f3d5681611d3118a3804ea7 jdk-9+117 +047f95de8f918d8ff5e8cd2636a2abb5c3c8adb8 jdk-9+118 diff --git a/common/autoconf/flags.m4 b/common/autoconf/flags.m4 index 7789f01450e..bdcec6208f3 100644 --- a/common/autoconf/flags.m4 +++ b/common/autoconf/flags.m4 @@ -768,7 +768,7 @@ AC_DEFUN([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK_HELPER], $2CFLAGS_JDK="${$2CFLAGS_JDK} -fno-strict-aliasing" ;; esac - TOOLCHAIN_CHECK_COMPILER_VERSION(VERSION: 6, IF_AT_LEAST: FLAGS_SETUP_GCC6_COMPILER_FLAGS) + TOOLCHAIN_CHECK_COMPILER_VERSION(VERSION: 6, PREFIX: $2, IF_AT_LEAST: FLAGS_SETUP_GCC6_COMPILER_FLAGS) elif test "x$TOOLCHAIN_TYPE" = xclang; then $2JVM_CFLAGS="[$]$2JVM_CFLAGS -D_GNU_SOURCE" @@ -964,7 +964,7 @@ AC_DEFUN([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK_HELPER], -Wunused-value -Woverloaded-virtual" if test "x$TOOLCHAIN_TYPE" = xgcc; then - TOOLCHAIN_CHECK_COMPILER_VERSION(VERSION: [4.8], + TOOLCHAIN_CHECK_COMPILER_VERSION(VERSION: [4.8], PREFIX: $2, IF_AT_LEAST: [ # These flags either do not work or give spurious warnings prior to gcc 4.8. $2JVM_CFLAGS="[$]$2JVM_CFLAGS -Wno-format-zero-length -Wtype-limits -Wuninitialized" @@ -1411,9 +1411,15 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_MISC], DISABLE_WARNING_PREFIX= fi CFLAGS_WARNINGS_ARE_ERRORS="-Werror" - # Repeate the check for the BUILD_CC + # Repeate the check for the BUILD_CC and BUILD_CXX. Need to also reset + # CFLAGS since any target specific flags will likely not work with the + # build compiler CC_OLD="$CC" + CXX_OLD="$CXX" CC="$BUILD_CC" + CXX="$BUILD_CXX" + CFLAGS_OLD="$CFLAGS" + CFLAGS="" FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [-Wno-this-is-a-warning-that-do-not-exist], IF_TRUE: [BUILD_CC_CAN_DISABLE_WARNINGS=true], IF_FALSE: [BUILD_CC_CAN_DISABLE_WARNINGS=false] @@ -1424,6 +1430,8 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_MISC], BUILD_CC_DISABLE_WARNING_PREFIX= fi CC="$CC_OLD" + CXX="$CXX_OLD" + CFLAGS="$CFLAGS_OLD" ;; clang) DISABLE_WARNING_PREFIX="-Wno-" diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 548ab680d2a..f40198f8da3 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -4900,6 +4900,8 @@ TOOLCHAIN_MINIMUM_VERSION_xlc="" # Prepare the system so that TOOLCHAIN_CHECK_COMPILER_VERSION can be called. # Must have CC_VERSION_NUMBER and CXX_VERSION_NUMBER. +# $1 - optional variable prefix for compiler and version variables (BUILD_) +# $2 - optional variable prefix for comparable variable (OPENJDK_BUILD_) # Check if the configured compiler (C and C++) is of a specific version or @@ -4909,6 +4911,7 @@ TOOLCHAIN_MINIMUM_VERSION_xlc="" # VERSION: The version string to check against the found version # IF_AT_LEAST: block to run if the compiler is at least this version (>=) # IF_OLDER_THAN: block to run if the compiler is older than this version (<) +# PREFIX: Optional variable prefix for compiler to compare version for (OPENJDK_BUILD_) @@ -5073,7 +5076,7 @@ VS_SDK_PLATFORM_NAME_2013= #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1462806878 +DATE_WHEN_GENERATED=1462970869 ############################################################################### # @@ -34795,19 +34798,19 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "x$CC_VERSION_NUMBER" != "x$CXX_VERSION_NUMBER"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C and C++ compiler has different version numbers, $CC_VERSION_NUMBER vs $CXX_VERSION_NUMBER." >&5 -$as_echo "$as_me: WARNING: C and C++ compiler has different version numbers, $CC_VERSION_NUMBER vs $CXX_VERSION_NUMBER." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C and C++ compiler have different version numbers, $CC_VERSION_NUMBER vs $CXX_VERSION_NUMBER." >&5 +$as_echo "$as_me: WARNING: C and C++ compiler have different version numbers, $CC_VERSION_NUMBER vs $CXX_VERSION_NUMBER." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This typically indicates a broken setup, and is not supported" >&5 $as_echo "$as_me: WARNING: This typically indicates a broken setup, and is not supported" >&2;} fi # We only check CC_VERSION_NUMBER since we assume CXX_VERSION_NUMBER is equal. - if [[ "$CC_VERSION_NUMBER" =~ (.*\.){3} ]] ; then + if [[ "[$]CC_VERSION_NUMBER" =~ (.*\.){3} ]] ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has more than three parts (X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&5 $as_echo "$as_me: WARNING: C compiler version number has more than three parts (X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} fi - if [[ "$CC_VERSION_NUMBER" =~ [0-9]{6} ]] ; then + if [[ "[$]CC_VERSION_NUMBER" =~ [0-9]{6} ]] ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has a part larger than 99999: $CC_VERSION_NUMBER. Comparisons might be wrong." >&5 $as_echo "$as_me: WARNING: C compiler version number has a part larger than 99999: $CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} fi @@ -34850,6 +34853,13 @@ $as_echo "$as_me: WARNING: C compiler version number has a part larger than 9999 + + + + + + + @@ -34897,6 +34907,8 @@ $as_echo "$as_me: WARNING: You are using $TOOLCHAIN_TYPE older than $TOOLCHAIN_M + + fi # @@ -46475,6 +46487,268 @@ $as_echo "$as_me: Rewriting BUILD_STRIP to \"$new_complete\"" >&6;} BUILD_LDCXX="$BUILD_CXX" PATH="$OLDPATH" + + + COMPILER=$BUILD_CC + COMPILER_NAME=BuildC + + if test "x$TOOLCHAIN_TYPE" = xsolstudio; then + # cc -V output typically looks like + # cc: Sun C 5.12 Linux_i386 2011/11/16 + COMPILER_VERSION_OUTPUT=`$COMPILER -V 2>&1` + # Check that this is likely to be the Solaris Studio cc. + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + if test $? -ne 0; then + ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -V was: \"$COMPILER_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_OUTPUT\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$ALT_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$ALT_VERSION_OUTPUT\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Remove usage instructions (if present), and + # collapse compiler output into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/ *[Uu]sage:.*//'` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/"` + elif test "x$TOOLCHAIN_TYPE" = xxlc; then + # xlc -qversion output typically looks like + # IBM XL C/C++ for AIX, V11.1 (5724-X13) + # Version: 11.01.0000.0015 + COMPILER_VERSION_OUTPUT=`$COMPILER -qversion 2>&1` + # Check that this is likely to be the IBM XL C compiler. + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "IBM XL C" > /dev/null + if test $? -ne 0; then + ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -qversion was: \"$COMPILER_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with -qversion was: \"$COMPILER_VERSION_OUTPUT\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$ALT_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$ALT_VERSION_OUTPUT\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Collapse compiler output into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/^.*, V\([1-9][0-9.]*\).*$/\1/'` + elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then + # There is no specific version flag, but all output starts with a version string. + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 + COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d '\r'` + # Check that this is likely to be Microsoft CL.EXE. + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Microsoft.*Compiler" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running it was: \"$COMPILER_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running it was: \"$COMPILER_VERSION_OUTPUT\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Collapse compiler output into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/^.*ersion.\([1-9][0-9.]*\) .*$/\1/'` + elif test "x$TOOLCHAIN_TYPE" = xgcc; then + # gcc --version output typically looks like + # gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 + # Copyright (C) 2013 Free Software Foundation, Inc. + # This is free software; see the source for copying conditions. There is NO + # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + COMPILER_VERSION_OUTPUT=`$COMPILER --version 2>&1` + # Check that this is likely to be GCC. + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Free Software Foundation" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Remove Copyright and legalese from version string, and + # collapse into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/ *Copyright .*//'` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/^.* \([1-9]\.[0-9.]*\)[^0-9.].*$/\1/'` + elif test "x$TOOLCHAIN_TYPE" = xclang; then + # clang --version output typically looks like + # Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) + # clang version 3.3 (tags/RELEASE_33/final) + # or + # Debian clang version 3.2-7ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2) + # Target: x86_64-pc-linux-gnu + # Thread model: posix + COMPILER_VERSION_OUTPUT=`$COMPILER --version 2>&1` + # Check that this is likely to be clang + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "clang" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_OUTPUT\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Collapse compiler output into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/^.* version \([1-9][0-9.]*\).*$/\1/'` + else + as_fn_error $? "Unknown toolchain type $TOOLCHAIN_TYPE." "$LINENO" 5 + fi + # This sets CC_VERSION_NUMBER or CXX_VERSION_NUMBER. (This comment is a grep marker) + BUILD_CC_VERSION_NUMBER="$COMPILER_VERSION_NUMBER" + # This sets CC_VERSION_STRING or CXX_VERSION_STRING. (This comment is a grep marker) + BUILD_CC_VERSION_STRING="$COMPILER_VERSION_STRING" + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $TOOLCHAIN_TYPE $COMPILER_NAME compiler version $COMPILER_VERSION_NUMBER [$COMPILER_VERSION_STRING]" >&5 +$as_echo "$as_me: Using $TOOLCHAIN_TYPE $COMPILER_NAME compiler version $COMPILER_VERSION_NUMBER [$COMPILER_VERSION_STRING]" >&6;} + + + COMPILER=$BUILD_CXX + COMPILER_NAME=BuildC++ + + if test "x$TOOLCHAIN_TYPE" = xsolstudio; then + # cc -V output typically looks like + # cc: Sun C 5.12 Linux_i386 2011/11/16 + COMPILER_VERSION_OUTPUT=`$COMPILER -V 2>&1` + # Check that this is likely to be the Solaris Studio cc. + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + if test $? -ne 0; then + ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -V was: \"$COMPILER_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_OUTPUT\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$ALT_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$ALT_VERSION_OUTPUT\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Remove usage instructions (if present), and + # collapse compiler output into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/ *[Uu]sage:.*//'` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/"` + elif test "x$TOOLCHAIN_TYPE" = xxlc; then + # xlc -qversion output typically looks like + # IBM XL C/C++ for AIX, V11.1 (5724-X13) + # Version: 11.01.0000.0015 + COMPILER_VERSION_OUTPUT=`$COMPILER -qversion 2>&1` + # Check that this is likely to be the IBM XL C compiler. + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "IBM XL C" > /dev/null + if test $? -ne 0; then + ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -qversion was: \"$COMPILER_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with -qversion was: \"$COMPILER_VERSION_OUTPUT\"" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$ALT_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$ALT_VERSION_OUTPUT\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Collapse compiler output into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/^.*, V\([1-9][0-9.]*\).*$/\1/'` + elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then + # There is no specific version flag, but all output starts with a version string. + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 + COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d '\r'` + # Check that this is likely to be Microsoft CL.EXE. + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Microsoft.*Compiler" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running it was: \"$COMPILER_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running it was: \"$COMPILER_VERSION_OUTPUT\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Collapse compiler output into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/^.*ersion.\([1-9][0-9.]*\) .*$/\1/'` + elif test "x$TOOLCHAIN_TYPE" = xgcc; then + # gcc --version output typically looks like + # gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 + # Copyright (C) 2013 Free Software Foundation, Inc. + # This is free software; see the source for copying conditions. There is NO + # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + COMPILER_VERSION_OUTPUT=`$COMPILER --version 2>&1` + # Check that this is likely to be GCC. + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Free Software Foundation" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Remove Copyright and legalese from version string, and + # collapse into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/ *Copyright .*//'` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/^.* \([1-9]\.[0-9.]*\)[^0-9.].*$/\1/'` + elif test "x$TOOLCHAIN_TYPE" = xclang; then + # clang --version output typically looks like + # Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) + # clang version 3.3 (tags/RELEASE_33/final) + # or + # Debian clang version 3.2-7ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2) + # Target: x86_64-pc-linux-gnu + # Thread model: posix + COMPILER_VERSION_OUTPUT=`$COMPILER --version 2>&1` + # Check that this is likely to be clang + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "clang" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_OUTPUT\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_OUTPUT\"" >&6;} + as_fn_error $? "A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + # Collapse compiler output into a single line + COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT` + COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \ + $SED -e 's/^.* version \([1-9][0-9.]*\).*$/\1/'` + else + as_fn_error $? "Unknown toolchain type $TOOLCHAIN_TYPE." "$LINENO" 5 + fi + # This sets CC_VERSION_NUMBER or CXX_VERSION_NUMBER. (This comment is a grep marker) + BUILD_CXX_VERSION_NUMBER="$COMPILER_VERSION_NUMBER" + # This sets CC_VERSION_STRING or CXX_VERSION_STRING. (This comment is a grep marker) + BUILD_CXX_VERSION_STRING="$COMPILER_VERSION_STRING" + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $TOOLCHAIN_TYPE $COMPILER_NAME compiler version $COMPILER_VERSION_NUMBER [$COMPILER_VERSION_STRING]" >&5 +$as_echo "$as_me: Using $TOOLCHAIN_TYPE $COMPILER_NAME compiler version $COMPILER_VERSION_NUMBER [$COMPILER_VERSION_STRING]" >&6;} + + + if test "x$BUILD_CC_VERSION_NUMBER" != "x$BUILD_CXX_VERSION_NUMBER"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C and C++ compiler have different version numbers, $BUILD_CC_VERSION_NUMBER vs $BUILD_CXX_VERSION_NUMBER." >&5 +$as_echo "$as_me: WARNING: C and C++ compiler have different version numbers, $BUILD_CC_VERSION_NUMBER vs $BUILD_CXX_VERSION_NUMBER." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This typically indicates a broken setup, and is not supported" >&5 +$as_echo "$as_me: WARNING: This typically indicates a broken setup, and is not supported" >&2;} + fi + + # We only check CC_VERSION_NUMBER since we assume CXX_VERSION_NUMBER is equal. + if [[ "[$]BUILD_CC_VERSION_NUMBER" =~ (.*\.){3} ]] ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has more than three parts (X.Y.Z): $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&5 +$as_echo "$as_me: WARNING: C compiler version number has more than three parts (X.Y.Z): $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} + fi + + if [[ "[$]BUILD_CC_VERSION_NUMBER" =~ [0-9]{6} ]] ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has a part larger than 99999: $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&5 +$as_echo "$as_me: WARNING: C compiler version number has a part larger than 99999: $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} + fi + + OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$BUILD_CC_VERSION_NUMBER"` + else # If we are not cross compiling, use the normal target compilers for # building the build platform executables. @@ -49122,6 +49396,18 @@ $as_echo "$supports" >&6; } + + + + + + + + + + + + @@ -49711,6 +49997,8 @@ $as_echo "$supports" >&6; } + + elif test "x$TOOLCHAIN_TYPE" = xclang; then JVM_CFLAGS="$JVM_CFLAGS -D_GNU_SOURCE" @@ -49935,6 +50223,18 @@ $as_echo "$supports" >&6; } + + + + + + + + + + + + @@ -49987,6 +50287,8 @@ $as_echo "$supports" >&6; } + + fi if ! [[ " $JVM_VARIANTS " =~ " zero " ]] && ! [[ " $JVM_VARIANTS " =~ " zeroshark " ]] ; then # Non-zero builds have stricter warnings @@ -50440,6 +50742,18 @@ $as_echo "$supports" >&6; } + + + + + + + + + + + + @@ -50469,7 +50783,7 @@ $as_echo "$supports" >&6; } # Version comparison method inspired by http://stackoverflow.com/a/24067243 COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$REFERENCE_VERSION"` - if test $COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then + if test $OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then : else @@ -50488,6 +50802,8 @@ $as_echo "$supports" >&6; } + + elif test "x$TOOLCHAIN_TYPE" = xclang; then OPENJDK_BUILD_JVM_CFLAGS="$OPENJDK_BUILD_JVM_CFLAGS -D_GNU_SOURCE" @@ -50712,6 +51028,18 @@ $as_echo "$supports" >&6; } + + + + + + + + + + + + @@ -50741,7 +51069,7 @@ $as_echo "$supports" >&6; } # Version comparison method inspired by http://stackoverflow.com/a/24067243 COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$REFERENCE_VERSION"` - if test $COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then + if test $OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then : # These flags either do not work or give spurious warnings prior to gcc 4.8. @@ -50764,6 +51092,8 @@ $as_echo "$supports" >&6; } + + fi if ! [[ " $JVM_VARIANTS " =~ " zero " ]] && ! [[ " $JVM_VARIANTS " =~ " zeroshark " ]] ; then # Non-zero builds have stricter warnings @@ -51918,9 +52248,15 @@ $as_echo "$supports" >&6; } DISABLE_WARNING_PREFIX= fi CFLAGS_WARNINGS_ARE_ERRORS="-Werror" - # Repeate the check for the BUILD_CC + # Repeate the check for the BUILD_CC and BUILD_CXX. Need to also reset + # CFLAGS since any target specific flags will likely not work with the + # build compiler CC_OLD="$CC" + CXX_OLD="$CXX" CC="$BUILD_CC" + CXX="$BUILD_CXX" + CFLAGS_OLD="$CFLAGS" + CFLAGS="" @@ -52198,6 +52534,8 @@ $as_echo "$supports" >&6; } BUILD_CC_DISABLE_WARNING_PREFIX= fi CC="$CC_OLD" + CXX="$CXX_OLD" + CFLAGS="$CFLAGS_OLD" ;; clang) DISABLE_WARNING_PREFIX="-Wno-" diff --git a/common/autoconf/toolchain.m4 b/common/autoconf/toolchain.m4 index 7e7a07c5d8b..c93d487a870 100644 --- a/common/autoconf/toolchain.m4 +++ b/common/autoconf/toolchain.m4 @@ -59,23 +59,25 @@ TOOLCHAIN_MINIMUM_VERSION_xlc="" # Prepare the system so that TOOLCHAIN_CHECK_COMPILER_VERSION can be called. # Must have CC_VERSION_NUMBER and CXX_VERSION_NUMBER. +# $1 - optional variable prefix for compiler and version variables (BUILD_) +# $2 - optional variable prefix for comparable variable (OPENJDK_BUILD_) AC_DEFUN([TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS], [ - if test "x$CC_VERSION_NUMBER" != "x$CXX_VERSION_NUMBER"; then - AC_MSG_WARN([C and C++ compiler has different version numbers, $CC_VERSION_NUMBER vs $CXX_VERSION_NUMBER.]) + if test "x[$]$1CC_VERSION_NUMBER" != "x[$]$1CXX_VERSION_NUMBER"; then + AC_MSG_WARN([C and C++ compiler have different version numbers, [$]$1CC_VERSION_NUMBER vs [$]$1CXX_VERSION_NUMBER.]) AC_MSG_WARN([This typically indicates a broken setup, and is not supported]) fi # We only check CC_VERSION_NUMBER since we assume CXX_VERSION_NUMBER is equal. - if [ [[ "$CC_VERSION_NUMBER" =~ (.*\.){3} ]] ]; then - AC_MSG_WARN([C compiler version number has more than three parts (X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong.]) + if [ [[ "[$]$1CC_VERSION_NUMBER" =~ (.*\.){3} ]] ]; then + AC_MSG_WARN([C compiler version number has more than three parts (X.Y.Z): [$]$1CC_VERSION_NUMBER. Comparisons might be wrong.]) fi - if [ [[ "$CC_VERSION_NUMBER" =~ [0-9]{6} ]] ]; then - AC_MSG_WARN([C compiler version number has a part larger than 99999: $CC_VERSION_NUMBER. Comparisons might be wrong.]) + if [ [[ "[$]$1CC_VERSION_NUMBER" =~ [0-9]{6} ]] ]; then + AC_MSG_WARN([C compiler version number has a part larger than 99999: [$]$1CC_VERSION_NUMBER. Comparisons might be wrong.]) fi - COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", [$]1, [$]2, [$]3) }' <<< "$CC_VERSION_NUMBER"` + $2COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", [$]1, [$]2, [$]3) }' <<< "[$]$1CC_VERSION_NUMBER"` ]) # Check if the configured compiler (C and C++) is of a specific version or @@ -85,8 +87,9 @@ AC_DEFUN([TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS], # VERSION: The version string to check against the found version # IF_AT_LEAST: block to run if the compiler is at least this version (>=) # IF_OLDER_THAN: block to run if the compiler is older than this version (<) +# PREFIX: Optional variable prefix for compiler to compare version for (OPENJDK_BUILD_) BASIC_DEFUN_NAMED([TOOLCHAIN_CHECK_COMPILER_VERSION], - [*VERSION IF_AT_LEAST IF_OLDER_THAN], [$@], + [*VERSION PREFIX IF_AT_LEAST IF_OLDER_THAN], [$@], [ # Need to assign to a variable since m4 is blocked from modifying parts in []. REFERENCE_VERSION=ARG_VERSION @@ -102,7 +105,7 @@ BASIC_DEFUN_NAMED([TOOLCHAIN_CHECK_COMPILER_VERSION], # Version comparison method inspired by http://stackoverflow.com/a/24067243 COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", [$]1, [$]2, [$]3) }' <<< "$REFERENCE_VERSION"` - if test $COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then + if test [$]ARG_PREFIX[COMPARABLE_ACTUAL_VERSION] -ge $COMPARABLE_REFERENCE_VERSION ; then : ARG_IF_AT_LEAST else @@ -808,6 +811,10 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS], BUILD_LDCXX="$BUILD_CXX" PATH="$OLDPATH" + + TOOLCHAIN_EXTRACT_COMPILER_VERSION(BUILD_CC, [BuildC]) + TOOLCHAIN_EXTRACT_COMPILER_VERSION(BUILD_CXX, [BuildC++]) + TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS([BUILD_], [OPENJDK_BUILD_]) else # If we are not cross compiling, use the normal target compilers for # building the build platform executables. diff --git a/common/bin/idea.sh b/common/bin/idea.sh new file mode 100644 index 00000000000..911d309c070 --- /dev/null +++ b/common/bin/idea.sh @@ -0,0 +1,199 @@ +#!/bin/sh +# +# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# Shell script for generating an IDEA project from a given list of modules + +usage() { + echo "usage: $0 [-h|--help] [-v|--verbose] [-o|--output ] [modules]+" + exit 1 +} + +SCRIPT_DIR=`dirname $0` +PWD=`pwd` +cd $SCRIPT_DIR; SCRIPT_DIR=`pwd` +cd ../../; TOP=`pwd`; cd $PWD + +IDEA_OUTPUT=$TOP/.idea +VERBOSE="false" +while [ $# -gt 0 ] +do + case $1 in + -h | --help ) + usage + ;; + + -v | --vebose ) + VERBOSE="true" + ;; + + -o | --output ) + IDEA_OUTPUT=$2 + shift + ;; + + -*) # bad option + usage + ;; + + * ) # non option + break + ;; + esac + shift +done + +mkdir $IDEA_OUTPUT || exit 1 +cd $IDEA_OUTPUT; IDEA_OUTPUT=`pwd` + +IDEA_MAKE="$TOP/make/idea" +IDEA_TEMPLATE="$IDEA_MAKE/template" +IML_TEMPLATE="$IDEA_TEMPLATE/jdk.iml" +ANT_TEMPLATE="$IDEA_TEMPLATE/ant.xml" +IDEA_IML="$IDEA_OUTPUT/jdk.iml" +IDEA_ANT="$IDEA_OUTPUT/ant.xml" + +if [ "$VERBOSE" = "true" ] ; then + echo "output dir: $IDEA_OUTPUT" + echo "idea template dir: $IDEA_TEMPLATE" +fi + +if [ ! -f "$IML_TEMPLATE" ] ; then + echo "FATAL: cannot find $IML_TEMPLATE" >&2; exit 1 +fi + +if [ ! -f "$ANT_TEMPLATE" ] ; then + echo "FATAL: cannot find $ANT_TEMPLATE" >&2; exit 1 +fi + +cp -r "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT" +cd $TOP ; make -f "$IDEA_MAKE/idea.gmk" -I make/common idea MAKEOVERRIDES= OUT=$IDEA_OUTPUT/env.cfg MODULES="$*" || exit 1 +cd $SCRIPT_DIR + +. $IDEA_OUTPUT/env.cfg + +# Expect MODULE_ROOTS, MODULE_NAMES, BOOT_JDK & SPEC to be set +if [ "x$MODULE_ROOTS" = "x" ] ; then + echo "FATAL: MODULE_ROOTS is empty" >&2; exit 1 +fi + +if [ "x$MODULE_NAMES" = "x" ] ; then + echo "FATAL: MODULE_NAMES is empty" >&2; exit 1 +fi + +if [ "x$BOOT_JDK" = "x" ] ; then + echo "FATAL: BOOT_JDK is empty" >&2; exit 1 +fi + +if [ "x$SPEC" = "x" ] ; then + echo "FATAL: SPEC is empty" >&2; exit 1 +fi + +SOURCE_FOLDER=" " +SOURCE_FOLDERS_DONE="false" + +addSourceFolder() { + root=$@ + relativePath="`echo "$root" | sed -e s@"$TOP/\(.*$\)"@"\1"@`" + folder="`echo "$SOURCE_FOLDER" | sed -e s@"\(.*/\)####\(.*\)"@"\1$relativePath\2"@`" + printf "%s\n" "$folder" >> $IDEA_IML +} + +### Generate project iml +RELATIVE_BUILD_DIR="`dirname $SPEC | sed -e s@"$TOP/\(.*$\)"@"\1"@`" +rm -f $IDEA_IML +while IFS= read -r line +do + if echo "$line" | egrep "^ .* /dev/null ; then + if [ "$SOURCE_FOLDERS_DONE" = "false" ] ; then + SOURCE_FOLDERS_DONE="true" + for root in $MODULE_ROOTS; do + addSourceFolder $root + done + fi + elif echo "$line" | egrep "^ .* /dev/null ; then + ul="`echo "$line" | sed -e s@"\(.*/\)####\(.*\)"@"\1$RELATIVE_BUILD_DIR\2"@`" + printf "%s\n" "$ul" >> $IDEA_IML + else + printf "%s\n" "$line" >> $IDEA_IML + fi +done < "$IML_TEMPLATE" + + +MODULE_NAME=" " + +addModuleName() { + mn="`echo "$MODULE_NAME" | sed -e s@"\(.*\)####\(.*\)"@"\1$MODULE_NAMES\2"@`" + printf "%s\n" "$mn" >> $IDEA_ANT +} + +BUILD_DIR=" " + +addBuildDir() { + DIR=`dirname $SPEC` + mn="`echo "$BUILD_DIR" | sed -e s@"\(.*\)####\(.*\)"@"\1$DIR\2"@`" + printf "%s\n" "$mn" >> $IDEA_ANT +} + +### Generate ant.xml + +rm -f $IDEA_ANT +while IFS= read -r line +do + if echo "$line" | egrep "^ .* /dev/null ; then + addModuleName + elif echo "$line" | egrep "^ .* /dev/null ; then + addBuildDir + else + printf "%s\n" "$line" >> $IDEA_ANT + fi +done < "$ANT_TEMPLATE" + +### Compile the custom Logger + +CLASSES=$IDEA_OUTPUT/classes + +if [ "x$ANT_HOME" = "x" ] ; then + # try some common locations, before giving up + if [ -f "/usr/share/ant/lib/ant.jar" ] ; then + ANT_HOME="/usr/share/ant" + elif [ -f "/usr/local/Cellar/ant/1.9.4/libexec/lib/ant.jar" ] ; then + ANT_HOME="/usr/local/Cellar/ant/1.9.4/libexec" + else + echo "FATAL: cannot find ant. Try setting ANT_HOME." >&2; exit 1 + fi +fi +CP=$ANT_HOME/lib/ant.jar +rm -rf $CLASSES; mkdir $CLASSES + +if [ "x$CYGPATH" = "x" ] ; then ## CYGPATH may be set in env.cfg + JAVAC_SOURCE_FILE=$IDEA_OUTPUT/src/idea/JdkIdeaAntLogger.java + JAVAC_CLASSES=$CLASSES + JAVAC_CP=$CP +else + JAVAC_SOURCE_FILE=`cygpath -am $IDEA_OUTPUT/src/idea/JdkIdeaAntLogger.java` + JAVAC_CLASSES=`cygpath -am $CLASSES` + JAVAC_CP=`cygpath -am $CP` +fi + +$BOOT_JDK/bin/javac -d $JAVAC_CLASSES -cp $JAVAC_CP $JAVAC_SOURCE_FILE diff --git a/common/bin/jib.sh b/common/bin/jib.sh index 454d78ce1d7..ea52385537b 100644 --- a/common/bin/jib.sh +++ b/common/bin/jib.sh @@ -89,7 +89,7 @@ install_jib() { fi if command -v curl > /dev/null; then - getcmd="curl -s" + getcmd="curl -s -L --retry 3 --retry-delay 5" elif command -v wget > /dev/null; then getcmd="wget --quiet -O -" else diff --git a/corba/.hgtags b/corba/.hgtags index 7a705d44659..feea5f070eb 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -360,3 +360,4 @@ cc30faa2da498c478e89ab062ff160653ca1b170 jdk-9+113 7bab1b1b36824924b1c657a8419369ba93d198d3 jdk-9+115 7dfa7377a5e601b8f740741a9a80e04c72dd04d6 jdk-9+116 7a1b36bf2fe55a9a7732489ccdd326c910329a7e jdk-9+117 +8c2c2d17f7ce92a31c9ccb44a122ec62f5a85ace jdk-9+118 diff --git a/hotspot/.hgtags b/hotspot/.hgtags index d308ce9a4c0..c2bf9fb792d 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -520,3 +520,4 @@ b64432bae5271735fd53300b2005b713e98ef411 jdk-9+114 88dd08d7be0fe7fb9f1914b1628f0aae9bf56e25 jdk-9+115 61a214186dae6811dd989e9165e42f7dbf02acde jdk-9+116 88170d3642905b9e6cac03e8efcc976885a7e6da jdk-9+117 +9b1075cac08dc836ec32e7b368415cbe3aceaf8c jdk-9+118 diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp index 5166478e5e7..834e1ae88fc 100644 --- a/hotspot/src/share/vm/prims/jvm.cpp +++ b/hotspot/src/share/vm/prims/jvm.cpp @@ -3387,14 +3387,14 @@ bool force_verify_field_access(Klass* current_class, Klass* field_class, AccessF return (!access.is_private() && InstanceKlass::cast(current_class)->is_same_class_package(field_class)); } -// Return the first non-null class loader up the execution stack, or null -// if only code from the null class loader is on the stack. +// Return the first user-defined class loader up the execution stack, or null +// if only code from the bootstrap or platform class loader is on the stack. JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env)) for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) { vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection oop loader = vfst.method()->method_holder()->class_loader(); - if (loader != NULL) { + if (loader != NULL && !SystemDictionary::is_platform_class_loader(loader)) { return JNIHandles::make_local(env, loader); } } diff --git a/hotspot/test/Makefile b/hotspot/test/Makefile index 3468e65bcac..1dfecd6bce1 100644 --- a/hotspot/test/Makefile +++ b/hotspot/test/Makefile @@ -120,24 +120,33 @@ endif TEST_ROOT := $(shell pwd) # Root of all test results -ifdef ALT_OUTPUTDIR - ABS_BUILD_ROOT = $(ALT_OUTPUTDIR) +ifdef TEST_OUTPUT_DIR + $(shell $(MKDIR) -p $(TEST_OUTPUT_DIR)/jtreg) + ABS_TEST_OUTPUT_DIR := \ + $(shell $(CD) $(TEST_OUTPUT_DIR)/jtreg && $(PWD)) else - ABS_BUILD_ROOT = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH) + ifdef ALT_OUTPUTDIR + ABS_OUTPUTDIR = $(shell $(CD) $(ALT_OUTPUTDIR) && $(PWD)) + else + ABS_OUTPUTDIR = $(shell $(CD) $(TEST_ROOT)/.. && $(PWD)) + endif + + ABS_PLATFORM_BUILD_ROOT = $(ABS_OUTPUTDIR) + ABS_TEST_OUTPUT_DIR := $(ABS_PLATFORM_BUILD_ROOT)/testoutput/$(UNIQUE_DIR) endif -ABS_TEST_OUTPUT_DIR = $(ABS_BUILD_ROOT)/testoutput/$(UNIQUE_DIR) # Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test) ifndef PRODUCT_HOME - # Try to use j2sdk-image if it exists - ABS_JDK_IMAGE = $(ABS_BUILD_ROOT)/j2sdk-image - PRODUCT_HOME := \ - $(shell \ - if [ -d $(ABS_JDK_IMAGE) ] ; then \ - $(ECHO) "$(ABS_JDK_IMAGE)"; \ - else \ - $(ECHO) "$(ABS_BUILD_ROOT)" ; \ + # Try to use images/jdk if it exists + ABS_JDK_IMAGE = $(ABS_PLATFORM_BUILD_ROOT)/images/jdk + PRODUCT_HOME := \ + $(shell \ + if [ -d $(ABS_JDK_IMAGE) ] ; then \ + $(ECHO) "$(ABS_JDK_IMAGE)"; \ + else \ + $(ECHO) "$(ABS_PLATFORM_BUILD_ROOT)"; \ fi) + PRODUCT_HOME := $(PRODUCT_HOME) endif # Expect JPRT to set JAVA_ARGS (e.g. -server etc.) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index f36d86837fa..3bef243c570 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -360,3 +360,4 @@ bdbf2342b21bd8ecad1b4e6499a0dfb314952bd7 jdk-9+103 1902a5bda18e794b31fc5f520f5e7d827714b50d jdk-9+115 9d71d20e614777cd23c1a43b38b5c08a9094d27a jdk-9+116 46b57560cd06ebcdd21489250628ff5f9d9d8916 jdk-9+117 +a8aa25fc6c5fda0ed7a93b8ffee62da326a752fc jdk-9+118 diff --git a/jaxp/THIRD_PARTY_README b/jaxp/THIRD_PARTY_README index a93b35b994c..4d3007051ce 100644 --- a/jaxp/THIRD_PARTY_README +++ b/jaxp/THIRD_PARTY_README @@ -3387,7 +3387,6 @@ included with JRE 8, JDK 8, and OpenJDK 8, except where noted: Apache Commons Math 2.2 Apache Derby 10.10.1.2 [included with JDK 8] Apache Jakarta BCEL 5.2 - Apache Jakarta Regexp 1.4 Apache Santuario XML Security for Java 1.5.4 Apache Xalan-Java 2.7.1 Apache Xerces Java 2.10.0 diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java index 162afd1e0dd..f755549b902 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java @@ -4,64 +4,29 @@ */ package com.sun.org.apache.bcel.internal.util; -/* ==================================================================== - * The Apache Software License, Version 1.1 +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. + * http://www.apache.org/licenses/LICENSE-2.0 * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Apache BCEL" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Apache BCEL", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . */ -import java.util.*; import com.sun.org.apache.bcel.internal.Constants; import com.sun.org.apache.bcel.internal.generic.*; -import com.sun.org.apache.regexp.internal.*; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * InstructionFinder is a tool to search for given instructions patterns, @@ -231,28 +196,22 @@ public class InstructionFinder { if(start == -1) throw new ClassGenException("Instruction handle " + from + " not found in instruction list."); - try { - RE regex = new RE(search); - ArrayList matches = new ArrayList(); - while(start < il_string.length() && regex.match(il_string, start)) { - int startExpr = regex.getParenStart(0); - int endExpr = regex.getParenEnd(0); - int lenExpr = regex.getParenLength(0); + Pattern regex = Pattern.compile(search); + List matches = new ArrayList<>(); + Matcher matcher = regex.matcher(il_string); + while(start < il_string.length() && matcher.find(start)) { + int startExpr = matcher.start(); + int endExpr = matcher.end(); + int lenExpr = endExpr - startExpr; + InstructionHandle[] match = getMatch(startExpr, lenExpr); - InstructionHandle[] match = getMatch(startExpr, lenExpr); - - if((constraint == null) || constraint.checkCode(match)) - matches.add(match); - start = endExpr; - } - - return matches.iterator(); - } catch(RESyntaxException e) { - System.err.println(e); + if((constraint == null) || constraint.checkCode(match)) + matches.add(match); + start = endExpr; } - return null; + return matches.iterator(); } /** diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/CharacterArrayCharacterIterator.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/CharacterArrayCharacterIterator.java deleted file mode 100644 index 6382d478d96..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/CharacterArrayCharacterIterator.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -/** - * Encapsulates char[] as CharacterIterator - * - * @author Ales Novak - */ -public final class CharacterArrayCharacterIterator implements CharacterIterator -{ - /** encapsulated */ - private final char[] src; - /** offset in the char array */ - private final int off; - /** used portion of the array */ - private final int len; - - /** @param src - encapsulated String */ - public CharacterArrayCharacterIterator(char[] src, int off, int len) - { - this.src = src; - this.off = off; - this.len = len; - } - - /** @return a substring */ - public String substring(int beginIndex, int endIndex) - { - if (endIndex > len) { - throw new IndexOutOfBoundsException("endIndex=" + endIndex - + "; sequence size=" + len); - } - if (beginIndex < 0 || beginIndex > endIndex) { - throw new IndexOutOfBoundsException("beginIndex=" + beginIndex - + "; endIndex=" + endIndex); - } - return new String(src, off + beginIndex, endIndex - beginIndex); - } - - /** @return a substring */ - public String substring(int beginIndex) - { - return substring(beginIndex, len); - } - - /** @return a character at the specified position. */ - public char charAt(int pos) - { - return src[off + pos]; - } - - /** @return true iff if the specified index is after the end of the character stream */ - public boolean isEnd(int pos) - { - return (pos >= len); - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/CharacterIterator.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/CharacterIterator.java deleted file mode 100644 index 69db536aaa2..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/CharacterIterator.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -/** - * Encapsulates different types of character sources - String, InputStream, ... - * Defines a set of common methods - * - * @author Ales Novak - */ -public interface CharacterIterator -{ - /** @return a substring */ - String substring(int beginIndex, int endIndex); - - /** @return a substring */ - String substring(int beginIndex); - - /** @return a character at the specified position. */ - char charAt(int pos); - - /** @return true iff if the specified index is after the end of the character stream */ - boolean isEnd(int pos); -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RE.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RE.java deleted file mode 100644 index 0cdc012dbb7..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RE.java +++ /dev/null @@ -1,1760 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -import java.io.Serializable; -import java.util.Vector; - -/** - * RE is an efficient, lightweight regular expression evaluator/matcher - * class. Regular expressions are pattern descriptions which enable - * sophisticated matching of strings. In addition to being able to - * match a string against a pattern, you can also extract parts of the - * match. This is especially useful in text parsing! Details on the - * syntax of regular expression patterns are given below. - * - *

- * To compile a regular expression (RE), you can simply construct an RE - * matcher object from the string specification of the pattern, like this: - * - *

- *  RE r = new RE("a*b");
- * 
- * - *

- * Once you have done this, you can call either of the RE.match methods to - * perform matching on a String. For example: - * - *

- *  boolean matched = r.match("aaaab");
- * 
- * - * will cause the boolean matched to be set to true because the - * pattern "a*b" matches the string "aaaab". - * - *

- * If you were interested in the number of a's which matched the - * first part of our example expression, you could change the expression to - * "(a*)b". Then when you compiled the expression and matched it against - * something like "xaaaab", you would get results like this: - * - *

- *  RE r = new RE("(a*)b");                  // Compile expression
- *  boolean matched = r.match("xaaaab");     // Match against "xaaaab"
- *
- *  String wholeExpr = r.getParen(0);        // wholeExpr will be 'aaaab'
- *  String insideParens = r.getParen(1);     // insideParens will be 'aaaa'
- *
- *  int startWholeExpr = r.getParenStart(0); // startWholeExpr will be index 1
- *  int endWholeExpr = r.getParenEnd(0);     // endWholeExpr will be index 6
- *  int lenWholeExpr = r.getParenLength(0);  // lenWholeExpr will be 5
- *
- *  int startInside = r.getParenStart(1);    // startInside will be index 1
- *  int endInside = r.getParenEnd(1);        // endInside will be index 5
- *  int lenInside = r.getParenLength(1);     // lenInside will be 4
- * 
- * - * You can also refer to the contents of a parenthesized expression - * within a regular expression itself. This is called a - * 'backreference'. The first backreference in a regular expression is - * denoted by \1, the second by \2 and so on. So the expression: - * - *
- *  ([0-9]+)=\1
- * 
- * - * will match any string of the form n=n (like 0=0 or 2=2). - * - *

- * The full regular expression syntax accepted by RE is described here: - * - *

- *
- *  Characters
- *
- *    unicodeChar   Matches any identical unicode character
- *    \                    Used to quote a meta-character (like '*')
- *    \\                   Matches a single '\' character
- *    \0nnn                Matches a given octal character
- *    \xhh                 Matches a given 8-bit hexadecimal character
- *    \\uhhhh              Matches a given 16-bit hexadecimal character
- *    \t                   Matches an ASCII tab character
- *    \n                   Matches an ASCII newline character
- *    \r                   Matches an ASCII return character
- *    \f                   Matches an ASCII form feed character
- *
- *
- *  Character Classes
- *
- *    [abc]                Simple character class
- *    [a-zA-Z]             Character class with ranges
- *    [^abc]               Negated character class
- * 
- * - * NOTE: Incomplete ranges will be interpreted as "starts - * from zero" or "ends with last character". - *
- * I.e. [-a] is the same as [\\u0000-a], and [a-] is the same as [a-\\uFFFF], - * [-] means "all characters". - * - *
- *
- *  Standard POSIX Character Classes
- *
- *    [:alnum:]            Alphanumeric characters.
- *    [:alpha:]            Alphabetic characters.
- *    [:blank:]            Space and tab characters.
- *    [:cntrl:]            Control characters.
- *    [:digit:]            Numeric characters.
- *    [:graph:]            Characters that are printable and are also visible.
- *                         (A space is printable, but not visible, while an
- *                         `a' is both.)
- *    [:lower:]            Lower-case alphabetic characters.
- *    [:print:]            Printable characters (characters that are not
- *                         control characters.)
- *    [:punct:]            Punctuation characters (characters that are not letter,
- *                         digits, control characters, or space characters).
- *    [:space:]            Space characters (such as space, tab, and formfeed,
- *                         to name a few).
- *    [:upper:]            Upper-case alphabetic characters.
- *    [:xdigit:]           Characters that are hexadecimal digits.
- *
- *
- *  Non-standard POSIX-style Character Classes
- *
- *    [:javastart:]        Start of a Java identifier
- *    [:javapart:]         Part of a Java identifier
- *
- *
- *  Predefined Classes
- *
- *    .         Matches any character other than newline
- *    \w        Matches a "word" character (alphanumeric plus "_")
- *    \W        Matches a non-word character
- *    \s        Matches a whitespace character
- *    \S        Matches a non-whitespace character
- *    \d        Matches a digit character
- *    \D        Matches a non-digit character
- *
- *
- *  Boundary Matchers
- *
- *    ^         Matches only at the beginning of a line
- *    $         Matches only at the end of a line
- *    \b        Matches only at a word boundary
- *    \B        Matches only at a non-word boundary
- *
- *
- *  Greedy Closures
- *
- *    A*        Matches A 0 or more times (greedy)
- *    A+        Matches A 1 or more times (greedy)
- *    A?        Matches A 1 or 0 times (greedy)
- *    A{n}      Matches A exactly n times (greedy)
- *    A{n,}     Matches A at least n times (greedy)
- *    A{n,m}    Matches A at least n but not more than m times (greedy)
- *
- *
- *  Reluctant Closures
- *
- *    A*?       Matches A 0 or more times (reluctant)
- *    A+?       Matches A 1 or more times (reluctant)
- *    A??       Matches A 0 or 1 times (reluctant)
- *
- *
- *  Logical Operators
- *
- *    AB        Matches A followed by B
- *    A|B       Matches either A or B
- *    (A)       Used for subexpression grouping
- *   (?:A)      Used for subexpression clustering (just like grouping but
- *              no backrefs)
- *
- *
- *  Backreferences
- *
- *    \1    Backreference to 1st parenthesized subexpression
- *    \2    Backreference to 2nd parenthesized subexpression
- *    \3    Backreference to 3rd parenthesized subexpression
- *    \4    Backreference to 4th parenthesized subexpression
- *    \5    Backreference to 5th parenthesized subexpression
- *    \6    Backreference to 6th parenthesized subexpression
- *    \7    Backreference to 7th parenthesized subexpression
- *    \8    Backreference to 8th parenthesized subexpression
- *    \9    Backreference to 9th parenthesized subexpression
- * 
- * - *

- * All closure operators (+, *, ?, {m,n}) are greedy by default, meaning - * that they match as many elements of the string as possible without - * causing the overall match to fail. If you want a closure to be - * reluctant (non-greedy), you can simply follow it with a '?'. A - * reluctant closure will match as few elements of the string as - * possible when finding matches. {m,n} closures don't currently - * support reluctancy. - * - *

- * Line terminators - *
- * A line terminator is a one- or two-character sequence that marks - * the end of a line of the input character sequence. The following - * are recognized as line terminators: - *

    - *
  • A newline (line feed) character ('\n'),
  • - *
  • A carriage-return character followed immediately by a newline character ("\r\n"),
  • - *
  • A standalone carriage-return character ('\r'),
  • - *
  • A next-line character ('\u0085'),
  • - *
  • A line-separator character ('\u2028'), or
  • - *
  • A paragraph-separator character ('\u2029).
  • - *
- * - *

- * RE runs programs compiled by the RECompiler class. But the RE - * matcher class does not include the actual regular expression compiler - * for reasons of efficiency. In fact, if you want to pre-compile one - * or more regular expressions, the 'recompile' class can be invoked - * from the command line to produce compiled output like this: - * - *

- *    // Pre-compiled regular expression "a*b"
- *    char[] re1Instructions =
- *    {
- *        0x007c, 0x0000, 0x001a, 0x007c, 0x0000, 0x000d, 0x0041,
- *        0x0001, 0x0004, 0x0061, 0x007c, 0x0000, 0x0003, 0x0047,
- *        0x0000, 0xfff6, 0x007c, 0x0000, 0x0003, 0x004e, 0x0000,
- *        0x0003, 0x0041, 0x0001, 0x0004, 0x0062, 0x0045, 0x0000,
- *        0x0000,
- *    };
- *
- *
- *    REProgram re1 = new REProgram(re1Instructions);
- * 
- * - * You can then construct a regular expression matcher (RE) object from - * the pre-compiled expression re1 and thus avoid the overhead of - * compiling the expression at runtime. If you require more dynamic - * regular expressions, you can construct a single RECompiler object and - * re-use it to compile each expression. Similarly, you can change the - * program run by a given matcher object at any time. However, RE and - * RECompiler are not threadsafe (for efficiency reasons, and because - * requiring thread safety in this class is deemed to be a rare - * requirement), so you will need to construct a separate compiler or - * matcher object for each thread (unless you do thread synchronization - * yourself). Once expression compiled into the REProgram object, REProgram - * can be safely shared across multiple threads and RE objects. - * - *


- * - * - * ISSUES: - * - *

    - *
  • com.weusours.util.re is not currently compatible with all - * standard POSIX regcomp flags
  • - *
  • com.weusours.util.re does not support POSIX equivalence classes - * ([=foo=] syntax) (I18N/locale issue)
  • - *
  • com.weusours.util.re does not support nested POSIX character - * classes (definitely should, but not completely trivial)
  • - *
  • com.weusours.util.re Does not support POSIX character collation - * concepts ([.foo.] syntax) (I18N/locale issue)
  • - *
  • Should there be different matching styles (simple, POSIX, Perl etc?)
  • - *
  • Should RE support character iterators (for backwards RE matching!)?
  • - *
  • Should RE support reluctant {m,n} closures (does anyone care)?
  • - *
  • Not *all* possibilities are considered for greediness when backreferences - * are involved (as POSIX suggests should be the case). The POSIX RE - * "(ac*)c*d[ac]*\1", when matched against "acdacaa" should yield a match - * of acdacaa where \1 is "a". This is not the case in this RE package, - * and actually Perl doesn't go to this extent either! Until someone - * actually complains about this, I'm not sure it's worth "fixing". - * If it ever is fixed, test #137 in RETest.txt should be updated.
  • - *
- * - * - * - * @see recompile - * @see RECompiler - * - * @author Jonathan Locke - * @author Tobias Schäfer - */ -public class RE implements Serializable -{ - /** - * Specifies normal, case-sensitive matching behaviour. - */ - public static final int MATCH_NORMAL = 0x0000; - - /** - * Flag to indicate that matching should be case-independent (folded) - */ - public static final int MATCH_CASEINDEPENDENT = 0x0001; - - /** - * Newlines should match as BOL/EOL (^ and $) - */ - public static final int MATCH_MULTILINE = 0x0002; - - /** - * Consider all input a single body of text - newlines are matched by . - */ - public static final int MATCH_SINGLELINE = 0x0004; - - /************************************************ - * * - * The format of a node in a program is: * - * * - * [ OPCODE ] [ OPDATA ] [ OPNEXT ] [ OPERAND ] * - * * - * char OPCODE - instruction * - * char OPDATA - modifying data * - * char OPNEXT - next node (relative offset) * - * * - ************************************************/ - - // Opcode Char Opdata/Operand Meaning - // ---------- ---------- --------------- -------------------------------------------------- - static final char OP_END = 'E'; // end of program - static final char OP_BOL = '^'; // match only if at beginning of line - static final char OP_EOL = '$'; // match only if at end of line - static final char OP_ANY = '.'; // match any single character except newline - static final char OP_ANYOF = '['; // count/ranges match any char in the list of ranges - static final char OP_BRANCH = '|'; // node match this alternative or the next one - static final char OP_ATOM = 'A'; // length/string length of string followed by string itself - static final char OP_STAR = '*'; // node kleene closure - static final char OP_PLUS = '+'; // node positive closure - static final char OP_MAYBE = '?'; // node optional closure - static final char OP_ESCAPE = '\\'; // escape special escape code char class (escape is E_* code) - static final char OP_OPEN = '('; // number nth opening paren - static final char OP_OPEN_CLUSTER = '<'; // opening cluster - static final char OP_CLOSE = ')'; // number nth closing paren - static final char OP_CLOSE_CLUSTER = '>'; // closing cluster - static final char OP_BACKREF = '#'; // number reference nth already matched parenthesized string - static final char OP_GOTO = 'G'; // nothing but a (back-)pointer - static final char OP_NOTHING = 'N'; // match null string such as in '(a|)' - static final char OP_RELUCTANTSTAR = '8'; // none/expr reluctant '*' (mnemonic for char is unshifted '*') - static final char OP_RELUCTANTPLUS = '='; // none/expr reluctant '+' (mnemonic for char is unshifted '+') - static final char OP_RELUCTANTMAYBE = '/'; // none/expr reluctant '?' (mnemonic for char is unshifted '?') - static final char OP_POSIXCLASS = 'P'; // classid one of the posix character classes - - // Escape codes - static final char E_ALNUM = 'w'; // Alphanumeric - static final char E_NALNUM = 'W'; // Non-alphanumeric - static final char E_BOUND = 'b'; // Word boundary - static final char E_NBOUND = 'B'; // Non-word boundary - static final char E_SPACE = 's'; // Whitespace - static final char E_NSPACE = 'S'; // Non-whitespace - static final char E_DIGIT = 'd'; // Digit - static final char E_NDIGIT = 'D'; // Non-digit - - // Posix character classes - static final char POSIX_CLASS_ALNUM = 'w'; // Alphanumerics - static final char POSIX_CLASS_ALPHA = 'a'; // Alphabetics - static final char POSIX_CLASS_BLANK = 'b'; // Blanks - static final char POSIX_CLASS_CNTRL = 'c'; // Control characters - static final char POSIX_CLASS_DIGIT = 'd'; // Digits - static final char POSIX_CLASS_GRAPH = 'g'; // Graphic characters - static final char POSIX_CLASS_LOWER = 'l'; // Lowercase characters - static final char POSIX_CLASS_PRINT = 'p'; // Printable characters - static final char POSIX_CLASS_PUNCT = '!'; // Punctuation - static final char POSIX_CLASS_SPACE = 's'; // Spaces - static final char POSIX_CLASS_UPPER = 'u'; // Uppercase characters - static final char POSIX_CLASS_XDIGIT = 'x'; // Hexadecimal digits - static final char POSIX_CLASS_JSTART = 'j'; // Java identifier start - static final char POSIX_CLASS_JPART = 'k'; // Java identifier part - - // Limits - static final int maxNode = 65536; // Maximum number of nodes in a program - static final int MAX_PAREN = 16; // Number of paren pairs (only 9 can be backrefs) - - // Node layout constants - static final int offsetOpcode = 0; // Opcode offset (first character) - static final int offsetOpdata = 1; // Opdata offset (second char) - static final int offsetNext = 2; // Next index offset (third char) - static final int nodeSize = 3; // Node size (in chars) - - // State of current program - REProgram program; // Compiled regular expression 'program' - transient CharacterIterator search; // The string being matched against - int matchFlags; // Match behaviour flags - int maxParen = MAX_PAREN; - - // Parenthesized subexpressions - transient int parenCount; // Number of subexpressions matched (num open parens + 1) - transient int start0; // Cache of start[0] - transient int end0; // Cache of start[0] - transient int start1; // Cache of start[1] - transient int end1; // Cache of start[1] - transient int start2; // Cache of start[2] - transient int end2; // Cache of start[2] - transient int[] startn; // Lazy-alloced array of sub-expression starts - transient int[] endn; // Lazy-alloced array of sub-expression ends - - // Backreferences - transient int[] startBackref; // Lazy-alloced array of backref starts - transient int[] endBackref; // Lazy-alloced array of backref ends - - /** - * Constructs a regular expression matcher from a String by compiling it - * using a new instance of RECompiler. If you will be compiling many - * expressions, you may prefer to use a single RECompiler object instead. - * - * @param pattern The regular expression pattern to compile. - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - * @see RECompiler - * @see recompile - */ - public RE(String pattern) throws RESyntaxException - { - this(pattern, MATCH_NORMAL); - } - - /** - * Constructs a regular expression matcher from a String by compiling it - * using a new instance of RECompiler. If you will be compiling many - * expressions, you may prefer to use a single RECompiler object instead. - * - * @param pattern The regular expression pattern to compile. - * @param matchFlags The matching style - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - * @see RECompiler - * @see recompile - */ - public RE(String pattern, int matchFlags) throws RESyntaxException - { - this(new RECompiler().compile(pattern)); - setMatchFlags(matchFlags); - } - - /** - * Construct a matcher for a pre-compiled regular expression from program - * (bytecode) data. Permits special flags to be passed in to modify matching - * behaviour. - * - * @param program Compiled regular expression program (see RECompiler and/or recompile) - * @param matchFlags One or more of the RE match behaviour flags (RE.MATCH_*): - * - *
-     *   MATCH_NORMAL              // Normal (case-sensitive) matching
-     *   MATCH_CASEINDEPENDENT     // Case folded comparisons
-     *   MATCH_MULTILINE           // Newline matches as BOL/EOL
-     * 
- * - * @see RECompiler - * @see REProgram - * @see recompile - */ - public RE(REProgram program, int matchFlags) - { - setProgram(program); - setMatchFlags(matchFlags); - } - - /** - * Construct a matcher for a pre-compiled regular expression from program - * (bytecode) data. - * - * @param program Compiled regular expression program - * @see RECompiler - * @see recompile - */ - public RE(REProgram program) - { - this(program, MATCH_NORMAL); - } - - /** - * Constructs a regular expression matcher with no initial program. - * This is likely to be an uncommon practice, but is still supported. - */ - public RE() - { - this((REProgram)null, MATCH_NORMAL); - } - - /** - * Converts a 'simplified' regular expression to a full regular expression - * - * @param pattern The pattern to convert - * @return The full regular expression - */ - public static String simplePatternToFullRegularExpression(String pattern) - { - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < pattern.length(); i++) - { - char c = pattern.charAt(i); - switch (c) - { - case '*': - buf.append(".*"); - break; - - case '.': - case '[': - case ']': - case '\\': - case '+': - case '?': - case '{': - case '}': - case '$': - case '^': - case '|': - case '(': - case ')': - buf.append('\\'); - default: - buf.append(c); - break; - } - } - return buf.toString(); - } - - /** - * Sets match behaviour flags which alter the way RE does matching. - * @param matchFlags One or more of the RE match behaviour flags (RE.MATCH_*): - * - *
-     *   MATCH_NORMAL              // Normal (case-sensitive) matching
-     *   MATCH_CASEINDEPENDENT     // Case folded comparisons
-     *   MATCH_MULTILINE           // Newline matches as BOL/EOL
-     * 
- */ - public void setMatchFlags(int matchFlags) - { - this.matchFlags = matchFlags; - } - - /** - * Returns the current match behaviour flags. - * @return Current match behaviour flags (RE.MATCH_*). - * - *
-     *   MATCH_NORMAL              // Normal (case-sensitive) matching
-     *   MATCH_CASEINDEPENDENT     // Case folded comparisons
-     *   MATCH_MULTILINE           // Newline matches as BOL/EOL
-     * 
- * - * @see #setMatchFlags - */ - public int getMatchFlags() - { - return matchFlags; - } - - /** - * Sets the current regular expression program used by this matcher object. - * - * @param program Regular expression program compiled by RECompiler. - * @see RECompiler - * @see REProgram - * @see recompile - */ - public void setProgram(REProgram program) - { - this.program = program; - if (program != null && program.maxParens != -1) { - this.maxParen = program.maxParens; - } else { - this.maxParen = MAX_PAREN; - } - } - - /** - * Returns the current regular expression program in use by this matcher object. - * - * @return Regular expression program - * @see #setProgram - */ - public REProgram getProgram() - { - return program; - } - - /** - * Returns the number of parenthesized subexpressions available after a successful match. - * - * @return Number of available parenthesized subexpressions - */ - public int getParenCount() - { - return parenCount; - } - - /** - * Gets the contents of a parenthesized subexpression after a successful match. - * - * @param which Nesting level of subexpression - * @return String - */ - public String getParen(int which) - { - int start; - if (which < parenCount && (start = getParenStart(which)) >= 0) - { - return search.substring(start, getParenEnd(which)); - } - return null; - } - - /** - * Returns the start index of a given paren level. - * - * @param which Nesting level of subexpression - * @return String index - */ - public final int getParenStart(int which) - { - if (which < parenCount) - { - switch (which) - { - case 0: - return start0; - - case 1: - return start1; - - case 2: - return start2; - - default: - if (startn == null) - { - allocParens(); - } - return startn[which]; - } - } - return -1; - } - - /** - * Returns the end index of a given paren level. - * - * @param which Nesting level of subexpression - * @return String index - */ - public final int getParenEnd(int which) - { - if (which < parenCount) - { - switch (which) - { - case 0: - return end0; - - case 1: - return end1; - - case 2: - return end2; - - default: - if (endn == null) - { - allocParens(); - } - return endn[which]; - } - } - return -1; - } - - /** - * Returns the length of a given paren level. - * - * @param which Nesting level of subexpression - * @return Number of characters in the parenthesized subexpression - */ - public final int getParenLength(int which) - { - if (which < parenCount) - { - return getParenEnd(which) - getParenStart(which); - } - return -1; - } - - /** - * Sets the start of a paren level - * - * @param which Which paren level - * @param i Index in input array - */ - protected final void setParenStart(int which, int i) - { - if (which < parenCount) - { - switch (which) - { - case 0: - start0 = i; - break; - - case 1: - start1 = i; - break; - - case 2: - start2 = i; - break; - - default: - if (startn == null) - { - allocParens(); - } - startn[which] = i; - break; - } - } - } - - /** - * Sets the end of a paren level - * - * @param which Which paren level - * @param i Index in input array - */ - protected final void setParenEnd(int which, int i) - { - if (which < parenCount) - { - switch (which) - { - case 0: - end0 = i; - break; - - case 1: - end1 = i; - break; - - case 2: - end2 = i; - break; - - default: - if (endn == null) - { - allocParens(); - } - endn[which] = i; - break; - } - } - } - - /** - * Throws an Error representing an internal error condition probably resulting - * from a bug in the regular expression compiler (or possibly data corruption). - * In practice, this should be very rare. - * - * @param s Error description - */ - protected void internalError(String s) throws Error - { - throw new Error("RE internal error: " + s); - } - - /** - * Performs lazy allocation of subexpression arrays - */ - private final void allocParens() - { - // Allocate arrays for subexpressions - startn = new int[maxParen]; - endn = new int[maxParen]; - - // Set sub-expression pointers to invalid values - for (int i = 0; i < maxParen; i++) - { - startn[i] = -1; - endn[i] = -1; - } - } - - /** - * Try to match a string against a subset of nodes in the program - * - * @param firstNode Node to start at in program - * @param lastNode Last valid node (used for matching a subexpression without - * matching the rest of the program as well). - * @param idxStart Starting position in character array - * @return Final input array index if match succeeded. -1 if not. - */ - protected int matchNodes(int firstNode, int lastNode, int idxStart) - { - // Our current place in the string - int idx = idxStart; - - // Loop while node is valid - int next, opcode, opdata; - int idxNew; - char[] instruction = program.instruction; - for (int node = firstNode; node < lastNode; ) - { - opcode = instruction[node + offsetOpcode]; - next = node + (short)instruction[node + offsetNext]; - opdata = instruction[node + offsetOpdata]; - - switch (opcode) - { - case OP_RELUCTANTMAYBE: - { - int once = 0; - do - { - // Try to match the rest without using the reluctant subexpr - if ((idxNew = matchNodes(next, maxNode, idx)) != -1) - { - return idxNew; - } - } - while ((once++ == 0) && (idx = matchNodes(node + nodeSize, next, idx)) != -1); - return -1; - } - - case OP_RELUCTANTPLUS: - while ((idx = matchNodes(node + nodeSize, next, idx)) != -1) - { - // Try to match the rest without using the reluctant subexpr - if ((idxNew = matchNodes(next, maxNode, idx)) != -1) - { - return idxNew; - } - } - return -1; - - case OP_RELUCTANTSTAR: - do - { - // Try to match the rest without using the reluctant subexpr - if ((idxNew = matchNodes(next, maxNode, idx)) != -1) - { - return idxNew; - } - } - while ((idx = matchNodes(node + nodeSize, next, idx)) != -1); - return -1; - - case OP_OPEN: - - // Match subexpression - if ((program.flags & REProgram.OPT_HASBACKREFS) != 0) - { - startBackref[opdata] = idx; - } - if ((idxNew = matchNodes(next, maxNode, idx)) != -1) - { - // Increase valid paren count - if ((opdata + 1) > parenCount) - { - parenCount = opdata + 1; - } - - // Don't set paren if already set later on - if (getParenStart(opdata) == -1) - { - setParenStart(opdata, idx); - } - } - return idxNew; - - case OP_CLOSE: - - // Done matching subexpression - if ((program.flags & REProgram.OPT_HASBACKREFS) != 0) - { - endBackref[opdata] = idx; - } - if ((idxNew = matchNodes(next, maxNode, idx)) != -1) - { - // Increase valid paren count - if ((opdata + 1) > parenCount) - { - parenCount = opdata + 1; - } - - // Don't set paren if already set later on - if (getParenEnd(opdata) == -1) - { - setParenEnd(opdata, idx); - } - } - return idxNew; - - case OP_OPEN_CLUSTER: - case OP_CLOSE_CLUSTER: - // starting or ending the matching of a subexpression which has no backref. - return matchNodes( next, maxNode, idx ); - - case OP_BACKREF: - { - // Get the start and end of the backref - int s = startBackref[opdata]; - int e = endBackref[opdata]; - - // We don't know the backref yet - if (s == -1 || e == -1) - { - return -1; - } - - // The backref is empty size - if (s == e) - { - break; - } - - // Get the length of the backref - int l = e - s; - - // If there's not enough input left, give up. - if (search.isEnd(idx + l - 1)) - { - return -1; - } - - // Case fold the backref? - final boolean caseFold = - ((matchFlags & MATCH_CASEINDEPENDENT) != 0); - // Compare backref to input - for (int i = 0; i < l; i++) - { - if (compareChars(search.charAt(idx++), search.charAt(s + i), caseFold) != 0) - { - return -1; - } - } - } - break; - - case OP_BOL: - - // Fail if we're not at the start of the string - if (idx != 0) - { - // If we're multiline matching, we could still be at the start of a line - if ((matchFlags & MATCH_MULTILINE) == MATCH_MULTILINE) - { - // If not at start of line, give up - if (idx <= 0 || !isNewline(idx - 1)) { - return -1; - } else { - break; - } - } - return -1; - } - break; - - case OP_EOL: - - // If we're not at the end of string - if (!search.isEnd(0) && !search.isEnd(idx)) - { - // If we're multi-line matching - if ((matchFlags & MATCH_MULTILINE) == MATCH_MULTILINE) - { - // Give up if we're not at the end of a line - if (!isNewline(idx)) { - return -1; - } else { - break; - } - } - return -1; - } - break; - - case OP_ESCAPE: - - // Which escape? - switch (opdata) - { - // Word boundary match - case E_NBOUND: - case E_BOUND: - { - char cLast = ((idx == 0) ? '\n' : search.charAt(idx - 1)); - char cNext = ((search.isEnd(idx)) ? '\n' : search.charAt(idx)); - if ((Character.isLetterOrDigit(cLast) == Character.isLetterOrDigit(cNext)) == (opdata == E_BOUND)) - { - return -1; - } - } - break; - - // Alpha-numeric, digit, space, javaLetter, javaLetterOrDigit - case E_ALNUM: - case E_NALNUM: - case E_DIGIT: - case E_NDIGIT: - case E_SPACE: - case E_NSPACE: - - // Give up if out of input - if (search.isEnd(idx)) - { - return -1; - } - - char c = search.charAt(idx); - - // Switch on escape - switch (opdata) - { - case E_ALNUM: - case E_NALNUM: - if (!((Character.isLetterOrDigit(c) || c == '_') == (opdata == E_ALNUM))) - { - return -1; - } - break; - - case E_DIGIT: - case E_NDIGIT: - if (!(Character.isDigit(c) == (opdata == E_DIGIT))) - { - return -1; - } - break; - - case E_SPACE: - case E_NSPACE: - if (!(Character.isWhitespace(c) == (opdata == E_SPACE))) - { - return -1; - } - break; - } - idx++; - break; - - default: - internalError("Unrecognized escape '" + opdata + "'"); - } - break; - - case OP_ANY: - - if ((matchFlags & MATCH_SINGLELINE) == MATCH_SINGLELINE) { - // Match anything - if (search.isEnd(idx)) - { - return -1; - } - } - else - { - // Match anything but a newline - if (search.isEnd(idx) || isNewline(idx)) - { - return -1; - } - } - idx++; - break; - - case OP_ATOM: - { - // Match an atom value - if (search.isEnd(idx)) - { - return -1; - } - - // Get length of atom and starting index - int lenAtom = opdata; - int startAtom = node + nodeSize; - - // Give up if not enough input remains to have a match - if (search.isEnd(lenAtom + idx - 1)) - { - return -1; - } - - // Match atom differently depending on casefolding flag - final boolean caseFold = - ((matchFlags & MATCH_CASEINDEPENDENT) != 0); - - for (int i = 0; i < lenAtom; i++) - { - if (compareChars(search.charAt(idx++), instruction[startAtom + i], caseFold) != 0) - { - return -1; - } - } - } - break; - - case OP_POSIXCLASS: - { - // Out of input? - if (search.isEnd(idx)) - { - return -1; - } - - switch (opdata) - { - case POSIX_CLASS_ALNUM: - if (!Character.isLetterOrDigit(search.charAt(idx))) - { - return -1; - } - break; - - case POSIX_CLASS_ALPHA: - if (!Character.isLetter(search.charAt(idx))) - { - return -1; - } - break; - - case POSIX_CLASS_DIGIT: - if (!Character.isDigit(search.charAt(idx))) - { - return -1; - } - break; - - case POSIX_CLASS_BLANK: // JWL - bugbug: is this right?? - if (!Character.isSpaceChar(search.charAt(idx))) - { - return -1; - } - break; - - case POSIX_CLASS_SPACE: - if (!Character.isWhitespace(search.charAt(idx))) - { - return -1; - } - break; - - case POSIX_CLASS_CNTRL: - if (Character.getType(search.charAt(idx)) != Character.CONTROL) - { - return -1; - } - break; - - case POSIX_CLASS_GRAPH: // JWL - bugbug??? - switch (Character.getType(search.charAt(idx))) - { - case Character.MATH_SYMBOL: - case Character.CURRENCY_SYMBOL: - case Character.MODIFIER_SYMBOL: - case Character.OTHER_SYMBOL: - break; - - default: - return -1; - } - break; - - case POSIX_CLASS_LOWER: - if (Character.getType(search.charAt(idx)) != Character.LOWERCASE_LETTER) - { - return -1; - } - break; - - case POSIX_CLASS_UPPER: - if (Character.getType(search.charAt(idx)) != Character.UPPERCASE_LETTER) - { - return -1; - } - break; - - case POSIX_CLASS_PRINT: - if (Character.getType(search.charAt(idx)) == Character.CONTROL) - { - return -1; - } - break; - - case POSIX_CLASS_PUNCT: - { - int type = Character.getType(search.charAt(idx)); - switch(type) - { - case Character.DASH_PUNCTUATION: - case Character.START_PUNCTUATION: - case Character.END_PUNCTUATION: - case Character.CONNECTOR_PUNCTUATION: - case Character.OTHER_PUNCTUATION: - break; - - default: - return -1; - } - } - break; - - case POSIX_CLASS_XDIGIT: // JWL - bugbug?? - { - boolean isXDigit = ((search.charAt(idx) >= '0' && search.charAt(idx) <= '9') || - (search.charAt(idx) >= 'a' && search.charAt(idx) <= 'f') || - (search.charAt(idx) >= 'A' && search.charAt(idx) <= 'F')); - if (!isXDigit) - { - return -1; - } - } - break; - - case POSIX_CLASS_JSTART: - if (!Character.isJavaIdentifierStart(search.charAt(idx))) - { - return -1; - } - break; - - case POSIX_CLASS_JPART: - if (!Character.isJavaIdentifierPart(search.charAt(idx))) - { - return -1; - } - break; - - default: - internalError("Bad posix class"); - break; - } - - // Matched. - idx++; - } - break; - - case OP_ANYOF: - { - // Out of input? - if (search.isEnd(idx)) - { - return -1; - } - - // Get character to match against character class and maybe casefold - char c = search.charAt(idx); - boolean caseFold = (matchFlags & MATCH_CASEINDEPENDENT) != 0; - // Loop through character class checking our match character - int idxRange = node + nodeSize; - int idxEnd = idxRange + (opdata * 2); - boolean match = false; - for (int i = idxRange; !match && i < idxEnd; ) - { - // Get start, end and match characters - char s = instruction[i++]; - char e = instruction[i++]; - - match = ((compareChars(c, s, caseFold) >= 0) - && (compareChars(c, e, caseFold) <= 0)); - } - - // Fail if we didn't match the character class - if (!match) - { - return -1; - } - idx++; - } - break; - - case OP_BRANCH: - { - // Check for choices - if (instruction[next + offsetOpcode] != OP_BRANCH) - { - // If there aren't any other choices, just evaluate this branch. - node += nodeSize; - continue; - } - - // Try all available branches - short nextBranch; - do - { - // Try matching the branch against the string - if ((idxNew = matchNodes(node + nodeSize, maxNode, idx)) != -1) - { - return idxNew; - } - - // Go to next branch (if any) - nextBranch = (short)instruction[node + offsetNext]; - node += nextBranch; - } - while (nextBranch != 0 && (instruction[node + offsetOpcode] == OP_BRANCH)); - - // Failed to match any branch! - return -1; - } - - case OP_NOTHING: - case OP_GOTO: - - // Just advance to the next node without doing anything - break; - - case OP_END: - - // Match has succeeded! - setParenEnd(0, idx); - return idx; - - default: - - // Corrupt program - internalError("Invalid opcode '" + opcode + "'"); - } - - // Advance to the next node in the program - node = next; - } - - // We "should" never end up here - internalError("Corrupt program"); - return -1; - } - - /** - * Match the current regular expression program against the current - * input string, starting at index i of the input string. This method - * is only meant for internal use. - * - * @param i The input string index to start matching at - * @return True if the input matched the expression - */ - protected boolean matchAt(int i) - { - // Initialize start pointer, paren cache and paren count - start0 = -1; - end0 = -1; - start1 = -1; - end1 = -1; - start2 = -1; - end2 = -1; - startn = null; - endn = null; - parenCount = 1; - setParenStart(0, i); - - // Allocate backref arrays (unless optimizations indicate otherwise) - if ((program.flags & REProgram.OPT_HASBACKREFS) != 0) - { - startBackref = new int[maxParen]; - endBackref = new int[maxParen]; - } - - // Match against string - int idx; - if ((idx = matchNodes(0, maxNode, i)) != -1) - { - setParenEnd(0, idx); - return true; - } - - // Didn't match - parenCount = 0; - return false; - } - - /** - * Matches the current regular expression program against a character array, - * starting at a given index. - * - * @param search String to match against - * @param i Index to start searching at - * @return True if string matched - */ - public boolean match(String search, int i) - { - return match(new StringCharacterIterator(search), i); - } - - /** - * Matches the current regular expression program against a character array, - * starting at a given index. - * - * @param search String to match against - * @param i Index to start searching at - * @return True if string matched - */ - public boolean match(CharacterIterator search, int i) - { - // There is no compiled program to search with! - if (program == null) - { - // This should be uncommon enough to be an error case rather - // than an exception (which would have to be handled everywhere) - internalError("No RE program to run!"); - } - - // Save string to search - this.search = search; - - // Can we optimize the search by looking for a prefix string? - if (program.prefix == null) - { - // Unprefixed matching must try for a match at each character - for ( ;! search.isEnd(i - 1); i++) - { - // Try a match at index i - if (matchAt(i)) - { - return true; - } - } - return false; - } - else - { - // Prefix-anchored matching is possible - boolean caseIndependent = (matchFlags & MATCH_CASEINDEPENDENT) != 0; - char[] prefix = program.prefix; - for ( ; !search.isEnd(i + prefix.length - 1); i++) - { - int j = i; - int k = 0; - - boolean match; - do { - // If there's a mismatch of any character in the prefix, give up - match = (compareChars(search.charAt(j++), prefix[k++], caseIndependent) == 0); - } while (match && k < prefix.length); - - // See if the whole prefix string matched - if (k == prefix.length) - { - // We matched the full prefix at firstChar, so try it - if (matchAt(i)) - { - return true; - } - } - } - return false; - } - } - - /** - * Matches the current regular expression program against a String. - * - * @param search String to match against - * @return True if string matched - */ - public boolean match(String search) - { - return match(search, 0); - } - - /** - * Splits a string into an array of strings on regular expression boundaries. - * This function works the same way as the Perl function of the same name. - * Given a regular expression of "[ab]+" and a string to split of - * "xyzzyababbayyzabbbab123", the result would be the array of Strings - * "[xyzzy, yyz, 123]". - * - *

Please note that the first string in the resulting array may be an empty - * string. This happens when the very first character of input string is - * matched by the pattern. - * - * @param s String to split on this regular exression - * @return Array of strings - */ - public String[] split(String s) - { - // Create new vector - Vector v = new Vector(); - - // Start at position 0 and search the whole string - int pos = 0; - int len = s.length(); - - // Try a match at each position - while (pos < len && match(s, pos)) - { - // Get start of match - int start = getParenStart(0); - - // Get end of match - int newpos = getParenEnd(0); - - // Check if no progress was made - if (newpos == pos) - { - v.addElement(s.substring(pos, start + 1)); - newpos++; - } - else - { - v.addElement(s.substring(pos, start)); - } - - // Move to new position - pos = newpos; - } - - // Push remainder if it's not empty - String remainder = s.substring(pos); - if (remainder.length() != 0) - { - v.addElement(remainder); - } - - // Return vector as an array of strings - String[] ret = new String[v.size()]; - v.copyInto(ret); - return ret; - } - - /** - * Flag bit that indicates that subst should replace all occurrences of this - * regular expression. - */ - public static final int REPLACE_ALL = 0x0000; - - /** - * Flag bit that indicates that subst should only replace the first occurrence - * of this regular expression. - */ - public static final int REPLACE_FIRSTONLY = 0x0001; - - /** - * Flag bit that indicates that subst should replace backreferences - */ - public static final int REPLACE_BACKREFERENCES = 0x0002; - - /** - * Substitutes a string for this regular expression in another string. - * This method works like the Perl function of the same name. - * Given a regular expression of "a*b", a String to substituteIn of - * "aaaabfooaaabgarplyaaabwackyb" and the substitution String "-", the - * resulting String returned by subst would be "-foo-garply-wacky-". - * - * @param substituteIn String to substitute within - * @param substitution String to substitute for all matches of this regular expression. - * @return The string substituteIn with zero or more occurrences of the current - * regular expression replaced with the substitution String (if this regular - * expression object doesn't match at any position, the original String is returned - * unchanged). - */ - public String subst(String substituteIn, String substitution) - { - return subst(substituteIn, substitution, REPLACE_ALL); - } - - /** - * Substitutes a string for this regular expression in another string. - * This method works like the Perl function of the same name. - * Given a regular expression of "a*b", a String to substituteIn of - * "aaaabfooaaabgarplyaaabwackyb" and the substitution String "-", the - * resulting String returned by subst would be "-foo-garply-wacky-". - *

- * It is also possible to reference the contents of a parenthesized expression - * with $0, $1, ... $9. A regular expression of "http://[\\.\\w\\-\\?/~_@&=%]+", - * a String to substituteIn of "visit us: http://www.apache.org!" and the - * substitution String "<a href=\"$0\">$0</a>", the resulting String - * returned by subst would be - * "visit us: <a href=\"http://www.apache.org\">http://www.apache.org</a>!". - *

- * Note: $0 represents the whole match. - * - * @param substituteIn String to substitute within - * @param substitution String to substitute for matches of this regular expression - * @param flags One or more bitwise flags from REPLACE_*. If the REPLACE_FIRSTONLY - * flag bit is set, only the first occurrence of this regular expression is replaced. - * If the bit is not set (REPLACE_ALL), all occurrences of this pattern will be - * replaced. If the flag REPLACE_BACKREFERENCES is set, all backreferences will - * be processed. - * @return The string substituteIn with zero or more occurrences of the current - * regular expression replaced with the substitution String (if this regular - * expression object doesn't match at any position, the original String is returned - * unchanged). - */ - public String subst(String substituteIn, String substitution, int flags) - { - // String to return - StringBuffer ret = new StringBuffer(); - - // Start at position 0 and search the whole string - int pos = 0; - int len = substituteIn.length(); - - // Try a match at each position - while (pos < len && match(substituteIn, pos)) - { - // Append string before match - ret.append(substituteIn.substring(pos, getParenStart(0))); - - if ((flags & REPLACE_BACKREFERENCES) != 0) - { - // Process backreferences - int lCurrentPosition = 0; - int lLastPosition = -2; - int lLength = substitution.length(); - boolean bAddedPrefix = false; - - while ((lCurrentPosition = substitution.indexOf("$", lCurrentPosition)) >= 0) - { - if ((lCurrentPosition == 0 || substitution.charAt(lCurrentPosition - 1) != '\\') - && lCurrentPosition+1 < lLength) - { - char c = substitution.charAt(lCurrentPosition + 1); - if (c >= '0' && c <= '9') - { - if (bAddedPrefix == false) - { - // Append everything between the beginning of the - // substitution string and the current $ sign - ret.append(substitution.substring(0, lCurrentPosition)); - bAddedPrefix = true; - } - else - { - // Append everything between the last and the current $ sign - ret.append(substitution.substring(lLastPosition + 2, lCurrentPosition)); - } - - // Append the parenthesized expression - // Note: if a parenthesized expression of the requested - // index is not available "null" is added to the string - ret.append(getParen(c - '0')); - lLastPosition = lCurrentPosition; - } - } - - // Move forward, skipping past match - lCurrentPosition++; - } - - // Append everything after the last $ sign - ret.append(substitution.substring(lLastPosition + 2, lLength)); - } - else - { - // Append substitution without processing backreferences - ret.append(substitution); - } - - // Move forward, skipping past match - int newpos = getParenEnd(0); - - // We always want to make progress! - if (newpos == pos) - { - newpos++; - } - - // Try new position - pos = newpos; - - // Break out if we're only supposed to replace one occurrence - if ((flags & REPLACE_FIRSTONLY) != 0) - { - break; - } - } - - // If there's remaining input, append it - if (pos < len) - { - ret.append(substituteIn.substring(pos)); - } - - // Return string buffer as string - return ret.toString(); - } - - /** - * Returns an array of Strings, whose toString representation matches a regular - * expression. This method works like the Perl function of the same name. Given - * a regular expression of "a*b" and an array of String objects of [foo, aab, zzz, - * aaaab], the array of Strings returned by grep would be [aab, aaaab]. - * - * @param search Array of Objects to search - * @return Array of Strings whose toString() value matches this regular expression. - */ - public String[] grep(Object[] search) - { - // Create new vector to hold return items - Vector v = new Vector(); - - // Traverse array of objects - for (int i = 0; i < search.length; i++) - { - // Get next object as a string - String s = search[i].toString(); - - // If it matches this regexp, add it to the list - if (match(s)) - { - v.addElement(s); - } - } - - // Return vector as an array of strings - String[] ret = new String[v.size()]; - v.copyInto(ret); - return ret; - } - - /** - * @return true if character at i-th position in the search string is a newline - */ - private boolean isNewline(int i) - { - char nextChar = search.charAt(i); - - if (nextChar == '\n' || nextChar == '\r' || nextChar == '\u0085' - || nextChar == '\u2028' || nextChar == '\u2029') - { - return true; - } - - return false; - } - - /** - * Compares two characters. - * - * @param c1 first character to compare. - * @param c2 second character to compare. - * @param caseIndependent whether comparision is case insensitive or not. - * @return negative, 0, or positive integer as the first character - * less than, equal to, or greater then the second. - */ - private int compareChars(char c1, char c2, boolean caseIndependent) - { - if (caseIndependent) - { - c1 = Character.toLowerCase(c1); - c2 = Character.toLowerCase(c2); - } - return ((int)c1 - (int)c2); - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RECompiler.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RECompiler.java deleted file mode 100644 index 23874ee8da0..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RECompiler.java +++ /dev/null @@ -1,1520 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -import com.sun.org.apache.regexp.internal.RE; -import java.util.Hashtable; - -/** - * A regular expression compiler class. This class compiles a pattern string into a - * regular expression program interpretable by the RE evaluator class. The 'recompile' - * command line tool uses this compiler to pre-compile regular expressions for use - * with RE. For a description of the syntax accepted by RECompiler and what you can - * do with regular expressions, see the documentation for the RE matcher class. - * - * @see RE - * @see recompile - * - * @author Jonathan Locke - * @author Michael McCallum - */ -public class RECompiler -{ - // The compiled program - char[] instruction; // The compiled RE 'program' instruction buffer - int lenInstruction; // The amount of the program buffer currently in use - - // Input state for compiling regular expression - String pattern; // Input string - int len; // Length of the pattern string - int idx; // Current input index into ac - int parens; // Total number of paren pairs - - // Node flags - static final int NODE_NORMAL = 0; // No flags (nothing special) - static final int NODE_NULLABLE = 1; // True if node is potentially null - static final int NODE_TOPLEVEL = 2; // True if top level expr - - // Special types of 'escapes' - static final int ESC_MASK = 0xffff0; // Escape complexity mask - static final int ESC_BACKREF = 0xfffff; // Escape is really a backreference - static final int ESC_COMPLEX = 0xffffe; // Escape isn't really a true character - static final int ESC_CLASS = 0xffffd; // Escape represents a whole class of characters - - // {m,n} stacks - int maxBrackets = 10; // Maximum number of bracket pairs - static final int bracketUnbounded = -1; // Unbounded value - int brackets = 0; // Number of bracket sets - int[] bracketStart = null; // Starting point - int[] bracketEnd = null; // Ending point - int[] bracketMin = null; // Minimum number of matches - int[] bracketOpt = null; // Additional optional matches - - // Lookup table for POSIX character class names - static Hashtable hashPOSIX = new Hashtable(); - static - { - hashPOSIX.put("alnum", new Character(RE.POSIX_CLASS_ALNUM)); - hashPOSIX.put("alpha", new Character(RE.POSIX_CLASS_ALPHA)); - hashPOSIX.put("blank", new Character(RE.POSIX_CLASS_BLANK)); - hashPOSIX.put("cntrl", new Character(RE.POSIX_CLASS_CNTRL)); - hashPOSIX.put("digit", new Character(RE.POSIX_CLASS_DIGIT)); - hashPOSIX.put("graph", new Character(RE.POSIX_CLASS_GRAPH)); - hashPOSIX.put("lower", new Character(RE.POSIX_CLASS_LOWER)); - hashPOSIX.put("print", new Character(RE.POSIX_CLASS_PRINT)); - hashPOSIX.put("punct", new Character(RE.POSIX_CLASS_PUNCT)); - hashPOSIX.put("space", new Character(RE.POSIX_CLASS_SPACE)); - hashPOSIX.put("upper", new Character(RE.POSIX_CLASS_UPPER)); - hashPOSIX.put("xdigit", new Character(RE.POSIX_CLASS_XDIGIT)); - hashPOSIX.put("javastart", new Character(RE.POSIX_CLASS_JSTART)); - hashPOSIX.put("javapart", new Character(RE.POSIX_CLASS_JPART)); - } - - /** - * Constructor. Creates (initially empty) storage for a regular expression program. - */ - public RECompiler() - { - // Start off with a generous, yet reasonable, initial size - instruction = new char[128]; - lenInstruction = 0; - } - - /** - * Ensures that n more characters can fit in the program buffer. - * If n more can't fit, then the size is doubled until it can. - * @param n Number of additional characters to ensure will fit. - */ - void ensure(int n) - { - // Get current program length - int curlen = instruction.length; - - // If the current length + n more is too much - if (lenInstruction + n >= curlen) - { - // Double the size of the program array until n more will fit - while (lenInstruction + n >= curlen) - { - curlen *= 2; - } - - // Allocate new program array and move data into it - char[] newInstruction = new char[curlen]; - System.arraycopy(instruction, 0, newInstruction, 0, lenInstruction); - instruction = newInstruction; - } - } - - /** - * Emit a single character into the program stream. - * @param c Character to add - */ - void emit(char c) - { - // Make room for character - ensure(1); - - // Add character - instruction[lenInstruction++] = c; - } - - /** - * Inserts a node with a given opcode and opdata at insertAt. The node relative next - * pointer is initialized to 0. - * @param opcode Opcode for new node - * @param opdata Opdata for new node (only the low 16 bits are currently used) - * @param insertAt Index at which to insert the new node in the program - */ - void nodeInsert(char opcode, int opdata, int insertAt) - { - // Make room for a new node - ensure(RE.nodeSize); - - // Move everything from insertAt to the end down nodeSize elements - System.arraycopy(instruction, insertAt, instruction, insertAt + RE.nodeSize, lenInstruction - insertAt); - instruction[insertAt + RE.offsetOpcode] = opcode; - instruction[insertAt + RE.offsetOpdata] = (char)opdata; - instruction[insertAt + RE.offsetNext] = 0; - lenInstruction += RE.nodeSize; - } - - /** - * Appends a node to the end of a node chain - * @param node Start of node chain to traverse - * @param pointTo Node to have the tail of the chain point to - */ - void setNextOfEnd(int node, int pointTo) - { - // Traverse the chain until the next offset is 0 - int next = instruction[node + RE.offsetNext]; - // while the 'node' is not the last in the chain - // and the 'node' is not the last in the program. - while ( next != 0 && node < lenInstruction ) - { - // if the node we are supposed to point to is in the chain then - // point to the end of the program instead. - // Michael McCallum - // FIXME: // This is a _hack_ to stop infinite programs. - // I believe that the implementation of the reluctant matches is wrong but - // have not worked out a better way yet. - if ( node == pointTo ) { - pointTo = lenInstruction; - } - node += next; - next = instruction[node + RE.offsetNext]; - } - // if we have reached the end of the program then dont set the pointTo. - // im not sure if this will break any thing but passes all the tests. - if ( node < lenInstruction ) { - // Point the last node in the chain to pointTo. - instruction[node + RE.offsetNext] = (char)(short)(pointTo - node); - } - } - - /** - * Adds a new node - * @param opcode Opcode for node - * @param opdata Opdata for node (only the low 16 bits are currently used) - * @return Index of new node in program - */ - int node(char opcode, int opdata) - { - // Make room for a new node - ensure(RE.nodeSize); - - // Add new node at end - instruction[lenInstruction + RE.offsetOpcode] = opcode; - instruction[lenInstruction + RE.offsetOpdata] = (char)opdata; - instruction[lenInstruction + RE.offsetNext] = 0; - lenInstruction += RE.nodeSize; - - // Return index of new node - return lenInstruction - RE.nodeSize; - } - - - /** - * Throws a new internal error exception - * @exception Error Thrown in the event of an internal error. - */ - void internalError() throws Error - { - throw new Error("Internal error!"); - } - - /** - * Throws a new syntax error exception - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - */ - void syntaxError(String s) throws RESyntaxException - { - throw new RESyntaxException(s); - } - - /** - * Allocate storage for brackets only as needed - */ - void allocBrackets() - { - // Allocate bracket stacks if not already done - if (bracketStart == null) - { - // Allocate storage - bracketStart = new int[maxBrackets]; - bracketEnd = new int[maxBrackets]; - bracketMin = new int[maxBrackets]; - bracketOpt = new int[maxBrackets]; - - // Initialize to invalid values - for (int i = 0; i < maxBrackets; i++) - { - bracketStart[i] = bracketEnd[i] = bracketMin[i] = bracketOpt[i] = -1; - } - } - } - - /** Enlarge storage for brackets only as needed. */ - synchronized void reallocBrackets() { - // trick the tricky - if (bracketStart == null) { - allocBrackets(); - } - - int new_size = maxBrackets * 2; - int[] new_bS = new int[new_size]; - int[] new_bE = new int[new_size]; - int[] new_bM = new int[new_size]; - int[] new_bO = new int[new_size]; - // Initialize to invalid values - for (int i=brackets; i= len || pattern.charAt(idx++) != '{') - { - internalError(); - } - - // Next char must be a digit - if (idx >= len || !Character.isDigit(pattern.charAt(idx))) - { - syntaxError("Expected digit"); - } - - // Get min ('m' of {m,n}) number - StringBuffer number = new StringBuffer(); - while (idx < len && Character.isDigit(pattern.charAt(idx))) - { - number.append(pattern.charAt(idx++)); - } - try - { - bracketMin[brackets] = Integer.parseInt(number.toString()); - } - catch (NumberFormatException e) - { - syntaxError("Expected valid number"); - } - - // If out of input, fail - if (idx >= len) - { - syntaxError("Expected comma or right bracket"); - } - - // If end of expr, optional limit is 0 - if (pattern.charAt(idx) == '}') - { - idx++; - bracketOpt[brackets] = 0; - return; - } - - // Must have at least {m,} and maybe {m,n}. - if (idx >= len || pattern.charAt(idx++) != ',') - { - syntaxError("Expected comma"); - } - - // If out of input, fail - if (idx >= len) - { - syntaxError("Expected comma or right bracket"); - } - - // If {m,} max is unlimited - if (pattern.charAt(idx) == '}') - { - idx++; - bracketOpt[brackets] = bracketUnbounded; - return; - } - - // Next char must be a digit - if (idx >= len || !Character.isDigit(pattern.charAt(idx))) - { - syntaxError("Expected digit"); - } - - // Get max number - number.setLength(0); - while (idx < len && Character.isDigit(pattern.charAt(idx))) - { - number.append(pattern.charAt(idx++)); - } - try - { - bracketOpt[brackets] = Integer.parseInt(number.toString()) - bracketMin[brackets]; - } - catch (NumberFormatException e) - { - syntaxError("Expected valid number"); - } - - // Optional repetitions must be >= 0 - if (bracketOpt[brackets] < 0) - { - syntaxError("Bad range"); - } - - // Must have close brace - if (idx >= len || pattern.charAt(idx++) != '}') - { - syntaxError("Missing close brace"); - } - } - - /** - * Match an escape sequence. Handles quoted chars and octal escapes as well - * as normal escape characters. Always advances the input stream by the - * right amount. This code "understands" the subtle difference between an - * octal escape and a backref. You can access the type of ESC_CLASS or - * ESC_COMPLEX or ESC_BACKREF by looking at pattern[idx - 1]. - * @return ESC_* code or character if simple escape - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - */ - int escape() throws RESyntaxException - { - // "Shouldn't" happen - if (pattern.charAt(idx) != '\\') - { - internalError(); - } - - // Escape shouldn't occur as last character in string! - if (idx + 1 == len) - { - syntaxError("Escape terminates string"); - } - - // Switch on character after backslash - idx += 2; - char escapeChar = pattern.charAt(idx - 1); - switch (escapeChar) - { - case RE.E_BOUND: - case RE.E_NBOUND: - return ESC_COMPLEX; - - case RE.E_ALNUM: - case RE.E_NALNUM: - case RE.E_SPACE: - case RE.E_NSPACE: - case RE.E_DIGIT: - case RE.E_NDIGIT: - return ESC_CLASS; - - case 'u': - case 'x': - { - // Exact required hex digits for escape type - int hexDigits = (escapeChar == 'u' ? 4 : 2); - - // Parse up to hexDigits characters from input - int val = 0; - for ( ; idx < len && hexDigits-- > 0; idx++) - { - // Get char - char c = pattern.charAt(idx); - - // If it's a hexadecimal digit (0-9) - if (c >= '0' && c <= '9') - { - // Compute new value - val = (val << 4) + c - '0'; - } - else - { - // If it's a hexadecimal letter (a-f) - c = Character.toLowerCase(c); - if (c >= 'a' && c <= 'f') - { - // Compute new value - val = (val << 4) + (c - 'a') + 10; - } - else - { - // If it's not a valid digit or hex letter, the escape must be invalid - // because hexDigits of input have not been absorbed yet. - syntaxError("Expected " + hexDigits + " hexadecimal digits after \\" + escapeChar); - } - } - } - return val; - } - - case 't': - return '\t'; - - case 'n': - return '\n'; - - case 'r': - return '\r'; - - case 'f': - return '\f'; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - - // An octal escape starts with a 0 or has two digits in a row - if ((idx < len && Character.isDigit(pattern.charAt(idx))) || escapeChar == '0') - { - // Handle \nnn octal escapes - int val = escapeChar - '0'; - if (idx < len && Character.isDigit(pattern.charAt(idx))) - { - val = ((val << 3) + (pattern.charAt(idx++) - '0')); - if (idx < len && Character.isDigit(pattern.charAt(idx))) - { - val = ((val << 3) + (pattern.charAt(idx++) - '0')); - } - } - return val; - } - - // It's actually a backreference (\[1-9]), not an escape - return ESC_BACKREF; - - default: - - // Simple quoting of a character - return escapeChar; - } - } - - /** - * Compile a character class - * @return Index of class node - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - */ - int characterClass() throws RESyntaxException - { - // Check for bad calling or empty class - if (pattern.charAt(idx) != '[') - { - internalError(); - } - - // Check for unterminated or empty class - if ((idx + 1) >= len || pattern.charAt(++idx) == ']') - { - syntaxError("Empty or unterminated class"); - } - - // Check for POSIX character class - if (idx < len && pattern.charAt(idx) == ':') - { - // Skip colon - idx++; - - // POSIX character classes are denoted with lowercase ASCII strings - int idxStart = idx; - while (idx < len && pattern.charAt(idx) >= 'a' && pattern.charAt(idx) <= 'z') - { - idx++; - } - - // Should be a ":]" to terminate the POSIX character class - if ((idx + 1) < len && pattern.charAt(idx) == ':' && pattern.charAt(idx + 1) == ']') - { - // Get character class - String charClass = pattern.substring(idxStart, idx); - - // Select the POSIX class id - Character i = (Character)hashPOSIX.get(charClass); - if (i != null) - { - // Move past colon and right bracket - idx += 2; - - // Return new POSIX character class node - return node(RE.OP_POSIXCLASS, i.charValue()); - } - syntaxError("Invalid POSIX character class '" + charClass + "'"); - } - syntaxError("Invalid POSIX character class syntax"); - } - - // Try to build a class. Create OP_ANYOF node - int ret = node(RE.OP_ANYOF, 0); - - // Parse class declaration - char CHAR_INVALID = Character.MAX_VALUE; - char last = CHAR_INVALID; - char simpleChar = 0; - boolean include = true; - boolean definingRange = false; - int idxFirst = idx; - char rangeStart = Character.MIN_VALUE; - char rangeEnd; - RERange range = new RERange(); - while (idx < len && pattern.charAt(idx) != ']') - { - - switchOnCharacter: - - // Switch on character - switch (pattern.charAt(idx)) - { - case '^': - include = !include; - if (idx == idxFirst) - { - range.include(Character.MIN_VALUE, Character.MAX_VALUE, true); - } - idx++; - continue; - - case '\\': - { - // Escape always advances the stream - int c; - switch (c = escape ()) - { - case ESC_COMPLEX: - case ESC_BACKREF: - - // Word boundaries and backrefs not allowed in a character class! - syntaxError("Bad character class"); - - case ESC_CLASS: - - // Classes can't be an endpoint of a range - if (definingRange) - { - syntaxError("Bad character class"); - } - - // Handle specific type of class (some are ok) - switch (pattern.charAt(idx - 1)) - { - case RE.E_NSPACE: - case RE.E_NDIGIT: - case RE.E_NALNUM: - syntaxError("Bad character class"); - - case RE.E_SPACE: - range.include('\t', include); - range.include('\r', include); - range.include('\f', include); - range.include('\n', include); - range.include('\b', include); - range.include(' ', include); - break; - - case RE.E_ALNUM: - range.include('a', 'z', include); - range.include('A', 'Z', include); - range.include('_', include); - - // Fall through! - - case RE.E_DIGIT: - range.include('0', '9', include); - break; - } - - // Make last char invalid (can't be a range start) - last = CHAR_INVALID; - break; - - default: - - // Escape is simple so treat as a simple char - simpleChar = (char) c; - break switchOnCharacter; - } - } - continue; - - case '-': - - // Start a range if one isn't already started - if (definingRange) - { - syntaxError("Bad class range"); - } - definingRange = true; - - // If no last character, start of range is 0 - rangeStart = (last == CHAR_INVALID ? 0 : last); - - // Premature end of range. define up to Character.MAX_VALUE - if ((idx + 1) < len && pattern.charAt(++idx) == ']') - { - simpleChar = Character.MAX_VALUE; - break; - } - continue; - - default: - simpleChar = pattern.charAt(idx++); - break; - } - - // Handle simple character simpleChar - if (definingRange) - { - // if we are defining a range make it now - rangeEnd = simpleChar; - - // Actually create a range if the range is ok - if (rangeStart >= rangeEnd) - { - syntaxError("Bad character class"); - } - range.include(rangeStart, rangeEnd, include); - - // We are done defining the range - last = CHAR_INVALID; - definingRange = false; - } - else - { - // If simple character and not start of range, include it - if (idx >= len || pattern.charAt(idx) != '-') - { - range.include(simpleChar, include); - } - last = simpleChar; - } - } - - // Shouldn't be out of input - if (idx == len) - { - syntaxError("Unterminated character class"); - } - - // Absorb the ']' end of class marker - idx++; - - // Emit character class definition - instruction[ret + RE.offsetOpdata] = (char)range.num; - for (int i = 0; i < range.num; i++) - { - emit((char)range.minRange[i]); - emit((char)range.maxRange[i]); - } - return ret; - } - - /** - * Absorb an atomic character string. This method is a little tricky because - * it can un-include the last character of string if a closure operator follows. - * This is correct because *+? have higher precedence than concatentation (thus - * ABC* means AB(C*) and NOT (ABC)*). - * @return Index of new atom node - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - */ - int atom() throws RESyntaxException - { - // Create a string node - int ret = node(RE.OP_ATOM, 0); - - // Length of atom - int lenAtom = 0; - - // Loop while we've got input - - atomLoop: - - while (idx < len) - { - // Is there a next char? - if ((idx + 1) < len) - { - char c = pattern.charAt(idx + 1); - - // If the next 'char' is an escape, look past the whole escape - if (pattern.charAt(idx) == '\\') - { - int idxEscape = idx; - escape(); - if (idx < len) - { - c = pattern.charAt(idx); - } - idx = idxEscape; - } - - // Switch on next char - switch (c) - { - case '{': - case '?': - case '*': - case '+': - - // If the next character is a closure operator and our atom is non-empty, the - // current character should bind to the closure operator rather than the atom - if (lenAtom != 0) - { - break atomLoop; - } - } - } - - // Switch on current char - switch (pattern.charAt(idx)) - { - case ']': - case '^': - case '$': - case '.': - case '[': - case '(': - case ')': - case '|': - break atomLoop; - - case '{': - case '?': - case '*': - case '+': - - // We should have an atom by now - if (lenAtom == 0) - { - // No atom before closure - syntaxError("Missing operand to closure"); - } - break atomLoop; - - case '\\': - - { - // Get the escaped character (advances input automatically) - int idxBeforeEscape = idx; - int c = escape(); - - // Check if it's a simple escape (as opposed to, say, a backreference) - if ((c & ESC_MASK) == ESC_MASK) - { - // Not a simple escape, so backup to where we were before the escape. - idx = idxBeforeEscape; - break atomLoop; - } - - // Add escaped char to atom - emit((char) c); - lenAtom++; - } - break; - - default: - - // Add normal character to atom - emit(pattern.charAt(idx++)); - lenAtom++; - break; - } - } - - // This "shouldn't" happen - if (lenAtom == 0) - { - internalError(); - } - - // Emit the atom length into the program - instruction[ret + RE.offsetOpdata] = (char)lenAtom; - return ret; - } - - /** - * Match a terminal node. - * @param flags Flags - * @return Index of terminal node (closeable) - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - */ - int terminal(int[] flags) throws RESyntaxException - { - switch (pattern.charAt(idx)) - { - case RE.OP_EOL: - case RE.OP_BOL: - case RE.OP_ANY: - return node(pattern.charAt(idx++), 0); - - case '[': - return characterClass(); - - case '(': - return expr(flags); - - case ')': - syntaxError("Unexpected close paren"); - - case '|': - internalError(); - - case ']': - syntaxError("Mismatched class"); - - case 0: - syntaxError("Unexpected end of input"); - - case '?': - case '+': - case '{': - case '*': - syntaxError("Missing operand to closure"); - - case '\\': - { - // Don't forget, escape() advances the input stream! - int idxBeforeEscape = idx; - - // Switch on escaped character - switch (escape()) - { - case ESC_CLASS: - case ESC_COMPLEX: - flags[0] &= ~NODE_NULLABLE; - return node(RE.OP_ESCAPE, pattern.charAt(idx - 1)); - - case ESC_BACKREF: - { - char backreference = (char)(pattern.charAt(idx - 1) - '0'); - if (parens <= backreference) - { - syntaxError("Bad backreference"); - } - flags[0] |= NODE_NULLABLE; - return node(RE.OP_BACKREF, backreference); - } - - default: - - // We had a simple escape and we want to have it end up in - // an atom, so we back up and fall though to the default handling - idx = idxBeforeEscape; - flags[0] &= ~NODE_NULLABLE; - break; - } - } - } - - // Everything above either fails or returns. - // If it wasn't one of the above, it must be the start of an atom. - flags[0] &= ~NODE_NULLABLE; - return atom(); - } - - /** - * Compile a possibly closured terminal - * @param flags Flags passed by reference - * @return Index of closured node - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - */ - int closure(int[] flags) throws RESyntaxException - { - // Before terminal - int idxBeforeTerminal = idx; - - // Values to pass by reference to terminal() - int[] terminalFlags = { NODE_NORMAL }; - - // Get terminal symbol - int ret = terminal(terminalFlags); - - // Or in flags from terminal symbol - flags[0] |= terminalFlags[0]; - - // Advance input, set NODE_NULLABLE flag and do sanity checks - if (idx >= len) - { - return ret; - } - boolean greedy = true; - char closureType = pattern.charAt(idx); - switch (closureType) - { - case '?': - case '*': - - // The current node can be null - flags[0] |= NODE_NULLABLE; - - case '+': - - // Eat closure character - idx++; - - case '{': - - // Don't allow blantant stupidity - int opcode = instruction[ret + RE.offsetOpcode]; - if (opcode == RE.OP_BOL || opcode == RE.OP_EOL) - { - syntaxError("Bad closure operand"); - } - if ((terminalFlags[0] & NODE_NULLABLE) != 0) - { - syntaxError("Closure operand can't be nullable"); - } - break; - } - - // If the next character is a '?', make the closure non-greedy (reluctant) - if (idx < len && pattern.charAt(idx) == '?') - { - idx++; - greedy = false; - } - - if (greedy) - { - // Actually do the closure now - switch (closureType) - { - case '{': - { - // We look for our bracket in the list - boolean found = false; - int i; - allocBrackets(); - for (i = 0; i < brackets; i++) - { - if (bracketStart[i] == idx) - { - found = true; - break; - } - } - - // If its not in the list we parse the {m,n} - if (!found) - { - if (brackets >= maxBrackets) - { - reallocBrackets(); - } - bracketStart[brackets] = idx; - bracket(); - bracketEnd[brackets] = idx; - i = brackets++; - } - - // Process min first - if (bracketMin[i]-- > 0) - { - if (bracketMin[i] > 0 || bracketOpt[i] != 0) { - // Rewind stream and run it through again - more matchers coming - for (int j = 0; j < brackets; j++) { - if (j != i && bracketStart[j] < idx - && bracketStart[j] >= idxBeforeTerminal) - { - brackets--; - bracketStart[j] = bracketStart[brackets]; - bracketEnd[j] = bracketEnd[brackets]; - bracketMin[j] = bracketMin[brackets]; - bracketOpt[j] = bracketOpt[brackets]; - } - } - - idx = idxBeforeTerminal; - } else { - // Bug #1030: No optinal matches - no need to rewind - idx = bracketEnd[i]; - } - break; - } - - // Do the right thing for maximum ({m,}) - if (bracketOpt[i] == bracketUnbounded) - { - // Drop through now and closure expression. - // We are done with the {m,} expr, so skip rest - closureType = '*'; - bracketOpt[i] = 0; - idx = bracketEnd[i]; - } - else - if (bracketOpt[i]-- > 0) - { - if (bracketOpt[i] > 0) - { - // More optional matchers - 'play it again sam!' - idx = idxBeforeTerminal; - } else { - // Bug #1030: We are done - this one is last and optional - idx = bracketEnd[i]; - } - // Drop through to optionally close - closureType = '?'; - } - else - { - // Rollback terminal - neither min nor opt matchers present - lenInstruction = ret; - node(RE.OP_NOTHING, 0); - - // We are done. skip the rest of {m,n} expr - idx = bracketEnd[i]; - break; - } - } - - // Fall through! - - case '?': - case '*': - - if (!greedy) - { - break; - } - - if (closureType == '?') - { - // X? is compiled as (X|) - nodeInsert(RE.OP_BRANCH, 0, ret); // branch before X - setNextOfEnd(ret, node (RE.OP_BRANCH, 0)); // inserted branch to option - int nothing = node (RE.OP_NOTHING, 0); // which is OP_NOTHING - setNextOfEnd(ret, nothing); // point (second) branch to OP_NOTHING - setNextOfEnd(ret + RE.nodeSize, nothing); // point the end of X to OP_NOTHING node - } - - if (closureType == '*') - { - // X* is compiled as (X{gotoX}|) - nodeInsert(RE.OP_BRANCH, 0, ret); // branch before X - setNextOfEnd(ret + RE.nodeSize, node(RE.OP_BRANCH, 0)); // end of X points to an option - setNextOfEnd(ret + RE.nodeSize, node(RE.OP_GOTO, 0)); // to goto - setNextOfEnd(ret + RE.nodeSize, ret); // the start again - setNextOfEnd(ret, node(RE.OP_BRANCH, 0)); // the other option is - setNextOfEnd(ret, node(RE.OP_NOTHING, 0)); // OP_NOTHING - } - break; - - case '+': - { - // X+ is compiled as X({gotoX}|) - int branch; - branch = node(RE.OP_BRANCH, 0); // a new branch - setNextOfEnd(ret, branch); // is added to the end of X - setNextOfEnd(node(RE.OP_GOTO, 0), ret); // one option is to go back to the start - setNextOfEnd(branch, node(RE.OP_BRANCH, 0)); // the other option - setNextOfEnd(ret, node(RE.OP_NOTHING, 0)); // is OP_NOTHING - } - break; - } - } - else - { - // Add end after closured subexpr - setNextOfEnd(ret, node(RE.OP_END, 0)); - - // Actually do the closure now - switch (closureType) - { - case '?': - nodeInsert(RE.OP_RELUCTANTMAYBE, 0, ret); - break; - - case '*': - nodeInsert(RE.OP_RELUCTANTSTAR, 0, ret); - break; - - case '+': - nodeInsert(RE.OP_RELUCTANTPLUS, 0, ret); - break; - } - - // Point to the expr after the closure - setNextOfEnd(ret, lenInstruction); - } - return ret; - } - - /** - * Compile one branch of an or operator (implements concatenation) - * @param flags Flags passed by reference - * @return Pointer to branch node - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - */ - int branch(int[] flags) throws RESyntaxException - { - // Get each possibly closured piece and concat - int node; - int ret = node(RE.OP_BRANCH, 0); - int chain = -1; - int[] closureFlags = new int[1]; - boolean nullable = true; - while (idx < len && pattern.charAt(idx) != '|' && pattern.charAt(idx) != ')') - { - // Get new node - closureFlags[0] = NODE_NORMAL; - node = closure(closureFlags); - if (closureFlags[0] == NODE_NORMAL) - { - nullable = false; - } - - // If there's a chain, append to the end - if (chain != -1) - { - setNextOfEnd(chain, node); - } - - // Chain starts at current - chain = node; - } - - // If we don't run loop, make a nothing node - if (chain == -1) - { - node(RE.OP_NOTHING, 0); - } - - // Set nullable flag for this branch - if (nullable) - { - flags[0] |= NODE_NULLABLE; - } - return ret; - } - - /** - * Compile an expression with possible parens around it. Paren matching - * is done at this level so we can tie the branch tails together. - * @param flags Flag value passed by reference - * @return Node index of expression in instruction array - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - */ - int expr(int[] flags) throws RESyntaxException - { - // Create open paren node unless we were called from the top level (which has no parens) - int paren = -1; - int ret = -1; - int closeParens = parens; - if ((flags[0] & NODE_TOPLEVEL) == 0 && pattern.charAt(idx) == '(') - { - // if its a cluster ( rather than a proper subexpression ie with backrefs ) - if ( idx + 2 < len && pattern.charAt( idx + 1 ) == '?' && pattern.charAt( idx + 2 ) == ':' ) - { - paren = 2; - idx += 3; - ret = node( RE.OP_OPEN_CLUSTER, 0 ); - } - else - { - paren = 1; - idx++; - ret = node(RE.OP_OPEN, parens++); - } - } - flags[0] &= ~NODE_TOPLEVEL; - - // Create a branch node - int branch = branch(flags); - if (ret == -1) - { - ret = branch; - } - else - { - setNextOfEnd(ret, branch); - } - - // Loop through branches - while (idx < len && pattern.charAt(idx) == '|') - { - idx++; - branch = branch(flags); - setNextOfEnd(ret, branch); - } - - // Create an ending node (either a close paren or an OP_END) - int end; - if ( paren > 0 ) - { - if (idx < len && pattern.charAt(idx) == ')') - { - idx++; - } - else - { - syntaxError("Missing close paren"); - } - if ( paren == 1 ) - { - end = node(RE.OP_CLOSE, closeParens); - } - else - { - end = node( RE.OP_CLOSE_CLUSTER, 0 ); - } - } - else - { - end = node(RE.OP_END, 0); - } - - // Append the ending node to the ret nodelist - setNextOfEnd(ret, end); - - // Hook the ends of each branch to the end node - int currentNode = ret; - int nextNodeOffset = instruction[ currentNode + RE.offsetNext ]; - // while the next node o - while ( nextNodeOffset != 0 && currentNode < lenInstruction ) - { - // If branch, make the end of the branch's operand chain point to the end node. - if ( instruction[ currentNode + RE.offsetOpcode ] == RE.OP_BRANCH ) - { - setNextOfEnd( currentNode + RE.nodeSize, end ); - } - nextNodeOffset = instruction[ currentNode + RE.offsetNext ]; - currentNode += nextNodeOffset; - } - - // Return the node list - return ret; - } - - /** - * Compiles a regular expression pattern into a program runnable by the pattern - * matcher class 'RE'. - * @param pattern Regular expression pattern to compile (see RECompiler class - * for details). - * @return A compiled regular expression program. - * @exception RESyntaxException Thrown if the regular expression has invalid syntax. - * @see RECompiler - * @see RE - */ - public REProgram compile(String pattern) throws RESyntaxException - { - // Initialize variables for compilation - this.pattern = pattern; // Save pattern in instance variable - len = pattern.length(); // Precompute pattern length for speed - idx = 0; // Set parsing index to the first character - lenInstruction = 0; // Set emitted instruction count to zero - parens = 1; // Set paren level to 1 (the implicit outer parens) - brackets = 0; // No bracketed closures yet - - // Initialize pass by reference flags value - int[] flags = { NODE_TOPLEVEL }; - - // Parse expression - expr(flags); - - // Should be at end of input - if (idx != len) - { - if (pattern.charAt(idx) == ')') - { - syntaxError("Unmatched close paren"); - } - syntaxError("Unexpected input remains"); - } - - // Return the result - char[] ins = new char[lenInstruction]; - System.arraycopy(instruction, 0, ins, 0, lenInstruction); - return new REProgram(parens, ins); - } - - /** - * Local, nested class for maintaining character ranges for character classes. - */ - class RERange - { - int size = 16; // Capacity of current range arrays - int[] minRange = new int[size]; // Range minima - int[] maxRange = new int[size]; // Range maxima - int num = 0; // Number of range array elements in use - - /** - * Deletes the range at a given index from the range lists - * @param index Index of range to delete from minRange and maxRange arrays. - */ - void delete(int index) - { - // Return if no elements left or index is out of range - if (num == 0 || index >= num) - { - return; - } - - // Move elements down - while (++index < num) - { - if (index - 1 >= 0) - { - minRange[index-1] = minRange[index]; - maxRange[index-1] = maxRange[index]; - } - } - - // One less element now - num--; - } - - /** - * Merges a range into the range list, coalescing ranges if possible. - * @param min Minimum end of range - * @param max Maximum end of range - */ - void merge(int min, int max) - { - // Loop through ranges - for (int i = 0; i < num; i++) - { - // Min-max is subsumed by minRange[i]-maxRange[i] - if (min >= minRange[i] && max <= maxRange[i]) - { - return; - } - - // Min-max subsumes minRange[i]-maxRange[i] - else if (min <= minRange[i] && max >= maxRange[i]) - { - delete(i); - merge(min, max); - return; - } - - // Min is in the range, but max is outside - else if (min >= minRange[i] && min <= maxRange[i]) - { - delete(i); - min = minRange[i]; - merge(min, max); - return; - } - - // Max is in the range, but min is outside - else if (max >= minRange[i] && max <= maxRange[i]) - { - delete(i); - max = maxRange[i]; - merge(min, max); - return; - } - } - - // Must not overlap any other ranges - if (num >= size) - { - size *= 2; - int[] newMin = new int[size]; - int[] newMax = new int[size]; - System.arraycopy(minRange, 0, newMin, 0, num); - System.arraycopy(maxRange, 0, newMax, 0, num); - minRange = newMin; - maxRange = newMax; - } - minRange[num] = min; - maxRange[num] = max; - num++; - } - - /** - * Removes a range by deleting or shrinking all other ranges - * @param min Minimum end of range - * @param max Maximum end of range - */ - void remove(int min, int max) - { - // Loop through ranges - for (int i = 0; i < num; i++) - { - // minRange[i]-maxRange[i] is subsumed by min-max - if (minRange[i] >= min && maxRange[i] <= max) - { - delete(i); - i--; - return; - } - - // min-max is subsumed by minRange[i]-maxRange[i] - else if (min >= minRange[i] && max <= maxRange[i]) - { - int minr = minRange[i]; - int maxr = maxRange[i]; - delete(i); - if (minr < min) - { - merge(minr, min - 1); - } - if (max < maxr) - { - merge(max + 1, maxr); - } - return; - } - - // minRange is in the range, but maxRange is outside - else if (minRange[i] >= min && minRange[i] <= max) - { - minRange[i] = max + 1; - return; - } - - // maxRange is in the range, but minRange is outside - else if (maxRange[i] >= min && maxRange[i] <= max) - { - maxRange[i] = min - 1; - return; - } - } - } - - /** - * Includes (or excludes) the range from min to max, inclusive. - * @param min Minimum end of range - * @param max Maximum end of range - * @param include True if range should be included. False otherwise. - */ - void include(int min, int max, boolean include) - { - if (include) - { - merge(min, max); - } - else - { - remove(min, max); - } - } - - /** - * Includes a range with the same min and max - * @param minmax Minimum and maximum end of range (inclusive) - * @param include True if range should be included. False otherwise. - */ - void include(char minmax, boolean include) - { - include(minmax, minmax, include); - } - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REDebugCompiler.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REDebugCompiler.java deleted file mode 100644 index 815d4fdfa81..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REDebugCompiler.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -import java.io.PrintWriter; -import java.util.Hashtable; - -/** - * A subclass of RECompiler which can dump a regular expression program - * for debugging purposes. - * - * @author Jonathan Locke - */ -public class REDebugCompiler extends RECompiler -{ - /** - * Mapping from opcodes to descriptive strings - */ - static Hashtable hashOpcode = new Hashtable(); - static - { - hashOpcode.put(new Integer(RE.OP_RELUCTANTSTAR), "OP_RELUCTANTSTAR"); - hashOpcode.put(new Integer(RE.OP_RELUCTANTPLUS), "OP_RELUCTANTPLUS"); - hashOpcode.put(new Integer(RE.OP_RELUCTANTMAYBE), "OP_RELUCTANTMAYBE"); - hashOpcode.put(new Integer(RE.OP_END), "OP_END"); - hashOpcode.put(new Integer(RE.OP_BOL), "OP_BOL"); - hashOpcode.put(new Integer(RE.OP_EOL), "OP_EOL"); - hashOpcode.put(new Integer(RE.OP_ANY), "OP_ANY"); - hashOpcode.put(new Integer(RE.OP_ANYOF), "OP_ANYOF"); - hashOpcode.put(new Integer(RE.OP_BRANCH), "OP_BRANCH"); - hashOpcode.put(new Integer(RE.OP_ATOM), "OP_ATOM"); - hashOpcode.put(new Integer(RE.OP_STAR), "OP_STAR"); - hashOpcode.put(new Integer(RE.OP_PLUS), "OP_PLUS"); - hashOpcode.put(new Integer(RE.OP_MAYBE), "OP_MAYBE"); - hashOpcode.put(new Integer(RE.OP_NOTHING), "OP_NOTHING"); - hashOpcode.put(new Integer(RE.OP_GOTO), "OP_GOTO"); - hashOpcode.put(new Integer(RE.OP_ESCAPE), "OP_ESCAPE"); - hashOpcode.put(new Integer(RE.OP_OPEN), "OP_OPEN"); - hashOpcode.put(new Integer(RE.OP_CLOSE), "OP_CLOSE"); - hashOpcode.put(new Integer(RE.OP_BACKREF), "OP_BACKREF"); - hashOpcode.put(new Integer(RE.OP_POSIXCLASS), "OP_POSIXCLASS"); - hashOpcode.put(new Integer(RE.OP_OPEN_CLUSTER), "OP_OPEN_CLUSTER"); - hashOpcode.put(new Integer(RE.OP_CLOSE_CLUSTER), "OP_CLOSE_CLUSTER"); - } - - /** - * Returns a descriptive string for an opcode. - * @param opcode Opcode to convert to a string - * @return Description of opcode - */ - String opcodeToString(char opcode) - { - // Get string for opcode - String ret =(String)hashOpcode.get(new Integer(opcode)); - - // Just in case we have a corrupt program - if (ret == null) - { - ret = "OP_????"; - } - return ret; - } - - /** - * Return a string describing a (possibly unprintable) character. - * @param c Character to convert to a printable representation - * @return String representation of character - */ - String charToString(char c) - { - // If it's unprintable, convert to '\###' - if (c < ' ' || c > 127) - { - return "\\" + (int)c; - } - - // Return the character as a string - return String.valueOf(c); - } - - /** - * Returns a descriptive string for a node in a regular expression program. - * @param node Node to describe - * @return Description of node - */ - String nodeToString(int node) - { - // Get opcode and opdata for node - char opcode = instruction[node + RE.offsetOpcode]; - int opdata = (int)instruction[node + RE.offsetOpdata]; - - // Return opcode as a string and opdata value - return opcodeToString(opcode) + ", opdata = " + opdata; - } - - /** - * Inserts a node with a given opcode and opdata at insertAt. The node relative next - * pointer is initialized to 0. - * @param opcode Opcode for new node - * @param opdata Opdata for new node (only the low 16 bits are currently used) - * @param insertAt Index at which to insert the new node in the program * / - void nodeInsert(char opcode, int opdata, int insertAt) { - System.out.println( "====> " + opcode + " " + opdata + " " + insertAt ); - PrintWriter writer = new PrintWriter( System.out ); - dumpProgram( writer ); - super.nodeInsert( opcode, opdata, insertAt ); - System.out.println( "====< " ); - dumpProgram( writer ); - writer.flush(); - }/**/ - - - /** - * Appends a node to the end of a node chain - * @param node Start of node chain to traverse - * @param pointTo Node to have the tail of the chain point to * / - void setNextOfEnd(int node, int pointTo) { - System.out.println( "====> " + node + " " + pointTo ); - PrintWriter writer = new PrintWriter( System.out ); - dumpProgram( writer ); - super.setNextOfEnd( node, pointTo ); - System.out.println( "====< " ); - dumpProgram( writer ); - writer.flush(); - }/**/ - - - /** - * Dumps the current program to a PrintWriter - * @param p PrintWriter for program dump output - */ - public void dumpProgram(PrintWriter p) - { - // Loop through the whole program - for (int i = 0; i < lenInstruction; ) - { - // Get opcode, opdata and next fields of current program node - char opcode = instruction[i + RE.offsetOpcode]; - char opdata = instruction[i + RE.offsetOpdata]; - short next = (short)instruction[i + RE.offsetNext]; - - // Display the current program node - p.print(i + ". " + nodeToString(i) + ", next = "); - - // If there's no next, say 'none', otherwise give absolute index of next node - if (next == 0) - { - p.print("none"); - } - else - { - p.print(i + next); - } - - // Move past node - i += RE.nodeSize; - - // If character class - if (opcode == RE.OP_ANYOF) - { - // Opening bracket for start of char class - p.print(", ["); - - // Show each range in the char class - int rangeCount = opdata; - for (int r = 0; r < rangeCount; r++) - { - // Get first and last chars in range - char charFirst = instruction[i++]; - char charLast = instruction[i++]; - - // Print range as X-Y, unless range encompasses only one char - if (charFirst == charLast) - { - p.print(charToString(charFirst)); - } - else - { - p.print(charToString(charFirst) + "-" + charToString(charLast)); - } - } - - // Annotate the end of the char class - p.print("]"); - } - - // If atom - if (opcode == RE.OP_ATOM) - { - // Open quote - p.print(", \""); - - // Print each character in the atom - for (int len = opdata; len-- != 0; ) - { - p.print(charToString(instruction[i++])); - } - - // Close quote - p.print("\""); - } - - // Print a newline - p.println(""); - } - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REProgram.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REProgram.java deleted file mode 100644 index f7a39ce3fe1..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REProgram.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -import java.io.Serializable; - -/** - * A class that holds compiled regular expressions. This is exposed mainly - * for use by the recompile utility (which helps you produce precompiled - * REProgram objects). You should not otherwise need to work directly with - * this class. -* - * @see RE - * @see RECompiler - * - * @author Jonathan Locke - */ -public class REProgram implements Serializable -{ - static final int OPT_HASBACKREFS = 1; - - char[] instruction; // The compiled regular expression 'program' - int lenInstruction; // The amount of the instruction buffer in use - char[] prefix; // Prefix string optimization - int flags; // Optimization flags (REProgram.OPT_*) - int maxParens = -1; - - /** - * Constructs a program object from a character array - * @param instruction Character array with RE opcode instructions in it - */ - public REProgram(char[] instruction) - { - this(instruction, instruction.length); - } - - /** - * Constructs a program object from a character array - * @param parens Count of parens in the program - * @param instruction Character array with RE opcode instructions in it - */ - public REProgram(int parens, char[] instruction) - { - this(instruction, instruction.length); - this.maxParens = parens; - } - - /** - * Constructs a program object from a character array - * @param instruction Character array with RE opcode instructions in it - * @param lenInstruction Amount of instruction array in use - */ - public REProgram(char[] instruction, int lenInstruction) - { - setInstructions(instruction, lenInstruction); - } - - /** - * Returns a copy of the current regular expression program in a character - * array that is exactly the right length to hold the program. If there is - * no program compiled yet, getInstructions() will return null. - * @return A copy of the current compiled RE program - */ - public char[] getInstructions() - { - // Ensure program has been compiled! - if (lenInstruction != 0) - { - // Return copy of program - char[] ret = new char[lenInstruction]; - System.arraycopy(instruction, 0, ret, 0, lenInstruction); - return ret; - } - return null; - } - - /** - * Sets a new regular expression program to run. It is this method which - * performs any special compile-time search optimizations. Currently only - * two optimizations are in place - one which checks for backreferences - * (so that they can be lazily allocated) and another which attempts to - * find an prefix anchor string so that substantial amounts of input can - * potentially be skipped without running the actual program. - * @param instruction Program instruction buffer - * @param lenInstruction Length of instruction buffer in use - */ - public void setInstructions(char[] instruction, int lenInstruction) - { - // Save reference to instruction array - this.instruction = instruction; - this.lenInstruction = lenInstruction; - - // Initialize other program-related variables - flags = 0; - prefix = null; - - // Try various compile-time optimizations if there's a program - if (instruction != null && lenInstruction != 0) - { - // If the first node is a branch - if (lenInstruction >= RE.nodeSize && instruction[0 + RE.offsetOpcode] == RE.OP_BRANCH) - { - // to the end node - int next = instruction[0 + RE.offsetNext]; - if (instruction[next + RE.offsetOpcode] == RE.OP_END) - { - // and the branch starts with an atom - if (lenInstruction >= (RE.nodeSize * 2) && instruction[RE.nodeSize + RE.offsetOpcode] == RE.OP_ATOM) - { - // then get that atom as an prefix because there's no other choice - int lenAtom = instruction[RE.nodeSize + RE.offsetOpdata]; - prefix = new char[lenAtom]; - System.arraycopy(instruction, RE.nodeSize * 2, prefix, 0, lenAtom); - } - } - } - - BackrefScanLoop: - - // Check for backreferences - for (int i = 0; i < lenInstruction; i += RE.nodeSize) - { - switch (instruction[i + RE.offsetOpcode]) - { - case RE.OP_ANYOF: - i += (instruction[i + RE.offsetOpdata] * 2); - break; - - case RE.OP_ATOM: - i += instruction[i + RE.offsetOpdata]; - break; - - case RE.OP_BACKREF: - flags |= OPT_HASBACKREFS; - break BackrefScanLoop; - } - } - } - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RESyntaxException.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RESyntaxException.java deleted file mode 100644 index a13f901ece4..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/RESyntaxException.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -/** - * Exception thrown to indicate a syntax error in a regular expression. - * This is a non-checked exception because you should only have problems compiling - * a regular expression during development. - * If you are making regular expresion programs dynamically then you can catch it - * if you wish. But should not be forced to. - * - * @author Jonathan Locke - * @author Jonathan Locke - * @author Jon S. Stevens - * @author Michael McCallum - */ -public class RETest -{ - // True if we want to see output from success cases - static final boolean showSuccesses = false; - - // A new line character. - static final String NEW_LINE = System.getProperty( "line.separator" ); - - // Construct a debug compiler - REDebugCompiler compiler = new REDebugCompiler(); - - /** - * Main program entrypoint. If an argument is given, it will be compiled - * and interactive matching will ensue. If no argument is given, the - * file RETest.txt will be used as automated testing input. - * @param args Command line arguments (optional regular expression) - */ - public static void main(String[] args) - { - try - { - if (!test( args )) { - System.exit(1); - } - } - catch (Exception e) - { - e.printStackTrace(); - System.exit(1); - } - } - - /** - * Testing entrypoint. - * @param args Command line arguments - * @exception Exception thrown in case of error - */ - public static boolean test( String[] args ) throws Exception - { - RETest test = new RETest(); - // Run interactive tests against a single regexp - if (args.length == 2) - { - test.runInteractiveTests(args[1]); - } - else if (args.length == 1) - { - // Run automated tests - test.runAutomatedTests(args[0]); - } - else - { - System.out.println( "Usage: RETest ([-i] [regex]) ([/path/to/testfile.txt])" ); - System.out.println( "By Default will run automated tests from file 'docs/RETest.txt' ..." ); - System.out.println(); - test.runAutomatedTests("docs/RETest.txt"); - } - return test.failures == 0; - } - - /** - * Constructor - */ - public RETest() - { - } - - /** - * Compile and test matching against a single expression - * @param expr Expression to compile and test - */ - void runInteractiveTests(String expr) - { - RE r = new RE(); - try - { - // Compile expression - r.setProgram(compiler.compile(expr)); - - // Show expression - say("" + NEW_LINE + "" + expr + "" + NEW_LINE + ""); - - // Show program for compiled expression - PrintWriter writer = new PrintWriter( System.out ); - compiler.dumpProgram( writer ); - writer.flush(); - - boolean running = true; - // Test matching against compiled expression - while ( running ) - { - // Read from keyboard - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - System.out.print("> "); - System.out.flush(); - String match = br.readLine(); - - if ( match != null ) - { - // Try a match against the keyboard input - if (r.match(match)) - { - say("Match successful."); - } - else - { - say("Match failed."); - } - - // Show subparen registers - showParens(r); - } - else - { - running = false; - System.out.println(); - } - } - } - catch (Exception e) - { - say("Error: " + e.toString()); - e.printStackTrace(); - } - } - - /** - * Exit with a fatal error. - * @param s Last famous words before exiting - */ - void die(String s) - { - say("FATAL ERROR: " + s); - System.exit(-1); - } - - /** - * Fail with an error. Will print a big failure message to System.out. - * - * @param log Output before failure - * @param s Failure description - */ - void fail(StringBuffer log, String s) - { - System.out.print(log.toString()); - fail(s); - } - - /** - * Fail with an error. Will print a big failure message to System.out. - * - * @param s Failure description - */ - void fail(String s) - { - failures++; - say("" + NEW_LINE + ""); - say("*******************************************************"); - say("********************* FAILURE! **********************"); - say("*******************************************************"); - say("" + NEW_LINE + ""); - say(s); - say(""); - // make sure the writer gets flushed. - if (compiler != null) { - PrintWriter writer = new PrintWriter( System.out ); - compiler.dumpProgram( writer ); - writer.flush(); - say("" + NEW_LINE + ""); - } - } - - /** - * Say something to standard out - * @param s What to say - */ - void say(String s) - { - System.out.println(s); - } - - /** - * Dump parenthesized subexpressions found by a regular expression matcher object - * @param r Matcher object with results to show - */ - void showParens(RE r) - { - // Loop through each paren - for (int i = 0; i < r.getParenCount(); i++) - { - // Show paren register - say("$" + i + " = " + r.getParen(i)); - } - } - - /* - * number in automated test - */ - int testCount = 0; - - /* - * Count of failures in automated test - */ - int failures = 0; - - /** - * Run automated tests in RETest.txt file (from Perl 4.0 test battery) - * @exception Exception thrown in case of error - */ - void runAutomatedTests(String testDocument) throws Exception - { - long ms = System.currentTimeMillis(); - - // Some unit tests - testPrecompiledRE(); - testSplitAndGrep(); - testSubst(); - testOther(); - - // Test from script file - File testInput = new File(testDocument); - if (! testInput.exists()) { - throw new Exception ("Could not find: " + testDocument); - } - - BufferedReader br = new BufferedReader(new FileReader(testInput)); - try - { - // While input is available, parse lines - while (br.ready()) - { - RETestCase testcase = getNextTestCase(br); - if (testcase != null) { - testcase.runTest(); - } - } - } - finally - { - br.close(); - } - - // Show match time - say(NEW_LINE + NEW_LINE + "Match time = " + (System.currentTimeMillis() - ms) + " ms."); - - // Print final results - if (failures > 0) { - say("*************** THERE ARE FAILURES! *******************"); - } - say("Tests complete. " + testCount + " tests, " + failures + " failure(s)."); - } - - /** - * Run automated unit test - * @exception Exception thrown in case of error - */ - void testOther() throws Exception - { - // Serialization test 1: Compile regexp and serialize/deserialize it - RE r = new RE("(a*)b"); - say("Serialized/deserialized (a*)b"); - ByteArrayOutputStream out = new ByteArrayOutputStream(128); - new ObjectOutputStream(out).writeObject(r); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - r = (RE)new ObjectInputStream(in).readObject(); - if (!r.match("aaab")) - { - fail("Did not match 'aaab' with deserialized RE."); - } else { - say("aaaab = true"); - showParens(r); - } - - // Serialization test 2: serialize/deserialize used regexp - out.reset(); - say("Deserialized (a*)b"); - new ObjectOutputStream(out).writeObject(r); - in = new ByteArrayInputStream(out.toByteArray()); - r = (RE)new ObjectInputStream(in).readObject(); - if (r.getParenCount() != 0) - { - fail("Has parens after deserialization."); - } - if (!r.match("aaab")) - { - fail("Did not match 'aaab' with deserialized RE."); - } else { - say("aaaab = true"); - showParens(r); - } - - // Test MATCH_CASEINDEPENDENT - r = new RE("abc(\\w*)"); - say("MATCH_CASEINDEPENDENT abc(\\w*)"); - r.setMatchFlags(RE.MATCH_CASEINDEPENDENT); - say("abc(d*)"); - if (!r.match("abcddd")) - { - fail("Did not match 'abcddd'."); - } else { - say("abcddd = true"); - showParens(r); - } - - if (!r.match("aBcDDdd")) - { - fail("Did not match 'aBcDDdd'."); - } else { - say("aBcDDdd = true"); - showParens(r); - } - - if (!r.match("ABCDDDDD")) - { - fail("Did not match 'ABCDDDDD'."); - } else { - say("ABCDDDDD = true"); - showParens(r); - } - - r = new RE("(A*)b\\1"); - r.setMatchFlags(RE.MATCH_CASEINDEPENDENT); - if (!r.match("AaAaaaBAAAAAA")) - { - fail("Did not match 'AaAaaaBAAAAAA'."); - } else { - say("AaAaaaBAAAAAA = true"); - showParens(r); - } - - r = new RE("[A-Z]*"); - r.setMatchFlags(RE.MATCH_CASEINDEPENDENT); - if (!r.match("CaBgDe12")) - { - fail("Did not match 'CaBgDe12'."); - } else { - say("CaBgDe12 = true"); - showParens(r); - } - - // Test MATCH_MULTILINE. Test for eol/bol symbols. - r = new RE("^abc$", RE.MATCH_MULTILINE); - if (!r.match("\nabc")) { - fail("\"\\nabc\" doesn't match \"^abc$\""); - } - if (!r.match("\rabc")) { - fail("\"\\rabc\" doesn't match \"^abc$\""); - } - if (!r.match("\r\nabc")) { - fail("\"\\r\\nabc\" doesn't match \"^abc$\""); - } - if (!r.match("\u0085abc")) { - fail("\"\\u0085abc\" doesn't match \"^abc$\""); - } - if (!r.match("\u2028abc")) { - fail("\"\\u2028abc\" doesn't match \"^abc$\""); - } - if (!r.match("\u2029abc")) { - fail("\"\\u2029abc\" doesn't match \"^abc$\""); - } - - // Test MATCH_MULTILINE. Test that '.' does not matches new line. - r = new RE("^a.*b$", RE.MATCH_MULTILINE); - if (r.match("a\nb")) { - fail("\"a\\nb\" matches \"^a.*b$\""); - } - if (r.match("a\rb")) { - fail("\"a\\rb\" matches \"^a.*b$\""); - } - if (r.match("a\r\nb")) { - fail("\"a\\r\\nb\" matches \"^a.*b$\""); - } - if (r.match("a\u0085b")) { - fail("\"a\\u0085b\" matches \"^a.*b$\""); - } - if (r.match("a\u2028b")) { - fail("\"a\\u2028b\" matches \"^a.*b$\""); - } - if (r.match("a\u2029b")) { - fail("\"a\\u2029b\" matches \"^a.*b$\""); - } - } - - private void testPrecompiledRE() - { - // Pre-compiled regular expression "a*b" - char[] re1Instructions = - { - 0x007c, 0x0000, 0x001a, 0x007c, 0x0000, 0x000d, 0x0041, - 0x0001, 0x0004, 0x0061, 0x007c, 0x0000, 0x0003, 0x0047, - 0x0000, 0xfff6, 0x007c, 0x0000, 0x0003, 0x004e, 0x0000, - 0x0003, 0x0041, 0x0001, 0x0004, 0x0062, 0x0045, 0x0000, - 0x0000, - }; - - REProgram re1 = new REProgram(re1Instructions); - - // Simple test of pre-compiled regular expressions - RE r = new RE(re1); - say("a*b"); - boolean result = r.match("aaab"); - say("aaab = " + result); - showParens(r); - if (!result) { - fail("\"aaab\" doesn't match to precompiled \"a*b\""); - } - - result = r.match("b"); - say("b = " + result); - showParens(r); - if (!result) { - fail("\"b\" doesn't match to precompiled \"a*b\""); - } - - result = r.match("c"); - say("c = " + result); - showParens(r); - if (result) { - fail("\"c\" matches to precompiled \"a*b\""); - } - - result = r.match("ccccaaaaab"); - say("ccccaaaaab = " + result); - showParens(r); - if (!result) { - fail("\"ccccaaaaab\" doesn't match to precompiled \"a*b\""); - } - } - - private void testSplitAndGrep() - { - String[] expected = {"xxxx", "xxxx", "yyyy", "zzz"}; - RE r = new RE("a*b"); - String[] s = r.split("xxxxaabxxxxbyyyyaaabzzz"); - for (int i = 0; i < expected.length && i < s.length; i++) { - assertEquals("Wrong splitted part", expected[i], s[i]); - } - assertEquals("Wrong number of splitted parts", expected.length, - s.length); - - r = new RE("x+"); - expected = new String[] {"xxxx", "xxxx"}; - s = r.grep(s); - for (int i = 0; i < s.length; i++) - { - say("s[" + i + "] = " + s[i]); - assertEquals("Grep fails", expected[i], s[i]); - } - assertEquals("Wrong number of string found by grep", expected.length, - s.length); - } - - private void testSubst() - { - RE r = new RE("a*b"); - String expected = "-foo-garply-wacky-"; - String actual = r.subst("aaaabfooaaabgarplyaaabwackyb", "-"); - assertEquals("Wrong result of substitution in \"a*b\"", expected, actual); - - // Test subst() with backreferences - r = new RE("http://[\\.\\w\\-\\?/~_@&=%]+"); - actual = r.subst("visit us: http://www.apache.org!", - "1234$0", RE.REPLACE_BACKREFERENCES); - assertEquals("Wrong subst() result", "visit us: 1234http://www.apache.org!", actual); - - // Test subst() with backreferences without leading characters - // before first backreference - r = new RE("(.*?)=(.*)"); - actual = r.subst("variable=value", - "$1_test_$212", RE.REPLACE_BACKREFERENCES); - assertEquals("Wrong subst() result", "variable_test_value12", actual); - - // Test subst() with NO backreferences - r = new RE("^a$"); - actual = r.subst("a", - "b", RE.REPLACE_BACKREFERENCES); - assertEquals("Wrong subst() result", "b", actual); - - // Test subst() with NO backreferences - r = new RE("^a$", RE.MATCH_MULTILINE); - actual = r.subst("\r\na\r\n", - "b", RE.REPLACE_BACKREFERENCES); - assertEquals("Wrong subst() result", "\r\nb\r\n", actual); - } - - public void assertEquals(String message, String expected, String actual) - { - if (expected != null && !expected.equals(actual) - || actual != null && !actual.equals(expected)) - { - fail(message + " (expected \"" + expected - + "\", actual \"" + actual + "\")"); - } - } - - public void assertEquals(String message, int expected, int actual) - { - if (expected != actual) { - fail(message + " (expected \"" + expected - + "\", actual \"" + actual + "\")"); - } - } - - /** - * Converts yesno string to boolean. - * @param yesno string representation of expected result - * @return true if yesno is "YES", false if yesno is "NO" - * stops program otherwise. - */ - private boolean getExpectedResult(String yesno) - { - if ("NO".equals(yesno)) - { - return false; - } - else if ("YES".equals(yesno)) - { - return true; - } - else - { - // Bad test script - die("Test script error!"); - return false; //to please javac - } - } - - /** - * Finds next test description in a given script. - * @param br BufferedReader for a script file - * @return strign tag for next test description - * @exception IOException if some io problems occured - */ - private String findNextTest(BufferedReader br) throws IOException - { - String number = ""; - - while (br.ready()) - { - number = br.readLine(); - if (number == null) - { - break; - } - number = number.trim(); - if (number.startsWith("#")) - { - break; - } - if (!number.equals("")) - { - say("Script error. Line = " + number); - System.exit(-1); - } - } - return number; - } - - /** - * Creates testcase for the next test description in the script file. - * @param br BufferedReader for script file. - * @return a new tescase or null. - * @exception IOException if some io problems occured - */ - private RETestCase getNextTestCase(BufferedReader br) throws IOException - { - // Find next re test case - final String tag = findNextTest(br); - - // Are we done? - if (!br.ready()) - { - return null; - } - - // Get expression - final String expr = br.readLine(); - - // Get test information - final String matchAgainst = br.readLine(); - final boolean badPattern = "ERR".equals(matchAgainst); - boolean shouldMatch = false; - int expectedParenCount = 0; - String[] expectedParens = null; - - if (!badPattern) { - shouldMatch = getExpectedResult(br.readLine().trim()); - if (shouldMatch) { - expectedParenCount = Integer.parseInt(br.readLine().trim()); - expectedParens = new String[expectedParenCount]; - for (int i = 0; i < expectedParenCount; i++) { - expectedParens[i] = br.readLine(); - } - } - } - - return new RETestCase(this, tag, expr, matchAgainst, badPattern, - shouldMatch, expectedParens); - } -} - -final class RETestCase -{ - final private StringBuffer log = new StringBuffer(); - final private int number; - final private String tag; // number from script file - final private String pattern; - final private String toMatch; - final private boolean badPattern; - final private boolean shouldMatch; - final private String[] parens; - final private RETest test; - private RE regexp; - - public RETestCase(RETest test, String tag, String pattern, - String toMatch, boolean badPattern, - boolean shouldMatch, String[] parens) - { - this.number = ++test.testCount; - this.test = test; - this.tag = tag; - this.pattern = pattern; - this.toMatch = toMatch; - this.badPattern = badPattern; - this.shouldMatch = shouldMatch; - if (parens != null) { - this.parens = new String[parens.length]; - for (int i = 0; i < parens.length; i++) { - this.parens[i] = parens[i]; - } - } else { - this.parens = null; - } - } - - public void runTest() - { - test.say(tag + "(" + number + "): " + pattern); - if (testCreation()) { - testMatch(); - } - } - - boolean testCreation() - { - try - { - // Compile it - regexp = new RE(); - regexp.setProgram(test.compiler.compile(pattern)); - // Expression didn't cause an expected error - if (badPattern) - { - test.fail(log, "Was expected to be an error, but wasn't."); - return false; - } - - return true; - } - // Some expressions *should* cause exceptions to be thrown - catch (Exception e) - { - // If it was supposed to be an error, report success and continue - if (badPattern) - { - log.append(" Match: ERR\n"); - success("Produces an error (" + e.toString() + "), as expected."); - return false; - } - - // Wasn't supposed to be an error - String message = (e.getMessage() == null) ? e.toString() : e.getMessage(); - test.fail(log, "Produces an unexpected exception \"" + message + "\""); - e.printStackTrace(); - } - catch (Error e) - { - // Internal error happened - test.fail(log, "Compiler threw fatal error \"" + e.getMessage() + "\""); - e.printStackTrace(); - } - - return false; - } - - private void testMatch() - { - log.append(" Match against: '" + toMatch + "'\n"); - // Try regular matching - try - { - // Match against the string - boolean result = regexp.match(toMatch); - log.append(" Matched: " + (result ? "YES" : "NO") + "\n"); - - // Check result, parens, and iterators - if (checkResult(result) && (!shouldMatch || checkParens())) - { - // test match(CharacterIterator, int) - // for every CharacterIterator implementation. - log.append(" Match using StringCharacterIterator\n"); - if (!tryMatchUsingCI(new StringCharacterIterator(toMatch))) - return; - - log.append(" Match using CharacterArrayCharacterIterator\n"); - if (!tryMatchUsingCI(new CharacterArrayCharacterIterator(toMatch.toCharArray(), 0, toMatch.length()))) - return; - - log.append(" Match using StreamCharacterIterator\n"); - if (!tryMatchUsingCI(new StreamCharacterIterator(new StringBufferInputStream(toMatch)))) - return; - - log.append(" Match using ReaderCharacterIterator\n"); - if (!tryMatchUsingCI(new ReaderCharacterIterator(new StringReader(toMatch)))) - return; - } - } - // Matcher blew it - catch(Exception e) - { - test.fail(log, "Matcher threw exception: " + e.toString()); - e.printStackTrace(); - } - // Internal error - catch(Error e) - { - test.fail(log, "Matcher threw fatal error \"" + e.getMessage() + "\""); - e.printStackTrace(); - } - } - - private boolean checkResult(boolean result) - { - // Write status - if (result == shouldMatch) { - success((shouldMatch ? "Matched" : "Did not match") - + " \"" + toMatch + "\", as expected:"); - return true; - } else { - if (shouldMatch) { - test.fail(log, "Did not match \"" + toMatch + "\", when expected to."); - } else { - test.fail(log, "Matched \"" + toMatch + "\", when not expected to."); - } - return false; - } - } - - private boolean checkParens() - { - // Show subexpression registers - if (RETest.showSuccesses) - { - test.showParens(regexp); - } - - log.append(" Paren count: " + regexp.getParenCount() + "\n"); - if (!assertEquals(log, "Wrong number of parens", parens.length, regexp.getParenCount())) - { - return false; - } - - // Check registers against expected contents - for (int p = 0; p < regexp.getParenCount(); p++) - { - log.append(" Paren " + p + ": " + regexp.getParen(p) + "\n"); - - // Compare expected result with actual - if ("null".equals(parens[p]) && regexp.getParen(p) == null) - { - // Consider "null" in test file equal to null - continue; - } - if (!assertEquals(log, "Wrong register " + p, parens[p], regexp.getParen(p))) - { - return false; - } - } - - return true; - } - - boolean tryMatchUsingCI(CharacterIterator matchAgainst) - { - try { - boolean result = regexp.match(matchAgainst, 0); - log.append(" Match: " + (result ? "YES" : "NO") + "\n"); - return checkResult(result) && (!shouldMatch || checkParens()); - } - // Matcher blew it - catch(Exception e) - { - test.fail(log, "Matcher threw exception: " + e.toString()); - e.printStackTrace(); - } - // Internal error - catch(Error e) - { - test.fail(log, "Matcher threw fatal error \"" + e.getMessage() + "\""); - e.printStackTrace(); - } - return false; - } - - public boolean assertEquals(StringBuffer log, String message, String expected, String actual) - { - if (expected != null && !expected.equals(actual) - || actual != null && !actual.equals(expected)) - { - test.fail(log, message + " (expected \"" + expected - + "\", actual \"" + actual + "\")"); - return false; - } - return true; - } - - public boolean assertEquals(StringBuffer log, String message, int expected, int actual) - { - if (expected != actual) { - test.fail(log, message + " (expected \"" + expected - + "\", actual \"" + actual + "\")"); - return false; - } - return true; - } - - /** - * Show a success - * @param s Success story - */ - void success(String s) - { - if (RETest.showSuccesses) - { - test.say("" + RETest.NEW_LINE + "-----------------------" + RETest.NEW_LINE + ""); - test.say("Expression #" + (number) + " \"" + pattern + "\" "); - test.say("Success: " + s); - } - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REUtil.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REUtil.java deleted file mode 100644 index 10907ece8d6..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/REUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -/** - * This is a class that contains utility helper methods for this package. - * - * @author Jonathan Locke - */ -public class REUtil -{ - /** complex: */ - private static final String complexPrefix = "complex:"; - - /** - * Creates a regular expression, permitting simple or complex syntax - * @param expression The expression, beginning with a prefix if it's complex or - * having no prefix if it's simple - * @param matchFlags Matching style flags - * @return The regular expression object - * @exception RESyntaxException thrown in case of error - */ - public static RE createRE(String expression, int matchFlags) throws RESyntaxException - { - if (expression.startsWith(complexPrefix)) - { - return new RE(expression.substring(complexPrefix.length()), matchFlags); - } - return new RE(RE.simplePatternToFullRegularExpression(expression), matchFlags); - } - - /** - * Creates a regular expression, permitting simple or complex syntax - * @param expression The expression, beginning with a prefix if it's complex or - * having no prefix if it's simple - * @return The regular expression object - * @exception RESyntaxException thrown in case of error - */ - public static RE createRE(String expression) throws RESyntaxException - { - return createRE(expression, RE.MATCH_NORMAL); - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/ReaderCharacterIterator.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/ReaderCharacterIterator.java deleted file mode 100644 index 7eafff44121..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/ReaderCharacterIterator.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -import java.io.Reader; -import java.io.IOException; - -/** - * Encapsulates java.io.Reader as CharacterIterator - * - * @author Ales Novak - */ -public final class ReaderCharacterIterator implements CharacterIterator -{ - /** Underlying reader */ - private final Reader reader; - - /** Buffer of read chars */ - private final StringBuffer buff; - - /** read end? */ - private boolean closed; - - /** @param reader a Reader, which is parsed */ - public ReaderCharacterIterator(Reader reader) - { - this.reader = reader; - this.buff = new StringBuffer(512); - this.closed = false; - } - - /** @return a substring */ - public String substring(int beginIndex, int endIndex) - { - try - { - ensure(endIndex); - return buff.toString().substring(beginIndex, endIndex); - } - catch (IOException e) - { - throw new StringIndexOutOfBoundsException(e.getMessage()); - } - } - - /** @return a substring */ - public String substring(int beginIndex) - { - try - { - readAll(); - return buff.toString().substring(beginIndex); - } - catch (IOException e) - { - throw new StringIndexOutOfBoundsException(e.getMessage()); - } - } - - /** @return a character at the specified position. */ - public char charAt(int pos) - { - try - { - ensure(pos); - return buff.charAt(pos); - } - catch (IOException e) - { - throw new StringIndexOutOfBoundsException(e.getMessage()); - } - } - - /** @return true iff if the specified index is after the end of the character stream */ - public boolean isEnd(int pos) - { - if (buff.length() > pos) - { - return false; - } - else - { - try - { - ensure(pos); - return (buff.length() <= pos); - } - catch (IOException e) - { - throw new StringIndexOutOfBoundsException(e.getMessage()); - } - } - } - - /** Reads n characters from the stream and appends them to the buffer */ - private int read(int n) throws IOException - { - if (closed) - { - return 0; - } - - char[] c = new char[n]; - int count = 0; - int read = 0; - - do - { - read = reader.read(c); - if (read < 0) // EOF - { - closed = true; - break; - } - count += read; - buff.append(c, 0, read); - } - while (count < n); - - return count; - } - - /** Reads rest of the stream. */ - private void readAll() throws IOException - { - while(! closed) - { - read(1000); - } - } - - /** Reads chars up to the idx */ - private void ensure(int idx) throws IOException - { - if (closed) - { - return; - } - - if (idx < buff.length()) - { - return; - } - read(idx + 1 - buff.length()); - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/StreamCharacterIterator.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/StreamCharacterIterator.java deleted file mode 100644 index e489065b79b..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/StreamCharacterIterator.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -import java.io.InputStream; -import java.io.IOException; - -/** - * Encapsulates java.io.InputStream as CharacterIterator. - * - * @author Ales Novak - */ -public final class StreamCharacterIterator implements CharacterIterator -{ - /** Underlying is */ - private final InputStream is; - - /** Buffer of read chars */ - private final StringBuffer buff; - - /** read end? */ - private boolean closed; - - /** @param is an InputStream, which is parsed */ - public StreamCharacterIterator(InputStream is) - { - this.is = is; - this.buff = new StringBuffer(512); - this.closed = false; - } - - /** @return a substring */ - public String substring(int beginIndex, int endIndex) - { - try - { - ensure(endIndex); - return buff.toString().substring(beginIndex, endIndex); - } - catch (IOException e) - { - throw new StringIndexOutOfBoundsException(e.getMessage()); - } - } - - /** @return a substring */ - public String substring(int beginIndex) - { - try - { - readAll(); - return buff.toString().substring(beginIndex); - } - catch (IOException e) - { - throw new StringIndexOutOfBoundsException(e.getMessage()); - } - } - - - /** @return a character at the specified position. */ - public char charAt(int pos) - { - try - { - ensure(pos); - return buff.charAt(pos); - } - catch (IOException e) - { - throw new StringIndexOutOfBoundsException(e.getMessage()); - } - } - - /** @return true iff if the specified index is after the end of the character stream */ - public boolean isEnd(int pos) - { - if (buff.length() > pos) - { - return false; - } - else - { - try - { - ensure(pos); - return (buff.length() <= pos); - } - catch (IOException e) - { - throw new StringIndexOutOfBoundsException(e.getMessage()); - } - } - } - - /** Reads n characters from the stream and appends them to the buffer */ - private int read(int n) throws IOException - { - if (closed) - { - return 0; - } - - int c; - int i = n; - while (--i >= 0) - { - c = is.read(); - if (c < 0) // EOF - { - closed = true; - break; - } - buff.append((char) c); - } - return n - i; - } - - /** Reads rest of the stream. */ - private void readAll() throws IOException - { - while(! closed) - { - read(1000); - } - } - - /** Reads chars up to the idx */ - private void ensure(int idx) throws IOException - { - if (closed) - { - return; - } - - if (idx < buff.length()) - { - return; - } - - read(idx + 1 - buff.length()); - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/StringCharacterIterator.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/StringCharacterIterator.java deleted file mode 100644 index bc6c859973c..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/StringCharacterIterator.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -/** - * Encapsulates String as CharacterIterator. - * - * @author Ales Novak - */ -public final class StringCharacterIterator implements CharacterIterator -{ - /** encapsulated */ - private final String src; - - /** @param src - encapsulated String */ - public StringCharacterIterator(String src) - { - this.src = src; - } - - /** @return a substring */ - public String substring(int beginIndex, int endIndex) - { - return src.substring(beginIndex, endIndex); - } - - /** @return a substring */ - public String substring(int beginIndex) - { - return src.substring(beginIndex); - } - - /** @return a character at the specified position. */ - public char charAt(int pos) - { - return src.charAt(pos); - } - - /** @return true iff if the specified index is after the end of the character stream */ - public boolean isEnd(int pos) - { - return (pos >= src.length()); - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/recompile.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/recompile.java deleted file mode 100644 index fc0cbb3b977..00000000000 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/regexp/internal/recompile.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.sun.org.apache.regexp.internal; - -import com.sun.org.apache.regexp.internal.RECompiler; -import com.sun.org.apache.regexp.internal.RESyntaxException; - -/** - * 'recompile' is a command line tool that pre-compiles one or more regular expressions - * for use with the regular expression matcher class 'RE'. For example, the command - * "java recompile a*b" produces output like this: - * - *

- *
- *    // Pre-compiled regular expression "a*b"
- *    char[] re1Instructions =
- *    {
- *        0x007c, 0x0000, 0x001a, 0x007c, 0x0000, 0x000d, 0x0041,
- *        0x0001, 0x0004, 0x0061, 0x007c, 0x0000, 0x0003, 0x0047,
- *        0x0000, 0xfff6, 0x007c, 0x0000, 0x0003, 0x004e, 0x0000,
- *        0x0003, 0x0041, 0x0001, 0x0004, 0x0062, 0x0045, 0x0000,
- *        0x0000,
- *    };
- *
- *    REProgram re1 = new REProgram(re1Instructions);
- *
- * 
- * - * By pasting this output into your code, you can construct a regular expression matcher - * (RE) object directly from the pre-compiled data (the character array re1), thus avoiding - * the overhead of compiling the expression at runtime. For example: - * - *
- *
- *    RE r = new RE(re1);
- *
- * 
- * - * @see RE - * @see RECompiler - * - * @author Jonathan Locke - */ -public class recompile -{ - /** - * Main application entrypoint. - * @param arg Command line arguments - */ - static public void main(String[] arg) - { - // Create a compiler object - RECompiler r = new RECompiler(); - - // Print usage if arguments are incorrect - if (arg.length <= 0 || arg.length % 2 != 0) - { - System.out.println("Usage: recompile "); - System.exit(0); - } - - // Loop through arguments, compiling each - for (int i = 0; i < arg.length; i += 2) - { - try - { - // Compile regular expression - String name = arg[i]; - String pattern = arg[i+1]; - String instructions = name + "PatternInstructions"; - - // Output program as a nice, formatted character array - System.out.print("\n // Pre-compiled regular expression '" + pattern + "'\n" - + " private static char[] " + instructions + " = \n {"); - - // Compile program for pattern - REProgram program = r.compile(pattern); - - // Number of columns in output - int numColumns = 7; - - // Loop through program - char[] p = program.getInstructions(); - for (int j = 0; j < p.length; j++) - { - // End of column? - if ((j % numColumns) == 0) - { - System.out.print("\n "); - } - - // Print character as padded hex number - String hex = Integer.toHexString(p[j]); - while (hex.length() < 4) - { - hex = "0" + hex; - } - System.out.print("0x" + hex + ", "); - } - - // End of program block - System.out.println("\n };"); - System.out.println("\n private static RE " + name + "Pattern = new RE(new REProgram(" + instructions + "));"); - } - catch (RESyntaxException e) - { - System.out.println("Syntax error in expression \"" + arg[i] + "\": " + e.toString()); - } - catch (Exception e) - { - System.out.println("Unexpected exception: " + e.toString()); - } - catch (Error e) - { - System.out.println("Internal error: " + e.toString()); - } - } - } -} diff --git a/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java b/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java index 8262111f444..f3b9b50397a 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java +++ b/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1345,6 +1345,15 @@ public final class XMLStreamWriterImpl extends AbstractMap implements XMLStreamW } } + /** + * Writes character reference in hex format. + */ + private void writeCharRef(int codePoint) throws IOException { + fWriter.write( "&#x" ); + fWriter.write( Integer.toHexString(codePoint) ); + fWriter.write( ';' ); + } + /** * Writes XML content to underlying writer. Escapes characters unless * escaping character feature is turned off. @@ -1368,10 +1377,14 @@ public final class XMLStreamWriterImpl extends AbstractMap implements XMLStreamW if (fEncoder != null && !fEncoder.canEncode(ch)){ fWriter.write(content, startWritePos, index - startWritePos ); - // Escape this char as underlying encoder cannot handle it - fWriter.write( "&#x" ); - fWriter.write(Integer.toHexString(ch)); - fWriter.write( ';' ); + // Check if current and next characters forms a surrogate pair + // and escape it to avoid generation of invalid xml content + if ( index != end - 1 && Character.isSurrogatePair(ch, content[index+1])) { + writeCharRef(Character.toCodePoint(ch, content[index+1])); + index++; + } else { + writeCharRef(ch); + } startWritePos = index + 1; continue; } @@ -1439,10 +1452,15 @@ public final class XMLStreamWriterImpl extends AbstractMap implements XMLStreamW if (fEncoder != null && !fEncoder.canEncode(ch)){ fWriter.write(content, startWritePos, index - startWritePos ); - // Escape this char as underlying encoder cannot handle it - fWriter.write( "&#x" ); - fWriter.write(Integer.toHexString(ch)); - fWriter.write( ';' ); + // Check if current and next characters forms a surrogate pair + // and escape it to avoid generation of invalid xml content + if ( index != end - 1 && Character.isSurrogatePair(ch, content.charAt(index+1))) { + writeCharRef(Character.toCodePoint(ch, content.charAt(index+1))); + index++; + } else { + writeCharRef(ch); + } + startWritePos = index + 1; continue; } diff --git a/jaxp/src/java.xml/share/classes/module-info.java b/jaxp/src/java.xml/share/classes/module-info.java index 3bd3fa340e7..ed48672adfc 100644 --- a/jaxp/src/java.xml/share/classes/module-info.java +++ b/jaxp/src/java.xml/share/classes/module-info.java @@ -86,5 +86,6 @@ module java.xml { uses javax.xml.transform.TransformerFactory; uses javax.xml.validation.SchemaFactory; uses javax.xml.xpath.XPathFactory; + uses org.xml.sax.XMLReader; } diff --git a/jaxp/src/java.xml/share/classes/org/xml/sax/AttributeList.java b/jaxp/src/java.xml/share/classes/org/xml/sax/AttributeList.java index 3b9f0f0f376..f79d5067c31 100644 --- a/jaxp/src/java.xml/share/classes/org/xml/sax/AttributeList.java +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/AttributeList.java @@ -93,6 +93,7 @@ package org.xml.sax; * @see org.xml.sax.DocumentHandler#startElement startElement * @see org.xml.sax.helpers.AttributeListImpl AttributeListImpl */ +@Deprecated(since="5") public interface AttributeList { diff --git a/jaxp/src/java.xml/share/classes/org/xml/sax/DocumentHandler.java b/jaxp/src/java.xml/share/classes/org/xml/sax/DocumentHandler.java index 0c8b93b85b2..91cdac156ca 100644 --- a/jaxp/src/java.xml/share/classes/org/xml/sax/DocumentHandler.java +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/DocumentHandler.java @@ -68,6 +68,7 @@ package org.xml.sax; * @see org.xml.sax.Locator * @see org.xml.sax.HandlerBase */ +@Deprecated(since="5") public interface DocumentHandler { diff --git a/jaxp/src/java.xml/share/classes/org/xml/sax/Parser.java b/jaxp/src/java.xml/share/classes/org/xml/sax/Parser.java index 099df32951b..fef6e44843b 100644 --- a/jaxp/src/java.xml/share/classes/org/xml/sax/Parser.java +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/Parser.java @@ -73,6 +73,7 @@ import java.util.Locale; * @see org.xml.sax.HandlerBase * @see org.xml.sax.InputSource */ +@Deprecated(since="5") public interface Parser { diff --git a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/NewInstance.java b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/NewInstance.java index c3516b17b5a..acd3996d014 100644 --- a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/NewInstance.java +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/NewInstance.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,8 +32,7 @@ package org.xml.sax.helpers; -import java.lang.reflect.Method; -import java.lang.reflect.InvocationTargetException; +import java.util.Objects; /** * Create a new instance of a class by name. @@ -57,31 +56,26 @@ import java.lang.reflect.InvocationTargetException; * @version 2.0.1 (sax2r2) */ class NewInstance { + private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal"; /** * Creates a new instance of the specified class name * * Package private so this code is not exposed at the API level. */ - static Object newInstance (ClassLoader classLoader, String className) + static T newInstance (Class type, ClassLoader loader, String clsName) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - // make sure we have access to restricted packages - boolean internal = false; - if (System.getSecurityManager() != null) { - if (className != null && className.startsWith(DEFAULT_PACKAGE)) { - internal = true; - } + ClassLoader classLoader = Objects.requireNonNull(loader); + String className = Objects.requireNonNull(clsName); + + if (className.startsWith(DEFAULT_PACKAGE)) { + return type.cast(new com.sun.org.apache.xerces.internal.parsers.SAXParser()); } - Class driverClass; - if (classLoader == null || internal) { - driverClass = Class.forName(className); - } else { - driverClass = classLoader.loadClass(className); - } - return driverClass.newInstance(); + Class driverClass = classLoader.loadClass(className); + return type.cast(driverClass.newInstance()); } } diff --git a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/ParserFactory.java b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/ParserFactory.java index efbefe01509..6e658867220 100644 --- a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/ParserFactory.java +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/ParserFactory.java @@ -30,8 +30,6 @@ package org.xml.sax.helpers; -import org.xml.sax.Parser; - /** * Java-specific class for dynamically loading SAX parsers. @@ -65,6 +63,8 @@ import org.xml.sax.Parser; * @author David Megginson * @version 2.0.1 (sax2r2) */ +@SuppressWarnings( "deprecation" ) +@Deprecated(since="5") public class ParserFactory { private static SecuritySupport ss = new SecuritySupport(); @@ -97,7 +97,7 @@ public class ParserFactory { * @see #makeParser(java.lang.String) * @see org.xml.sax.Parser */ - public static Parser makeParser () + public static org.xml.sax.Parser makeParser () throws ClassNotFoundException, IllegalAccessException, InstantiationException, @@ -134,14 +134,13 @@ public class ParserFactory { * @see #makeParser() * @see org.xml.sax.Parser */ - public static Parser makeParser (String className) + public static org.xml.sax.Parser makeParser (String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ClassCastException { - return (Parser) NewInstance.newInstance ( - ss.getContextClassLoader(), className); + return NewInstance.newInstance (org.xml.sax.Parser.class, ss.getClassLoader(), className); } } diff --git a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/SecuritySupport.java b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/SecuritySupport.java index ecd5696942d..3d753b1dcd3 100644 --- a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/SecuritySupport.java +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/SecuritySupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,72 +37,56 @@ import java.security.*; */ class SecuritySupport { - - ClassLoader getContextClassLoader() throws SecurityException{ - return (ClassLoader) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - ClassLoader cl = null; - //try { - cl = Thread.currentThread().getContextClassLoader(); - //} catch (SecurityException ex) { } - - if (cl == null) - cl = ClassLoader.getSystemClassLoader(); - - return cl; + /** + * Returns the current thread's context class loader, or the system class loader + * if the context class loader is null. + * @return the current thread's context class loader, or the system class loader + * @throws SecurityException + */ + ClassLoader getClassLoader() throws SecurityException{ + return AccessController.doPrivileged((PrivilegedAction)() -> { + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + if (cl == null) { + cl = ClassLoader.getSystemClassLoader(); } + + return cl; }); } String getSystemProperty(final String propName) { - return (String) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return System.getProperty(propName); - } - }); + return AccessController.doPrivileged((PrivilegedAction)() + -> System.getProperty(propName)); } FileInputStream getFileInputStream(final File file) throws FileNotFoundException { try { - return (FileInputStream) - AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Object run() throws FileNotFoundException { - return new FileInputStream(file); - } - }); + return AccessController.doPrivileged((PrivilegedExceptionAction)() -> + new FileInputStream(file)); } catch (PrivilegedActionException e) { throw (FileNotFoundException)e.getException(); } } - InputStream getResourceAsStream(final ClassLoader cl, - final String name) + + InputStream getResourceAsStream(final ClassLoader cl, final String name) { - return (InputStream) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - InputStream ris; - if (cl == null) { - ris = SecuritySupport.class.getResourceAsStream(name); - } else { - ris = cl.getResourceAsStream(name); - } - return ris; - } - }); + return AccessController.doPrivileged((PrivilegedAction) () -> { + InputStream ris; + if (cl == null) { + ris = SecuritySupport.class.getResourceAsStream(name); + } else { + ris = cl.getResourceAsStream(name); + } + return ris; + }); } boolean doesFileExist(final File f) { - return ((Boolean) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return new Boolean(f.exists()); - } - })).booleanValue(); + return (AccessController.doPrivileged((PrivilegedAction)() -> + new Boolean(f.exists()))); } } diff --git a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/XMLReaderFactory.java b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/XMLReaderFactory.java index 9635e4cf777..6b183ff7350 100644 --- a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/XMLReaderFactory.java +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/XMLReaderFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,10 +32,17 @@ package org.xml.sax.helpers; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import org.xml.sax.XMLReader; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Iterator; +import java.util.Objects; +import java.util.ServiceConfigurationError; +import java.util.ServiceLoader; import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; /** @@ -70,7 +77,11 @@ import org.xml.sax.SAXException; * @since 1.4, SAX 2.0 * @author David Megginson, David Brownell * @version 2.0.1 (sax2r2) + * + * @deprecated It is recommended to use {@link javax.xml.parsers.SAXParserFactory} + * instead. */ +@Deprecated(since="9") final public class XMLReaderFactory { /** @@ -83,47 +94,43 @@ final public class XMLReaderFactory } private static final String property = "org.xml.sax.driver"; - private static SecuritySupport ss = new SecuritySupport(); + private static final SecuritySupport ss = new SecuritySupport(); - private static String _clsFromJar = null; - private static boolean _jarread = false; /** - * Attempt to create an XMLReader from system defaults. - * In environments which can support it, the name of the XMLReader - * class is determined by trying each these options in order, and - * using the first one which succeeds: - *
    - * + * Obtains a new instance of a {@link org.xml.sax.XMLReader}. + * This method uses the following ordered lookup procedure to find and load + * the {@link org.xml.sax.XMLReader} implementation class: + *

    + *

      *
    1. If the system property {@code org.xml.sax.driver} * has a value, that is used as an XMLReader class name.
    2. + *
    3. + * Use the service-provider loading facility, defined by the + * {@link java.util.ServiceLoader} class, to attempt to locate and load an + * implementation of the service {@link org.xml.sax.XMLReader} by using the + * {@linkplain java.lang.Thread#getContextClassLoader() current thread's context class loader}. + * If the context class loader is null, the + * {@linkplain ClassLoader#getSystemClassLoader() system class loader} will + * be used. + *
    4. + *
    5. + * Deprecated. Look for a class name in the {@code META-INF/services/org.xml.sax.driver} + * file in a jar file available to the runtime.
    6. + *
    7. + *

      + * Otherwise, the system-default implementation is returned. + *

    8. + *
    * - *
  • The JAR "Services API" is used to look for a class name - * in the META-INF/services/org.xml.sax.driver file in - * jarfiles available to the runtime.
  • + * @apiNote + * The process that looks for a class name in the + * {@code META-INF/services/org.xml.sax.driver} file in a jar file does not + * conform to the specification of the service-provider loading facility + * as defined in {@link java.util.ServiceLoader} and therefore does not + * support modularization. It is deprecated as of Java SE 9 and subject to + * removal in a future release. * - *
  • SAX parser distributions are strongly encouraged to provide - * a default XMLReader class name that will take effect only when - * previous options (on this list) are not successful.
  • - * - *
  • Finally, if {@link ParserFactory#makeParser()} can - * return a system default SAX1 parser, that parser is wrapped in - * a {@link ParserAdapter}. (This is a migration aid for SAX1 - * environments, where the {@code org.xml.sax.parser} system - * property will often be usable.)
  • - *
- * - *

In environments such as small embedded systems, which can not - * support that flexibility, other mechanisms to determine the default - * may be used. - * - *

Note that many Java environments allow system properties to be - * initialized on a command line. This means that in most cases - * setting a good value for that property ensures that calls to this - * method will succeed, except when security policies intervene. - * This will also maximize application portability to older SAX - * environments, with less robust implementations of this method. - * - * @return A new XMLReader. + * @return a new XMLReader. * @exception org.xml.sax.SAXException If no default XMLReader class * can be identified and instantiated. * @see #createXMLReader(java.lang.String) @@ -132,7 +139,7 @@ final public class XMLReaderFactory throws SAXException { String className = null; - ClassLoader cl = ss.getContextClassLoader(); + ClassLoader cl = ss.getClassLoader(); // 1. try the JVM-instance-wide system property try { @@ -140,62 +147,26 @@ final public class XMLReaderFactory } catch (RuntimeException e) { /* continue searching */ } - // 2. if that fails, try META-INF/services/ + // 2. try the ServiceLoader if (className == null) { - if (!_jarread) { - _jarread = true; - String service = "META-INF/services/" + property; - InputStream in; - BufferedReader reader; - - try { - if (cl != null) { - in = ss.getResourceAsStream(cl, service); - - // If no provider found then try the current ClassLoader - if (in == null) { - cl = null; - in = ss.getResourceAsStream(cl, service); - } - } else { - // No Context ClassLoader, try the current ClassLoader - in = ss.getResourceAsStream(cl, service); - } - - if (in != null) { - reader = new BufferedReader (new InputStreamReader (in, "UTF8")); - _clsFromJar = reader.readLine (); - in.close (); - } - } catch (Exception e) { - } + final XMLReader provider = findServiceProvider(XMLReader.class, cl); + if (provider != null) { + return provider; } - className = _clsFromJar; } - // 3. Distro-specific fallback + // 3. try META-INF/services/org.xml.sax.driver. This old process allows + // legacy providers to be found if (className == null) { -// BEGIN DISTRIBUTION-SPECIFIC - - // EXAMPLE: - // className = "com.example.sax.XmlReader"; - // or a $JAVA_HOME/jre/lib/*properties setting... - className = "com.sun.org.apache.xerces.internal.parsers.SAXParser"; - -// END DISTRIBUTION-SPECIFIC + className = jarLookup(cl); } - // do we know the XMLReader implementation class yet? - if (className != null) - return loadClass (cl, className); - - // 4. panic -- adapt any SAX1 parser - try { - return new ParserAdapter (ParserFactory.makeParser ()); - } catch (Exception e) { - throw new SAXException ("Can't create default XMLReader; " - + "is system property org.xml.sax.driver set?"); + // 4. Distro-specific fallback + if (className == null) { + return new com.sun.org.apache.xerces.internal.parsers.SAXParser(); } + + return loadClass (cl, className); } @@ -217,14 +188,14 @@ final public class XMLReaderFactory public static XMLReader createXMLReader (String className) throws SAXException { - return loadClass (ss.getContextClassLoader(), className); + return loadClass (ss.getClassLoader(), className); } private static XMLReader loadClass (ClassLoader loader, String className) throws SAXException { try { - return (XMLReader) NewInstance.newInstance (loader, className); + return NewInstance.newInstance (XMLReader.class, loader, className); } catch (ClassNotFoundException e1) { throw new SAXException("SAX2 driver class " + className + " not found", e1); @@ -240,4 +211,64 @@ final public class XMLReaderFactory " does not implement XMLReader", e4); } } + + /** + * Locates a provider by directly reading the jar service file. + * @param loader the ClassLoader to be used to read the service file + * @return the name of the provider, or null if nothing is found + */ + private static String jarLookup(final ClassLoader loader) { + final ClassLoader cl = Objects.requireNonNull(loader); + String clsFromJar = null; + String service = "META-INF/services/" + property; + InputStream in; + BufferedReader reader; + + try { + in = ss.getResourceAsStream(cl, service); + + // If no provider found then try the current ClassLoader + if (in == null) { + in = ss.getResourceAsStream(null, service); + } + + if (in != null) { + reader = new BufferedReader (new InputStreamReader (in, "UTF8")); + clsFromJar = reader.readLine (); + in.close (); + } + } catch (IOException e) { + } + return clsFromJar; + } + + /* + * Try to find provider using the ServiceLoader API + * + * @param type Base class / Service interface of the factory to find. + * + * @return instance of provider class if found or null + */ + private static T findServiceProvider(final Class type, final ClassLoader loader) + throws SAXException { + ClassLoader cl = Objects.requireNonNull(loader); + try { + return AccessController.doPrivileged((PrivilegedAction) () -> { + final ServiceLoader serviceLoader; + serviceLoader = ServiceLoader.load(type, cl); + final Iterator iterator = serviceLoader.iterator(); + if (iterator.hasNext()) { + return iterator.next(); + } else { + return null; + } + }); + } catch(ServiceConfigurationError e) { + final RuntimeException x = new RuntimeException( + "Provider for " + type + " cannot be created", e); + throw new SAXException("Provider for " + type + " cannot be created", x); + + } + } + } diff --git a/jaxp/test/Makefile b/jaxp/test/Makefile index 912f2b98406..bf94d252889 100644 --- a/jaxp/test/Makefile +++ b/jaxp/test/Makefile @@ -76,14 +76,20 @@ endif TEST_ROOT := $(shell $(PWD)) # Root of all test results -ifdef ALT_OUTPUTDIR - ABS_OUTPUTDIR = $(shell $(CD) $(ALT_OUTPUTDIR) && $(PWD)) +ifdef TEST_OUTPUT_DIR + $(shell $(MKDIR) -p $(TEST_OUTPUT_DIR)/jtreg) + ABS_TEST_OUTPUT_DIR := \ + $(shell $(CD) $(TEST_OUTPUT_DIR)/jtreg && $(PWD)) else - ABS_OUTPUTDIR = $(shell $(CD) $(TEST_ROOT)/.. && $(PWD)) -endif + ifdef ALT_OUTPUTDIR + ABS_OUTPUTDIR = $(shell $(CD) $(ALT_OUTPUTDIR) && $(PWD)) + else + ABS_OUTPUTDIR = $(shell $(CD) $(TEST_ROOT)/.. && $(PWD)) + endif -ABS_PLATFORM_BUILD_ROOT = $(ABS_OUTPUTDIR) -ABS_TEST_OUTPUT_DIR := $(ABS_PLATFORM_BUILD_ROOT)/testoutput/$(UNIQUE_DIR) + ABS_PLATFORM_BUILD_ROOT = $(ABS_OUTPUTDIR) + ABS_TEST_OUTPUT_DIR := $(ABS_PLATFORM_BUILD_ROOT)/testoutput/$(UNIQUE_DIR) +endif # Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test) ifndef PRODUCT_HOME diff --git a/jaxp/test/ProblemList.txt b/jaxp/test/ProblemList.txt index c9aaf13d1fb..b6b8b41ba4f 100644 --- a/jaxp/test/ProblemList.txt +++ b/jaxp/test/ProblemList.txt @@ -29,3 +29,5 @@ javax/xml/jaxp/isolatedjdk/catalog/PropertiesTest.sh generic-all # 8150145 javax/xml/jaxp/unittest/common/TransformationWarningsTest.java generic-all +# 8156508 +javax/xml/jaxp/unittest/stream/FactoryFindTest.java generic-all diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/BasicModularXMLParserTest.java b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/BasicModularXMLParserTest.java index c3403f9d1d0..c2bf928ba1f 100644 --- a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/BasicModularXMLParserTest.java +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/BasicModularXMLParserTest.java @@ -38,7 +38,7 @@ import org.testng.annotations.Test; * @library /javax/xml/jaxp/libs * @build jdk.testlibrary.* * @run testng BasicModularXMLParserTest - * @bug 8078820 + * @bug 8078820 8156119 * @summary Tests JAXP lib can instantiate the following interfaces * with customized provider module on boot layer * @@ -51,6 +51,7 @@ import org.testng.annotations.Test; * javax.xml.transform.TransformerFactory * javax.xml.validation.SchemaFactory * javax.xml.xpath.XPathFactory + * org.xml.sax.XMLReader */ @Test diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/LayerModularXMLParserTest.java b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/LayerModularXMLParserTest.java index 45f24001278..3e157679b9e 100644 --- a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/LayerModularXMLParserTest.java +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/LayerModularXMLParserTest.java @@ -50,7 +50,7 @@ import jdk.testlibrary.CompilerUtils; * @library /javax/xml/jaxp/libs * @build jdk.testlibrary.* * @run testng LayerModularXMLParserTest - * @bug 8078820 + * @bug 8078820 8156119 * @summary Tests JAXP lib works with layer and TCCL */ @@ -75,7 +75,7 @@ public class LayerModularXMLParserTest { * services provided by provider2 */ private static final String[] services2 = { "javax.xml.datatype.DatatypeFactory", - "javax.xml.stream.XMLEventFactory" }; + "javax.xml.stream.XMLEventFactory", "org.xml.sax.XMLReader" }; /* * Compiles all modules used by the test diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/XMLReaderFactoryTest.java b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/XMLReaderFactoryTest.java new file mode 100644 index 00000000000..ef3507fe9d1 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/XMLReaderFactoryTest.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import jdk.testlibrary.CompilerUtils; + +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; + +/* + * @test + * @library /javax/xml/jaxp/libs + * @build jdk.testlibrary.* + * @run testng XMLReaderFactoryTest + * @bug 8152912 8015099 8156119 + * @summary Tests XMLReaderFactory can work as ServiceLoader compliant, as well as backward compatible + */ + +@Test +public class XMLReaderFactoryTest { + private static final String TEST_SRC = System.getProperty("test.src"); + + private static final Path SRC_DIR = Paths.get(TEST_SRC, "src").resolve("xmlprovider3"); + private static final Path CLASSES_DIR = Paths.get("classes"); + private static final Path LEGACY_DIR = CLASSES_DIR.resolve("legacy"); + private static final Path SERVICE_DIR = CLASSES_DIR.resolve("service"); + + // resources to copy to the class path + private static final String LEGACY_SERVICE_FILE = "legacy/META-INF/services/org.xml.sax.driver"; + private static final String SERVICE_FILE = "service/META-INF/services/org.xml.sax.XMLReader"; + + /* + * Compile class and copy service files + */ + @BeforeTest + public void setup() throws Exception { + setup(LEGACY_DIR, LEGACY_SERVICE_FILE); + setup(SERVICE_DIR, SERVICE_FILE); + } + + private void setup(Path dest, String serviceFile) throws Exception { + Files.createDirectories(dest); + assertTrue(CompilerUtils.compile(SRC_DIR, dest)); + + Path file = Paths.get(serviceFile.replace('/', File.separatorChar)); + Path source = SRC_DIR.resolve(file); + Path target = CLASSES_DIR.resolve(file); + Files.createDirectories(target.getParent()); + Files.copy(source, target); + + } + + public void testService() throws Exception { + ClassLoader clBackup = Thread.currentThread().getContextClassLoader(); + try { + URL[] classUrls = { SERVICE_DIR.toUri().toURL() }; + URLClassLoader loader = new URLClassLoader(classUrls, ClassLoader.getSystemClassLoader().getParent()); + + // set TCCL and try locating the provider + Thread.currentThread().setContextClassLoader(loader); + XMLReader reader = XMLReaderFactory.createXMLReader(); + assertEquals(reader.getClass().getName(), "xp3.XMLReaderImpl"); + } finally { + Thread.currentThread().setContextClassLoader(clBackup); + } + } + + public void testLegacy() throws Exception { + ClassLoader clBackup = Thread.currentThread().getContextClassLoader(); + try { + URL[] classUrls = { LEGACY_DIR.toUri().toURL() }; + URLClassLoader loader = new URLClassLoader(classUrls, ClassLoader.getSystemClassLoader().getParent()); + + // set TCCL and try locating the provider + Thread.currentThread().setContextClassLoader(loader); + XMLReader reader1 = XMLReaderFactory.createXMLReader(); + assertEquals(reader1.getClass().getName(), "xp3.XMLReaderImpl"); + + // now point to a random URL + Thread.currentThread().setContextClassLoader( + new URLClassLoader(new URL[0], ClassLoader.getSystemClassLoader().getParent())); + // ClassNotFoundException if also trying to load class of reader1, which + // would be the case before 8152912 + XMLReader reader2 = XMLReaderFactory.createXMLReader(); + assertEquals(reader2.getClass().getName(), "com.sun.org.apache.xerces.internal.parsers.SAXParser"); + } finally { + Thread.currentThread().setContextClassLoader(clBackup); + } + } +} diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/test/test/XMLFactoryHelper.java b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/test/test/XMLFactoryHelper.java index 6dfaec5cedf..4f4a530a288 100644 --- a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/test/test/XMLFactoryHelper.java +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/test/test/XMLFactoryHelper.java @@ -31,6 +31,8 @@ import java.lang.System; import java.util.Iterator; import java.util.ServiceLoader; +import org.xml.sax.helpers.XMLReaderFactory; + public class XMLFactoryHelper { /* * instantiate a xml factory by reflection e.g. @@ -41,7 +43,9 @@ public class XMLFactoryHelper { try { // set thread context class loader to module class loader Thread.currentThread().setContextClassLoader(XMLFactoryHelper.class.getClassLoader()); - if (serviceName.equals("javax.xml.validation.SchemaFactory")) + if (serviceName.equals("org.xml.sax.XMLReader")) + return XMLReaderFactory.createXMLReader(); + else if (serviceName.equals("javax.xml.validation.SchemaFactory")) return Class.forName(serviceName).getMethod("newInstance", String.class) .invoke(null, W3C_XML_SCHEMA_NS_URI); else diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/unnamed/Main.java b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/unnamed/Main.java index cb0a37e916b..ee3e3e004d5 100644 --- a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/unnamed/Main.java +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/unnamed/Main.java @@ -30,6 +30,8 @@ import java.util.HashSet; import java.util.Set; import java.util.stream.Stream; +import org.xml.sax.helpers.XMLReaderFactory; + public class Main { /* * @param args, the names of provider modules, which have been loaded @@ -69,7 +71,9 @@ public class Main { */ private static Object instantiateXMLService(String serviceName) { try { - if (serviceName.equals("javax.xml.validation.SchemaFactory")) + if (serviceName.equals("org.xml.sax.XMLReader")) + return XMLReaderFactory.createXMLReader(); + else if (serviceName.equals("javax.xml.validation.SchemaFactory")) return Class.forName(serviceName).getMethod("newInstance", String.class) .invoke(null, W3C_XML_SCHEMA_NS_URI); else @@ -102,6 +106,7 @@ public class Main { "javax.xml.parsers.DocumentBuilderFactory", "javax.xml.parsers.SAXParserFactory", "javax.xml.stream.XMLEventFactory", "javax.xml.stream.XMLInputFactory", "javax.xml.stream.XMLOutputFactory", "javax.xml.transform.TransformerFactory", - "javax.xml.validation.SchemaFactory", "javax.xml.xpath.XPathFactory" }; + "javax.xml.validation.SchemaFactory", "javax.xml.xpath.XPathFactory", + "org.xml.sax.XMLReader"}; } diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider2/module-info.java b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider2/module-info.java index d55645e58e9..c8bc623aa7a 100644 --- a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider2/module-info.java +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider2/module-info.java @@ -26,4 +26,5 @@ module xmlprovider2 { provides javax.xml.datatype.DatatypeFactory with xp2.DatatypeFactoryImpl; provides javax.xml.stream.XMLEventFactory with xp2.XMLEventFactoryImpl; + provides org.xml.sax.XMLReader with xp2.XMLReaderImpl; } \ No newline at end of file diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider2/xp2/XMLReaderImpl.java b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider2/xp2/XMLReaderImpl.java new file mode 100644 index 00000000000..0b6276f818e --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider2/xp2/XMLReaderImpl.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package xp2; + +import java.io.IOException; + +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.XMLReader; + +public class XMLReaderImpl implements XMLReader { + + @Override + public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { + return false; + } + + @Override + public void setFeature(String name, boolean value) throws SAXNotRecognizedException, + SAXNotSupportedException { + } + + @Override + public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { + return null; + } + + @Override + public void setProperty(String name, Object value) throws SAXNotRecognizedException, + SAXNotSupportedException { + } + + @Override + public void setEntityResolver(EntityResolver resolver) { + // TODO Auto-generated method stub + + } + + @Override + public EntityResolver getEntityResolver() { + return null; + } + + @Override + public void setDTDHandler(DTDHandler handler) { + } + + @Override + public DTDHandler getDTDHandler() { + return null; + } + + @Override + public void setContentHandler(ContentHandler handler) { + } + + @Override + public ContentHandler getContentHandler() { + return null; + } + + @Override + public void setErrorHandler(ErrorHandler handler) { + } + + @Override + public ErrorHandler getErrorHandler() { + return null; + } + + @Override + public void parse(InputSource input) throws IOException, SAXException { + } + + @Override + public void parse(String systemId) throws IOException, SAXException { + } + +} diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/legacy/META-INF/services/org.xml.sax.driver b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/legacy/META-INF/services/org.xml.sax.driver new file mode 100644 index 00000000000..ef9ddc888ef --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/legacy/META-INF/services/org.xml.sax.driver @@ -0,0 +1 @@ +xp3.XMLReaderImpl diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/service/META-INF/services/org.xml.sax.XMLReader b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/service/META-INF/services/org.xml.sax.XMLReader new file mode 100644 index 00000000000..ef9ddc888ef --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/service/META-INF/services/org.xml.sax.XMLReader @@ -0,0 +1 @@ +xp3.XMLReaderImpl diff --git a/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/xp3/XMLReaderImpl.java b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/xp3/XMLReaderImpl.java new file mode 100644 index 00000000000..80738a961c1 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/module/ServiceProviderTest/src/xmlprovider3/xp3/XMLReaderImpl.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package xp3; + +import java.io.IOException; + +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.XMLReader; + +public class XMLReaderImpl implements XMLReader { + + @Override + public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { + return false; + } + + @Override + public void setFeature(String name, boolean value) throws SAXNotRecognizedException, + SAXNotSupportedException { + } + + @Override + public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { + return null; + } + + @Override + public void setProperty(String name, Object value) throws SAXNotRecognizedException, + SAXNotSupportedException { + } + + @Override + public void setEntityResolver(EntityResolver resolver) { + // TODO Auto-generated method stub + + } + + @Override + public EntityResolver getEntityResolver() { + return null; + } + + @Override + public void setDTDHandler(DTDHandler handler) { + } + + @Override + public DTDHandler getDTDHandler() { + return null; + } + + @Override + public void setContentHandler(ContentHandler handler) { + } + + @Override + public ContentHandler getContentHandler() { + return null; + } + + @Override + public void setErrorHandler(ErrorHandler handler) { + } + + @Override + public ErrorHandler getErrorHandler() { + return null; + } + + @Override + public void parse(InputSource input) throws IOException, SAXException { + } + + @Override + public void parse(String systemId) throws IOException, SAXException { + } + +} diff --git a/jaxp/test/javax/xml/jaxp/unittest/stream/XMLStreamWriterTest/SurrogatesTest.java b/jaxp/test/javax/xml/jaxp/unittest/stream/XMLStreamWriterTest/SurrogatesTest.java new file mode 100644 index 00000000000..a24c6b8b54f --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/stream/XMLStreamWriterTest/SurrogatesTest.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package stream.XMLStreamWriterTest; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStreamWriter; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import org.testng.Assert; +import org.testng.annotations.Test; +import org.testng.annotations.DataProvider; + +/* + * @test + * @bug 8145974 + * @modules javax.xml + * @summary Check that XMLStreamWriter generates valid xml with surrogate pair + * used within element text + */ + +public class SurrogatesTest { + + // Test that valid surrogate characters can be written/readen by xml stream + // reader/writer + @Test(dataProvider = "validData") + public void xmlWithValidSurrogatesTest(String content) + throws Exception { + generateAndReadXml(content); + } + + // Test that unbalanced surrogate character will + @Test(dataProvider = "invalidData", + expectedExceptions = XMLStreamException.class) + public void xmlWithUnbalancedSurrogatesTest(String content) + throws Exception { + generateAndReadXml(content); + } + + // Generates xml content with XMLStreamWriter and read it to check + // for correctness of xml and generated data + void generateAndReadXml(String content) throws Exception { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + XMLOutputFactory factory = XMLOutputFactory.newInstance(); + OutputStreamWriter streamWriter = new OutputStreamWriter(stream); + XMLStreamWriter writer = factory.createXMLStreamWriter(streamWriter); + + // Generate xml with selected stream writer type + generateXML(writer, content); + String output = stream.toString(); + System.out.println("Generated xml: " + output); + // Read generated xml with StAX parser + readXML(output.getBytes(), content); + } + + // Generates XML with provided xml stream writer. Provided string + // is inserted into xml twice: with usage of writeCharacters( String ) + // and writeCharacters( char [], int , int ) + private void generateXML(XMLStreamWriter writer, String sequence) + throws XMLStreamException { + char[] seqArr = sequence.toCharArray(); + writer.writeStartDocument(); + writer.writeStartElement("root"); + + // Use writeCharacters( String ) to write characters + writer.writeStartElement("writeCharactersWithString"); + writer.writeCharacters(sequence); + writer.writeEndElement(); + + // Use writeCharacters( char [], int , int ) to write characters + writer.writeStartElement("writeCharactersWithArray"); + writer.writeCharacters(seqArr, 0, seqArr.length); + writer.writeEndElement(); + + // Close root element and document + writer.writeEndElement(); + writer.writeEndDocument(); + writer.flush(); + writer.close(); + } + + // Reads generated XML data and check if it contains expected + // text in writeCharactersWithString and writeCharactersWithArray + // elements + private void readXML(byte[] xmlData, String expectedContent) + throws Exception { + InputStream stream = new ByteArrayInputStream(xmlData); + XMLInputFactory factory = XMLInputFactory.newInstance(); + XMLStreamReader xmlReader + = factory.createXMLStreamReader(stream); + boolean inTestElement = false; + StringBuilder sb = new StringBuilder(); + while (xmlReader.hasNext()) { + String ename; + switch (xmlReader.getEventType()) { + case XMLStreamConstants.START_ELEMENT: + ename = xmlReader.getLocalName(); + if (ename.equals("writeCharactersWithString") + || ename.equals("writeCharactersWithArray")) { + inTestElement = true; + } + break; + case XMLStreamConstants.END_ELEMENT: + ename = xmlReader.getLocalName(); + if (ename.equals("writeCharactersWithString") + || ename.equals("writeCharactersWithArray")) { + inTestElement = false; + String content = sb.toString(); + System.out.println(ename + " text:'" + content + "' expected:'" + expectedContent+"'"); + Assert.assertEquals(content, expectedContent); + sb.setLength(0); + } + break; + case XMLStreamConstants.CHARACTERS: + if (inTestElement) { + sb.append(xmlReader.getText()); + } + break; + } + xmlReader.next(); + } + } + + @DataProvider(name = "validData") + Object[][] getValidData() { + return new Object[][] { + {"Don't Worry Be \uD83D\uDE0A"}, + {"BMP characters \uE000\uFFFD"}, + {"Simple text"}, + }; + } + + @DataProvider(name = "invalidData") + Object[][] getInvalidData() { + return new Object[][] { + {"Unbalanced surrogate \uD83D"}, + {"Unbalanced surrogate \uD83Dis here"}, + {"Surrogate with followup BMP\uD83D\uFFF9"}, + }; + } +} diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 514c6a8ced9..4d92200f4dc 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -363,3 +363,4 @@ b314bb02182b9ca94708a91f312c377f5435f740 jdk-9+114 4ff86e5489e4c0513dadfa69def8601c110ca5cd jdk-9+115 529f0bf896e58525614d863e283ad155531941cb jdk-9+116 58265b39fc74b932bda4d4f4649c530a89f55c4e jdk-9+117 +6ba73d04589ccc0705a5d8ae5111b63632b6ad20 jdk-9+118 diff --git a/jdk/.hgtags b/jdk/.hgtags index 2b6d80debed..b7e36c324d5 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -361,3 +361,4 @@ bb8379287f3736f38c52b2d1418784e2592461d1 jdk-9+114 baeb5edb38939cdb78ae0ac6f4fd368465cbf188 jdk-9+116 4da0f73ce03aaf245b92cc040cc0ab0e3fa54dc2 jdk-9+117 e1eba5cfa5cc8c66d524396a05323dc93568730a jdk-9+118 +bad3f8a33db271a6143ba6eac0c8bd5bbd942417 jdk-9+119 diff --git a/jdk/make/Import.gmk b/jdk/make/Import.gmk index d479b095514..29e4ce0f19e 100644 --- a/jdk/make/Import.gmk +++ b/jdk/make/Import.gmk @@ -112,7 +112,7 @@ $(BASE_INSTALL_LIBRARIES_HERE)/server/%$(SHARED_LIBRARY_SUFFIX): $(BASE_INSTALL_ $(LN) -s ../$(@F) $@ ifeq ($(OPENJDK_TARGET_OS), macosx) - $(BASE_INSTALL_LIBRARIES_HERE)/server/%.dSYM : $(BASE_INSTALL_LIBRARIES_HERE)/%.dSYM + $(BASE_INSTALL_LIBRARIES_HERE)/server/%.dSYM: $(MKDIR) -p $(@D) $(RM) $@ $(LN) -s ../$(@F) $@ diff --git a/jdk/make/data/currency/CurrencyData.properties b/jdk/make/data/currency/CurrencyData.properties index 808d01d6958..0288b04390b 100644 --- a/jdk/make/data/currency/CurrencyData.properties +++ b/jdk/make/data/currency/CurrencyData.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,8 @@ # Version of the currency data format. # 1: initial # 2: Change in minor unit (allowing 4-9 digits) -formatVersion=2 +# 3: Change in the order of special case and other currency entries +formatVersion=3 # Version of the currency code information in this class. # It is a serial number that accompanies with each amendment. diff --git a/jdk/make/lib/Awt2dLibraries.gmk b/jdk/make/lib/Awt2dLibraries.gmk index 73b452f43f6..b4c6f5e20a3 100644 --- a/jdk/make/lib/Awt2dLibraries.gmk +++ b/jdk/make/lib/Awt2dLibraries.gmk @@ -96,10 +96,7 @@ ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_ARCH), solaris-sparc) mlib_c_ImageAffine_BL.c \ mlib_c_ImageAffine_BL_S16.c \ mlib_c_ImageAffine_BL_U16.c \ - mlib_c_ImageAffineIndex_BC.c \ - mlib_c_ImageAffineIndex_BL.c \ mlib_c_ImageAffine_NN.c \ - mlib_c_ImageBlendTable.c \ mlib_c_ImageConvClearEdge.c \ mlib_c_ImageConvCopyEdge.c \ mlib_c_ImageConv_f.c \ @@ -107,14 +104,6 @@ ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_ARCH), solaris-sparc) mlib_c_ImageCopy.c \ mlib_c_ImageLookUp.c \ mlib_c_ImageLookUp_f.c \ - mlib_v_ImageChannelExtract.c \ - mlib_v_ImageChannelExtract_f.c \ - mlib_v_ImageChannelInsert_34.c \ - mlib_v_ImageChannelInsert.c \ - mlib_v_ImageConvIndex3_8_16nw.c \ - mlib_v_ImageConvIndex3_8_8nw.c \ - mlib_v_ImageCopy.c \ - mlib_v_ImageCopy_blk.s \ # LIBMLIB_IMAGE_V_CFLAGS += $(filter-out -DMLIB_NO_LIBSUNMATH, $(BUILD_LIBMLIB_CFLAGS)) diff --git a/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java b/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java index f15834202b0..b72ac9225b1 100644 --- a/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java +++ b/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -584,7 +584,9 @@ public class CLDRConverter { String[] data = (String[])e[1]; if (map.get(TIMEZONE_ID_PREFIX + tzid) == null && - handlerMetaZones.get(tzid) == null) { + handlerMetaZones.get(tzid) == null || + handlerMetaZones.get(tzid) != null && + map.get(METAZONE_ID_PREFIX + handlerMetaZones.get(tzid)) == null) { // First, check the CLDR meta key Optional> cldrMeta = handlerMetaZones.getData().entrySet().stream() diff --git a/jdk/make/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java b/jdk/make/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java index cc125638c96..ae861c5abe5 100644 --- a/jdk/make/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java +++ b/jdk/make/src/classes/build/tools/generatecurrencydata/GenerateCurrencyData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -121,7 +121,7 @@ public class GenerateCurrencyData { private static final int maxOtherCurrencies = 128; private static int otherCurrenciesCount = 0; - private static StringBuffer otherCurrencies = new StringBuffer(); + private static String[] otherCurrencies = new String[maxOtherCurrencies]; private static int[] otherCurrenciesDefaultFractionDigits = new int[maxOtherCurrencies]; private static int[] otherCurrenciesNumericCode= new int[maxOtherCurrencies]; @@ -318,10 +318,7 @@ public class GenerateCurrencyData { if (otherCurrenciesCount == maxOtherCurrencies) { throw new RuntimeException("too many other currencies"); } - if (otherCurrencies.length() > 0) { - otherCurrencies.append('-'); - } - otherCurrencies.append(currencyCode); + otherCurrencies[otherCurrenciesCount] = currencyCode; otherCurrenciesDefaultFractionDigits[otherCurrenciesCount] = getDefaultFractionDigits(currencyCode); otherCurrenciesNumericCode[otherCurrenciesCount] = getNumericCode(currencyCode); otherCurrenciesCount++; @@ -350,35 +347,41 @@ public class GenerateCurrencyData { out.writeInt(Integer.parseInt(dataVersion)); writeIntArray(mainTable, mainTable.length); out.writeInt(specialCaseCount); - writeLongArray(specialCaseCutOverTimes, specialCaseCount); - writeStringArray(specialCaseOldCurrencies, specialCaseCount); - writeStringArray(specialCaseNewCurrencies, specialCaseCount); - writeIntArray(specialCaseOldCurrenciesDefaultFractionDigits, specialCaseCount); - writeIntArray(specialCaseNewCurrenciesDefaultFractionDigits, specialCaseCount); - writeIntArray(specialCaseOldCurrenciesNumericCode, specialCaseCount); - writeIntArray(specialCaseNewCurrenciesNumericCode, specialCaseCount); + writeSpecialCaseEntries(); out.writeInt(otherCurrenciesCount); - out.writeUTF(otherCurrencies.toString()); - writeIntArray(otherCurrenciesDefaultFractionDigits, otherCurrenciesCount); - writeIntArray(otherCurrenciesNumericCode, otherCurrenciesCount); + writeOtherCurrencies(); } private static void writeIntArray(int[] ia, int count) throws IOException { - for (int i = 0; i < count; i ++) { + for (int i = 0; i < count; i++) { out.writeInt(ia[i]); } } - private static void writeLongArray(long[] la, int count) throws IOException { - for (int i = 0; i < count; i ++) { - out.writeLong(la[i]); + private static void writeSpecialCaseEntries() throws IOException { + for (int index = 0; index < specialCaseCount; index++) { + out.writeLong(specialCaseCutOverTimes[index]); + String str = (specialCaseOldCurrencies[index] != null) + ? specialCaseOldCurrencies[index] : ""; + out.writeUTF(str); + str = (specialCaseNewCurrencies[index] != null) + ? specialCaseNewCurrencies[index] : ""; + out.writeUTF(str); + out.writeInt(specialCaseOldCurrenciesDefaultFractionDigits[index]); + out.writeInt(specialCaseNewCurrenciesDefaultFractionDigits[index]); + out.writeInt(specialCaseOldCurrenciesNumericCode[index]); + out.writeInt(specialCaseNewCurrenciesNumericCode[index]); } } - private static void writeStringArray(String[] sa, int count) throws IOException { - for (int i = 0; i < count; i ++) { - String str = (sa[i] != null) ? sa[i] : ""; + private static void writeOtherCurrencies() throws IOException { + for (int index = 0; index < otherCurrenciesCount; index++) { + String str = (otherCurrencies[index] != null) + ? otherCurrencies[index] : ""; out.writeUTF(str); + out.writeInt(otherCurrenciesDefaultFractionDigits[index]); + out.writeInt(otherCurrenciesNumericCode[index]); } } + } diff --git a/jdk/src/demo/share/jvmti/index.html b/jdk/src/demo/share/jvmti/index.html index 25440a104d9..5791b8b046f 100644 --- a/jdk/src/demo/share/jvmti/index.html +++ b/jdk/src/demo/share/jvmti/index.html @@ -415,7 +415,7 @@ Additional information can also be found by doing a search on "jvmti" at Various technical articles are also available through this website. And don't forget the Java Tutorials at -http://java.sun.com/docs/books/tutorial +http://docs.oracle.com/javase/tutorial for getting a quick start on all the various interfaces.

Comments and Feedback

diff --git a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Constants.java b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Constants.java index fee0b800f2d..50dc8020b25 100644 --- a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Constants.java +++ b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/Constants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,9 +43,10 @@ class Constants { 1.0 to 1.3.X 45,3 1.4 to 1.4.X 46,0 1.5 to 1.5.X 49,0 - 1.6 to 1.5.x 50,0 - 1.7 to 1.6.x 51,0 - 1.8 to 1.7.x 52,0 + 1.6 to 1.6.X 50,0 + 1.7 to 1.7.X 51,0 + 1.8 to 1.8.X 52,0 + 1.9 to 1.9.X 53,0 */ public static final Package.Version JAVA_MIN_CLASS_VERSION = @@ -63,6 +64,9 @@ class Constants { public static final Package.Version JAVA8_MAX_CLASS_VERSION = Package.Version.of(52, 00); + public static final Package.Version JAVA9_MAX_CLASS_VERSION = + Package.Version.of(53, 00); + public static final int JAVA_PACKAGE_MAGIC = 0xCAFED00D; public static final Package.Version JAVA5_PACKAGE_VERSION = @@ -79,7 +83,7 @@ class Constants { // upper limit, should point to the latest class version public static final Package.Version JAVA_MAX_CLASS_VERSION = - JAVA8_MAX_CLASS_VERSION; + JAVA9_MAX_CLASS_VERSION; // upper limit should point to the latest package version, for version info!. public static final Package.Version MAX_PACKAGE_VERSION = diff --git a/jdk/src/java.base/share/classes/java/io/BufferedWriter.java b/jdk/src/java.base/share/classes/java/io/BufferedWriter.java index 28e170fe800..3d8e1ee1b19 100644 --- a/jdk/src/java.base/share/classes/java/io/BufferedWriter.java +++ b/jdk/src/java.base/share/classes/java/io/BufferedWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -153,13 +153,18 @@ public class BufferedWriter extends Writer { * needed. If the requested length is at least as large as the buffer, * however, then this method will flush the buffer and write the characters * directly to the underlying stream. Thus redundant - * BufferedWriters will not copy data unnecessarily. + * {@code BufferedWriter}s will not copy data unnecessarily. * * @param cbuf A character array * @param off Offset from which to start reading characters * @param len Number of characters to write * - * @exception IOException If an I/O error occurs + * @throws IndexOutOfBoundsException + * If {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given array + * + * @throws IOException If an I/O error occurs */ public void write(char cbuf[], int off, int len) throws IOException { synchronized (lock) { @@ -195,17 +200,24 @@ public class BufferedWriter extends Writer { /** * Writes a portion of a String. * - *

If the value of the {@code len} parameter is negative then no - * characters are written. This is contrary to the specification of this - * method in the {@linkplain java.io.Writer#write(java.lang.String,int,int) - * superclass}, which requires that an {@link IndexOutOfBoundsException} be - * thrown. + * @implSpec + * While the specification of this method in the + * {@linkplain java.io.Writer#write(java.lang.String,int,int) superclass} + * recommends that an {@link IndexOutOfBoundsException} be thrown + * if {@code len} is negative or {@code off + len} is negative, + * the implementation in this class does not throw such an exception in + * these cases but instead simply writes no characters. * * @param s String to be written * @param off Offset from which to start reading characters * @param len Number of characters to be written * - * @exception IOException If an I/O error occurs + * @throws IndexOutOfBoundsException + * If {@code off} is negative, + * or {@code off + len} is greater than the length + * of the given string + * + * @throws IOException If an I/O error occurs */ public void write(String s, int off, int len) throws IOException { synchronized (lock) { diff --git a/jdk/src/java.base/share/classes/java/io/CharArrayWriter.java b/jdk/src/java.base/share/classes/java/io/CharArrayWriter.java index ed27bbae314..773b59614d9 100644 --- a/jdk/src/java.base/share/classes/java/io/CharArrayWriter.java +++ b/jdk/src/java.base/share/classes/java/io/CharArrayWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,6 +91,11 @@ class CharArrayWriter extends Writer { * @param c the data to be written * @param off the start offset in the data * @param len the number of chars that are written + * + * @throws IndexOutOfBoundsException + * If {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given array */ public void write(char c[], int off, int len) { if ((off < 0) || (off > c.length) || (len < 0) || @@ -114,6 +119,11 @@ class CharArrayWriter extends Writer { * @param str String to be written from * @param off Offset from which to start reading characters * @param len Number of characters to be written + * + * @throws IndexOutOfBoundsException + * If {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given string */ public void write(String str, int off, int len) { synchronized (lock) { diff --git a/jdk/src/java.base/share/classes/java/io/FilterWriter.java b/jdk/src/java.base/share/classes/java/io/FilterWriter.java index 303c674e0c0..8272b3cc8bf 100644 --- a/jdk/src/java.base/share/classes/java/io/FilterWriter.java +++ b/jdk/src/java.base/share/classes/java/io/FilterWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,7 +72,12 @@ public abstract class FilterWriter extends Writer { * @param off Offset from which to start reading characters * @param len Number of characters to be written * - * @exception IOException If an I/O error occurs + * @throws IndexOutOfBoundsException + * If the values of the {@code off} and {@code len} parameters + * cause the corresponding method of the underlying {@code Writer} + * to throw an {@code IndexOutOfBoundsException} + * + * @throws IOException If an I/O error occurs */ public void write(char cbuf[], int off, int len) throws IOException { out.write(cbuf, off, len); @@ -85,7 +90,12 @@ public abstract class FilterWriter extends Writer { * @param off Offset from which to start reading characters * @param len Number of characters to be written * - * @exception IOException If an I/O error occurs + * @throws IndexOutOfBoundsException + * If the values of the {@code off} and {@code len} parameters + * cause the corresponding method of the underlying {@code Writer} + * to throw an {@code IndexOutOfBoundsException} + * + * @throws IOException If an I/O error occurs */ public void write(String str, int off, int len) throws IOException { out.write(str, off, len); diff --git a/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java b/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java index 0d597e6bef4..4fdb148baaf 100644 --- a/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java +++ b/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -202,7 +202,12 @@ public class OutputStreamWriter extends Writer { * @param off Offset from which to start writing characters * @param len Number of characters to write * - * @exception IOException If an I/O error occurs + * @throws IndexOutOfBoundsException + * If {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given array + * + * @throws IOException If an I/O error occurs */ public void write(char cbuf[], int off, int len) throws IOException { se.write(cbuf, off, len); @@ -215,7 +220,12 @@ public class OutputStreamWriter extends Writer { * @param off Offset from which to start writing characters * @param len Number of characters to write * - * @exception IOException If an I/O error occurs + * @throws IndexOutOfBoundsException + * If {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given string + * + * @throws IOException If an I/O error occurs */ public void write(String str, int off, int len) throws IOException { se.write(str, off, len); diff --git a/jdk/src/java.base/share/classes/java/io/PipedWriter.java b/jdk/src/java.base/share/classes/java/io/PipedWriter.java index 02201fbec1a..a4534b8604c 100644 --- a/jdk/src/java.base/share/classes/java/io/PipedWriter.java +++ b/jdk/src/java.base/share/classes/java/io/PipedWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -125,19 +125,25 @@ public class PipedWriter extends Writer { } /** - * Writes len characters from the specified character array - * starting at offset off to this piped output stream. + * Writes {@code len} characters from the specified character array + * starting at offset {@code off} to this piped output stream. * This method blocks until all the characters are written to the output * stream. * If a thread was reading data characters from the connected piped input * stream, but the thread is no longer alive, then an - * IOException is thrown. + * {@code IOException} is thrown. * * @param cbuf the data. * @param off the start offset in the data. * @param len the number of characters to write. - * @exception IOException if the pipe is - * broken, + * + * @throws IndexOutOfBoundsException + * If {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given array + * + * @throws IOException if the pipe is + * broken, * {@link #connect(java.io.PipedReader) unconnected}, closed * or an I/O error occurs. */ diff --git a/jdk/src/java.base/share/classes/java/io/PrintWriter.java b/jdk/src/java.base/share/classes/java/io/PrintWriter.java index 662f930ef90..d516b8ef404 100644 --- a/jdk/src/java.base/share/classes/java/io/PrintWriter.java +++ b/jdk/src/java.base/share/classes/java/io/PrintWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -410,6 +410,11 @@ public class PrintWriter extends Writer { * @param buf Array of characters * @param off Offset from which to start writing characters * @param len Number of characters to write + * + * @throws IndexOutOfBoundsException + * If the values of the {@code off} and {@code len} parameters + * cause the corresponding method of the underlying {@code Writer} + * to throw an {@code IndexOutOfBoundsException} */ public void write(char buf[], int off, int len) { try { @@ -440,6 +445,11 @@ public class PrintWriter extends Writer { * @param s A String * @param off Offset from which to start writing characters * @param len Number of characters to write + * + * @throws IndexOutOfBoundsException + * If the values of the {@code off} and {@code len} parameters + * cause the corresponding method of the underlying {@code Writer} + * to throw an {@code IndexOutOfBoundsException} */ public void write(String s, int off, int len) { try { diff --git a/jdk/src/java.base/share/classes/java/io/StringWriter.java b/jdk/src/java.base/share/classes/java/io/StringWriter.java index 5d1babc3127..15022b353a8 100644 --- a/jdk/src/java.base/share/classes/java/io/StringWriter.java +++ b/jdk/src/java.base/share/classes/java/io/StringWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -83,6 +83,11 @@ public class StringWriter extends Writer { * @param cbuf Array of characters * @param off Offset from which to start writing characters * @param len Number of characters to write + * + * @throws IndexOutOfBoundsException + * If {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given array */ public void write(char cbuf[], int off, int len) { if ((off < 0) || (off > cbuf.length) || (len < 0) || @@ -107,6 +112,11 @@ public class StringWriter extends Writer { * @param str String to be written * @param off Offset from which to start writing characters * @param len Number of characters to write + * + * @throws IndexOutOfBoundsException + * If {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given string */ public void write(String str, int off, int len) { buf.append(str, off, off + len); diff --git a/jdk/src/java.base/share/classes/java/io/Writer.java b/jdk/src/java.base/share/classes/java/io/Writer.java index 5ad5e554fb3..17e8de3ef8a 100644 --- a/jdk/src/java.base/share/classes/java/io/Writer.java +++ b/jdk/src/java.base/share/classes/java/io/Writer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,12 +32,11 @@ package java.io; * Most subclasses, however, will override some of the methods defined here in * order to provide higher efficiency, additional functionality, or both. * - * @see Writer * @see BufferedWriter * @see CharArrayWriter * @see FilterWriter * @see OutputStreamWriter - * @see FileWriter + * @see FileWriter * @see PipedWriter * @see PrintWriter * @see StringWriter @@ -139,6 +138,12 @@ public abstract class Writer implements Appendable, Closeable, Flushable { * @param len * Number of characters to write * + * @throws IndexOutOfBoundsException + * Implementations should throw this exception + * if {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length + * of the given array + * * @throws IOException * If an I/O error occurs */ @@ -160,6 +165,11 @@ public abstract class Writer implements Appendable, Closeable, Flushable { /** * Writes a portion of a string. * + * @implSpec + * The implementation in this class throws an + * {@code IndexOutOfBoundsException} for the indicated conditions; + * overriding methods may choose to do otherwise. + * * @param str * A String * @@ -170,8 +180,9 @@ public abstract class Writer implements Appendable, Closeable, Flushable { * Number of characters to write * * @throws IndexOutOfBoundsException - * If {@code off} is negative, or {@code len} is negative, - * or {@code off+len} is negative or greater than the length + * Implementations should throw this exception + * if {@code off} is negative, or {@code len} is negative, + * or {@code off + len} is negative or greater than the length * of the given string * * @throws IOException diff --git a/jdk/src/java.base/share/classes/java/lang/Runtime.java b/jdk/src/java.base/share/classes/java/lang/Runtime.java index 3c73d5b61a3..1533130017b 100644 --- a/jdk/src/java.base/share/classes/java/lang/Runtime.java +++ b/jdk/src/java.base/share/classes/java/lang/Runtime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,21 @@ package java.lang; import java.io.*; +import java.math.BigInteger; +import java.util.AbstractList; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.RandomAccess; import java.util.StringTokenizer; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; +import sun.security.action.GetPropertyAction; /** * Every Java application has a single instance of class @@ -46,6 +58,8 @@ import jdk.internal.reflect.Reflection; public class Runtime { private static final Runtime currentRuntime = new Runtime(); + private static Version version; + /** * Returns the runtime object associated with the current Java application. * Most of the methods of class {@code Runtime} are instance @@ -917,4 +931,591 @@ public class Runtime { return out; } + /** + * Returns the version of the Java Runtime Environment as a {@link + * Runtime.Version}. + * + * @return the {@link Runtime.Version} of the Java Runtime Environment + * + * @since 9 + */ + public static Version version() { + if (version == null) { + version = Version.parse( + GetPropertyAction.privilegedGetProperty("java.runtime.version")); + } + return version; + } + + /** + * A representation of a version string for an implemenation of the + * Java SE Platform. A version string contains a version number + * optionally followed by pre-release and build information. + * + *

Version numbers

+ * + *

A version number, {@code $VNUM}, is a non-empty sequence + * of elements separated by period characters (U+002E). An element is + * either zero, or a unsigned integer numeral without leading zeros. The + * final element in a version number must not be zero. The format is: + *

+ * + *
+     *     ^[1-9][0-9]*(((\.0)*\.[1-9][0-9]*)*)*$
+     * 
+ * + *

The sequence may be of arbitrary length but the first three + * elements are assigned specific meanings, as follows:

+ * + *
+     *     $MAJOR.$MINOR.$SECURITY
+     * 
+ * + *
    + * + *
  • {@code $MAJOR} --- The major version + * number, incremented for a major release that contains significant new + * features as specified in a new edition of the Java SE Platform + * Specification, e.g., JSR 337 for + * Java SE 8. Features may be removed in a major release, given + * advance notice at least one major release ahead of time, and + * incompatible changes may be made when justified. The {@code $MAJOR} + * version number of JDK 8 is {@code 8}; the {@code $MAJOR} version + * number of JDK 9 is {@code 9}. When {@code $MAJOR} is incremented, + * all subsequent elements are removed.

  • + * + *
  • {@code $MINOR} --- The minor version + * number, incremented for a minor update release that may contain + * compatible bug fixes, revisions to standard APIs mandated by a + * Maintenance Release + * of the relevant Platform Specification, and implementation features + * outside the scope of that Specification such as new JDK-specific APIs, + * additional service providers, new garbage collectors, and ports to new + * hardware architectures.

  • + * + *
  • {@code $SECURITY} --- The security + * level, incremented for a security update release that contains critical + * fixes including those necessary to improve security. {@code $SECURITY} + * is not reset when {@code $MINOR} is incremented. A + * higher value of {@code $SECURITY} for a given {@code $MAJOR} value, + * therefore, always indicates a more secure release, regardless of the + * value of {@code $MINOR}.

  • + * + *
+ * + *

The fourth and later elements of a version number are free for use + * by downstream consumers of this code base. Such a consumer may, + * e.g., use the fourth element to identify patch releases which + * contain a small number of critical non-security fixes in addition to + * the security fixes in the corresponding security release.

+ * + *

The version number does not include trailing zero elements; + * i.e., {@code $SECURITY} is omitted if it has the value zero, + * and {@code $MINOR} is omitted if both {@code $MINOR} and {@code + * $SECURITY} have the value zero.

+ * + *

The sequence of numerals in a version number is compared to another + * such sequence in numerical, pointwise fashion; e.g., {@code + * 9.9.1} is less than {@code 9.10.3}. If one sequence is shorter than + * another then the missing elements of the shorter sequence are + * considered to be less than the corresponding elements of the longer + * sequence; e.g., {@code 9.1.2} is less than {@code 9.1.2.1}. + *

+ * + *

Version strings

+ * + *

A version string, {@code $VSTR}, consists of a version + * number {@code $VNUM}, as described above, optionally followed by + * pre-release and build information, in the format

+ * + *
+     *     $VNUM(-$PRE)?(\+($BUILD)?(-$OPT)?)?
+     * 
+ * + *

where:

+ * + *
    + * + *
  • {@code $PRE}, matching {@code ([a-zA-Z0-9]+)} + * --- A pre-release identifier. Typically {@code ea}, for a + * potentially unstable early-access release under active development, + * or {@code internal}, for an internal developer build. + * + *

  • {@code $BUILD}, matching {@code + * (0|[1-9][0-9]*)} --- The build number, incremented for each promoted + * build. {@code $BUILD} is reset to {@code 1} when any portion of {@code + * $VNUM} is incremented.

    + * + *
  • {@code $OPT}, matching {@code + * ([-a-zA-Z0-9\.]+)} --- Additional build information, if desired. In + * the case of an {@code internal} build this will often contain the date + * and time of the build.

    + * + *
+ * + *

A version number {@code 10-ea} matches {@code $VNUM = "10"} and + * {@code $PRE = "ea"}. The version number {@code 10+-ea} matches + * {@code $VNUM = "10"} and {@code $OPT = "ea"}.

+ * + *

When comparing two version strings, the value of {@code $OPT}, if + * present, may or may not be significant depending on the chosen + * comparison method. The comparison methods {@link #compareTo(Version) + * compareTo()} and {@link #compareToIgnoreOpt(Version) + * compareToIgnoreOpt()} should be used consistently with the + * corresponding methods {@link #equals(Object) equals()} and {@link + * #equalsIgnoreOpt(Object) equalsIgnoreOpt()}.

+ * + *

A short version string, {@code $SVSTR}, often useful in + * less formal contexts, is a version number optionally followed by a + * pre-release identifier: + * + *

+     *     $VNUM(-$PRE)?
+     * 
+ * + * @since 9 + */ + public static class Version + implements Comparable + { + private final List version; + private final Optional pre; + private final Optional build; + private final Optional optional; + + + // $VNUM(-$PRE)?(\+($BUILD)?(\-$OPT)?)? + // RE limits the format of version strings + // ([1-9][0-9]*(?:(?:\.0)*\.[1-9][0-9]*)*)(?:-([a-zA-Z0-9]+))?(?:(\+)(0|[1-9][0-9]*)?)?(?:-([-a-zA-Z0-9.]+))? + + private static final String VNUM + = "(?[1-9][0-9]*(?:(?:\\.0)*\\.[1-9][0-9]*)*)"; + private static final String VNUM_GROUP = "VNUM"; + + private static final String PRE = "(?:-(?
[a-zA-Z0-9]+))?";
+        private static final String PRE_GROUP   = "PRE";
+
+        private static final String BUILD
+            = "(?:(?\\+)(?0|[1-9][0-9]*)?)?";
+        private static final String PLUS_GROUP  = "PLUS";
+        private static final String BUILD_GROUP = "BUILD";
+
+        private static final String OPT      = "(?:-(?[-a-zA-Z0-9.]+))?";
+        private static final String OPT_GROUP   = "OPT";
+
+        private static final String VSTR_FORMAT
+            = "^" + VNUM + PRE + BUILD + OPT + "$";
+        private static final Pattern VSTR_PATTERN = Pattern.compile(VSTR_FORMAT);
+
+        /**
+         * Constructs a valid version string containing
+         * a version number followed by pre-release and
+         * build information.
+         *
+         * @param  s
+         *         A string to be interpreted as a version
+         *
+         * @throws  IllegalArgumentException
+         *          If the given string cannot be interpreted as a valid
+         *          version
+         *
+         * @throws  NullPointerException
+         *          If {@code s} is {@code null}
+         *
+         * @throws  NumberFormatException
+         *          If an element of the version number or the build number
+         *          cannot be represented as an {@link Integer}
+         */
+        private Version(String s) {
+            if (s == null)
+                throw new NullPointerException();
+
+            Matcher m = VSTR_PATTERN.matcher(s);
+            if (!m.matches())
+                throw new IllegalArgumentException("Invalid version string: '"
+                                                   + s + "'");
+
+            // $VNUM is a dot-separated list of integers of arbitrary length
+            List list = new ArrayList<>();
+            for (String i : m.group(VNUM_GROUP).split("\\."))
+                list.add(Integer.parseInt(i));
+            version = Collections.unmodifiableList(list);
+
+            pre = Optional.ofNullable(m.group(PRE_GROUP));
+
+            String b = m.group(BUILD_GROUP);
+            // $BUILD is an integer
+            build = (b == null)
+                ? Optional.empty()
+                : Optional.ofNullable(Integer.parseInt(b));
+
+            optional = Optional.ofNullable(m.group(OPT_GROUP));
+
+            // empty '+'
+            if ((m.group(PLUS_GROUP) != null) && !build.isPresent()) {
+                if (optional.isPresent()) {
+                    if (pre.isPresent())
+                        throw new IllegalArgumentException("'+' found with"
+                            + " pre-release and optional components:'" + s
+                            + "'");
+                } else {
+                    throw new IllegalArgumentException("'+' found with neither"
+                        + " build or optional components: '" + s + "'");
+                }
+            }
+        }
+
+        /**
+         * Parses the given string as a valid
+         * version string containing a
+         * version number followed by pre-release and
+         * build information.
+         *
+         * @param  s
+         *         A string to interpret as a version
+         *
+         * @throws  IllegalArgumentException
+         *          If the given string cannot be interpreted as a valid
+         *          version
+         *
+         * @throws  NullPointerException
+         *          If the given string is {@code null}
+         *
+         * @throws  NumberFormatException
+         *          If an element of the version number or the build number
+         *          cannot be represented as an {@link Integer}
+         *
+         * @return  The Version of the given string
+         */
+        public static Version parse(String s) {
+            return new Version(s);
+        }
+
+        /**
+         * Returns the major version number.
+         *
+         * @return  The major version number
+         */
+        public int major() {
+            return version.get(0);
+        }
+
+        /**
+         * Returns the minor version number or zero if it
+         * was not set.
+         *
+         * @return  The minor version number or zero if it was not set
+         */
+        public int minor() {
+            return (version.size() > 1 ? version.get(1) : 0);
+        }
+
+        /**
+         * Returns the security version number or zero
+         * if it was not set.
+         *
+         * @return  The security version number or zero if it was not set
+         */
+        public int security() {
+            return (version.size() > 2 ? version.get(2) : 0);
+        }
+
+        /**
+         * Returns an unmodifiable {@link java.util.List List} of the
+         * integer numerals contained in the version
+         * number.  The {@code List} always contains at least one
+         * element corresponding to the major version
+         * number.
+         *
+         * @return  An unmodifiable list of the integer numerals
+         *          contained in the version number
+         */
+        public List version() {
+            return version;
+        }
+
+        /**
+         * Returns the optional pre-release information.
+         *
+         * @return  The optional pre-release information as a String
+         */
+        public Optional pre() {
+            return pre;
+        }
+
+        /**
+         * Returns the build number.
+         *
+         * @return  The optional build number.
+         */
+        public Optional build() {
+            return build;
+        }
+
+        /**
+         * Returns optional additional identifying build
+         * information.
+         *
+         * @return  Additional build information as a String
+         */
+        public Optional optional() {
+            return optional;
+        }
+
+        /**
+         * Compares this version to another.
+         *
+         * 

Each of the components in the version is + * compared in the follow order of precedence: version numbers, + * pre-release identifiers, build numbers, optional build information. + *

+ * + *

Comparison begins by examining the sequence of version numbers. + * If one sequence is shorter than another, then the missing elements + * of the shorter sequence are considered to be less than the + * corresponding elements of the longer sequence.

+ * + *

A version with a pre-release identifier is always considered to + * be less than a version without one. Pre-release identifiers are + * compared numerically when they consist only of digits, and + * lexicographically otherwise. Numeric identifiers are considered to + * be less than non-numeric identifiers.

+ * + *

A version without a build number is always less than one with a + * build number; otherwise build numbers are compared numerically.

+ * + *

The optional build information is compared lexicographically. + * During this comparison, a version with optional build information is + * considered to be greater than a version without one.

+ * + *

A version is not comparable to any other type of object. + * + * @param ob + * The object to be compared + * + * @return A negative integer, zero, or a positive integer if this + * {@code Version} is less than, equal to, or greater than the + * given {@code Version} + * + * @throws NullPointerException + * If the given object is {@code null} + */ + @Override + public int compareTo(Version ob) { + return compare(ob, false); + } + + /** + * Compares this version to another disregarding optional build + * information. + * + *

Two versions are compared by examining the version string as + * described in {@link #compareTo(Version)} with the exception that the + * optional build information is always ignored.

+ * + *

A version is not comparable to any other type of object. + * + * @param ob + * The object to be compared + * + * @return A negative integer, zero, or a positive integer if this + * {@code Version} is less than, equal to, or greater than the + * given {@code Version} + * + * @throws NullPointerException + * If the given object is {@code null} + */ + public int compareToIgnoreOpt(Version ob) { + return compare(ob, true); + } + + private int compare(Version ob, boolean ignoreOpt) { + if (ob == null) + throw new NullPointerException("Invalid argument"); + + int ret = compareVersion(ob); + if (ret != 0) + return ret; + + ret = comparePre(ob); + if (ret != 0) + return ret; + + ret = compareBuild(ob); + if (ret != 0) + return ret; + + if (!ignoreOpt) + return compareOpt(ob); + + return 0; + } + + private int compareVersion(Version ob) { + int size = version.size(); + int oSize = ob.version().size(); + int min = Math.min(size, oSize); + for (int i = 0; i < min; i++) { + Integer val = version.get(i); + Integer oVal = ob.version().get(i); + if (val != oVal) + return val - oVal; + } + if (size != oSize) + return size - oSize; + return 0; + } + + private int comparePre(Version ob) { + Optional oPre = ob.pre(); + if (!pre.isPresent()) { + if (oPre.isPresent()) + return 1; + } else { + if (!oPre.isPresent()) + return -1; + String val = pre.get(); + String oVal = oPre.get(); + if (val.matches("\\d+")) { + return (oVal.matches("\\d+") + ? (new BigInteger(val)).compareTo(new BigInteger(oVal)) + : -1); + } else { + return (oVal.matches("\\d+") + ? 1 + : val.compareTo(oVal)); + } + } + return 0; + } + + private int compareBuild(Version ob) { + Optional oBuild = ob.build(); + if (oBuild.isPresent()) { + return (build.isPresent() + ? build.get().compareTo(oBuild.get()) + : 1); + } else if (build.isPresent()) { + return -1; + } + return 0; + } + + private int compareOpt(Version ob) { + Optional oOpt = ob.optional(); + if (!optional.isPresent()) { + if (oOpt.isPresent()) + return -1; + } else { + if (!oOpt.isPresent()) + return 1; + return optional.get().compareTo(oOpt.get()); + } + return 0; + } + + /** + * Returns a string representation of this version. + * + * @return The version string + */ + @Override + public String toString() { + StringBuilder sb + = new StringBuilder(version.stream() + .map(Object::toString) + .collect(Collectors.joining("."))); + + pre.ifPresent(v -> sb.append("-").append(v)); + + if (build.isPresent()) { + sb.append("+").append(build.get()); + if (optional.isPresent()) + sb.append("-").append(optional.get()); + } else { + if (optional.isPresent()) { + sb.append(pre.isPresent() ? "-" : "+-"); + sb.append(optional.get()); + } + } + + return sb.toString(); + } + + /** + * Determines whether this {@code Version} is equal to another object. + * + *

Two {@code Version}s are equal if and only if they represent the + * same version string. + * + *

This method satisfies the general contract of the {@link + * Object#equals(Object) Object.equals} method.

+ * + * @param ob + * The object to which this {@code Version} is to be compared + * + * @return {@code true} if, and only if, the given object is a {@code + * Version} that is identical to this {@code Version} + * + */ + @Override + public boolean equals(Object ob) { + boolean ret = equalsIgnoreOpt(ob); + if (!ret) + return false; + + Version that = (Version)ob; + return (this.optional().equals(that.optional())); + } + + /** + * Determines whether this {@code Version} is equal to another + * disregarding optional build information. + * + *

Two {@code Version}s are equal if and only if they represent the + * same version string disregarding the optional build information. + * + * @param ob + * The object to which this {@code Version} is to be compared + * + * @return {@code true} if, and only if, the given object is a {@code + * Version} that is identical to this {@code Version} + * ignoring the optinal build information + * + */ + public boolean equalsIgnoreOpt(Object ob) { + if (this == ob) + return true; + if (!(ob instanceof Version)) + return false; + + Version that = (Version)ob; + return (this.version().equals(that.version()) + && this.pre().equals(that.pre()) + && this.build().equals(that.build())); + } + + /** + * Returns the hash code of this version. + * + *

This method satisfies the general contract of the {@link + * Object#hashCode Object.hashCode} method. + * + * @return The hashcode of this version + */ + @Override + public int hashCode() { + int h = 1; + int p = 17; + + h = p * h + version.hashCode(); + h = p * h + pre.hashCode(); + h = p * h + build.hashCode(); + h = p * h + optional.hashCode(); + + return h; + } + } + } diff --git a/jdk/src/java.base/share/classes/java/lang/System.java b/jdk/src/java.base/share/classes/java/lang/System.java index ab7bb02c1f7..7ac564d959a 100644 --- a/jdk/src/java.base/share/classes/java/lang/System.java +++ b/jdk/src/java.base/share/classes/java/lang/System.java @@ -576,7 +576,8 @@ public final class System { * Key * Description of Associated Value * java.version - * Java Runtime Environment version + * Java Runtime Environment version which may be interpreted + * as a {@link Runtime.Version} * java.vendor * Java Runtime Environment vendor * java.vendor.url @@ -584,19 +585,22 @@ public final class System { * java.home * Java installation directory * java.vm.specification.version - * Java Virtual Machine specification version + * Java Virtual Machine specification version which may be + * interpreted as a {@link Runtime.Version} * java.vm.specification.vendor * Java Virtual Machine specification vendor * java.vm.specification.name * Java Virtual Machine specification name * java.vm.version - * Java Virtual Machine implementation version + * Java Virtual Machine implementation version which may be + * interpreted as a {@link Runtime.Version} * java.vm.vendor * Java Virtual Machine implementation vendor * java.vm.name * Java Virtual Machine implementation name * java.specification.version - * Java Runtime Environment specification version + * Java Runtime Environment specification version which may be + * interpreted as a {@link Runtime.Version} * java.specification.vendor * Java Runtime Environment specification vendor * java.specification.name diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index 08e38987bf2..da1700ffdb1 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -706,6 +706,9 @@ class InvokerBytecodeGenerator { case ARRAY_STORE: emitArrayStore(name); continue; + case ARRAY_LENGTH: + emitArrayLength(name); + continue; case IDENTITY: assert(name.arguments.length == 1); emitPushArguments(name); @@ -740,15 +743,16 @@ class InvokerBytecodeGenerator { return classFile; } - void emitArrayLoad(Name name) { emitArrayOp(name, Opcodes.AALOAD); } - void emitArrayStore(Name name) { emitArrayOp(name, Opcodes.AASTORE); } + void emitArrayLoad(Name name) { emitArrayOp(name, Opcodes.AALOAD); } + void emitArrayStore(Name name) { emitArrayOp(name, Opcodes.AASTORE); } + void emitArrayLength(Name name) { emitArrayOp(name, Opcodes.ARRAYLENGTH); } void emitArrayOp(Name name, int arrayOpcode) { - assert arrayOpcode == Opcodes.AALOAD || arrayOpcode == Opcodes.AASTORE; + assert arrayOpcode == Opcodes.AALOAD || arrayOpcode == Opcodes.AASTORE || arrayOpcode == Opcodes.ARRAYLENGTH; Class elementType = name.function.methodType().parameterType(0).getComponentType(); assert elementType != null; emitPushArguments(name); - if (elementType.isPrimitive()) { + if (arrayOpcode != Opcodes.ARRAYLENGTH && elementType.isPrimitive()) { Wrapper w = Wrapper.forPrimitiveType(elementType); arrayOpcode = arrayInsnOpcode(arrayTypeCode(w), arrayOpcode); } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java b/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java index 29cc430f877..1aca86298fe 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java @@ -95,12 +95,12 @@ class Invokers { /*non-public*/ MethodHandle varHandleMethodInvoker(VarHandle.AccessMode ak) { // TODO cache invoker - return makeVarHandleMethodInvoker(ak); + return makeVarHandleMethodInvoker(ak, false); } /*non-public*/ MethodHandle varHandleMethodExactInvoker(VarHandle.AccessMode ak) { // TODO cache invoker - return makeVarHandleMethodExactInvoker(ak); + return makeVarHandleMethodInvoker(ak, true); } private MethodHandle cachedInvoker(int idx) { @@ -127,26 +127,11 @@ class Invokers { return invoker; } - private MethodHandle makeVarHandleMethodInvoker(VarHandle.AccessMode ak) { + private MethodHandle makeVarHandleMethodInvoker(VarHandle.AccessMode ak, boolean isExact) { MethodType mtype = targetType; MethodType invokerType = mtype.insertParameterTypes(0, VarHandle.class); - LambdaForm lform = varHandleMethodGenericInvokerHandleForm(ak.methodName(), mtype); - VarHandle.AccessDescriptor ad = new VarHandle.AccessDescriptor(mtype, ak.at.ordinal(), ak.ordinal()); - MethodHandle invoker = BoundMethodHandle.bindSingle(invokerType, lform, ad); - - invoker = invoker.withInternalMemberName(MemberName.makeVarHandleMethodInvoke(ak.methodName(), mtype), false); - assert(checkVarHandleInvoker(invoker)); - - maybeCompileToBytecode(invoker); - return invoker; - } - - private MethodHandle makeVarHandleMethodExactInvoker(VarHandle.AccessMode ak) { - MethodType mtype = targetType; - MethodType invokerType = mtype.insertParameterTypes(0, VarHandle.class); - - LambdaForm lform = varHandleMethodExactInvokerHandleForm(ak.methodName(), mtype); + LambdaForm lform = varHandleMethodInvokerHandleForm(ak.methodName(), mtype, isExact); VarHandle.AccessDescriptor ad = new VarHandle.AccessDescriptor(mtype, ak.at.ordinal(), ak.ordinal()); MethodHandle invoker = BoundMethodHandle.bindSingle(invokerType, lform, ad); @@ -400,59 +385,7 @@ class Invokers { return lform; } - private static LambdaForm varHandleMethodExactInvokerHandleForm(String name, MethodType mtype) { - // TODO Cache form? - - final int THIS_MH = 0; - final int CALL_VH = THIS_MH + 1; - final int ARG_BASE = CALL_VH + 1; - final int ARG_LIMIT = ARG_BASE + mtype.parameterCount(); - int nameCursor = ARG_LIMIT; - final int VAD_ARG = nameCursor++; - final int CHECK_TYPE = nameCursor++; - final int GET_MEMBER = nameCursor++; - final int LINKER_CALL = nameCursor++; - - MethodType invokerFormType = mtype.insertParameterTypes(0, VarHandle.class) - .basicType() - .appendParameterTypes(MemberName.class); - - MemberName linker = new MemberName(MethodHandle.class, "linkToStatic", invokerFormType, REF_invokeStatic); - try { - linker = MemberName.getFactory().resolveOrFail(REF_invokeStatic, linker, null, NoSuchMethodException.class); - } catch (ReflectiveOperationException ex) { - throw newInternalError(ex); - } - - Name[] names = new Name[LINKER_CALL + 1]; - names[THIS_MH] = argument(THIS_MH, BasicType.basicType(Object.class)); - names[CALL_VH] = argument(CALL_VH, BasicType.basicType(Object.class)); - for (int i = 0; i < mtype.parameterCount(); i++) { - names[ARG_BASE + i] = argument(ARG_BASE + i, BasicType.basicType(mtype.parameterType(i))); - } - - BoundMethodHandle.SpeciesData speciesData = BoundMethodHandle.speciesData_L(); - names[THIS_MH] = names[THIS_MH].withConstraint(speciesData); - - NamedFunction getter = speciesData.getterFunction(0); - names[VAD_ARG] = new Name(getter, names[THIS_MH]); - - Object[] outArgs = Arrays.copyOfRange(names, CALL_VH, ARG_LIMIT + 1, Object[].class); - - names[CHECK_TYPE] = new Name(NF_checkVarHandleExactType, names[CALL_VH], names[VAD_ARG]); - - names[GET_MEMBER] = new Name(NF_getVarHandleMemberName, names[CALL_VH], names[VAD_ARG]); - outArgs[outArgs.length - 1] = names[GET_MEMBER]; - - names[LINKER_CALL] = new Name(linker, outArgs); - LambdaForm lform = new LambdaForm(name + ":VarHandle_exactInvoker" + shortenSignature(basicTypeSignature(mtype)), - ARG_LIMIT, names); - - lform.compileToBytecode(); - return lform; - } - - private static LambdaForm varHandleMethodGenericInvokerHandleForm(String name, MethodType mtype) { + private static LambdaForm varHandleMethodInvokerHandleForm(String name, MethodType mtype, boolean isExact) { // TODO Cache form? final int THIS_MH = 0; @@ -477,8 +410,11 @@ class Invokers { NamedFunction getter = speciesData.getterFunction(0); names[VAD_ARG] = new Name(getter, names[THIS_MH]); - names[CHECK_TYPE] = new Name(NF_checkVarHandleGenericType, names[CALL_VH], names[VAD_ARG]); - + if (isExact) { + names[CHECK_TYPE] = new Name(NF_checkVarHandleExactType, names[CALL_VH], names[VAD_ARG]); + } else { + names[CHECK_TYPE] = new Name(NF_checkVarHandleGenericType, names[CALL_VH], names[VAD_ARG]); + } Object[] outArgs = new Object[ARG_LIMIT]; outArgs[0] = names[CHECK_TYPE]; for (int i = 1; i < ARG_LIMIT; i++) { @@ -488,7 +424,8 @@ class Invokers { MethodType outCallType = mtype.insertParameterTypes(0, VarHandle.class) .basicType(); names[LINKER_CALL] = new Name(outCallType, outArgs); - LambdaForm lform = new LambdaForm(name + ":VarHandle_invoker" + shortenSignature(basicTypeSignature(mtype)), + String debugName = isExact ? ":VarHandle_exactInvoker" : ":VarHandle_invoker"; + LambdaForm lform = new LambdaForm(name + debugName + shortenSignature(basicTypeSignature(mtype)), ARG_LIMIT, names); lform.prepare(); @@ -511,21 +448,13 @@ class Invokers { /*non-public*/ static @ForceInline - void checkVarHandleExactType(VarHandle handle, VarHandle.AccessDescriptor ad) { - MethodType erasedTarget = handle.vform.methodType_table[ad.type]; - MethodType erasedSymbolic = ad.symbolicMethodTypeErased; - if (erasedTarget != erasedSymbolic) - throw newWrongMethodTypeException(erasedTarget, erasedSymbolic); - } - - /*non-public*/ static - @ForceInline - MemberName getVarHandleMemberName(VarHandle handle, VarHandle.AccessDescriptor ad) { - MemberName mn = handle.vform.memberName_table[ad.mode]; - if (mn == null) { - throw handle.unsupported(); + MethodHandle checkVarHandleExactType(VarHandle handle, VarHandle.AccessDescriptor ad) { + MethodHandle mh = handle.getMethodHandle(ad.mode); + MethodType mt = mh.type(); + if (mt != ad.symbolicMethodTypeInvoker) { + throw newWrongMethodTypeException(mt, ad.symbolicMethodTypeInvoker); } - return mn; + return mh; } /*non-public*/ static @@ -649,8 +578,7 @@ class Invokers { NF_getCallSiteTarget, NF_checkCustomized, NF_checkVarHandleGenericType, - NF_checkVarHandleExactType, - NF_getVarHandleMemberName; + NF_checkVarHandleExactType; static { try { NamedFunction nfs[] = { @@ -666,8 +594,6 @@ class Invokers { .getDeclaredMethod("checkVarHandleGenericType", VarHandle.class, VarHandle.AccessDescriptor.class)), NF_checkVarHandleExactType = new NamedFunction(Invokers.class .getDeclaredMethod("checkVarHandleExactType", VarHandle.class, VarHandle.AccessDescriptor.class)), - NF_getVarHandleMemberName = new NamedFunction(Invokers.class - .getDeclaredMethod("getVarHandleMemberName", VarHandle.class, VarHandle.AccessDescriptor.class)) }; // Each nf must be statically invocable or we get tied up in our bootstraps. assert(InvokerBytecodeGenerator.isStaticallyInvocable(nfs)); diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index 782eff613ae..cc7e1e3fecc 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -41,9 +41,15 @@ import sun.invoke.empty.Empty; import sun.invoke.util.ValueConversions; import sun.invoke.util.VerifyType; import sun.invoke.util.Wrapper; + +import jdk.internal.org.objectweb.asm.AnnotationVisitor; +import jdk.internal.org.objectweb.asm.ClassWriter; +import jdk.internal.org.objectweb.asm.MethodVisitor; + import static java.lang.invoke.LambdaForm.*; import static java.lang.invoke.MethodHandleStatics.*; import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; +import static jdk.internal.org.objectweb.asm.Opcodes.*; /** * Trusted implementation code for MethodHandle. @@ -66,25 +72,28 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; /// Factory methods to create method handles: - static MethodHandle makeArrayElementAccessor(Class arrayClass, boolean isSetter) { - if (arrayClass == Object[].class) - return (isSetter ? ArrayAccessor.OBJECT_ARRAY_SETTER : ArrayAccessor.OBJECT_ARRAY_GETTER); + static MethodHandle makeArrayElementAccessor(Class arrayClass, ArrayAccess access) { + if (arrayClass == Object[].class) { + return ArrayAccess.objectAccessor(access); + } if (!arrayClass.isArray()) throw newIllegalArgumentException("not an array: "+arrayClass); MethodHandle[] cache = ArrayAccessor.TYPED_ACCESSORS.get(arrayClass); - int cacheIndex = (isSetter ? ArrayAccessor.SETTER_INDEX : ArrayAccessor.GETTER_INDEX); + int cacheIndex = ArrayAccess.cacheIndex(access); MethodHandle mh = cache[cacheIndex]; if (mh != null) return mh; - mh = ArrayAccessor.getAccessor(arrayClass, isSetter); - MethodType correctType = ArrayAccessor.correctType(arrayClass, isSetter); + mh = ArrayAccessor.getAccessor(arrayClass, access); + MethodType correctType = ArrayAccessor.correctType(arrayClass, access); if (mh.type() != correctType) { assert(mh.type().parameterType(0) == Object[].class); - assert((isSetter ? mh.type().parameterType(2) : mh.type().returnType()) == Object.class); - assert(isSetter || correctType.parameterType(0).getComponentType() == correctType.returnType()); + /* if access == SET */ assert(access != ArrayAccess.SET || mh.type().parameterType(2) == Object.class); + /* if access == GET */ assert(access != ArrayAccess.GET || + (mh.type().returnType() == Object.class && + correctType.parameterType(0).getComponentType() == correctType.returnType())); // safe to view non-strictly, because element type follows from array type mh = mh.viewAsType(correctType, false); } - mh = makeIntrinsic(mh, (isSetter ? Intrinsic.ARRAY_STORE : Intrinsic.ARRAY_LOAD)); + mh = makeIntrinsic(mh, ArrayAccess.intrinsic(access)); // Atomically update accessor cache. synchronized(cache) { if (cache[cacheIndex] == null) { @@ -97,9 +106,52 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; return mh; } + enum ArrayAccess { + GET, SET, LENGTH; + + // As ArrayAccess and ArrayAccessor have a circular dependency, the ArrayAccess properties cannot be stored in + // final fields. + + static String opName(ArrayAccess a) { + switch (a) { + case GET: return "getElement"; + case SET: return "setElement"; + case LENGTH: return "length"; + } + throw new AssertionError(); + } + + static MethodHandle objectAccessor(ArrayAccess a) { + switch (a) { + case GET: return ArrayAccessor.OBJECT_ARRAY_GETTER; + case SET: return ArrayAccessor.OBJECT_ARRAY_SETTER; + case LENGTH: return ArrayAccessor.OBJECT_ARRAY_LENGTH; + } + throw new AssertionError(); + } + + static int cacheIndex(ArrayAccess a) { + switch (a) { + case GET: return ArrayAccessor.GETTER_INDEX; + case SET: return ArrayAccessor.SETTER_INDEX; + case LENGTH: return ArrayAccessor.LENGTH_INDEX; + } + throw new AssertionError(); + } + + static Intrinsic intrinsic(ArrayAccess a) { + switch (a) { + case GET: return Intrinsic.ARRAY_LOAD; + case SET: return Intrinsic.ARRAY_STORE; + case LENGTH: return Intrinsic.ARRAY_LENGTH; + } + throw new AssertionError(); + } + } + static final class ArrayAccessor { - /// Support for array element access - static final int GETTER_INDEX = 0, SETTER_INDEX = 1, INDEX_LIMIT = 2; + /// Support for array element and length access + static final int GETTER_INDEX = 0, SETTER_INDEX = 1, LENGTH_INDEX = 2, INDEX_LIMIT = 3; static final ClassValue TYPED_ACCESSORS = new ClassValue() { @Override @@ -107,14 +159,16 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; return new MethodHandle[INDEX_LIMIT]; } }; - static final MethodHandle OBJECT_ARRAY_GETTER, OBJECT_ARRAY_SETTER; + static final MethodHandle OBJECT_ARRAY_GETTER, OBJECT_ARRAY_SETTER, OBJECT_ARRAY_LENGTH; static { MethodHandle[] cache = TYPED_ACCESSORS.get(Object[].class); - cache[GETTER_INDEX] = OBJECT_ARRAY_GETTER = makeIntrinsic(getAccessor(Object[].class, false), Intrinsic.ARRAY_LOAD); - cache[SETTER_INDEX] = OBJECT_ARRAY_SETTER = makeIntrinsic(getAccessor(Object[].class, true), Intrinsic.ARRAY_STORE); + cache[GETTER_INDEX] = OBJECT_ARRAY_GETTER = makeIntrinsic(getAccessor(Object[].class, ArrayAccess.GET), Intrinsic.ARRAY_LOAD); + cache[SETTER_INDEX] = OBJECT_ARRAY_SETTER = makeIntrinsic(getAccessor(Object[].class, ArrayAccess.SET), Intrinsic.ARRAY_STORE); + cache[LENGTH_INDEX] = OBJECT_ARRAY_LENGTH = makeIntrinsic(getAccessor(Object[].class, ArrayAccess.LENGTH), Intrinsic.ARRAY_LENGTH); assert(InvokerBytecodeGenerator.isStaticallyInvocable(ArrayAccessor.OBJECT_ARRAY_GETTER.internalMemberName())); assert(InvokerBytecodeGenerator.isStaticallyInvocable(ArrayAccessor.OBJECT_ARRAY_SETTER.internalMemberName())); + assert(InvokerBytecodeGenerator.isStaticallyInvocable(ArrayAccessor.OBJECT_ARRAY_LENGTH.internalMemberName())); } static int getElementI(int[] a, int i) { return a[i]; } @@ -137,31 +191,47 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; static void setElementC(char[] a, int i, char x) { a[i] = x; } static void setElementL(Object[] a, int i, Object x) { a[i] = x; } - static String name(Class arrayClass, boolean isSetter) { + static int lengthI(int[] a) { return a.length; } + static int lengthJ(long[] a) { return a.length; } + static int lengthF(float[] a) { return a.length; } + static int lengthD(double[] a) { return a.length; } + static int lengthZ(boolean[] a) { return a.length; } + static int lengthB(byte[] a) { return a.length; } + static int lengthS(short[] a) { return a.length; } + static int lengthC(char[] a) { return a.length; } + static int lengthL(Object[] a) { return a.length; } + + static String name(Class arrayClass, ArrayAccess access) { Class elemClass = arrayClass.getComponentType(); if (elemClass == null) throw newIllegalArgumentException("not an array", arrayClass); - return (!isSetter ? "getElement" : "setElement") + Wrapper.basicTypeChar(elemClass); + return ArrayAccess.opName(access) + Wrapper.basicTypeChar(elemClass); } - static MethodType type(Class arrayClass, boolean isSetter) { + static MethodType type(Class arrayClass, ArrayAccess access) { Class elemClass = arrayClass.getComponentType(); Class arrayArgClass = arrayClass; if (!elemClass.isPrimitive()) { arrayArgClass = Object[].class; elemClass = Object.class; } - return !isSetter ? - MethodType.methodType(elemClass, arrayArgClass, int.class) : - MethodType.methodType(void.class, arrayArgClass, int.class, elemClass); + switch (access) { + case GET: return MethodType.methodType(elemClass, arrayArgClass, int.class); + case SET: return MethodType.methodType(void.class, arrayArgClass, int.class, elemClass); + case LENGTH: return MethodType.methodType(int.class, arrayArgClass); + } + throw new IllegalStateException("should not reach here"); } - static MethodType correctType(Class arrayClass, boolean isSetter) { + static MethodType correctType(Class arrayClass, ArrayAccess access) { Class elemClass = arrayClass.getComponentType(); - return !isSetter ? - MethodType.methodType(elemClass, arrayClass, int.class) : - MethodType.methodType(void.class, arrayClass, int.class, elemClass); + switch (access) { + case GET: return MethodType.methodType(elemClass, arrayClass, int.class); + case SET: return MethodType.methodType(void.class, arrayClass, int.class, elemClass); + case LENGTH: return MethodType.methodType(int.class, arrayClass); + } + throw new IllegalStateException("should not reach here"); } - static MethodHandle getAccessor(Class arrayClass, boolean isSetter) { - String name = name(arrayClass, isSetter); - MethodType type = type(arrayClass, isSetter); + static MethodHandle getAccessor(Class arrayClass, ArrayAccess access) { + String name = name(arrayClass, access); + MethodType type = type(arrayClass, access); try { return IMPL_LOOKUP.findStatic(ArrayAccessor.class, name, type); } catch (ReflectiveOperationException ex) { @@ -1091,6 +1161,8 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; // Put the whole mess into its own nested class. // That way we can lazily load the code and set up the constants. private static class BindCaller { + private static MethodType INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object[].class); + static MethodHandle bindCaller(MethodHandle mh, Class hostClass) { // Do not use this function to inject calls into system classes. @@ -1109,38 +1181,15 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; } private static MethodHandle makeInjectedInvoker(Class hostClass) { - Class bcc = UNSAFE.defineAnonymousClass(hostClass, T_BYTES, null); - if (hostClass.getClassLoader() != bcc.getClassLoader()) - throw new InternalError(hostClass.getName()+" (CL)"); try { - if (hostClass.getProtectionDomain() != bcc.getProtectionDomain()) - throw new InternalError(hostClass.getName()+" (PD)"); - } catch (SecurityException ex) { - // Self-check was blocked by security manager. This is OK. - // In fact the whole try body could be turned into an assertion. - } - try { - MethodHandle init = IMPL_LOOKUP.findStatic(bcc, "init", MethodType.methodType(void.class)); - init.invokeExact(); // force initialization of the class - } catch (Throwable ex) { - throw uncaughtException(ex); - } - MethodHandle bccInvoker; - try { - MethodType invokerMT = MethodType.methodType(Object.class, MethodHandle.class, Object[].class); - bccInvoker = IMPL_LOOKUP.findStatic(bcc, "invoke_V", invokerMT); + Class invokerClass = UNSAFE.defineAnonymousClass(hostClass, INJECTED_INVOKER_TEMPLATE, null); + assert checkInjectedInvoker(hostClass, invokerClass); + return IMPL_LOOKUP.findStatic(invokerClass, "invoke_V", INVOKER_MT); } catch (ReflectiveOperationException ex) { throw uncaughtException(ex); } - // Test the invoker, to ensure that it really injects into the right place. - try { - MethodHandle vamh = prepareForInvoker(MH_checkCallerClass); - Object ok = bccInvoker.invokeExact(vamh, new Object[]{hostClass, bcc}); - } catch (Throwable ex) { - throw new InternalError(ex); - } - return bccInvoker; } + private static ClassValue CV_makeInjectedInvoker = new ClassValue() { @Override protected MethodHandle computeValue(Class hostClass) { return makeInjectedInvoker(hostClass); @@ -1171,62 +1220,82 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; return mh; } + private static boolean checkInjectedInvoker(Class hostClass, Class invokerClass) { + assert (hostClass.getClassLoader() == invokerClass.getClassLoader()) : hostClass.getName()+" (CL)"; + try { + assert (hostClass.getProtectionDomain() == invokerClass.getProtectionDomain()) : hostClass.getName()+" (PD)"; + } catch (SecurityException ex) { + // Self-check was blocked by security manager. This is OK. + } + try { + // Test the invoker to ensure that it really injects into the right place. + MethodHandle invoker = IMPL_LOOKUP.findStatic(invokerClass, "invoke_V", INVOKER_MT); + MethodHandle vamh = prepareForInvoker(MH_checkCallerClass); + return (boolean)invoker.invoke(vamh, new Object[]{ invokerClass }); + } catch (Throwable ex) { + throw new InternalError(ex); + } + } + private static final MethodHandle MH_checkCallerClass; static { final Class THIS_CLASS = BindCaller.class; - assert(checkCallerClass(THIS_CLASS, THIS_CLASS)); + assert(checkCallerClass(THIS_CLASS)); try { MH_checkCallerClass = IMPL_LOOKUP .findStatic(THIS_CLASS, "checkCallerClass", - MethodType.methodType(boolean.class, Class.class, Class.class)); - assert((boolean) MH_checkCallerClass.invokeExact(THIS_CLASS, THIS_CLASS)); + MethodType.methodType(boolean.class, Class.class)); + assert((boolean) MH_checkCallerClass.invokeExact(THIS_CLASS)); } catch (Throwable ex) { throw new InternalError(ex); } } @CallerSensitive - private static boolean checkCallerClass(Class expected, Class expected2) { - // This method is called via MH_checkCallerClass and so it's - // correct to ask for the immediate caller here. + private static boolean checkCallerClass(Class expected) { + // This method is called via MH_checkCallerClass and so it's correct to ask for the immediate caller here. Class actual = Reflection.getCallerClass(); - if (actual != expected && actual != expected2) - throw new InternalError("found "+actual.getName()+", expected "+expected.getName() - +(expected == expected2 ? "" : ", or else "+expected2.getName())); + if (actual != expected) + throw new InternalError("found " + actual.getName() + ", expected " + expected.getName()); return true; } - private static final byte[] T_BYTES; - static { - final Object[] values = {null}; - AccessController.doPrivileged(new PrivilegedAction<>() { - public Void run() { - try { - Class tClass = T.class; - String tName = tClass.getName(); - String tResource = tName.substring(tName.lastIndexOf('.')+1)+".class"; - try (java.io.InputStream in = tClass.getResourceAsStream(tResource)) { - values[0] = in.readAllBytes(); - } - } catch (java.io.IOException ex) { - throw new InternalError(ex); - } - return null; - } - }); - T_BYTES = (byte[]) values[0]; - } + private static final byte[] INJECTED_INVOKER_TEMPLATE = generateInvokerTemplate(); - // The following class is used as a template for Unsafe.defineAnonymousClass: - private static class T { - static void init() { } // side effect: initializes this class - static Object invoke_V(MethodHandle vamh, Object[] args) throws Throwable { - return vamh.invokeExact(args); - } + /** Produces byte code for a class that is used as an injected invoker. */ + private static byte[] generateInvokerTemplate() { + ClassWriter cw = new ClassWriter(0); + + // private static class InjectedInvoker { + // @Hidden + // static Object invoke_V(MethodHandle vamh, Object[] args) throws Throwable { + // return vamh.invokeExact(args); + // } + // } + cw.visit(52, ACC_PRIVATE | ACC_SUPER, "InjectedInvoker", null, "java/lang/Object", null); + + MethodVisitor mv = cw.visitMethod(ACC_STATIC, "invoke_V", + "(Ljava/lang/invoke/MethodHandle;[Ljava/lang/Object;)Ljava/lang/Object;", + null, null); + + // Suppress invoker method in stack traces. + AnnotationVisitor av0 = mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true); + av0.visitEnd(); + + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeExact", + "([Ljava/lang/Object;)Ljava/lang/Object;", false); + mv.visitInsn(ARETURN); + mv.visitMaxs(2, 2); + mv.visitEnd(); + + cw.visitEnd(); + return cw.toByteArray(); } } - /** This subclass allows a wrapped method handle to be re-associated with an arbitrary member name. */ private static final class WrappedMember extends DelegatingMethodHandle { private final MethodHandle target; @@ -1282,6 +1351,7 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; NEW_ARRAY, ARRAY_LOAD, ARRAY_STORE, + ARRAY_LENGTH, IDENTITY, ZERO, NONE // no intrinsic associated diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index c3a97a178a3..2be727ffb0f 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -2244,6 +2244,20 @@ return mh1; return ani.asType(ani.type().changeReturnType(arrayClass)); } + /** + * Produces a method handle returning the length of an array. + * The type of the method handle will have {@code int} as return type, + * and its sole argument will be the array type. + * @param arrayClass an array type + * @return a method handle which can retrieve the length of an array of the given array type + * @throws NullPointerException if the argument is {@code null} + * @throws IllegalArgumentException if arrayClass is not an array type + */ + public static + MethodHandle arrayLength(Class arrayClass) throws IllegalArgumentException { + return MethodHandleImpl.makeArrayElementAccessor(arrayClass, MethodHandleImpl.ArrayAccess.LENGTH); + } + /** * Produces a method handle giving read access to elements of an array. * The type of the method handle will have a return type of the array's @@ -2256,7 +2270,7 @@ return mh1; */ public static MethodHandle arrayElementGetter(Class arrayClass) throws IllegalArgumentException { - return MethodHandleImpl.makeArrayElementAccessor(arrayClass, false); + return MethodHandleImpl.makeArrayElementAccessor(arrayClass, MethodHandleImpl.ArrayAccess.GET); } /** @@ -2271,7 +2285,7 @@ return mh1; */ public static MethodHandle arrayElementSetter(Class arrayClass) throws IllegalArgumentException { - return MethodHandleImpl.makeArrayElementAccessor(arrayClass, true); + return MethodHandleImpl.makeArrayElementAccessor(arrayClass, MethodHandleImpl.ArrayAccess.SET); } /** diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java index 0d965ed5a54..7da455097b8 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java @@ -128,7 +128,7 @@ public final class StringConcatFactory { /** * Default strategy to use for concatenation. */ - private static final Strategy DEFAULT_STRATEGY = Strategy.BC_SB; + private static final Strategy DEFAULT_STRATEGY = Strategy.MH_INLINE_SIZED_EXACT; private enum Strategy { /** diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java index cc8d36ea1d1..ee7be4096bf 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java @@ -1475,11 +1475,11 @@ public abstract class VarHandle { TypesAndInvokers tis = getTypesAndInvokers(); MethodHandle mh = tis.methodHandle_table[mode]; if (mh == null) { - mh = tis.methodHandle_table[mode] = getMethodHandleUncached(tis, mode); + mh = tis.methodHandle_table[mode] = getMethodHandleUncached(mode); } return mh; } - private final MethodHandle getMethodHandleUncached(TypesAndInvokers tis, int mode) { + private final MethodHandle getMethodHandleUncached(int mode) { MethodType mt = accessModeType(AccessMode.values()[mode]). insertParameterTypes(0, VarHandle.class); MemberName mn = vform.getMemberName(mode); diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template index 17858a35c94..ebb6dd31b79 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template +++ b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template @@ -165,8 +165,7 @@ final class VarHandle$Type$s { @ForceInline static boolean weakCompareAndSetVolatile(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) { - // TODO defer to strong form until new Unsafe method is added - return UNSAFE.compareAndSwap$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), + return UNSAFE.weakCompareAndSwap$Type$Volatile(Objects.requireNonNull(handle.receiverType.cast(holder)), handle.fieldOffset, {#if[Object]?handle.fieldType.cast(expected):expected}, {#if[Object]?handle.fieldType.cast(value):value}); @@ -347,8 +346,7 @@ final class VarHandle$Type$s { @ForceInline static boolean weakCompareAndSetVolatile(FieldStaticReadWrite handle, $type$ expected, $type$ value) { - // TODO defer to strong form until new Unsafe method is added - return UNSAFE.compareAndSwap$Type$(handle.base, + return UNSAFE.weakCompareAndSwap$Type$Volatile(handle.base, handle.fieldOffset, {#if[Object]?handle.fieldType.cast(expected):expected}, {#if[Object]?handle.fieldType.cast(value):value}); @@ -583,8 +581,7 @@ final class VarHandle$Type$s { #else[Object] $type$[] array = ($type$[]) oarray; #end[Object] - // TODO defer to strong form until new Unsafe method is added - return UNSAFE.compareAndSwap$Type$(array, + return UNSAFE.weakCompareAndSwap$Type$Volatile(array, (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, {#if[Object]?handle.componentType.cast(expected):expected}, {#if[Object]?handle.componentType.cast(value):value}); diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template index e3051a5cde8..66bf267476e 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template +++ b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template @@ -234,8 +234,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static boolean weakCompareAndSetVolatile(ArrayHandle handle, Object oba, int index, $type$ expected, $type$ value) { byte[] ba = (byte[]) oba; - // TODO defer to strong form until new Unsafe method is added - return UNSAFE.compareAndSwap$RawType$( + return UNSAFE.weakCompareAndSwap$RawType$Volatile( ba, address(ba, index(ba, index)), convEndian(handle.be, expected), convEndian(handle.be, value)); @@ -272,22 +271,33 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { #if[AtomicAdd] @ForceInline - static $type$ getAndAdd(ArrayHandle handle, Object oba, int index, $type$ value) { + static $type$ getAndAdd(ArrayHandle handle, Object oba, int index, $type$ delta) { byte[] ba = (byte[]) oba; - return convEndian(handle.be, - UNSAFE.getAndAdd$RawType$( - ba, - address(ba, index(ba, index)), - convEndian(handle.be, value))); + if (handle.be == BE) { + return UNSAFE.getAndAdd$RawType$( + ba, + address(ba, index(ba, index)), + delta); + } else { + return getAndAddConvEndianWithCAS(ba, index, delta); + } } @ForceInline - static $type$ addAndGet(ArrayHandle handle, Object oba, int index, $type$ value) { - byte[] ba = (byte[]) oba; - return convEndian(handle.be, UNSAFE.getAndAdd$RawType$( - ba, - address(ba, index(ba, index)), - convEndian(handle.be, value))) + value; + static $type$ getAndAddConvEndianWithCAS(byte[] ba, int index, $type$ delta) { + $type$ nativeExpectedValue, expectedValue; + long offset = address(ba, index(ba, index)); + do { + nativeExpectedValue = UNSAFE.get$RawType$Volatile(ba, offset); + expectedValue = $RawBoxType$.reverseBytes(nativeExpectedValue); + } while (!UNSAFE.weakCompareAndSwap$RawType$Volatile(ba, offset, + nativeExpectedValue, $RawBoxType$.reverseBytes(expectedValue + delta))); + return expectedValue; + } + + @ForceInline + static $type$ addAndGet(ArrayHandle handle, Object oba, int index, $type$ delta) { + return getAndAdd(handle, oba, index, delta) + delta; } #end[AtomicAdd] @@ -467,8 +477,7 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { @ForceInline static boolean weakCompareAndSetVolatile(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { ByteBuffer bb = (ByteBuffer) obb; - // TODO defer to strong form until new Unsafe method is added - return UNSAFE.compareAndSwap$RawType$( + return UNSAFE.weakCompareAndSwap$RawType$Volatile( UNSAFE.getObject(bb, BYTE_BUFFER_HB), address(bb, indexRO(bb, index)), convEndian(handle.be, expected), convEndian(handle.be, value)); @@ -505,23 +514,34 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { #if[AtomicAdd] @ForceInline - static $type$ getAndAdd(ByteBufferHandle handle, Object obb, int index, $type$ value) { + static $type$ getAndAdd(ByteBufferHandle handle, Object obb, int index, $type$ delta) { ByteBuffer bb = (ByteBuffer) obb; - return convEndian(handle.be, - UNSAFE.getAndAdd$RawType$( - UNSAFE.getObject(bb, BYTE_BUFFER_HB), - address(bb, indexRO(bb, index)), - convEndian(handle.be, value))); + if (handle.be == BE) { + return UNSAFE.getAndAdd$RawType$( + UNSAFE.getObject(bb, BYTE_BUFFER_HB), + address(bb, indexRO(bb, index)), + delta); + } else { + return getAndAddConvEndianWithCAS(bb, index, delta); + } } @ForceInline - static $type$ addAndGet(ByteBufferHandle handle, Object obb, int index, $type$ value) { - ByteBuffer bb = (ByteBuffer) obb; - return convEndian(handle.be, - UNSAFE.getAndAdd$RawType$( - UNSAFE.getObject(bb, BYTE_BUFFER_HB), - address(bb, indexRO(bb, index)), - convEndian(handle.be, value))) + value; + static $type$ getAndAddConvEndianWithCAS(ByteBuffer bb, int index, $type$ delta) { + $type$ nativeExpectedValue, expectedValue; + Object base = UNSAFE.getObject(bb, BYTE_BUFFER_HB); + long offset = address(bb, indexRO(bb, index)); + do { + nativeExpectedValue = UNSAFE.get$RawType$Volatile(base, offset); + expectedValue = $RawBoxType$.reverseBytes(nativeExpectedValue); + } while (!UNSAFE.weakCompareAndSwap$RawType$Volatile(base, offset, + nativeExpectedValue, $RawBoxType$.reverseBytes(expectedValue + delta))); + return expectedValue; + } + + @ForceInline + static $type$ addAndGet(ByteBufferHandle handle, Object obb, int index, $type$ delta) { + return getAndAdd(handle, obb, index, delta) + delta; } #end[AtomicAdd] diff --git a/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java b/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java index efc8c37b8a2..7bf9342ca88 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java @@ -154,7 +154,7 @@ final class ModuleInfo { int minor_version = in.readUnsignedShort(); int major_version = in.readUnsignedShort(); if (major_version < 53) { - // throw invalidModuleDescriptor"Must be >= 53.0"); + throw invalidModuleDescriptor("Must be >= 53.0"); } ConstantPool cpool = new ConstantPool(in); diff --git a/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java b/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java index d14ee8d60e4..77d5392821a 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java +++ b/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java @@ -45,6 +45,7 @@ import jdk.internal.jimage.ImageLocation; import jdk.internal.jimage.ImageReader; import jdk.internal.jimage.ImageReaderFactory; import jdk.internal.module.ModuleHashes; +import jdk.internal.module.ModuleHashes.HashSupplier; import jdk.internal.module.SystemModules; import jdk.internal.module.ModulePatcher; import jdk.internal.perf.PerfCounter; @@ -84,57 +85,23 @@ class SystemModuleFinder implements ModuleFinder { long t0 = System.nanoTime(); imageReader = ImageReaderFactory.getImageReader(); - String[] moduleNames = SystemModules.MODULE_NAMES; - ModuleDescriptor[] descriptors = null; + String[] names = moduleNames(); + ModuleDescriptor[] descriptors = descriptors(names); - boolean fastLoad = System.getProperty("jdk.installed.modules.disable") == null; - if (fastLoad) { - // fast loading of ModuleDescriptor of installed modules - descriptors = SystemModules.modules(); - } - - int n = moduleNames.length; + int n = names.length; moduleCount.add(n); Set mods = new HashSet<>(n); Map map = new HashMap<>(n); for (int i = 0; i < n; i++) { - String mn = moduleNames[i]; - ModuleDescriptor md; - String hash; - if (fastLoad) { - md = descriptors[i]; - hash = SystemModules.MODULES_TO_HASH[i]; - } else { - // fallback to read module-info.class - // if fast loading of ModuleDescriptors is disabled - ImageLocation location = imageReader.findLocation(mn, "module-info.class"); - md = ModuleDescriptor.read(imageReader.getResourceBuffer(location)); - hash = null; - } - if (!md.name().equals(mn)) - throw new InternalError(); + ModuleDescriptor md = descriptors[i]; // create the ModuleReference - - URI uri = URI.create("jrt:/" + mn); - - Supplier readerSupplier = new Supplier<>() { - @Override - public ModuleReader get() { - return new ImageModuleReader(mn, uri); - } - }; - - ModuleReference mref = - new ModuleReference(md, uri, readerSupplier, hashSupplier(hash)); - - // may need a reference to a patched module if -Xpatch specified - mref = ModulePatcher.interposeIfNeeded(mref); + ModuleReference mref = toModuleReference(md, hashSupplier(i, names[i])); mods.add(mref); - map.put(mn, mref); + map.put(names[i], mref); // counters packageCount.add(md.packages().size()); @@ -147,16 +114,114 @@ class SystemModuleFinder implements ModuleFinder { initTime.addElapsedTimeFrom(t0); } - private static ModuleHashes.HashSupplier hashSupplier(String hash) { - if (hash == null) - return null; + /* + * Returns an array of ModuleDescriptor of the given module names. + * + * This obtains ModuleDescriptors from SystemModules class that is generated + * from the jlink system-modules plugin. ModuleDescriptors have already + * been validated at link time. + * + * If java.base is patched, or fastpath is disabled for troubleshooting + * purpose, it will fall back to find system modules via jrt file system. + */ + private static ModuleDescriptor[] descriptors(String[] names) { + // fastpath is enabled by default. + // It can be disabled for troubleshooting purpose. + boolean disabled = + System.getProperty("jdk.system.module.finder.disabledFastPath") != null; - return new ModuleHashes.HashSupplier() { + // fast loading of ModuleDescriptor of system modules + if (isFastPathSupported() && !disabled) + return SystemModules.modules(); + + // if fast loading of ModuleDescriptors is disabled + // fallback to read module-info.class + ModuleDescriptor[] descriptors = new ModuleDescriptor[names.length]; + for (int i = 0; i < names.length; i++) { + String mn = names[i]; + ImageLocation loc = imageReader.findLocation(mn, "module-info.class"); + descriptors[i] = ModuleDescriptor.read(imageReader.getResourceBuffer(loc)); + + // add the recorded hashes of tied modules + Hashes.add(descriptors[i]); + } + return descriptors; + } + + private static boolean isFastPathSupported() { + return SystemModules.MODULE_NAMES.length > 0; + } + + private static String[] moduleNames() { + if (isFastPathSupported()) + // module names recorded at link time + return SystemModules.MODULE_NAMES; + + // this happens when java.base is patched with java.base + // from an exploded image + return imageReader.getModuleNames(); + } + + private static ModuleReference toModuleReference(ModuleDescriptor md, + HashSupplier hash) + { + String mn = md.name(); + URI uri = URI.create("jrt:/" + mn); + + Supplier readerSupplier = new Supplier<>() { @Override - public String generate(String algorithm) { - return hash; + public ModuleReader get() { + return new ImageModuleReader(mn, uri); } }; + + ModuleReference mref = + new ModuleReference(md, uri, readerSupplier, hash); + + // may need a reference to a patched module if -Xpatch specified + mref = ModulePatcher.interposeIfNeeded(mref); + + return mref; + } + + private static HashSupplier hashSupplier(int index, String name) { + if (isFastPathSupported()) { + return new HashSupplier() { + @Override + public String generate(String algorithm) { + return SystemModules.MODULES_TO_HASH[index]; + } + }; + } else { + return Hashes.hashFor(name); + } + } + + /* + * This helper class is only used when SystemModules is patched. + * It will get the recorded hashes from module-info.class. + */ + private static class Hashes { + static Map hashes = new HashMap<>(); + + static void add(ModuleDescriptor descriptor) { + Optional ohashes = descriptor.hashes(); + if (ohashes.isPresent()) { + hashes.putAll(ohashes.get().hashes()); + } + } + + static HashSupplier hashFor(String name) { + if (!hashes.containsKey(name)) + return null; + + return new HashSupplier() { + @Override + public String generate(String algorithm) { + return hashes.get(name); + } + }; + } } SystemModuleFinder() { } diff --git a/jdk/src/java.base/share/classes/java/nio/Buffer.java b/jdk/src/java.base/share/classes/java/nio/Buffer.java index d534fb3ae73..1f6bef17960 100644 --- a/jdk/src/java.base/share/classes/java/nio/Buffer.java +++ b/jdk/src/java.base/share/classes/java/nio/Buffer.java @@ -111,7 +111,7 @@ import java.util.Spliterator; * to zero. * * - *

Clearing, flipping, and rewinding

+ *

Additional operations

* *

In addition to methods for accessing the position, limit, and capacity * values and for marking and resetting, this class also defines the following @@ -131,6 +131,12 @@ import java.util.Spliterator; * it already contains: It leaves the limit unchanged and sets the position * to zero.

* + *
  • {@link #slice} creates a subsequence of a buffer: It leaves the + * limit and the position unchanged.

  • + * + *
  • {@link #duplicate} creates a shallow copy of a buffer: It leaves + * the limit and the position unchanged.

  • + * * * * @@ -567,6 +573,46 @@ public abstract class Buffer { */ public abstract boolean isDirect(); + /** + * Creates a new buffer whose content is a shared subsequence of + * this buffer's content. + * + *

    The content of the new buffer will start at this buffer's current + * position. Changes to this buffer's content will be visible in the new + * buffer, and vice versa; the two buffers' position, limit, and mark + * values will be independent. + * + *

    The new buffer's position will be zero, its capacity and its limit + * will be the number of elements remaining in this buffer, its mark will be + * undefined. The new buffer will be direct if, and only if, this buffer is + * direct, and it will be read-only if, and only if, this buffer is + * read-only.

    + * + * @return The new buffer + * + * @since 9 + */ + public abstract Buffer slice(); + + /** + * Creates a new buffer that shares this buffer's content. + * + *

    The content of the new buffer will be that of this buffer. Changes + * to this buffer's content will be visible in the new buffer, and vice + * versa; the two buffers' position, limit, and mark values will be + * independent. + * + *

    The new buffer's capacity, limit, position and mark values will be + * identical to those of this buffer. The new buffer will be direct if, and + * only if, this buffer is direct, and it will be read-only if, and only if, + * this buffer is read-only.

    + * + * @return The new buffer + * + * @since 9 + */ + public abstract Buffer duplicate(); + // -- Package-private methods for bounds checking, etc. -- diff --git a/jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template b/jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template index 104f504b551..1292ca458c6 100644 --- a/jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template +++ b/jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template @@ -70,8 +70,7 @@ import java.util.stream.$Streamtype$Stream; * #end[byte] * - *
  • Methods for {@link #compact compacting}, {@link - * #duplicate duplicating}, and {@link #slice slicing} + *

  • A method for {@link #compact compacting} * $a$ $type$ buffer.

  • * * @@ -535,6 +534,7 @@ public abstract class $Type$Buffer * @see #alignedSlice(int) #end[byte] */ + @Override public abstract $Type$Buffer slice(); /** @@ -557,6 +557,7 @@ public abstract class $Type$Buffer * * @return The new $type$ buffer */ + @Override public abstract $Type$Buffer duplicate(); /** diff --git a/jdk/src/java.base/share/classes/java/util/Currency.java b/jdk/src/java.base/share/classes/java/util/Currency.java index cea4cdc4f3c..6c9bbb62654 100644 --- a/jdk/src/java.base/share/classes/java/util/Currency.java +++ b/jdk/src/java.base/share/classes/java/util/Currency.java @@ -153,33 +153,13 @@ public final class Currency implements Serializable { // - bits 0-4: final char for currency code for simple country, or ID of special case // - special case IDs: // - 0: country has no currency - // - other: index into sc* arrays + 1 - // - scCutOverTimes: cut-over time in millis as returned by - // System.currentTimeMillis for special case countries that are changing - // currencies; Long.MAX_VALUE for countries that are not changing currencies - // - scOldCurrencies: old currencies for special case countries - // - scNewCurrencies: new currencies for special case countries that are - // changing currencies; null for others - // - scOldCurrenciesDFD: default fraction digits for old currencies - // - scNewCurrenciesDFD: default fraction digits for new currencies, 0 for - // countries that are not changing currencies - // - otherCurrencies: concatenation of all currency codes that are not the - // main currency of a simple country, separated by "-" - // - otherCurrenciesDFD: decimal format digits for currencies in otherCurrencies, same order + // - other: index into specialCasesList static int formatVersion; static int dataVersion; static int[] mainTable; - static long[] scCutOverTimes; - static String[] scOldCurrencies; - static String[] scNewCurrencies; - static int[] scOldCurrenciesDFD; - static int[] scNewCurrenciesDFD; - static int[] scOldCurrenciesNumericCode; - static int[] scNewCurrenciesNumericCode; - static String otherCurrencies; - static int[] otherCurrenciesDFD; - static int[] otherCurrenciesNumericCode; + static List specialCasesList; + static List otherCurrenciesList; // handy constants - must match definitions in GenerateCurrencyData // magic number @@ -214,7 +194,7 @@ public final class Currency implements Serializable { private static final int NUMERIC_CODE_SHIFT = 10; // Currency data format version - private static final int VALID_FORMAT_VERSION = 2; + private static final int VALID_FORMAT_VERSION = 3; static { AccessController.doPrivileged(new PrivilegedAction<>() { @@ -236,17 +216,9 @@ public final class Currency implements Serializable { dataVersion = dis.readInt(); mainTable = readIntArray(dis, A_TO_Z * A_TO_Z); int scCount = dis.readInt(); - scCutOverTimes = readLongArray(dis, scCount); - scOldCurrencies = readStringArray(dis, scCount); - scNewCurrencies = readStringArray(dis, scCount); - scOldCurrenciesDFD = readIntArray(dis, scCount); - scNewCurrenciesDFD = readIntArray(dis, scCount); - scOldCurrenciesNumericCode = readIntArray(dis, scCount); - scNewCurrenciesNumericCode = readIntArray(dis, scCount); + specialCasesList = readSpecialCases(dis, scCount); int ocCount = dis.readInt(); - otherCurrencies = dis.readUTF(); - otherCurrenciesDFD = readIntArray(dis, ocCount); - otherCurrenciesNumericCode = readIntArray(dis, ocCount); + otherCurrenciesList = readOtherCurrencies(dis, ocCount); } } catch (IOException e) { throw new InternalError(e); @@ -329,6 +301,7 @@ public final class Currency implements Serializable { // Currency code not internally generated, need to verify first // A currency code must have 3 characters and exist in the main table // or in the list of other currencies. + boolean found = false; if (currencyCode.length() != 3) { throw new IllegalArgumentException(); } @@ -340,17 +313,23 @@ public final class Currency implements Serializable { && currencyCode.charAt(2) - 'A' == (tableEntry & SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK)) { defaultFractionDigits = (tableEntry & SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK) >> SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT; numericCode = (tableEntry & NUMERIC_CODE_MASK) >> NUMERIC_CODE_SHIFT; - } else { - // Check for '-' separately so we don't get false hits in the table. - if (currencyCode.charAt(2) == '-') { + found = true; + } else { //special case + int[] fractionAndNumericCode = SpecialCaseEntry.findEntry(currencyCode); + if (fractionAndNumericCode != null) { + defaultFractionDigits = fractionAndNumericCode[0]; + numericCode = fractionAndNumericCode[1]; + found = true; + } + } + + if (!found) { + OtherCurrencyEntry ocEntry = OtherCurrencyEntry.findEntry(currencyCode); + if (ocEntry == null) { throw new IllegalArgumentException(); } - int index = otherCurrencies.indexOf(currencyCode); - if (index == -1) { - throw new IllegalArgumentException(); - } - defaultFractionDigits = otherCurrenciesDFD[index / 4]; - numericCode = otherCurrenciesNumericCode[index / 4]; + defaultFractionDigits = ocEntry.fraction; + numericCode = ocEntry.numericCode; } } @@ -410,13 +389,17 @@ public final class Currency implements Serializable { if (tableEntry == COUNTRY_WITHOUT_CURRENCY_ENTRY) { return null; } else { - int index = (tableEntry & SPECIAL_CASE_COUNTRY_INDEX_MASK) - SPECIAL_CASE_COUNTRY_INDEX_DELTA; - if (scCutOverTimes[index] == Long.MAX_VALUE || System.currentTimeMillis() < scCutOverTimes[index]) { - return getInstance(scOldCurrencies[index], scOldCurrenciesDFD[index], - scOldCurrenciesNumericCode[index]); + int index = SpecialCaseEntry.toIndex(tableEntry); + SpecialCaseEntry scEntry = specialCasesList.get(index); + if (scEntry.cutOverTime == Long.MAX_VALUE + || System.currentTimeMillis() < scEntry.cutOverTime) { + return getInstance(scEntry.oldCurrency, + scEntry.oldCurrencyFraction, + scEntry.oldCurrencyNumericCode); } else { - return getInstance(scNewCurrencies[index], scNewCurrenciesDFD[index], - scNewCurrenciesNumericCode[index]); + return getInstance(scEntry.newCurrency, + scEntry.newCurrencyFraction, + scEntry.newCurrencyNumericCode); } } } @@ -451,14 +434,29 @@ public final class Currency implements Serializable { sb.append(c2); sb.append(finalChar); available.add(getInstance(sb.toString(), defaultFractionDigits, numericCode)); + } else if ((tableEntry & COUNTRY_TYPE_MASK) == SPECIAL_CASE_COUNTRY_MASK + && tableEntry != INVALID_COUNTRY_ENTRY + && tableEntry != COUNTRY_WITHOUT_CURRENCY_ENTRY) { + int index = SpecialCaseEntry.toIndex(tableEntry); + SpecialCaseEntry scEntry = specialCasesList.get(index); + + if (scEntry.cutOverTime == Long.MAX_VALUE + || System.currentTimeMillis() < scEntry.cutOverTime) { + available.add(getInstance(scEntry.oldCurrency, + scEntry.oldCurrencyFraction, + scEntry.oldCurrencyNumericCode)); + } else { + available.add(getInstance(scEntry.newCurrency, + scEntry.newCurrencyFraction, + scEntry.newCurrencyNumericCode)); + } } } } // Now add other currencies - StringTokenizer st = new StringTokenizer(otherCurrencies, "-"); - while (st.hasMoreElements()) { - available.add(getInstance((String)st.nextElement())); + for (OtherCurrencyEntry entry : otherCurrenciesList) { + available.add(getInstance(entry.currencyCode)); } } } @@ -521,15 +519,15 @@ public final class Currency implements Serializable { } /** - * Gets the default number of fraction digits used with this currency. - * Note that the number of fraction digits is the same as ISO 4217's - * minor unit for the currency. - * For example, the default number of fraction digits for the Euro is 2, - * while for the Japanese Yen it's 0. - * In the case of pseudo-currencies, such as IMF Special Drawing Rights, - * -1 is returned. - * - * @return the default number of fraction digits used with this currency + * Gets the default number of fraction digits used with this currency. + * Note that the number of fraction digits is the same as ISO 4217's + * minor unit for the currency. + * For example, the default number of fraction digits for the Euro is 2, + * while for the Japanese Yen it's 0. + * In the case of pseudo-currencies, such as IMF Special Drawing Rights, + * -1 is returned. + * + * @return the default number of fraction digits used with this currency */ public int getDefaultFractionDigits() { return defaultFractionDigits; @@ -693,22 +691,55 @@ public final class Currency implements Serializable { return ret; } - private static long[] readLongArray(DataInputStream dis, int count) throws IOException { - long[] ret = new long[count]; - for (int i = 0; i < count; i++) { - ret[i] = dis.readLong(); - } + private static List readSpecialCases(DataInputStream dis, + int count) + throws IOException { - return ret; + List list = new ArrayList<>(count); + long cutOverTime; + String oldCurrency; + String newCurrency; + int oldCurrencyFraction; + int newCurrencyFraction; + int oldCurrencyNumericCode; + int newCurrencyNumericCode; + + for (int i = 0; i < count; i++) { + cutOverTime = dis.readLong(); + oldCurrency = dis.readUTF(); + newCurrency = dis.readUTF(); + oldCurrencyFraction = dis.readInt(); + newCurrencyFraction = dis.readInt(); + oldCurrencyNumericCode = dis.readInt(); + newCurrencyNumericCode = dis.readInt(); + SpecialCaseEntry sc = new SpecialCaseEntry(cutOverTime, + oldCurrency, newCurrency, + oldCurrencyFraction, newCurrencyFraction, + oldCurrencyNumericCode, newCurrencyNumericCode); + list.add(sc); + } + return list; } - private static String[] readStringArray(DataInputStream dis, int count) throws IOException { - String[] ret = new String[count]; - for (int i = 0; i < count; i++) { - ret[i] = dis.readUTF(); - } + private static List readOtherCurrencies(DataInputStream dis, + int count) + throws IOException { - return ret; + List list = new ArrayList<>(count); + String currencyCode; + int fraction; + int numericCode; + + for (int i = 0; i < count; i++) { + currencyCode = dis.readUTF(); + fraction = dis.readInt(); + numericCode = dis.readInt(); + OtherCurrencyEntry oc = new OtherCurrencyEntry(currencyCode, + fraction, + numericCode); + list.add(oc); + } + return list; } /** @@ -766,21 +797,27 @@ public final class Currency implements Serializable { return; } - int index; - for (index = 0; index < scOldCurrencies.length; index++) { - if (scOldCurrencies[index].equals(code)) { - break; - } + int index = SpecialCaseEntry.indexOf(code, fraction, numeric); + + /* if a country switches from simple case to special case or + * one special case to other special case which is not present + * in the sc arrays then insert the new entry in special case arrays + */ + if (index == -1 && (ctry.charAt(0) != code.charAt(0) + || ctry.charAt(1) != code.charAt(1))) { + + specialCasesList.add(new SpecialCaseEntry(code, fraction, numeric)); + index = specialCasesList.size() - 1; } - if (index == scOldCurrencies.length) { + if (index == -1) { // simple case - entry |= (fraction << SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT) | - (code.charAt(2) - 'A'); + entry |= (fraction << SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT) + | (code.charAt(2) - 'A'); } else { // special case - entry |= SPECIAL_CASE_COUNTRY_MASK | - (index + SPECIAL_CASE_COUNTRY_INDEX_DELTA); + entry = SPECIAL_CASE_COUNTRY_MASK + | (index + SPECIAL_CASE_COUNTRY_INDEX_DELTA); } setMainTableEntry(ctry.charAt(0), ctry.charAt(1), entry); } @@ -814,5 +851,128 @@ public final class Currency implements Serializable { } } } + + /* Used to represent a special case currency entry + * - cutOverTime: cut-over time in millis as returned by + * System.currentTimeMillis for special case countries that are changing + * currencies; Long.MAX_VALUE for countries that are not changing currencies + * - oldCurrency: old currencies for special case countries + * - newCurrency: new currencies for special case countries that are + * changing currencies; null for others + * - oldCurrencyFraction: default fraction digits for old currencies + * - newCurrencyFraction: default fraction digits for new currencies, 0 for + * countries that are not changing currencies + * - oldCurrencyNumericCode: numeric code for old currencies + * - newCurrencyNumericCode: numeric code for new currencies, 0 for countries + * that are not changing currencies + */ + private static class SpecialCaseEntry { + + final private long cutOverTime; + final private String oldCurrency; + final private String newCurrency; + final private int oldCurrencyFraction; + final private int newCurrencyFraction; + final private int oldCurrencyNumericCode; + final private int newCurrencyNumericCode; + + private SpecialCaseEntry(long cutOverTime, String oldCurrency, String newCurrency, + int oldCurrencyFraction, int newCurrencyFraction, + int oldCurrencyNumericCode, int newCurrencyNumericCode) { + this.cutOverTime = cutOverTime; + this.oldCurrency = oldCurrency; + this.newCurrency = newCurrency; + this.oldCurrencyFraction = oldCurrencyFraction; + this.newCurrencyFraction = newCurrencyFraction; + this.oldCurrencyNumericCode = oldCurrencyNumericCode; + this.newCurrencyNumericCode = newCurrencyNumericCode; + } + + private SpecialCaseEntry(String currencyCode, int fraction, + int numericCode) { + this(Long.MAX_VALUE, currencyCode, "", fraction, 0, numericCode, 0); + } + + //get the index of the special case entry + private static int indexOf(String code, int fraction, int numeric) { + int size = specialCasesList.size(); + for (int index = 0; index < size; index++) { + SpecialCaseEntry scEntry = specialCasesList.get(index); + if (scEntry.oldCurrency.equals(code) + && scEntry.oldCurrencyFraction == fraction + && scEntry.oldCurrencyNumericCode == numeric + && scEntry.cutOverTime == Long.MAX_VALUE) { + return index; + } + } + return -1; + } + + // get the fraction and numericCode of the sc currencycode + private static int[] findEntry(String code) { + int[] fractionAndNumericCode = null; + int size = specialCasesList.size(); + for (int index = 0; index < size; index++) { + SpecialCaseEntry scEntry = specialCasesList.get(index); + if (scEntry.oldCurrency.equals(code) && (scEntry.cutOverTime == Long.MAX_VALUE + || System.currentTimeMillis() < scEntry.cutOverTime)) { + //consider only when there is no new currency or cutover time is not passed + fractionAndNumericCode = new int[2]; + fractionAndNumericCode[0] = scEntry.oldCurrencyFraction; + fractionAndNumericCode[1] = scEntry.oldCurrencyNumericCode; + break; + } else if (scEntry.newCurrency.equals(code) + && System.currentTimeMillis() >= scEntry.cutOverTime) { + //consider only if the cutover time is passed + fractionAndNumericCode = new int[2]; + fractionAndNumericCode[0] = scEntry.newCurrencyFraction; + fractionAndNumericCode[1] = scEntry.newCurrencyNumericCode; + break; + } + } + return fractionAndNumericCode; + } + + // convert the special case entry to sc arrays index + private static int toIndex(int tableEntry) { + return (tableEntry & SPECIAL_CASE_COUNTRY_INDEX_MASK) - SPECIAL_CASE_COUNTRY_INDEX_DELTA; + } + + } + + /* Used to represent Other currencies + * - currencyCode: currency codes that are not the main currency + * of a simple country + * - otherCurrenciesDFD: decimal format digits for other currencies + * - otherCurrenciesNumericCode: numeric code for other currencies + */ + private static class OtherCurrencyEntry { + + final private String currencyCode; + final private int fraction; + final private int numericCode; + + private OtherCurrencyEntry(String currencyCode, int fraction, + int numericCode) { + this.currencyCode = currencyCode; + this.fraction = fraction; + this.numericCode = numericCode; + } + + //get the instance of the other currency code + private static OtherCurrencyEntry findEntry(String code) { + int size = otherCurrenciesList.size(); + for (int index = 0; index < size; index++) { + OtherCurrencyEntry ocEntry = otherCurrenciesList.get(index); + if (ocEntry.currencyCode.equalsIgnoreCase(code)) { + return ocEntry; + } + } + return null; + } + + } + } + diff --git a/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java b/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java index fbc0359ed37..97a48ae301c 100644 --- a/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java +++ b/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -146,12 +146,26 @@ final class DualPivotQuicksort { } } - // Check special cases - // Implementation note: variable "right" is increased by 1. - if (run[count] == right++) { // The last run contains one element - run[++count] = right; - } else if (count <= 1) { // The array is already sorted + // These invariants should hold true: + // run[0] = 0 + // run[] = right + 1; (terminator) + + if (count == 0) { + // A single equal run return; + } else if (count == 1 && run[count] > right) { + // Either a single ascending or a transformed descending run. + // Always check that a final run is a proper terminator, otherwise + // we have an unterminated trailing run, to handle downstream. + return; + } + right++; + if (run[count] < right) { + // Corner case: the final run is not a terminator. This may happen + // if a final run is an equals run, or there is a single-element run + // at the end. Fix up by adding a proper terminator at the end. + // Note that we terminate with (right + 1), incremented earlier. + run[++count] = right; } // Determine alternation base for merge @@ -598,12 +612,26 @@ final class DualPivotQuicksort { } } - // Check special cases - // Implementation note: variable "right" is increased by 1. - if (run[count] == right++) { // The last run contains one element - run[++count] = right; - } else if (count <= 1) { // The array is already sorted + // These invariants should hold true: + // run[0] = 0 + // run[] = right + 1; (terminator) + + if (count == 0) { + // A single equal run return; + } else if (count == 1 && run[count] > right) { + // Either a single ascending or a transformed descending run. + // Always check that a final run is a proper terminator, otherwise + // we have an unterminated trailing run, to handle downstream. + return; + } + right++; + if (run[count] < right) { + // Corner case: the final run is not a terminator. This may happen + // if a final run is an equals run, or there is a single-element run + // at the end. Fix up by adding a proper terminator at the end. + // Note that we terminate with (right + 1), incremented earlier. + run[++count] = right; } // Determine alternation base for merge @@ -1086,12 +1114,26 @@ final class DualPivotQuicksort { } } - // Check special cases - // Implementation note: variable "right" is increased by 1. - if (run[count] == right++) { // The last run contains one element - run[++count] = right; - } else if (count <= 1) { // The array is already sorted + // These invariants should hold true: + // run[0] = 0 + // run[] = right + 1; (terminator) + + if (count == 0) { + // A single equal run return; + } else if (count == 1 && run[count] > right) { + // Either a single ascending or a transformed descending run. + // Always check that a final run is a proper terminator, otherwise + // we have an unterminated trailing run, to handle downstream. + return; + } + right++; + if (run[count] < right) { + // Corner case: the final run is not a terminator. This may happen + // if a final run is an equals run, or there is a single-element run + // at the end. Fix up by adding a proper terminator at the end. + // Note that we terminate with (right + 1), incremented earlier. + run[++count] = right; } // Determine alternation base for merge @@ -1574,12 +1616,26 @@ final class DualPivotQuicksort { } } - // Check special cases - // Implementation note: variable "right" is increased by 1. - if (run[count] == right++) { // The last run contains one element - run[++count] = right; - } else if (count <= 1) { // The array is already sorted + // These invariants should hold true: + // run[0] = 0 + // run[] = right + 1; (terminator) + + if (count == 0) { + // A single equal run return; + } else if (count == 1 && run[count] > right) { + // Either a single ascending or a transformed descending run. + // Always check that a final run is a proper terminator, otherwise + // we have an unterminated trailing run, to handle downstream. + return; + } + right++; + if (run[count] < right) { + // Corner case: the final run is not a terminator. This may happen + // if a final run is an equals run, or there is a single-element run + // at the end. Fix up by adding a proper terminator at the end. + // Note that we terminate with (right + 1), incremented earlier. + run[++count] = right; } // Determine alternation base for merge @@ -2158,12 +2214,26 @@ final class DualPivotQuicksort { } } - // Check special cases - // Implementation note: variable "right" is increased by 1. - if (run[count] == right++) { // The last run contains one element - run[++count] = right; - } else if (count <= 1) { // The array is already sorted + // These invariants should hold true: + // run[0] = 0 + // run[] = right + 1; (terminator) + + if (count == 0) { + // A single equal run return; + } else if (count == 1 && run[count] > right) { + // Either a single ascending or a transformed descending run. + // Always check that a final run is a proper terminator, otherwise + // we have an unterminated trailing run, to handle downstream. + return; + } + right++; + if (run[count] < right) { + // Corner case: the final run is not a terminator. This may happen + // if a final run is an equals run, or there is a single-element run + // at the end. Fix up by adding a proper terminator at the end. + // Note that we terminate with (right + 1), incremented earlier. + run[++count] = right; } // Determine alternation base for merge @@ -2701,12 +2771,26 @@ final class DualPivotQuicksort { } } - // Check special cases - // Implementation note: variable "right" is increased by 1. - if (run[count] == right++) { // The last run contains one element - run[++count] = right; - } else if (count <= 1) { // The array is already sorted + // These invariants should hold true: + // run[0] = 0 + // run[] = right + 1; (terminator) + + if (count == 0) { + // A single equal run return; + } else if (count == 1 && run[count] > right) { + // Either a single ascending or a transformed descending run. + // Always check that a final run is a proper terminator, otherwise + // we have an unterminated trailing run, to handle downstream. + return; + } + right++; + if (run[count] < right) { + // Corner case: the final run is not a terminator. This may happen + // if a final run is an equals run, or there is a single-element run + // at the end. Fix up by adding a proper terminator at the end. + // Note that we terminate with (right + 1), incremented earlier. + run[++count] = right; } // Determine alternation base for merge diff --git a/jdk/src/java.base/share/classes/java/util/Hashtable.java b/jdk/src/java.base/share/classes/java/util/Hashtable.java index 6ad2f3a933c..b541ca12a06 100644 --- a/jdk/src/java.base/share/classes/java/util/Hashtable.java +++ b/jdk/src/java.base/share/classes/java/util/Hashtable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -229,6 +229,14 @@ public class Hashtable putAll(t); } + /** + * A constructor chained from {@link Properties} keeps Hashtable fields + * uninitialized since they are not used. + * + * @param dummy a dummy parameter + */ + Hashtable(Void dummy) {} + /** * Returns the number of keys in this hashtable. * @@ -549,18 +557,23 @@ public class Hashtable * @return a clone of the hashtable */ public synchronized Object clone() { + Hashtable t = cloneHashtable(); + t.table = new Entry[table.length]; + for (int i = table.length ; i-- > 0 ; ) { + t.table[i] = (table[i] != null) + ? (Entry) table[i].clone() : null; + } + t.keySet = null; + t.entrySet = null; + t.values = null; + t.modCount = 0; + return t; + } + + /** Calls super.clone() */ + final Hashtable cloneHashtable() { try { - Hashtable t = (Hashtable)super.clone(); - t.table = new Entry[table.length]; - for (int i = table.length ; i-- > 0 ; ) { - t.table[i] = (table[i] != null) - ? (Entry) table[i].clone() : null; - } - t.keySet = null; - t.entrySet = null; - t.values = null; - t.modCount = 0; - return t; + return (Hashtable)super.clone(); } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(e); @@ -1189,6 +1202,15 @@ public class Hashtable */ private void writeObject(java.io.ObjectOutputStream s) throws IOException { + writeHashtable(s); + } + + /** + * Perform serialization of the Hashtable to an ObjectOutputStream. + * The Properties class overrides this method. + */ + void writeHashtable(java.io.ObjectOutputStream s) + throws IOException { Entry entryStack = null; synchronized (this) { @@ -1218,12 +1240,30 @@ public class Hashtable } } + /** + * Called by Properties to write out a simulated threshold and loadfactor. + */ + final void defaultWriteHashtable(java.io.ObjectOutputStream s, int length, + float loadFactor) throws IOException { + this.threshold = (int)Math.min(length * loadFactor, MAX_ARRAY_SIZE + 1); + this.loadFactor = loadFactor; + s.defaultWriteObject(); + } + /** * Reconstitute the Hashtable from a stream (i.e., deserialize it). */ private void readObject(java.io.ObjectInputStream s) - throws IOException, ClassNotFoundException - { + throws IOException, ClassNotFoundException { + readHashtable(s); + } + + /** + * Perform deserialization of the Hashtable from an ObjectInputStream. + * The Properties class overrides this method. + */ + void readHashtable(java.io.ObjectInputStream s) + throws IOException, ClassNotFoundException { // Read in the threshold and loadFactor s.defaultReadObject(); diff --git a/jdk/src/java.base/share/classes/java/util/Properties.java b/jdk/src/java.base/share/classes/java/util/Properties.java index 1eddbab3740..c2b93d250bf 100644 --- a/jdk/src/java.base/share/classes/java/util/Properties.java +++ b/jdk/src/java.base/share/classes/java/util/Properties.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,13 @@ import java.io.Reader; import java.io.Writer; import java.io.OutputStreamWriter; import java.io.BufferedWriter; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.StreamCorruptedException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Function; import jdk.internal.util.xml.PropertiesDefaultHandler; @@ -60,6 +67,13 @@ import jdk.internal.util.xml.PropertiesDefaultHandler; * object that contains a non-{@code String} key. * *

    + * The iterators returned by the {@code iterator} method of this class's + * "collection views" (that is, {@code entrySet()}, {@code keySet()}, and + * {@code values()}) may not fail-fast (unlike the Hashtable implementation). + * These iterators are guaranteed to traverse elements as they existed upon + * construction exactly once, and may (but are not guaranteed to) reflect any + * modifications subsequent to construction. + *

    * The {@link #load(java.io.Reader) load(Reader)} {@code /} * {@link #store(java.io.Writer, java.lang.String) store(Writer, String)} * methods load and store properties from and to a character based stream @@ -127,6 +141,15 @@ class Properties extends Hashtable { */ protected Properties defaults; + /** + * Properties does not store values in its inherited Hashtable, but instead + * in an internal ConcurrentHashMap. Synchronization is omitted from + * simple read operations. Writes and bulk operations remain synchronized, + * as in Hashtable. + */ + private transient ConcurrentHashMap map = + new ConcurrentHashMap<>(8); + /** * Creates an empty property list with no default values. */ @@ -140,6 +163,9 @@ class Properties extends Hashtable { * @param defaults the defaults. */ public Properties(Properties defaults) { + // use package-private constructor to + // initialize unused fields with dummy values + super((Void) null); this.defaults = defaults; } @@ -826,9 +852,9 @@ class Properties extends Hashtable { bw.write("#" + new Date().toString()); bw.newLine(); synchronized (this) { - for (Enumeration e = keys(); e.hasMoreElements();) { - String key = (String)e.nextElement(); - String val = (String)get(key); + for (Map.Entry e : entrySet()) { + String key = (String)e.getKey(); + String val = (String)e.getValue(); key = saveConvert(key, true, escUnicode); /* No need to escape embedded and trailing spaces for value, hence * pass false to flag. @@ -967,7 +993,7 @@ class Properties extends Hashtable { * @see #defaults */ public String getProperty(String key) { - Object oval = super.get(key); + Object oval = map.get(key); String sval = (oval instanceof String) ? (String)oval : null; return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval; } @@ -1029,7 +1055,7 @@ class Properties extends Hashtable { * @since 1.6 */ public Set stringPropertyNames() { - Hashtable h = new Hashtable<>(); + Map h = new HashMap<>(); enumerateStringProperties(h); return h.keySet(); } @@ -1044,11 +1070,11 @@ class Properties extends Hashtable { */ public void list(PrintStream out) { out.println("-- listing properties --"); - Hashtable h = new Hashtable<>(); + Map h = new HashMap<>(); enumerate(h); - for (Enumeration e = h.keys() ; e.hasMoreElements() ;) { - String key = e.nextElement(); - String val = (String)h.get(key); + for (Map.Entry e : h.entrySet()) { + String key = e.getKey(); + String val = (String)e.getValue(); if (val.length() > 40) { val = val.substring(0, 37) + "..."; } @@ -1072,11 +1098,11 @@ class Properties extends Hashtable { */ public void list(PrintWriter out) { out.println("-- listing properties --"); - Hashtable h = new Hashtable<>(); + Map h = new HashMap<>(); enumerate(h); - for (Enumeration e = h.keys() ; e.hasMoreElements() ;) { - String key = e.nextElement(); - String val = (String)h.get(key); + for (Map.Entry e : h.entrySet()) { + String key = e.getKey(); + String val = (String)e.getValue(); if (val.length() > 40) { val = val.substring(0, 37) + "..."; } @@ -1085,33 +1111,33 @@ class Properties extends Hashtable { } /** - * Enumerates all key/value pairs in the specified hashtable. - * @param h the hashtable + * Enumerates all key/value pairs into the specified Map. + * @param h the Map * @throws ClassCastException if any of the property keys * is not of String type. */ - private synchronized void enumerate(Hashtable h) { + private void enumerate(Map h) { if (defaults != null) { defaults.enumerate(h); } - for (Enumeration e = keys() ; e.hasMoreElements() ;) { - String key = (String)e.nextElement(); - h.put(key, get(key)); + for (Map.Entry e : entrySet()) { + String key = (String)e.getKey(); + h.put(key, e.getValue()); } } /** - * Enumerates all key/value pairs in the specified hashtable + * Enumerates all key/value pairs into the specified Map * and omits the property if the key or value is not a string. - * @param h the hashtable + * @param h the Map */ - private synchronized void enumerateStringProperties(Hashtable h) { + private void enumerateStringProperties(Map h) { if (defaults != null) { defaults.enumerateStringProperties(h); } - for (Enumeration e = keys() ; e.hasMoreElements() ;) { - Object k = e.nextElement(); - Object v = get(k); + for (Map.Entry e : entrySet()) { + Object k = e.getKey(); + Object v = e.getValue(); if (k instanceof String && v instanceof String) { h.put((String) k, (String) v); } @@ -1130,4 +1156,283 @@ class Properties extends Hashtable { private static final char[] hexDigit = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; + + // + // Hashtable methods overridden and delegated to a ConcurrentHashMap instance + + @Override + public int size() { + return map.size(); + } + + @Override + public boolean isEmpty() { + return map.isEmpty(); + } + + @Override + public Enumeration keys() { + // CHM.keys() returns Iterator w/ remove() - instead wrap keySet() + return Collections.enumeration(map.keySet()); + } + + @Override + public Enumeration elements() { + // CHM.elements() returns Iterator w/ remove() - instead wrap values() + return Collections.enumeration(map.values()); + } + + @Override + public boolean contains(Object value) { + return map.contains(value); + } + + @Override + public boolean containsValue(Object value) { + return map.containsValue(value); + } + + @Override + public boolean containsKey(Object key) { + return map.containsKey(key); + } + + @Override + public Object get(Object key) { + return map.get(key); + } + + @Override + public synchronized Object put(Object key, Object value) { + return map.put(key, value); + } + + @Override + public synchronized Object remove(Object key) { + return map.remove(key); + } + + @Override + public synchronized void putAll(Map t) { + map.putAll(t); + } + + @Override + public synchronized void clear() { + map.clear(); + } + + @Override + public synchronized String toString() { + return map.toString(); + } + + @Override + public Set keySet() { + return Collections.synchronizedSet(map.keySet(), this); + } + + @Override + public Collection values() { + return Collections.synchronizedCollection(map.values(), this); + } + + @Override + public Set> entrySet() { + return Collections.synchronizedSet(new EntrySet(map.entrySet()), this); + } + + /* + * Properties.entrySet() should not support add/addAll, however + * ConcurrentHashMap.entrySet() provides add/addAll. This class wraps the + * Set returned from CHM, changing add/addAll to throw UOE. + */ + private static class EntrySet implements Set> { + private Set> entrySet; + + private EntrySet(Set> entrySet) { + this.entrySet = entrySet; + } + + @Override public int size() { return entrySet.size(); } + @Override public boolean isEmpty() { return entrySet.isEmpty(); } + @Override public boolean contains(Object o) { return entrySet.contains(o); } + @Override public Object[] toArray() { return entrySet.toArray(); } + @Override public T[] toArray(T[] a) { return entrySet.toArray(a); } + @Override public void clear() { entrySet.clear(); } + @Override public boolean remove(Object o) { return entrySet.remove(o); } + + @Override + public boolean add(Map.Entry e) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean addAll(Collection> c) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean containsAll(Collection c) { + return entrySet.containsAll(c); + } + + @Override + public boolean removeAll(Collection c) { + return entrySet.removeAll(c); + } + + @Override + public boolean retainAll(Collection c) { + return entrySet.retainAll(c); + } + + @Override + public Iterator> iterator() { + return entrySet.iterator(); + } + } + + @Override + public synchronized boolean equals(Object o) { + return map.equals(o); + } + + @Override + public synchronized int hashCode() { + return map.hashCode(); + } + + @Override + public Object getOrDefault(Object key, Object defaultValue) { + return map.getOrDefault(key, defaultValue); + } + + @Override + public synchronized void forEach(BiConsumer action) { + map.forEach(action); + } + + @Override + public synchronized void replaceAll(BiFunction function) { + map.replaceAll(function); + } + + @Override + public synchronized Object putIfAbsent(Object key, Object value) { + return map.putIfAbsent(key, value); + } + + @Override + public synchronized boolean remove(Object key, Object value) { + return map.remove(key, value); + } + + /** @hidden */ + @Override + public synchronized boolean replace(Object key, Object oldValue, Object newValue) { + return map.replace(key, oldValue, newValue); + } + + @Override + public synchronized Object replace(Object key, Object value) { + return map.replace(key, value); + } + + @Override + public synchronized Object computeIfAbsent(Object key, + Function mappingFunction) { + return map.computeIfAbsent(key, mappingFunction); + } + + @Override + public synchronized Object computeIfPresent(Object key, + BiFunction remappingFunction) { + return map.computeIfPresent(key, remappingFunction); + } + + @Override + public synchronized Object compute(Object key, + BiFunction remappingFunction) { + return map.compute(key, remappingFunction); + } + + @Override + public synchronized Object merge(Object key, Object value, + BiFunction remappingFunction) { + return map.merge(key, value, remappingFunction); + } + + // + // Special Hashtable methods + + @Override + protected void rehash() { /* no-op */ } + + @Override + public synchronized Object clone() { + Properties clone = (Properties) cloneHashtable(); + clone.map = new ConcurrentHashMap<>(map); + return clone; + } + + // + // Hashtable serialization overrides + // (these should emit and consume Hashtable-compatible stream) + + @Override + void writeHashtable(ObjectOutputStream s) throws IOException { + List entryStack = new ArrayList<>(map.size() * 2); // an estimate + + for (Map.Entry entry : map.entrySet()) { + entryStack.add(entry.getValue()); + entryStack.add(entry.getKey()); + } + + // Write out the simulated threshold, loadfactor + float loadFactor = 0.75f; + int count = entryStack.size() / 2; + int length = (int)(count / loadFactor) + (count / 20) + 3; + if (length > count && (length & 1) == 0) { + length--; + } + synchronized (map) { // in case of multiple concurrent serializations + defaultWriteHashtable(s, length, loadFactor); + } + + // Write out simulated length and real count of elements + s.writeInt(length); + s.writeInt(count); + + // Write out the key/value objects from the stacked entries + for (int i = entryStack.size() - 1; i >= 0; i--) { + s.writeObject(entryStack.get(i)); + } + } + + @Override + void readHashtable(ObjectInputStream s) throws IOException, + ClassNotFoundException { + // Read in the threshold and loadfactor + s.defaultReadObject(); + + // Read the original length of the array and number of elements + int origlength = s.readInt(); + int elements = s.readInt(); + + // Validate # of elements + if (elements < 0) { + throw new StreamCorruptedException("Illegal # of Elements: " + elements); + } + + // create CHM of appropriate capacity + map = new ConcurrentHashMap<>(elements); + + // Read all the key/value objects + for (; elements > 0; elements--) { + Object key = s.readObject(); + Object value = s.readObject(); + map.put(key, value); + } + } } diff --git a/jdk/src/java.base/share/classes/java/util/jar/JarFile.java b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java index 5f08db7b1c4..aab2474fd66 100644 --- a/jdk/src/java.base/share/classes/java/util/jar/JarFile.java +++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -153,7 +153,7 @@ class JarFile extends ZipFile { SharedSecrets.setJavaUtilJarAccess(new JavaUtilJarAccessImpl()); BASE_VERSION = 8; // one less than lowest version for versioned entries - int runtimeVersion = jdk.Version.current().major(); + int runtimeVersion = Runtime.version().major(); String jarVersion = GetPropertyAction.privilegedGetProperty("jdk.util.jar.version"); if (jarVersion != null) { @@ -357,7 +357,7 @@ class JarFile extends ZipFile { } private boolean runtimeVersionExists() { - int version = jdk.Version.current().major(); + int version = Runtime.version().major(); try { Release.valueOf(version); return true; diff --git a/jdk/src/java.base/share/classes/java/util/stream/AbstractTask.java b/jdk/src/java.base/share/classes/java/util/stream/AbstractTask.java index 33de7d5c52a..f6bd8f5fc00 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/AbstractTask.java +++ b/jdk/src/java.base/share/classes/java/util/stream/AbstractTask.java @@ -106,7 +106,7 @@ abstract class AbstractTask spliterator; /** Target leaf size, common to all tasks in a computation */ - protected long targetSize; // may be laziliy initialized + protected long targetSize; // may be lazily initialized /** * The left child. diff --git a/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java b/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java index 9d25d902bb4..ad250753673 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java +++ b/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java @@ -211,6 +211,11 @@ public interface DoubleStream extends BaseStream { * .sum(); * } * + *

    In cases where the stream implementation is able to optimize away the + * production of some or all the elements (such as with short-circuiting + * operations like {@code findFirst}, or in the example described in + * {@link #count}), the action will not be invoked for those elements. + * * @param action a * non-interfering action to perform on the elements as * they are consumed from the stream diff --git a/jdk/src/java.base/share/classes/java/util/stream/IntStream.java b/jdk/src/java.base/share/classes/java/util/stream/IntStream.java index 115a782937f..9c729772c0c 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/IntStream.java +++ b/jdk/src/java.base/share/classes/java/util/stream/IntStream.java @@ -209,6 +209,11 @@ public interface IntStream extends BaseStream { * .sum(); * } * + *

    In cases where the stream implementation is able to optimize away the + * production of some or all the elements (such as with short-circuiting + * operations like {@code findFirst}, or in the example described in + * {@link #count}), the action will not be invoked for those elements. + * * @param action a * non-interfering action to perform on the elements as * they are consumed from the stream diff --git a/jdk/src/java.base/share/classes/java/util/stream/LongStream.java b/jdk/src/java.base/share/classes/java/util/stream/LongStream.java index f987820c5a8..7965bfd06a6 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/LongStream.java +++ b/jdk/src/java.base/share/classes/java/util/stream/LongStream.java @@ -209,6 +209,11 @@ public interface LongStream extends BaseStream { * .sum(); * } * + *

    In cases where the stream implementation is able to optimize away the + * production of some or all the elements (such as with short-circuiting + * operations like {@code findFirst}, or in the example described in + * {@link #count}), the action will not be invoked for those elements. + * * @param action a * non-interfering action to perform on the elements as * they are consumed from the stream diff --git a/jdk/src/java.base/share/classes/java/util/stream/Stream.java b/jdk/src/java.base/share/classes/java/util/stream/Stream.java index 1dd1d43f91d..7ab71a50aee 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/Stream.java +++ b/jdk/src/java.base/share/classes/java/util/stream/Stream.java @@ -82,6 +82,19 @@ import java.util.function.UnaryOperator; * terminal operation is initiated, and source elements are consumed only * as needed. * + *

    A stream implementation is permitted significant latitude in optimizing + * the computation of the result. For example, a stream implementation is free + * to elide operations (or entire stages) from a stream pipeline -- and + * therefore elide invocation of behavioral parameters -- if it can prove that + * it would not affect the result of the computation. This means that + * side-effects of behavioral parameters may not always be executed and should + * not be relied upon, unless otherwise specified (such as by the terminal + * operations {@code forEach} and {@code forEachOrdered}). (For a specific + * example of such an optimization, see the API note documented on the + * {@link #count} operation. For more detail, see the + * side-effects section of the + * stream package documentation.) + * *

    Collections and streams, while bearing some superficial similarities, * have different goals. Collections are primarily concerned with the efficient * management of, and access to, their elements. By contrast, streams do not @@ -415,6 +428,11 @@ public interface Stream extends BaseStream> { * .collect(Collectors.toList()); * } * + *

    In cases where the stream implementation is able to optimize away the + * production of some or all the elements (such as with short-circuiting + * operations like {@code findFirst}, or in the example described in + * {@link #count}), the action will not be invoked for those elements. + * * @param action a * non-interfering action to perform on the elements as * they are consumed from the stream diff --git a/jdk/src/java.base/share/classes/java/util/stream/StreamSpliterators.java b/jdk/src/java.base/share/classes/java/util/stream/StreamSpliterators.java index cb92b2ebfad..8236255d5ef 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/StreamSpliterators.java +++ b/jdk/src/java.base/share/classes/java/util/stream/StreamSpliterators.java @@ -28,7 +28,6 @@ import java.util.Comparator; import java.util.Objects; import java.util.Spliterator; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ForkJoinPool; import java.util.concurrent.atomic.AtomicLong; import java.util.function.BooleanSupplier; import java.util.function.Consumer; @@ -104,7 +103,7 @@ class StreamSpliterators { T_BUFFER buffer; /** - * True if full traversal has occurred (with possible cancelation). + * True if full traversal has occurred (with possible cancellation). * If doing a partial traversal, there may be still elements in buffer. */ boolean finished; diff --git a/jdk/src/java.base/share/classes/java/util/stream/package-info.java b/jdk/src/java.base/share/classes/java/util/stream/package-info.java index 2850e21bbbd..f580d8fb372 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/package-info.java +++ b/jdk/src/java.base/share/classes/java/util/stream/package-info.java @@ -287,18 +287,35 @@ * statelessness requirement, as well as other thread-safety hazards. * *

    If the behavioral parameters do have side-effects, unless explicitly - * stated, there are no guarantees as to the - * visibility - * of those side-effects to other threads, nor are there any guarantees that - * different operations on the "same" element within the same stream pipeline - * are executed in the same thread. Further, the ordering of those effects - * may be surprising. Even when a pipeline is constrained to produce a - * result that is consistent with the encounter order of the stream - * source (for example, {@code IntStream.range(0,5).parallel().map(x -> x*2).toArray()} + * stated, there are no guarantees as to: + *

      + *
    • the + * visibility of those side-effects to other threads;
    • + *
    • that different operations on the "same" element within the same stream + * pipeline are executed in the same thread; and
    • + *
    • that behavioral parameters are always invoked, since a stream + * implementation is free to elide operations (or entire stages) from a + * stream pipeline if it can prove that it would not affect the result of the + * computation. + *
    • + *
    + *

    The ordering of side-effects may be surprising. Even when a pipeline is + * constrained to produce a result that is consistent with the + * encounter order of the stream source (for example, + * {@code IntStream.range(0,5).parallel().map(x -> x*2).toArray()} * must produce {@code [0, 2, 4, 6, 8]}), no guarantees are made as to the order * in which the mapper function is applied to individual elements, or in what * thread any behavioral parameter is executed for a given element. * + *

    The eliding of side-effects may also be surprising. With the exception of + * terminal operations {@link java.util.stream.Stream#forEach forEach} and + * {@link java.util.stream.Stream#forEachOrdered forEachOrdered}, side-effects + * of behavioral parameters may not always be executed when the stream + * implementation can optimize away the execution of behavioral parameters + * without affecting the result of the computation. (For a specific example + * see the API note documented on the {@link java.util.stream.Stream#count count} + * operation.) + * *

    Many computations where one might be tempted to use side effects can be more * safely and efficiently expressed without side-effects, such as using * reduction instead of mutable diff --git a/jdk/src/java.base/share/classes/java/util/zip/ZipFile.java b/jdk/src/java.base/share/classes/java/util/zip/ZipFile.java index 1cba038d6e5..b97d0cf68c6 100644 --- a/jdk/src/java.base/share/classes/java/util/zip/ZipFile.java +++ b/jdk/src/java.base/share/classes/java/util/zip/ZipFile.java @@ -462,9 +462,13 @@ class ZipFile implements ZipConstants, Closeable { private class ZipEntryIterator implements Enumeration, Iterator { private int i = 0; + private final int entryCount; public ZipEntryIterator() { - ensureOpen(); + synchronized (ZipFile.this) { + ensureOpen(); + this.entryCount = zsrc.total; + } } public boolean hasMoreElements() { @@ -472,10 +476,7 @@ class ZipFile implements ZipConstants, Closeable { } public boolean hasNext() { - synchronized (ZipFile.this) { - ensureOpen(); - return i < zsrc.total; - } + return i < entryCount; } public ZipEntry nextElement() { @@ -485,7 +486,7 @@ class ZipFile implements ZipConstants, Closeable { public ZipEntry next() { synchronized (ZipFile.this) { ensureOpen(); - if (i >= zsrc.total) { + if (!hasNext()) { throw new NoSuchElementException(); } // each "entry" has 3 ints in table entries @@ -526,34 +527,34 @@ class ZipFile implements ZipConstants, Closeable { /* Checks ensureOpen() before invoke this method */ private ZipEntry getZipEntry(String name, int pos) { byte[] cen = zsrc.cen; - ZipEntry e = new ZipEntry(); int nlen = CENNAM(cen, pos); int elen = CENEXT(cen, pos); int clen = CENCOM(cen, pos); - e.flag = CENFLG(cen, pos); // get the flag first - if (name != null) { - e.name = name; - } else { - if (!zc.isUTF8() && (e.flag & EFS) != 0) { - e.name = zc.toStringUTF8(cen, pos + CENHDR, nlen); + int flag = CENFLG(cen, pos); + if (name == null) { + if (!zc.isUTF8() && (flag & EFS) != 0) { + name = zc.toStringUTF8(cen, pos + CENHDR, nlen); } else { - e.name = zc.toString(cen, pos + CENHDR, nlen); + name = zc.toString(cen, pos + CENHDR, nlen); } } + ZipEntry e = new ZipEntry(name); + e.flag = flag; e.xdostime = CENTIM(cen, pos); e.crc = CENCRC(cen, pos); e.size = CENLEN(cen, pos); e.csize = CENSIZ(cen, pos); e.method = CENHOW(cen, pos); if (elen != 0) { - e.setExtra0(Arrays.copyOfRange(cen, pos + CENHDR + nlen, - pos + CENHDR + nlen + elen), true); + int start = pos + CENHDR + nlen; + e.setExtra0(Arrays.copyOfRange(cen, start, start + elen), true); } if (clen != 0) { - if (!zc.isUTF8() && (e.flag & EFS) != 0) { - e.comment = zc.toStringUTF8(cen, pos + CENHDR + nlen + elen, clen); + int start = pos + CENHDR + nlen + elen; + if (!zc.isUTF8() && (flag & EFS) != 0) { + e.comment = zc.toStringUTF8(cen, start, clen); } else { - e.comment = zc.toString(cen, pos + CENHDR + nlen + elen, clen); + e.comment = zc.toString(cen, start, clen); } } return e; @@ -817,7 +818,7 @@ class ZipFile implements ZipConstants, Closeable { ); } - /* + /** * Returns an array of strings representing the names of all entries * that begin with "META-INF/" (case ignored). This method is used * in JarFile, via SharedSecrets, as an optimization when looking up @@ -827,14 +828,14 @@ class ZipFile implements ZipConstants, Closeable { private String[] getMetaInfEntryNames() { synchronized (this) { ensureOpen(); - if (zsrc.metanames.size() == 0) { + if (zsrc.metanames == null) { return null; } - String[] names = new String[zsrc.metanames.size()]; + String[] names = new String[zsrc.metanames.length]; byte[] cen = zsrc.cen; for (int i = 0; i < names.length; i++) { - int pos = zsrc.metanames.get(i); - names[i] = new String(cen, pos + CENHDR, CENNAM(cen, pos), + int pos = zsrc.metanames[i]; + names[i] = new String(cen, pos + CENHDR, CENNAM(cen, pos), StandardCharsets.UTF_8); } return names; @@ -850,7 +851,7 @@ class ZipFile implements ZipConstants, Closeable { private long locpos; // position of first LOC header (usually 0) private byte[] comment; // zip file comment // list of meta entries in META-INF dir - private ArrayList metanames = new ArrayList<>(); + private int[] metanames; private final boolean startsWithLoc; // true, if zip file starts with LOCSIG (usually true) // A Hashmap for all entries. @@ -1159,7 +1160,7 @@ class ZipFile implements ZipConstants, Closeable { int next = -1; // list for all meta entries - metanames = new ArrayList<>(); + ArrayList metanamesList = null; // Iterate through the entries in the central directory int i = 0; @@ -1194,13 +1195,21 @@ class ZipFile implements ZipConstants, Closeable { idx = addEntry(idx, hash, next, pos); // Adds name to metanames. if (isMetaName(cen, pos + CENHDR, nlen)) { - metanames.add(pos); + if (metanamesList == null) + metanamesList = new ArrayList<>(4); + metanamesList.add(pos); } // skip ext and comment pos += (CENHDR + nlen + elen + clen); i++; } total = i; + if (metanamesList != null) { + metanames = new int[metanamesList.size()]; + for (int j = 0, len = metanames.length; j < len; j++) { + metanames[j] = metanamesList.get(j); + } + } if (pos + ENDHDR != cen.length) { zerror("invalid CEN header (bad header size)"); } @@ -1265,30 +1274,23 @@ class ZipFile implements ZipConstants, Closeable { } } - private static byte[] metainf = new byte[] { - 'M', 'E', 'T', 'A', '-', 'I' , 'N', 'F', '/', - }; - - /* - * Returns true if the specified entry's name begins with the string - * "META-INF/" irrespective of case. + /** + * Returns true if the bytes represent a non-directory name + * beginning with "META-INF/", disregarding ASCII case. */ - private static boolean isMetaName(byte[] name, int off, int len) { - if (len < 9 || (name[off] != 'M' && name[off] != 'm')) { // sizeof("META-INF/") - 1 - return false; - } - off++; - for (int i = 1; i < metainf.length; i++) { - byte c = name[off++]; - // Avoid toupper; it's locale-dependent - if (c >= 'a' && c <= 'z') { - c += 'A' - 'a'; - } - if (metainf[i] != c) { - return false; - } - } - return true; + private static boolean isMetaName(byte[] name, int off, int len) { + // Use the "oldest ASCII trick in the book" + return len > 9 // "META-INF/".length() + && name[off + len - 1] != '/' // non-directory + && (name[off++] | 0x20) == 'm' + && (name[off++] | 0x20) == 'e' + && (name[off++] | 0x20) == 't' + && (name[off++] | 0x20) == 'a' + && (name[off++] ) == '-' + && (name[off++] | 0x20) == 'i' + && (name[off++] | 0x20) == 'n' + && (name[off++] | 0x20) == 'f' + && (name[off] ) == '/'; } /* diff --git a/jdk/src/java.base/share/classes/jdk/Version.java b/jdk/src/java.base/share/classes/jdk/Version.java deleted file mode 100644 index 8afccfba6a8..00000000000 --- a/jdk/src/java.base/share/classes/jdk/Version.java +++ /dev/null @@ -1,603 +0,0 @@ -/* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import sun.security.action.GetPropertyAction; - -/** - * A representation of the JDK version-string which contains a version - * number optionally followed by pre-release and build information. - * - *

    Version numbers

    - * - * A version number, {@code $VNUM}, is a non-empty sequence of - * non-negative integer numerals, without leading or trailing zeroes, - * separated by period characters (U+002E); i.e., it matches the regular - * expression {@code ^[1-9][0-9]*(((\.0)*\.[1-9][0-9]*)*)*$}. The sequence may - * be of arbitrary length but the first three elements are assigned specific - * meanings, as follows: - * - *
    - *     $MAJOR.$MINOR.$SECURITY
    - * 
    - * - *
      - * - *
    • {@code $MAJOR} --- The major version number, - * incremented for a major release that contains significant new features as - * specified in a new edition of the Java SE Platform Specification, - * e.g., JSR 337 - * for Java SE 8. Features may be removed in a major release, given - * advance notice at least one major release ahead of time, and incompatible - * changes may be made when justified. The {@code $MAJOR} version number of - * JDK 8 was {@code 8}; the {@code $MAJOR} version number of JDK 9 - * is {@code 9}.

    • - * - *
    • {@code $MINOR} --- The minor version number, - * incremented for a minor update release that may contain compatible bug - * fixes, revisions to standard APIs mandated by a Maintenance Release of - * the relevant Platform Specification, and implementation features outside - * the scope of that Specification such as new JDK-specific APIs, additional - * service providers, new garbage collectors, and ports to new hardware - * architectures. {@code $MINOR} is reset to zero when {@code $MAJOR} is - * incremented.

    • - * - *
    • {@code $SECURITY} --- The security level, - * incremented for a security-update release that contains critical fixes - * including those necessary to improve security. {@code $SECURITY} is reset - * to zero only when {@code $MAJOR} is incremented. A higher - * value of {@code $SECURITY} for a given {@code $MAJOR} value, therefore, - * always indicates a more secure release, regardless of the value of {@code - * $MINOR}.

    • - * - *
    - * - *

    The fourth and later elements of a version number are free for use by - * downstream consumers of the JDK code base. Such a consumer may, - * e.g., use the fourth element to identify patch releases which - * contain a small number of critical non-security fixes in addition to the - * security fixes in the corresponding security release.

    - * - *

    The version number does not include trailing zero elements; - * i.e., {@code $SECURITY} is omitted if it has the value zero, and - * {@code $MINOR} is omitted if both {@code $MINOR} and {@code $SECURITY} have - * the value zero.

    - * - *

    The sequence of numerals in a version number is compared to another - * such sequence in numerical, pointwise fashion; e.g., {@code 9.9.1} - * is less than {@code 9.10.0}. If one sequence is shorter than another then - * the missing elements of the shorter sequence are considered to be zero; - * e.g., {@code 9.1.2} is equal to {@code 9.1.2.0} but less than - * {@code 9.1.2.1}.

    - * - *

    Version strings

    - * - *

    A version string {@code $VSTR} consists of a version number - * {@code $VNUM}, as described above, optionally followed by pre-release and - * build information, in the format

    - * - *
    - *     $VNUM(-$PRE)?(\+($BUILD)?(-$OPT)?)?
    - * 
    - * - *

    where:

    - * - *
      - * - *
    • {@code $PRE}, matching {@code ([a-zA-Z0-9]+)} --- - * A pre-release identifier. Typically {@code ea}, for an early-access - * release that's under active development and potentially unstable, or {@code - * internal}, for an internal developer build. - * - *

    • {@code $BUILD}, matching {@code - * (0|[1-9][0-9]*)} --- The build number, incremented for each promoted build. - * {@code $BUILD} is reset to {@code 1} when any portion of {@code $VNUM} is - * incremented.

      - * - *
    • {@code $OPT}, matching {@code ([-a-zA-Z0-9\.]+)} - * --- Additional build information, if desired. In the case of an {@code - * internal} build this will often contain the date and time of the - * build.

      - * - *
    - * - *

    When comparing two version strings the value of {@code $OPT}, if - * present, may or may not be significant depending on the chosen comparison - * method. The comparison methods {@link #compareTo(Version) compareTo()} and - * {@link #compareToIgnoreOpt(Version) compareToIgnoreOpt{}} should be used - * consistently with the corresponding methods {@link #equals(Object) equals()} - * and {@link #equalsIgnoreOpt(Object) equalsIgnoreOpt()}.

    - * - *

    A short version string ({@code $SVSTR}), often useful in less - * formal contexts, is simply {@code $VNUM} optionally ended with {@code - * -$PRE}.

    - * - * @since 9 - */ -public final class Version - implements Comparable -{ - private final List version; - private final Optional pre; - private final Optional build; - private final Optional optional; - - private static Version current; - - // $VNUM(-$PRE)?(\+($BUILD)?(\-$OPT)?)? - // RE limits the format of version strings - // ([1-9][0-9]*(?:(?:\.0)*\.[1-9][0-9]*)*)(?:-([a-zA-Z0-9]+))?(?:(\+)(0|[1-9][0-9]*)?)?(?:-([-a-zA-Z0-9.]+))? - - private static final String VNUM - = "(?[1-9][0-9]*(?:(?:\\.0)*\\.[1-9][0-9]*)*)"; - private static final String VNUM_GROUP = "VNUM"; - - private static final String PRE = "(?:-(?
    [a-zA-Z0-9]+))?";
    -    private static final String PRE_GROUP   = "PRE";
    -
    -    private static final String BUILD
    -        = "(?:(?\\+)(?0|[1-9][0-9]*)?)?";
    -    private static final String PLUS_GROUP  = "PLUS";
    -    private static final String BUILD_GROUP = "BUILD";
    -
    -    private static final String OPT      = "(?:-(?[-a-zA-Z0-9.]+))?";
    -    private static final String OPT_GROUP   = "OPT";
    -
    -    private static final String VSTR_FORMAT
    -        = "^" + VNUM + PRE + BUILD + OPT + "$";
    -    private static final Pattern VSTR_PATTERN = Pattern.compile(VSTR_FORMAT);
    -
    -    /**
    -     * Constructs a valid JDK version string containing a
    -     * version number followed by pre-release and build
    -     * information.
    -     *
    -     * @param  s
    -     *         A string to be interpreted as a version
    -     *
    -     * @throws  IllegalArgumentException
    -     *          If the given string cannot be interpreted a valid version
    -     *
    -     * @throws  NullPointerException
    -     *          If {@code s} is {@code null}
    -     *
    -     * @throws  NumberFormatException
    -     *          If an element of the version number or the build number cannot
    -     *          be represented as an {@link Integer}
    -     */
    -    private Version(String s) {
    -        if (s == null)
    -            throw new NullPointerException();
    -
    -        Matcher m = VSTR_PATTERN.matcher(s);
    -        if (!m.matches())
    -            throw new IllegalArgumentException("Invalid version string: '"
    -                                               + s + "'");
    -
    -        // $VNUM is a dot-separated list of integers of arbitrary length
    -        List list = new ArrayList<>();
    -        for (String i : m.group(VNUM_GROUP).split("\\."))
    -            list.add(Integer.parseInt(i));
    -        version = Collections.unmodifiableList(list);
    -
    -        pre = Optional.ofNullable(m.group(PRE_GROUP));
    -
    -        String b = m.group(BUILD_GROUP);
    -        // $BUILD is an integer
    -        build = (b == null)
    -             ? Optional.empty()
    -             : Optional.ofNullable(Integer.parseInt(b));
    -
    -        optional = Optional.ofNullable(m.group(OPT_GROUP));
    -
    -        // empty '+'
    -        if ((m.group(PLUS_GROUP) != null) && !build.isPresent()) {
    -            if (optional.isPresent()) {
    -                if (pre.isPresent())
    -                    throw new IllegalArgumentException("'+' found with"
    -                        + " pre-release and optional components:'" + s + "'");
    -            } else {
    -                throw new IllegalArgumentException("'+' found with neither"
    -                    + " build or optional components: '" + s + "'");
    -            }
    -        }
    -    }
    -
    -    /**
    -     * Parses the given string as a valid JDK version string containing a version number followed by pre-release and
    -     * build information.
    -     *
    -     * @param  s
    -     *         A string to interpret as a version
    -     *
    -     * @throws  IllegalArgumentException
    -     *          If the given string cannot be interpreted a valid version
    -     *
    -     * @throws  NullPointerException
    -     *          If the given string is {@code null}
    -     *
    -     * @throws  NumberFormatException
    -     *          If an element of the version number or the build number cannot
    -     *          be represented as an {@link Integer}
    -     *
    -     * @return  This version
    -     */
    -    public static Version parse(String s) {
    -        return new Version(s);
    -    }
    -
    -    /**
    -     * Returns {@code System.getProperty("java.version")} as a Version.
    -     *
    -     * @throws  SecurityException
    -     *          If a security manager exists and its {@link
    -     *          SecurityManager#checkPropertyAccess(String)
    -     *          checkPropertyAccess} method does not allow access to the
    -     *          system property "java.version"
    -     *
    -     * @return  {@code System.getProperty("java.version")} as a Version
    -     */
    -    public static Version current() {
    -        if (current == null) {
    -            current = parse(
    -                    GetPropertyAction.privilegedGetProperty("java.version"));
    -        }
    -        return current;
    -    }
    -
    -    /**
    -     * Returns the major version number.
    -     *
    -     * @return  The major version number
    -     */
    -    public int major() {
    -        return version.get(0);
    -    }
    -
    -    /**
    -     * Returns the minor version number or zero if it was
    -     * not set.
    -     *
    -     * @return  The minor version number or zero if it was not set
    -     */
    -    public int minor() {
    -        return (version.size() > 1 ? version.get(1) : 0);
    -    }
    -
    -    /**
    -     * Returns the security version number or zero if
    -     * it was not set.
    -     *
    -     * @return  The security version number or zero if it was not set
    -     */
    -    public int security() {
    -        return (version.size() > 2 ? version.get(2) : 0);
    -    }
    -
    -    /**
    -     * Returns an unmodifiable {@link java.util.List List} of the
    -     * integer numerals contained in the version
    -     * number.  The {@code List} always contains at least one
    -     * element corresponding to the major version
    -     * number.
    -     *
    -     * @return  An unmodifiable list of the integer numerals
    -     *          contained in the version number
    -     */
    -    public List version() {
    -        return version;
    -    }
    -
    -    /**
    -     * Returns the optional pre-release information.
    -     *
    -     * @return  The optional pre-release information as a String
    -     */
    -    public Optional pre() {
    -        return pre;
    -    }
    -
    -    /**
    -     * Returns the build number.
    -     *
    -     * @return The optional build number.
    -     */
    -    public Optional build() {
    -        return build;
    -    }
    -
    -    /**
    -     * Returns optional additional identifying build
    -     * information.
    -     *
    -     * @return  Additional build information as a String
    -     */
    -    public Optional optional() {
    -        return optional;
    -    }
    -
    -    /**
    -     * Compares this version to another.
    -     *
    -     * 

    Each of the components in the version is - * compared in the follow order of precedence: version numbers, - * pre-release identifiers, build numbers, optional build information.

    - * - *

    Comparison begins by examining the sequence of version numbers. If - * one sequence is shorter than another, then the missing elements of the - * shorter sequence are considered to be zero.

    - * - *

    A version with a pre-release identifier is always considered to be - * less than a version without one. Pre-release identifiers are compared - * numerically when they consist only of digits, and lexicographically - * otherwise. Numeric identifiers are considered to be less than - * non-numeric identifiers.

    - * - *

    A version without a build number is always less than one with a - * build number; otherwise build numbers are compared numerically.

    - * - *

    The optional build information is compared lexicographically. - * During this comparison, a version with optional build information is - * considered to be greater than a version without one.

    - * - *

    A version is not comparable to any other type of object. - * - * @param ob - * The object to be compared - * - * @return A negative integer, zero, or a positive integer if this - * {@code Version} is less than, equal to, or greater than the - * given {@code Version} - * - * @throws NullPointerException - * If the given object is {@code null} - */ - @Override - public int compareTo(Version ob) { - return compare(ob, false); - } - - /** - * Compares this version to another disregarding optional build - * information. - * - *

    Two versions are compared by examining the version string as - * described in {@link #compareTo(Version)} with the exception that the - * optional build information is always ignored.

    - * - *

    A version is not comparable to any other type of object. - * - * @param ob - * The object to be compared - * - * @return A negative integer, zero, or a positive integer if this - * {@code Version} is less than, equal to, or greater than the - * given {@code Version} - * - * @throws NullPointerException - * If the given object is {@code null} - */ - public int compareToIgnoreOpt(Version ob) { - return compare(ob, true); - } - - private int compare(Version ob, boolean ignoreOpt) { - if (ob == null) - throw new NullPointerException("Invalid argument"); - - int ret = compareVersion(ob); - if (ret != 0) - return ret; - - ret = comparePre(ob); - if (ret != 0) - return ret; - - ret = compareBuild(ob); - if (ret != 0) - return ret; - - if (!ignoreOpt) - return compareOpt(ob); - - return 0; - } - - private int compareVersion(Version ob) { - int size = version.size(); - int oSize = ob.version().size(); - int min = Math.min(size, oSize); - for (int i = 0; i < min; i++) { - Integer val = version.get(i); - Integer oVal = ob.version().get(i); - if (val != oVal) - return val - oVal; - } - if (size != oSize) - return size - oSize; - return 0; - } - - private int comparePre(Version ob) { - Optional oPre = ob.pre(); - if (!pre.isPresent()) { - if (oPre.isPresent()) - return 1; - } else { - if (!oPre.isPresent()) - return -1; - String val = pre.get(); - String oVal = oPre.get(); - if (val.matches("\\d+")) { - return (oVal.matches("\\d+") - ? (new BigInteger(val)).compareTo(new BigInteger(oVal)) - : -1); - } else { - return (oVal.matches("\\d+") - ? 1 - : val.compareTo(oVal)); - } - } - return 0; - } - - private int compareBuild(Version ob) { - Optional oBuild = ob.build(); - if (oBuild.isPresent()) { - return (build.isPresent() - ? build.get().compareTo(oBuild.get()) - : 1); - } else if (build.isPresent()) { - return -1; - } - return 0; - } - - private int compareOpt(Version ob) { - Optional oOpt = ob.optional(); - if (!optional.isPresent()) { - if (oOpt.isPresent()) - return -1; - } else { - if (!oOpt.isPresent()) - return 1; - return optional.get().compareTo(oOpt.get()); - } - return 0; - } - - /** - * Returns a string representation of this version. - * - * @return The version string - */ - @Override - public String toString() { - StringBuilder sb - = new StringBuilder(version.stream() - .map(Object::toString) - .collect(Collectors.joining("."))); - pre.ifPresent(v -> sb.append("-").append(v)); - - if (build.isPresent()) { - sb.append("+").append(build.get()); - if (optional.isPresent()) - sb.append("-").append(optional.get()); - } else { - if (optional.isPresent()) { - sb.append(pre.isPresent() ? "-" : "+-"); - sb.append(optional.get()); - } - } - - return sb.toString(); - } - - /** - * Determines whether this {@code Version} is equal to another object. - * - *

    Two {@code Version}s are equal if and only if they represent the - * same version string. - * - *

    This method satisfies the general contract of the {@link - * Object#equals(Object) Object.equals} method.

    - * - * @param ob - * The object to which this {@code Version} is to be compared - * - * @return {@code true} if, and only if, the given object is a {@code - * Version} that is identical to this {@code Version} - * - */ - @Override - public boolean equals(Object ob) { - boolean ret = equalsIgnoreOpt(ob); - if (!ret) - return false; - - Version that = (Version)ob; - return (this.optional().equals(that.optional())); - } - - /** - * Determines whether this {@code Version} is equal to another - * disregarding optional build information. - * - *

    Two {@code Version}s are equal if and only if they represent the - * same version string disregarding the optional build information. - * - * @param ob - * The object to which this {@code Version} is to be compared - * - * @return {@code true} if, and only if, the given object is a {@code - * Version} that is identical to this {@code Version} - * ignoring the optinal build information - * - */ - public boolean equalsIgnoreOpt(Object ob) { - if (this == ob) - return true; - if (!(ob instanceof Version)) - return false; - - Version that = (Version)ob; - return (this.version().equals(that.version()) - && this.pre().equals(that.pre()) - && this.build().equals(that.build())); - } - - /** - * Returns the hash code of this version. - * - *

    This method satisfies the general contract of the {@link - * Object#hashCode Object.hashCode} method. - * - * @return The hashcode of this version - */ - @Override - public int hashCode() { - int h = 1; - int p = 17; - - h = p * h + version.hashCode(); - h = p * h + pre.hashCode(); - h = p * h + build.hashCode(); - h = p * h + optional.hashCode(); - - return h; - } -} diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java index 9b21fb6c1be..68b076784f5 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java @@ -27,6 +27,8 @@ package jdk.internal.jimage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; @@ -98,8 +100,34 @@ public class BasicImageReader implements AutoCloseable { } // Open the file only if no memory map yet or is 32 bit jvm - channel = map != null && MAP_ALL ? null : - FileChannel.open(imagePath, StandardOpenOption.READ); + if (map != null && MAP_ALL) { + channel = null; + } else { + channel = FileChannel.open(imagePath, StandardOpenOption.READ); + // No lambdas during bootstrap + AccessController.doPrivileged(new PrivilegedAction() { + @Override + public Void run() { + if (BasicImageReader.class.getClassLoader() == null) { + try { + Class fileChannelImpl = + Class.forName("sun.nio.ch.FileChannelImpl"); + Method setUninterruptible = + fileChannelImpl.getMethod("setUninterruptible"); + setUninterruptible.invoke(channel); + } catch (ClassNotFoundException | + NoSuchMethodException | + IllegalAccessException | + InvocationTargetException ex) { + // fall thru - will only happen on JDK-8 systems where this code + // is only used by tools using jrt-fs (non-critical.) + } + } + + return null; + } + }); + } // If no memory map yet and 64 bit jvm then memory map entire file if (MAP_ALL && map == null) { diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java index 2c78ea9e5d5..a747ea8aa7b 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java @@ -149,6 +149,17 @@ public final class ImageReader implements AutoCloseable { return reader.getEntryNames(); } + public String[] getModuleNames() { + Objects.requireNonNull(reader, "image file closed"); + int off = "/modules/".length(); + return reader.findNode("/modules") + .getChildren() + .stream() + .map(Node::getNameString) + .map(s -> s.substring(off, s.length())) + .toArray(String[]::new); + } + public long[] getAttributes(int offset) { Objects.requireNonNull(reader, "image file closed"); return reader.getAttributes(offset); diff --git a/jdk/src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java b/jdk/src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java index 7a946099fdf..bc2396f10c3 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java +++ b/jdk/src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java @@ -68,13 +68,14 @@ public class ClassLoaders { if (s != null && s.length() > 0) bcp = toURLClassPath(s); - // we have a class path if -cp is specified or -m is not specified + // we have a class path if -cp is specified or -m is not specified. + // If neither is specified then default to -cp . URLClassPath ucp = null; String mainMid = System.getProperty("jdk.module.main"); String cp = System.getProperty("java.class.path"); - if (mainMid == null && (cp == null || cp.length() == 0)) - cp = "."; - if (cp != null && cp.length() > 0) + if (mainMid == null && cp == null) + cp = ""; + if (cp != null) ucp = toURLClassPath(cp); @@ -197,7 +198,7 @@ public class ClassLoaders { * @see java.lang.instrument.Instrumentation#appendToSystemClassLoaderSearch */ void appendToClassPathForInstrumentation(String path) { - appendToUCP(path, ucp); + addClassPathToUCP(path, ucp); } /** @@ -224,7 +225,7 @@ public class ClassLoaders { */ private static URLClassPath toURLClassPath(String cp) { URLClassPath ucp = new URLClassPath(new URL[0]); - appendToUCP(cp, ucp); + addClassPathToUCP(cp, ucp); return ucp; } @@ -232,20 +233,28 @@ public class ClassLoaders { * Converts the elements in the given class path to file URLs and adds * them to the given URLClassPath. */ - private static void appendToUCP(String cp, URLClassPath ucp) { - String[] elements = cp.split(File.pathSeparator); - if (elements.length == 0) { - // contains path separator(s) only, default to current directory - // to be compatible with long standing behavior - elements = new String[] { "" }; + private static void addClassPathToUCP(String cp, URLClassPath ucp) { + int off = 0; + int next; + while ((next = cp.indexOf(File.pathSeparator, off)) != -1) { + addURLToUCP(cp.substring(off, next), ucp); + off = next + 1; } - for (String s: elements) { - try { - URL url = Paths.get(s).toRealPath().toUri().toURL(); - ucp.addURL(url); - } catch (InvalidPathException | IOException ignore) { - // malformed path string or class path element does not exist - } + + // remaining + addURLToUCP(cp.substring(off), ucp); + } + + /** + * Attempts to convert to the given string to a file URL and adds it + * to the given URLClassPath. + */ + private static void addURLToUCP(String s, URLClassPath ucp) { + try { + URL url = Paths.get(s).toRealPath().toUri().toURL(); + ucp.addURL(url); + } catch (InvalidPathException | IOException ignore) { + // malformed path string or class path element does not exist } } diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java index 1fb433b9f7c..c86416e1dab 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java @@ -54,7 +54,7 @@ public final class ModuleInfoWriter { ClassWriter cw = new ClassWriter(0); String name = md.name().replace('.', '/') + "/module-info"; - cw.visit(Opcodes.V1_8, ACC_MODULE, name, null, null, null); + cw.visit(Opcodes.V1_9, ACC_MODULE, name, null, null, null); cw.visitAttribute(new ModuleAttribute(md)); cw.visitAttribute(new ConcealedPackagesAttribute(md.conceals())); diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java b/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java index 43de2cda9f7..78619f09f4d 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java @@ -46,12 +46,12 @@ public final class SystemModules { * and read module-info.class from the run-time image instead of * the fastpath. */ - public static final String[] MODULE_NAMES = new String[1]; + public static final String[] MODULE_NAMES = new String[0]; /** * Hash of system modules. */ - public static String[] MODULES_TO_HASH = new String[1]; + public static String[] MODULES_TO_HASH = new String[0]; /** * Number of packages in the boot layer from the installed modules. @@ -67,7 +67,7 @@ public final class SystemModules { * When running an exploded image it returns an empty array. */ public static ModuleDescriptor[] modules() { - return new ModuleDescriptor[0]; + throw new InternalError("should not reach here"); } } diff --git a/jdk/src/java.base/share/classes/module-info.java b/jdk/src/java.base/share/classes/module-info.java index 9d9fe8ec11f..a1b13336fa2 100644 --- a/jdk/src/java.base/share/classes/module-info.java +++ b/jdk/src/java.base/share/classes/module-info.java @@ -81,9 +81,6 @@ module java.base { exports javax.security.auth.x500; exports javax.security.cert; - // see JDK-8144062 - exports jdk; - // the service types defined by the APIs in this module diff --git a/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java index deefc8529f9..df9364a11d8 100644 --- a/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java @@ -40,7 +40,6 @@ import java.nio.channels.OverlappingFileLockException; import java.nio.channels.ReadableByteChannel; import java.nio.channels.SelectableChannel; import java.nio.channels.WritableByteChannel; -import java.security.AccessController; import java.util.ArrayList; import java.util.List; @@ -83,6 +82,9 @@ public class FileChannelImpl // Lock for operations involving position and size private final Object positionLock = new Object(); + // Positional-read is not interruptible + private volatile boolean uninterruptible; + private FileChannelImpl(FileDescriptor fd, String path, boolean readable, boolean writable, Object parent) { @@ -108,6 +110,10 @@ public class FileChannelImpl throw new ClosedChannelException(); } + public void setUninterruptible() { + uninterruptible = true; + } + // -- Standard channel operations -- protected void implCloseChannel() throws IOException { @@ -733,8 +739,10 @@ public class FileChannelImpl assert !nd.needsPositionLock() || Thread.holdsLock(positionLock); int n = 0; int ti = -1; + + boolean interruptible = !uninterruptible; try { - begin(); + if (interruptible) begin(); ti = threads.add(); if (!isOpen()) return -1; @@ -744,7 +752,7 @@ public class FileChannelImpl return IOStatus.normalize(n); } finally { threads.remove(ti); - end(n > 0); + if (interruptible) end(n > 0); assert IOStatus.check(n); } } diff --git a/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java b/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java index 9082670609e..971c4930b7e 100644 --- a/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java +++ b/jdk/src/java.base/share/classes/sun/security/jca/ProviderList.java @@ -650,12 +650,29 @@ public final class ProviderList { } } + /* Defined Groups for jdk.security.provider.preferred */ + private static final String SHA2Group[] = { "SHA-224", "SHA-256", + "SHA-384", "SHA-512", "SHA-512/224", "SHA-512/256" }; + private static final String HmacSHA2Group[] = { "HmacSHA224", + "HmacSHA256", "HmacSHA384", "HmacSHA512"}; + private static final String SHA2RSAGroup[] = { "SHA224withRSA", + "SHA256withRSA", "SHA384withRSA", "SHA512withRSA"}; + private static final String SHA2DSAGroup[] = { "SHA224withDSA", + "SHA256withDSA", "SHA384withDSA", "SHA512withDSA"}; + private static final String SHA2ECDSAGroup[] = { "SHA224withECDSA", + "SHA256withECDSA", "SHA384withECDSA", "SHA512withECDSA"}; + private static final String SHA3Group[] = { "SHA3-224", "SHA3-256", + "SHA3-384", "SHA3-512" }; + private static final String HmacSHA3Group[] = { "HmacSHA3-224", + "HmacSHA3-256", "HmacSHA3-384", "HmacSHA3-512"}; + // Individual preferred property entry from jdk.security.provider.preferred - private class PreferredEntry { - String type = null; - String algorithm; - String provider; - String alternateName = null; + private static class PreferredEntry { + private String type = null; + private String algorithm; + private String provider; + private String alternateNames[] = null; + private boolean group = false; PreferredEntry(String t, String p) { int i = t.indexOf('.'); @@ -667,47 +684,83 @@ public final class ProviderList { } provider = p; - if (algorithm.compareToIgnoreCase("SHA1") == 0) { - alternateName = "SHA-1"; + // Group definitions + if (type != null && type.compareToIgnoreCase("Group") == 0) { + // Currently intrinsic algorithm groups + if (algorithm.compareToIgnoreCase("SHA2") == 0) { + alternateNames = SHA2Group; + } else if (algorithm.compareToIgnoreCase("HmacSHA2") == 0) { + alternateNames = HmacSHA2Group; + } else if (algorithm.compareToIgnoreCase("SHA2RSA") == 0) { + alternateNames = SHA2RSAGroup; + } else if (algorithm.compareToIgnoreCase("SHA2DSA") == 0) { + alternateNames = SHA2DSAGroup; + } else if (algorithm.compareToIgnoreCase("SHA2ECDSA") == 0) { + alternateNames = SHA2ECDSAGroup; + } else if (algorithm.compareToIgnoreCase("SHA3") == 0) { + alternateNames = SHA3Group; + } else if (algorithm.compareToIgnoreCase("HmacSHA3") == 0) { + alternateNames = HmacSHA3Group; + } + if (alternateNames != null) { + group = true; + } + + // If the algorithm name given is SHA1 + } else if (algorithm.compareToIgnoreCase("SHA1") == 0) { + alternateNames = new String[] { "SHA-1" }; } else if (algorithm.compareToIgnoreCase("SHA-1") == 0) { - alternateName = "SHA1"; + alternateNames = new String[] { "SHA1" }; } } boolean match(String t, String a) { if (debug != null) { - debug.println("Config match: " + toString() + " == [" + t + - ", " + a + "]"); + debug.println("Config check: " + toString() + " == " + + print(t, a, null)); } // Compare service type if configured - if (type != null && type.compareToIgnoreCase(t) != 0) { + if (type != null && !group && type.compareToIgnoreCase(t) != 0) { return false; } // Compare the algorithm string. - if (a.compareToIgnoreCase(algorithm) == 0) { + if (!group && a.compareToIgnoreCase(algorithm) == 0) { if (debug != null) { - debug.println("Config entry found: " + toString()); + debug.println("Config entry matched: " + toString()); } return true; } - if (alternateName != null && - a.compareToIgnoreCase(alternateName) == 0) { - if (debug != null) { - debug.println("Config entry found (alternateName): " + - toString()); + if (alternateNames != null) { + for (String alt : alternateNames) { + if (debug != null) { + debug.println("AltName check: " + print(type, alt, + provider)); + } + if (a.compareToIgnoreCase(alt) == 0) { + if (debug != null) { + debug.println("AltName entry matched: " + + provider); + } + return true; + } } - return true; } // No match return false; } + // Print debugging output of PreferredEntry + private String print(String t, String a, String p) { + return "[" + ((t != null) ? t : "" ) + ", " + a + + ((p != null) ? " : " + p : "" ) + "] "; + } + public String toString() { - return "[" + type + ", " + algorithm + " : " + provider + "] "; + return print(type, algorithm, provider); } } diff --git a/jdk/src/java.base/share/classes/sun/security/provider/PolicyFile.java b/jdk/src/java.base/share/classes/sun/security/provider/PolicyFile.java index 5861b6c7a85..861fa692471 100644 --- a/jdk/src/java.base/share/classes/sun/security/provider/PolicyFile.java +++ b/jdk/src/java.base/share/classes/sun/security/provider/PolicyFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -259,14 +259,10 @@ public class PolicyFile extends java.security.Policy { private static final Debug debug = Debug.getInstance("policy"); - private static final String NONE = "NONE"; - private static final String P11KEYSTORE = "PKCS11"; - private static final String SELF = "${{self}}"; private static final String X500PRINCIPAL = "javax.security.auth.x500.X500Principal"; private static final String POLICY = "java.security.policy"; - private static final String SECURITY_MANAGER = "java.security.manager"; private static final String POLICY_URL = "policy.url."; private static final String AUTH_POLICY = "java.security.auth.policy"; private static final String AUTH_POLICY_URL = "auth.policy.url."; @@ -287,6 +283,17 @@ public class PolicyFile extends java.security.Policy { private static final Class[] PARAMS1 = { String.class }; private static final Class[] PARAMS2 = { String.class, String.class }; + /** + * When a policy file has a syntax error, the exception code may generate + * another permission check and this can cause the policy file to be parsed + * repeatedly, leading to a StackOverflowError or ClassCircularityError. + * To avoid this, this set is populated with policy files that have been + * previously parsed and have syntax errors, so that they can be + * subsequently ignored. + */ + private static AtomicReference> badPolicyURLs = + new AtomicReference<>(new HashSet<>()); + /** * Initializes the Policy object and reads the default policy * configuration file(s) into the Policy object. @@ -580,6 +587,16 @@ public class PolicyFile extends java.security.Policy { * @param policyFile the policy Reader object. */ private boolean init(URL policy, PolicyInfo newInfo) { + + // skip parsing policy file if it has been previously parsed and + // has syntax errors + if (badPolicyURLs.get().contains(policy)) { + if (debug != null) { + debug.println("skipping bad policy file: " + policy); + } + return false; + } + boolean success = false; PolicyParser pp = new PolicyParser(expandProperties); InputStreamReader isr = null; @@ -622,13 +639,18 @@ public class PolicyFile extends java.security.Policy { addGrantEntry(ge, keyStore, newInfo); } } catch (PolicyParser.ParsingException pe) { + // record bad policy file to avoid later reparsing it + badPolicyURLs.updateAndGet(k -> { + k.add(policy); + return k; + }); MessageFormat form = new MessageFormat(ResourcesMgr.getString (POLICY + ".error.parsing.policy.message")); Object[] source = {policy, pe.getLocalizedMessage()}; System.err.println(form.format(source)); - if (debug != null) + if (debug != null) { pe.printStackTrace(); - + } } catch (Exception e) { if (debug != null) { debug.println("error parsing "+policy); diff --git a/jdk/src/java.base/share/classes/sun/security/provider/PolicyParser.java b/jdk/src/java.base/share/classes/sun/security/provider/PolicyParser.java index ba8ed750254..f8aa620fc77 100644 --- a/jdk/src/java.base/share/classes/sun/security/provider/PolicyParser.java +++ b/jdk/src/java.base/share/classes/sun/security/provider/PolicyParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -213,7 +213,9 @@ public class PolicyParser { new MessageFormat(ResourcesMgr.getString( "duplicate.keystore.domain.name")); Object[] source = {domainName}; - throw new ParsingException(form.format(source)); + String msg = "duplicate keystore domain name: " + + domainName; + throw new ParsingException(msg, form, source); } } } else { @@ -743,7 +745,8 @@ public class PolicyParser { ResourcesMgr.getString ("expected.expect.read.end.of.file.")); Object[] source = {expect}; - throw new ParsingException(form.format(source)); + String msg = "expected [" + expect + "], read [end of file]"; + throw new ParsingException(msg, form, source); case StreamTokenizer.TT_WORD: if (expect.equalsIgnoreCase(st.sval)) { lookahead = st.nextToken(); @@ -1244,7 +1247,8 @@ public class PolicyParser { MessageFormat form = new MessageFormat(ResourcesMgr.getString( "duplicate.keystore.name")); Object[] source = {keystoreName}; - throw new ParsingException(form.format(source)); + String msg = "duplicate keystore name: " + keystoreName; + throw new ParsingException(msg, form, source); } } @@ -1316,6 +1320,8 @@ public class PolicyParser { private static final long serialVersionUID = -4330692689482574072L; private String i18nMessage; + private MessageFormat form; + private Object[] source; /** * Constructs a ParsingException with the specified @@ -1330,26 +1336,34 @@ public class PolicyParser { i18nMessage = msg; } + public ParsingException(String msg, MessageFormat form, + Object[] source) { + super(msg); + this.form = form; + this.source = source; + } + public ParsingException(int line, String msg) { super("line " + line + ": " + msg); - MessageFormat form = new MessageFormat - (ResourcesMgr.getString("line.number.msg")); - Object[] source = {line, msg}; - i18nMessage = form.format(source); + // don't call form.format unless getLocalizedMessage is called + // to avoid unnecessary permission checks + form = new MessageFormat(ResourcesMgr.getString("line.number.msg")); + source = new Object[] {line, msg}; } public ParsingException(int line, String expect, String actual) { super("line " + line + ": expected [" + expect + "], found [" + actual + "]"); - MessageFormat form = new MessageFormat(ResourcesMgr.getString + // don't call form.format unless getLocalizedMessage is called + // to avoid unnecessary permission checks + form = new MessageFormat(ResourcesMgr.getString ("line.number.expected.expect.found.actual.")); - Object[] source = {line, expect, actual}; - i18nMessage = form.format(source); + source = new Object[] {line, expect, actual}; } @Override public String getLocalizedMessage() { - return i18nMessage; + return i18nMessage != null ? i18nMessage : form.format(source); } } diff --git a/jdk/src/java.base/share/classes/sun/security/tools/keytool/CertAndKeyGen.java b/jdk/src/java.base/share/classes/sun/security/tools/keytool/CertAndKeyGen.java index e2b4cfbb823..85037622c1b 100644 --- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/CertAndKeyGen.java +++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/CertAndKeyGen.java @@ -67,7 +67,9 @@ public final class CertAndKeyGen { * * @param keyType type of key, e.g. "RSA", "DSA" * @param sigAlg name of the signature algorithm, e.g. "MD5WithRSA", - * "MD2WithRSA", "SHAwithDSA". + * "MD2WithRSA", "SHAwithDSA". If set to null, a default + * algorithm matching the private key will be chosen after + * the first keypair is generated. * @exception NoSuchAlgorithmException on unrecognized algorithms. */ public CertAndKeyGen (String keyType, String sigAlg) @@ -83,7 +85,9 @@ public final class CertAndKeyGen { * * @param keyType type of key, e.g. "RSA", "DSA" * @param sigAlg name of the signature algorithm, e.g. "MD5WithRSA", - * "MD2WithRSA", "SHAwithDSA". + * "MD2WithRSA", "SHAwithDSA". If set to null, a default + * algorithm matching the private key will be chosen after + * the first keypair is generated. * @param providerName name of the provider * @exception NoSuchAlgorithmException on unrecognized algorithms. * @exception NoSuchProviderException on unrecognized providers. @@ -161,8 +165,16 @@ public final class CertAndKeyGen { throw new IllegalArgumentException("Public key format is " + publicKey.getFormat() + ", must be X.509"); } - } + if (sigAlg == null) { + sigAlg = AlgorithmId.getDefaultSigAlgForKey(privateKey); + if (sigAlg == null) { + throw new IllegalArgumentException( + "Cannot derive signature algorithm from " + + privateKey.getAlgorithm()); + } + } + } /** * Returns the public key of the generated key pair if it is of type diff --git a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java index 94969b84196..3a3d5cfe91d 100644 --- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java +++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java @@ -54,7 +54,6 @@ import java.text.MessageFormat; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import java.lang.reflect.Constructor; import java.math.BigInteger; import java.net.URI; import java.net.URL; @@ -1238,7 +1237,7 @@ public final class Main { PrivateKey privateKey = (PrivateKey)recoverKey(alias, storePass, keyPass).fst; if (sigAlgName == null) { - sigAlgName = getCompatibleSigAlgName(privateKey.getAlgorithm()); + sigAlgName = getCompatibleSigAlgName(privateKey); } Signature signature = Signature.getInstance(sigAlgName); signature.initSign(privateKey); @@ -1328,7 +1327,7 @@ public final class Main { PrivateKey privateKey = (PrivateKey)recoverKey(alias, storePass, keyPass).fst; if (sigAlgName == null) { - sigAlgName = getCompatibleSigAlgName(privateKey.getAlgorithm()); + sigAlgName = getCompatibleSigAlgName(privateKey); } X509CRLEntry[] badCerts = new X509CRLEntry[ids.size()]; @@ -1387,7 +1386,7 @@ public final class Main { // Construct a Signature object, so that we can sign the request if (sigAlgName == null) { - sigAlgName = getCompatibleSigAlgName(privKey.getAlgorithm()); + sigAlgName = getCompatibleSigAlgName(privKey); } Signature signature = Signature.getInstance(sigAlgName); @@ -1619,19 +1618,17 @@ public final class Main { * If no signature algorithm was specified at the command line, * we choose one that is compatible with the selected private key */ - private static String getCompatibleSigAlgName(String keyAlgName) + private static String getCompatibleSigAlgName(PrivateKey key) throws Exception { - if ("DSA".equalsIgnoreCase(keyAlgName)) { - return "SHA256WithDSA"; - } else if ("RSA".equalsIgnoreCase(keyAlgName)) { - return "SHA256WithRSA"; - } else if ("EC".equalsIgnoreCase(keyAlgName)) { - return "SHA256withECDSA"; + String result = AlgorithmId.getDefaultSigAlgForKey(key); + if (result != null) { + return result; } else { throw new Exception(rb.getString ("Cannot.derive.signature.algorithm")); } } + /** * Creates a new key pair and self-signed certificate. */ @@ -1658,9 +1655,6 @@ public final class Main { throw new Exception(form.format(source)); } - if (sigAlgName == null) { - sigAlgName = getCompatibleSigAlgName(keyAlgName); - } CertAndKeyGen keypair = new CertAndKeyGen(keyAlgName, sigAlgName, providerName); @@ -2526,7 +2520,7 @@ public final class Main { // Determine the signature algorithm if (sigAlgName == null) { - sigAlgName = getCompatibleSigAlgName(privKey.getAlgorithm()); + sigAlgName = getCompatibleSigAlgName(privKey); } // Get the old certificate diff --git a/jdk/src/java.base/share/classes/sun/security/util/SignatureFileVerifier.java b/jdk/src/java.base/share/classes/sun/security/util/SignatureFileVerifier.java index 20e66d561fb..0bf5fcbe1fc 100644 --- a/jdk/src/java.base/share/classes/sun/security/util/SignatureFileVerifier.java +++ b/jdk/src/java.base/share/classes/sun/security/util/SignatureFileVerifier.java @@ -145,11 +145,10 @@ public class SignatureFileVerifier { */ public static boolean isBlockOrSF(String s) { // we currently only support DSA and RSA PKCS7 blocks - if (s.endsWith(".SF") || s.endsWith(".DSA") || - s.endsWith(".RSA") || s.endsWith(".EC")) { - return true; - } - return false; + return s.endsWith(".SF") + || s.endsWith(".DSA") + || s.endsWith(".RSA") + || s.endsWith(".EC"); } /** diff --git a/jdk/src/java.base/share/conf/security/java.policy b/jdk/src/java.base/share/conf/security/java.policy index 0400ebfd546..32d31472394 100644 --- a/jdk/src/java.base/share/conf/security/java.policy +++ b/jdk/src/java.base/share/conf/security/java.policy @@ -80,6 +80,10 @@ grant codeBase "jrt:/jdk.naming.dns" { permission java.security.AllPermission; }; +grant codeBase "jrt:/java.scripting" { + permission java.security.AllPermission; +}; + grant codeBase "jrt:/jdk.scripting.nashorn" { permission java.security.AllPermission; }; diff --git a/jdk/src/java.base/share/conf/security/java.security b/jdk/src/java.base/share/conf/security/java.security index 6fa0d301d33..caf94448f25 100644 --- a/jdk/src/java.base/share/conf/security/java.security +++ b/jdk/src/java.base/share/conf/security/java.security @@ -105,15 +105,30 @@ security.provider.tbd=SunPKCS11 # The provider is the name of the provider. Any provider that does not # also appear in the registered list will be ignored. # +# There is a special serviceType for this property only to group a set of +# algorithms together. The type is "Group" and is followed by an algorithm +# keyword. Groups are to simplify and lessen the entries on the property +# line. Current groups are: +# Group.SHA2 = SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256 +# Group.HmacSHA2 = HmacSHA224, HmacSHA256, HmacSHA384, HmacSHA512 +# Group.SHA2RSA = SHA224withRSA, SHA256withRSA, SHA384withRSA, SHA512withRSA +# Group.SHA2DSA = SHA224withDSA, SHA256withDSA, SHA384withDSA, SHA512withDSA +# Group.SHA2ECDSA = SHA224withECDSA, SHA256withECDSA, SHA384withECDSA, \ +# SHA512withECDSA +# Group.SHA3 = SHA3-224, SHA3-256, SHA3-384, SHA3-512 +# Group.HmacSHA3 = HmacSHA3-224, HmacSHA3-256, HmacSHA3-384, HmacSHA3-512 +# # Example: # jdk.security.provider.preferred=AES/GCM/NoPadding:SunJCE, \ -# MessageDigest.SHA-256:SUN +# MessageDigest.SHA-256:SUN, Group.HmacSHA2:SunJCE #ifdef solaris-sparc -jdk.security.provider.preferred=AES:SunJCE, SHA1:SUN, SHA-224:SUN, \ - SHA-256:SUN, SHA-384:SUN, SHA-512:SUN +jdk.security.provider.preferred=AES:SunJCE, SHA1:SUN, Group.SHA2:SUN, \ + HmacSHA1:SunJCE, Group.HmacSHA2:SunJCE #endif #ifdef solaris-x86 -jdk.security.provider.preferred=AES:SunJCE, RSA:SunRsaSign +jdk.security.provider.preferred=AES:SunJCE, SHA1:SUN, Group.SHA2:SUN, \ + HmacSHA1:SunJCE, Group.HmacSHA2:SunJCE, RSA:SunRsaSign, \ + SHA1withRSA:SunRsaSign, Group.SHA2RSA:SunRsaSign #endif @@ -613,14 +628,14 @@ krb5.kdc.bad.policy = tryLast # "CertConstraint" specifies additional constraints for # certificates that contain algorithms that are restricted: # -#   "jdkCA" prohibits the specified algorithm only if the algorithm is used -#     in a certificate chain that terminates at a marked trust anchor in the -#     lib/security/cacerts keystore.  All other chains are not affected. -#     If the jdkCA constraint is not set, then all chains using the -#     specified algorithm are restricted. jdkCA may only be used once in +# "jdkCA" prohibits the specified algorithm only if the algorithm is used +# in a certificate chain that terminates at a marked trust anchor in the +# lib/security/cacerts keystore.  All other chains are not affected. +# If the jdkCA constraint is not set, then all chains using the +# specified algorithm are restricted. jdkCA may only be used once in # a DisabledAlgorithm expression. -#     Example:  To apply this constraint to SHA-1 certificates, include -#     the following:  "SHA1 jdkCA" +# Example:  To apply this constraint to SHA-1 certificates, include +# the following:  "SHA1 jdkCA" # # When an algorithm must satisfy more than one constraint, it must be # delimited by an ampersand '&'. For example, to restrict certificates in a @@ -713,6 +728,12 @@ jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024 # See SSL/TLS specifications and "Java Cryptography Architecture Standard # Algorithm Name Documentation" for information about the algorithm names. # +# Note: If a legacy algorithm is also restricted through the +# jdk.tls.disabledAlgorithms property or the +# java.security.AlgorithmConstraints API (See +# javax.net.ssl.SSLParameters.setAlgorithmConstraints()), +# then the algorithm is completely disabled and will not be negotiated. +# # Note: This property is currently used by Oracle's JSSE implementation. # It is not guaranteed to be examined and used by other implementations. # There is no guarantee the property will continue to exist or be of the diff --git a/jdk/src/java.base/unix/native/launcher/jexec.c b/jdk/src/java.base/unix/native/launcher/jexec.c index 179ae4f893c..d2888234674 100644 --- a/jdk/src/java.base/unix/native/launcher/jexec.c +++ b/jdk/src/java.base/unix/native/launcher/jexec.c @@ -331,6 +331,7 @@ const char * isJar(const char * path) { off_t end = start + xlen; if (end <= count) { + end -= 4; // make sure there are 4 bytes to read at start while (start < end) { off_t xhid = SH(buf, start); off_t xdlen = SH(buf, start + 2); diff --git a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileChooserUI.java b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileChooserUI.java index 91e1e4e8c39..eaade120e04 100644 --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileChooserUI.java +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileChooserUI.java @@ -112,7 +112,7 @@ public class AquaFileChooserUI extends FileChooserUI { private AncestorListener ancestorListener = null; private DropTarget dragAndDropTarget = null; - private final AcceptAllFileFilter acceptAllFileFilter = new AcceptAllFileFilter(); + private static final AcceptAllFileFilter acceptAllFileFilter = new AcceptAllFileFilter(); private AquaFileSystemModel model; @@ -997,7 +997,7 @@ public class AquaFileChooserUI extends FileChooserUI { // ***************************************** // ***** default AcceptAll file filter ***** // ***************************************** - protected class AcceptAllFileFilter extends FileFilter { + private static class AcceptAllFileFilter extends FileFilter { public AcceptAllFileFilter() { } @@ -1305,6 +1305,8 @@ public class AquaFileChooserUI extends FileChooserUI { protected class FilterComboBoxModel extends AbstractListModel implements ComboBoxModel, PropertyChangeListener { protected FileFilter[] filters; + Object oldFileFilter = getFileChooser().getFileFilter(); + protected FilterComboBoxModel() { super(); filters = getFileChooser().getChoosableFileFilters(); @@ -1321,12 +1323,17 @@ public class AquaFileChooserUI extends FileChooserUI { } public void setSelectedItem(Object filter) { - if (filter != null && !containsFileFilter(filter)) { + if (filter != null && !isSelectedFileFilterInModel(filter)) { + oldFileFilter = filter; getFileChooser().setFileFilter((FileFilter) filter); fireContentsChanged(this, -1, -1); } } + private boolean isSelectedFileFilterInModel(Object filter) { + return Objects.equals(filter, oldFileFilter); + } + public Object getSelectedItem() { // Ensure that the current filter is in the list. // NOTE: we shouldnt' have to do this, since JFileChooser adds diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m index 9b8e370a938..e57074ee74c 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -282,11 +282,19 @@ const nsKeyToJavaModifierTable[] = //kCGSFlagsMaskAppleLeftAlternateKey, //kCGSFlagsMaskAppleRightAlternateKey, 58, - 61, + 0, java_awt_event_InputEvent_ALT_DOWN_MASK, java_awt_event_InputEvent_ALT_MASK, java_awt_event_KeyEvent_VK_ALT }, + { + NSAlternateKeyMask, + 0, + 61, + java_awt_event_InputEvent_ALT_DOWN_MASK | java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK, + java_awt_event_InputEvent_ALT_MASK | java_awt_event_InputEvent_ALT_GRAPH_MASK, + java_awt_event_KeyEvent_VK_ALT + }, { NSCommandKeyMask, //kCGSFlagsMaskAppleLeftCommandKey, @@ -310,6 +318,8 @@ const nsKeyToJavaModifierTable[] = {0, 0, 0, 0, 0, 0} }; +static BOOL leftAltKeyPressed; + /* * Almost all unicode characters just go from NS to Java with no translation. * For the few exceptions, we handle it here with this small table. @@ -523,13 +533,17 @@ NsKeyModifiersToJavaKeyInfo(NSUInteger nsFlags, unsigned short eventKeyCode, // *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; //} if (eventKeyCode == cur->leftKeyCode) { + leftAltKeyPressed = YES; *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; } else if (eventKeyCode == cur->rightKeyCode) { *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; + } else if (cur->nsMask == NSAlternateKeyMask) { + leftAltKeyPressed = NO; + continue; } *javaKeyType = (cur->nsMask & nsFlags) ? - java_awt_event_KeyEvent_KEY_PRESSED : - java_awt_event_KeyEvent_KEY_RELEASED; + java_awt_event_KeyEvent_KEY_PRESSED : + java_awt_event_KeyEvent_KEY_RELEASED; break; } } @@ -545,7 +559,11 @@ jint NsKeyModifiersToJavaModifiers(NSUInteger nsFlags, BOOL isExtMods) for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) { if ((cur->nsMask & nsFlags) != 0) { - javaModifiers |= isExtMods? cur->javaExtMask : cur->javaMask; + javaModifiers |= isExtMods ? cur->javaExtMask : cur->javaMask; + if (cur->nsMask == NSAlternateKeyMask && leftAltKeyPressed == NO) { + continue; + } + break; } } diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CMenuItem.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CMenuItem.m index 28e4f386d78..e6b7e21bccb 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CMenuItem.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CMenuItem.m @@ -25,7 +25,6 @@ #import #include - #import "CMenuItem.h" #import "CMenu.h" #import "AWTEvent.h" @@ -64,42 +63,6 @@ - (BOOL) worksWhenModal { return YES; } -// This is a method written using Carbon framework methods to remove -// All modifiers including "Shift" modifier. -// Example 1: Shortcut set is "Command Shift m" returns "m" -// Example 2: Shortcut set is "Command m" returns "m" -// Example 3: Shortcut set is "Alt Shift ," returns "," - -CFStringRef createStringForKey(CGKeyCode keyCode) -{ - TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); -// currentKeyboard now contains the current input source - CFDataRef layoutData = - TISGetInputSourceProperty(currentKeyboard, - kTISPropertyUnicodeKeyLayoutData); -// the UNICODE keyLayout is fetched from currentKeyboard in layoutData - const UCKeyboardLayout *keyboardLayout = - (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); -// A read-only data pointer is fetched from layoutData - UInt32 keysDown = 0; - UniChar chars[4]; - UniCharCount realLength; - - UCKeyTranslate(keyboardLayout, - keyCode, - kUCKeyActionDisplay, - 0, - LMGetKbdType(), - kUCKeyTranslateNoDeadKeysBit, - &keysDown, - sizeof(chars) / sizeof(chars[0]), - &realLength, - chars); - CFRelease(currentKeyboard); -// Converts keyCode, modifier and dead-key state into UNICODE characters - return CFStringCreateWithCharacters(kCFAllocatorDefault, chars, 1); -} - // Events - (void)handleAction:(NSMenuItem *)sender { AWT_ASSERT_APPKIT_THREAD; @@ -116,35 +79,6 @@ CFStringRef createStringForKey(CGKeyCode keyCode) // from this "frameless" menu, because there are no active windows. This // means we have to handle it here. NSEvent *currEvent = [[NSApplication sharedApplication] currentEvent]; - if ([currEvent type] == NSKeyDown) { - NSString *menuKey = [sender keyEquivalent]; -// If shortcut is "Command Shift ," the menuKey gets the value "," -// But [currEvent charactersIgnoringModifiers]; returns "<" and not "," -// because the charactersIgnoreingModifiers does not ignore "Shift" -// So a shortcut like "Command Shift m" will return "M" where as the -// MenuKey will have the value "m". To remove this issue the below -// createStringForKey is used. - NSString *eventKey = createStringForKey([currEvent keyCode]); - -// Apple uses characters from private Unicode range for some of the -// keys, so we need to do the same translation here that we do -// for the regular key down events - if ([eventKey length] == 1) { - unichar origChar = [eventKey characterAtIndex:0]; - unichar newChar = NsCharToJavaChar(origChar, 0); - if (newChar == java_awt_event_KeyEvent_CHAR_UNDEFINED) { - newChar = origChar; - } - - eventKey = [NSString stringWithCharacters: &newChar length: 1]; - } - - NSWindow *keyWindow = [NSApp keyWindow]; - if ([menuKey isEqualToString:eventKey] && keyWindow != nil) { - return; - } - } - if (fIsCheckbox) { static JNF_CLASS_CACHE(jc_CCheckboxMenuItem, "sun/lwawt/macosx/CCheckboxMenuItem"); static JNF_MEMBER_CACHE(jm_ckHandleAction, jc_CCheckboxMenuItem, "handleAction", "(Z)V"); @@ -154,16 +88,47 @@ CFStringRef createStringForKey(CGKeyCode keyCode) NSInteger state = [sender state]; jboolean newState = (state == NSOnState ? JNI_FALSE : JNI_TRUE); JNFCallVoidMethod(env, fPeer, jm_ckHandleAction, newState); - } else { - static JNF_CLASS_CACHE(jc_CMenuItem, "sun/lwawt/macosx/CMenuItem"); - static JNF_MEMBER_CACHE(jm_handleAction, jc_CMenuItem, "handleAction", "(JI)V"); // AWT_THREADING Safe (event) - - NSUInteger modifiers = [currEvent modifierFlags]; - jint javaModifiers = NsKeyModifiersToJavaModifiers(modifiers, NO); - - JNFCallVoidMethod(env, fPeer, jm_handleAction, UTC(currEvent), javaModifiers); // AWT_THREADING Safe (event) + } + else { + if ([currEvent type] == NSKeyDown) { + + // Event available through sender variable hence NSApplication + // not needed for checking the keyboard input sans the modifier keys + // Also, the method used to fetch eventKey earlier would be locale dependent + // With earlier implementation, if MenuKey: e EventKey: ा ; if input method + // is not U.S. (Devanagari in this case) + // With current implementation, EventKey = MenuKey = e irrespective of + // input method + + NSString *eventKey = [sender keyEquivalent]; + // Apple uses characters from private Unicode range for some of the + // keys, so we need to do the same translation here that we do + // for the regular key down events + if ([eventKey length] == 1) { + unichar origChar = [eventKey characterAtIndex:0]; + unichar newChar = NsCharToJavaChar(origChar, 0); + if (newChar == java_awt_event_KeyEvent_CHAR_UNDEFINED) { + newChar = origChar; + } + eventKey = [NSString stringWithCharacters: &newChar length: 1]; + } + NSWindow *keyWindow = [NSApp keyWindow]; + if (keyWindow != nil) { + return; + } + else { + static JNF_CLASS_CACHE(jc_CMenuItem, "sun/lwawt/macosx/CMenuItem"); + static JNF_MEMBER_CACHE(jm_handleAction, jc_CMenuItem, "handleAction", "(JI)V"); // AWT_THREADING Safe (event) + + NSUInteger modifiers = [currEvent modifierFlags]; + jint javaModifiers = NsKeyModifiersToJavaModifiers(modifiers, NO); + + JNFCallVoidMethod(env, fPeer, jm_handleAction, UTC(currEvent), javaModifiers); // AWT_THREADING Safe (event) + } + } } JNF_COCOA_EXIT(env); + } - (void) setJavaLabel:(NSString *)theLabel shortcut:(NSString *)theKeyEquivalent modifierMask:(jint)modifiers { diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m index b740d05895c..0ad123bf600 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m @@ -25,7 +25,7 @@ // External Java Accessibility links: // -// +// // // (Sun's mailing list for Java accessibility) @@ -1030,7 +1030,7 @@ static NSObject *sAttributeNamesLOCK = nil; // Element's value (id) // note that the appKit meaning of "accessibilityValue" is different from the java // meaning of "accessibleValue", which is specific to numerical values -// (http://java.sun.com/j2se/1.3/docs/api/javax/accessibility/AccessibleValue.html#setCurrentAccessibleValue(java.lang.Number)) +// (https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleValue.html#setCurrentAccessibleValue-java.lang.Number-) - (id)accessibilityValueAttribute { static JNF_STATIC_MEMBER_CACHE(jm_getCurrentAccessibleValue, sjc_CAccessibility, "getCurrentAccessibleValue", "(Ljavax/accessibility/AccessibleValue;Ljava/awt/Component;)Ljava/lang/Number;"); diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/SimpleCMYKColorSpace.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/SimpleCMYKColorSpace.java index a1097b3853e..db96e67bb1d 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/SimpleCMYKColorSpace.java +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/SimpleCMYKColorSpace.java @@ -31,7 +31,7 @@ import java.awt.color.ColorSpace; * color space. */ public final class SimpleCMYKColorSpace extends ColorSpace { - private static final long serialVersionUID = 666L; // XXX Revise UID value + private static final long serialVersionUID = 5387117338644522424L; private static ColorSpace theInstance = null; private ColorSpace csRGB; diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java index 8d5e7f07468..010bd3d4b56 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,17 +25,14 @@ package com.sun.media.sound; -import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; - /** * AIFF file format. * * @author Jan Borgersen */ - -final class AiffFileFormat extends AudioFileFormat { +final class AiffFileFormat extends StandardFileFormat { static final int AIFF_MAGIC = 1179603533; @@ -70,11 +67,8 @@ final class AiffFileFormat extends AudioFileFormat { /** FVER chunk size in bytes, inclusive magic and length field */ private final int fverChunkSize=0; - AiffFileFormat( AudioFileFormat aff ) { - this( aff.getType(), aff.getByteLength(), aff.getFormat(), aff.getFrameLength() ); - } - - AiffFileFormat(Type type, int byteLength, AudioFormat format, int frameLength) { + AiffFileFormat(final Type type, final long byteLength, + final AudioFormat format, final long frameLength) { super(type, byteLength, format, frameLength); } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java index c0ac8bf6d40..20dc68409ff 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java @@ -45,7 +45,7 @@ import javax.sound.sampled.UnsupportedAudioFileException; public final class AiffFileReader extends SunFileReader { @Override - AudioFileFormat getAudioFileFormatImpl(final InputStream stream) + StandardFileFormat getAudioFileFormatImpl(final InputStream stream) throws UnsupportedAudioFileException, IOException { DataInputStream dis = new DataInputStream(stream); @@ -60,11 +60,11 @@ public final class AiffFileReader extends SunFileReader { throw new UnsupportedAudioFileException("not an AIFF file"); } - int frameLength = 0; + long /* unsigned 32bit */ frameLength = 0; int length = dis.readInt(); int iffType = dis.readInt(); - int totallength; + final long totallength; if(length <= 0 ) { length = AudioSystem.NOT_SPECIFIED; totallength = AudioSystem.NOT_SPECIFIED; @@ -106,12 +106,7 @@ public final class AiffFileReader extends SunFileReader { if (channels <= 0) { throw new UnsupportedAudioFileException("Invalid number of channels"); } - frameLength = dis.readInt(); // numSampleFrames - if (frameLength < 0) { - // AiffFileFormat uses int, unlike AIS which uses long - //TODO this (negative) value should be passed as long to AIS - frameLength = AudioSystem.NOT_SPECIFIED; - } + frameLength = dis.readInt() & 0xffffffffL; // numSampleFrames int sampleSizeInBits = dis.readUnsignedShort(); if (sampleSizeInBits < 1 || sampleSizeInBits > 32) { diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AuFileFormat.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AuFileFormat.java index 7a91bfc0a75..dc425e40a65 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AuFileFormat.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AuFileFormat.java @@ -33,7 +33,7 @@ import javax.sound.sampled.AudioFormat; * * @author Jan Borgersen */ -final class AuFileFormat extends AudioFileFormat { +final class AuFileFormat extends StandardFileFormat { // magic numbers static final int AU_SUN_MAGIC = 0x2e736e64; // ".snd" @@ -55,11 +55,18 @@ final class AuFileFormat extends AudioFileFormat { static final int AU_HEADERSIZE = 24; + /** + * According the specification of AU file format this is the value for + * length field if length is not known. This is a maximum possible value for + * the unsigned int. + */ + static final long /*unsigned int */ UNKNOWN_SIZE = 0xffffffffL; + private int auType; - AuFileFormat(AudioFileFormat.Type type, int lengthInBytes, AudioFormat format, int lengthInFrames) { - - super(type,lengthInBytes,format,lengthInFrames); + AuFileFormat(final AudioFileFormat.Type type, final long byteLength, + final AudioFormat format, final long frameLength) { + super(type, byteLength, format, frameLength); AudioFormat.Encoding encoding = format.getEncoding(); diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AuFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AuFileReader.java index 876c3b78e80..097b64b4746 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AuFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AuFileReader.java @@ -29,7 +29,6 @@ import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; -import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFileFormat.Type; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; @@ -45,7 +44,7 @@ import javax.sound.sampled.UnsupportedAudioFileException; public final class AuFileReader extends SunFileReader { @Override - public AudioFileFormat getAudioFileFormatImpl(final InputStream stream) + public StandardFileFormat getAudioFileFormatImpl(final InputStream stream) throws UnsupportedAudioFileException, IOException { final DataInputStream dis = new DataInputStream(stream); final int magic = dis.readInt(); @@ -56,7 +55,7 @@ public final class AuFileReader extends SunFileReader { } final int headerSize = dis.readInt(); - final int dataSize = dis.readInt(); + final long /* unsigned int */ dataSize = dis.readInt() & 0xffffffffL; final int auType = dis.readInt(); final int sampleRate = dis.readInt(); final int channels = dis.readInt(); @@ -120,21 +119,21 @@ public final class AuFileReader extends SunFileReader { // unsupported filetype, throw exception throw new UnsupportedAudioFileException("not a valid AU file"); } + // now seek past the header + dis.skipBytes(headerSize - AuFileFormat.AU_HEADERSIZE); final int frameSize = calculatePCMFrameSize(sampleSizeInBits, channels); //$$fb 2002-11-02: fix for 4629669: AU file reader: problems with empty files - final int length; - if (dataSize < 0) { - length = AudioSystem.NOT_SPECIFIED; - } else { - //$$fb 2003-10-20: fix for 4940459: AudioInputStream.getFrameLength() returns 0 instead of NOT_SPECIFIED - length = dataSize / frameSize; + //$$fb 2003-10-20: fix for 4940459: AudioInputStream.getFrameLength() returns 0 instead of NOT_SPECIFIED + long frameLength = AudioSystem.NOT_SPECIFIED; + long byteLength = AudioSystem.NOT_SPECIFIED; + if (dataSize != AuFileFormat.UNKNOWN_SIZE) { + frameLength = dataSize / frameSize; + byteLength = dataSize + headerSize; } - // now seek past the header - dis.skipBytes(headerSize - AuFileFormat.AU_HEADERSIZE); final AudioFormat format = new AudioFormat(encoding, sampleRate, sampleSizeInBits, channels, frameSize, sampleRate, true); - return new AuFileFormat(Type.AU, dataSize + headerSize, format, length); + return new AuFileFormat(Type.AU, byteLength, format, frameLength); } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java index 715cfcf9e76..b573b16d935 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,6 @@ import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Receiver; import javax.sound.midi.Sequence; import javax.sound.midi.Track; -import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFileFormat.Type; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; @@ -56,10 +55,10 @@ public final class SoftMidiAudioFileReader extends SunFileReader { private static final AudioFormat format = new AudioFormat(44100, 16, 2, true, false); - private static AudioFileFormat getAudioFileFormat(final Sequence seq) { + private static StandardFileFormat getAudioFileFormat(final Sequence seq) { long totallen = seq.getMicrosecondLength() / 1000000; long len = (long) (format.getFrameRate() * (totallen + 4)); - return new AudioFileFormat(MIDI, format, (int) len); + return new StandardFileFormat(MIDI, format, len); } private AudioInputStream getAudioInputStream(final Sequence seq) @@ -140,7 +139,7 @@ public final class SoftMidiAudioFileReader extends SunFileReader { } @Override - AudioFileFormat getAudioFileFormatImpl(final InputStream stream) + StandardFileFormat getAudioFileFormatImpl(final InputStream stream) throws UnsupportedAudioFileException, IOException { try { return getAudioFileFormat(MidiSystem.getSequence(stream)); diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardFileFormat.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardFileFormat.java new file mode 100644 index 00000000000..5be7149929c --- /dev/null +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/StandardFileFormat.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.media.sound; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; + +/** + * An instance of the {@code StandardFileFormat} describes the file's length in + * bytes and the length in sample frames as longs. This will provide an + * additional precision unlike the {@code AudioFileFormat}. + */ +class StandardFileFormat extends AudioFileFormat { + + /** + * File length in bytes stored as long. + */ + private final long byteLength; + + /** + * Audio data length in sample frames stored as long. + */ + private final long frameLength; + + /** + * Constructs {@code StandardFileFormat} object. + * + * @param type the type of the audio file + * @param format the format of the audio data contained in the file + * @param frameLength the audio data length in sample frames, or + * {@code AudioSystem.NOT_SPECIFIED} + */ + StandardFileFormat(final Type type, final AudioFormat format, + final long frameLength) { + this(type, AudioSystem.NOT_SPECIFIED, format, frameLength); + } + + /** + * Constructs {@code StandardFileFormat} object. + * + * @param type the type of the audio file + * @param byteLength the length of the file in bytes, or + * {@code AudioSystem.NOT_SPECIFIED} + * @param format the format of the audio data contained in the file + * @param frameLength the audio data length in sample frames, or + * {@code AudioSystem.NOT_SPECIFIED} + */ + StandardFileFormat(final Type type, final long byteLength, + final AudioFormat format, final long frameLength) { + super(type, clip(byteLength), format, clip(frameLength)); + this.byteLength = byteLength; + this.frameLength = frameLength; + } + + /** + * Replaces the passed value to {@code AudioSystem.NOT_SPECIFIED} if the + * value is greater than {@code Integer.MAX_VALUE}. + * + * @param value which should be clipped + * @return the clipped value + */ + private static int clip(final long value) { + if (value > Integer.MAX_VALUE) { + return AudioSystem.NOT_SPECIFIED; + } + return (int) value; + } + + /** + * Obtains the length of the audio data contained in the file, expressed in + * sample frames. The long precision is used. + * + * @return the number of sample frames of audio data in the file + * @see AudioSystem#NOT_SPECIFIED + */ + public final long getLongFrameLength() { + return frameLength; + } + + /** + * Obtains the size in bytes of the entire audio file (not just its audio + * data). The long precision is used. + * + * @return the audio file length in bytes + * @see AudioSystem#NOT_SPECIFIED + */ + public final long getLongByteLength() { + return byteLength; + } +} diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java index a9e40ff33c5..01307d59514 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,7 +47,7 @@ import javax.sound.sampled.spi.AudioFileReader; abstract class SunFileReader extends AudioFileReader { @Override - public final AudioFileFormat getAudioFileFormat(final InputStream stream) + public final StandardFileFormat getAudioFileFormat(final InputStream stream) throws UnsupportedAudioFileException, IOException { stream.mark(200); // The biggest value which was historically used try { @@ -87,11 +87,11 @@ abstract class SunFileReader extends AudioFileReader { throws UnsupportedAudioFileException, IOException { stream.mark(200); // The biggest value which was historically used try { - final AudioFileFormat fileFormat = getAudioFileFormatImpl(stream); + final StandardFileFormat format = getAudioFileFormatImpl(stream); // we've got everything, the stream is supported and it is at the // beginning of the audio data, so return an AudioInputStream - return new AudioInputStream(stream, fileFormat.getFormat(), - fileFormat.getFrameLength()); + return new AudioInputStream(stream, format.getFormat(), + format.getLongFrameLength()); } catch (UnsupportedAudioFileException | EOFException ignored) { // stream is unsupported or the header is less than was expected stream.reset(); @@ -140,7 +140,7 @@ abstract class SunFileReader extends AudioFileReader { * UnsupportedAudioFileException if the header is less than was * expected */ - abstract AudioFileFormat getAudioFileFormatImpl(InputStream stream) + abstract StandardFileFormat getAudioFileFormatImpl(InputStream stream) throws UnsupportedAudioFileException, IOException; // HELPER METHODS diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java index 7d6ec18239b..5066ba29ea5 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java @@ -34,7 +34,6 @@ import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFormat.Encoding; import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; /** @@ -167,7 +166,7 @@ public final class WaveExtensibleFileReader extends SunFileReader { } @Override - AudioFileFormat getAudioFileFormatImpl(final InputStream stream) + StandardFileFormat getAudioFileFormatImpl(final InputStream stream) throws UnsupportedAudioFileException, IOException { RIFFReader riffiterator = new RIFFReader(stream); @@ -249,19 +248,17 @@ public final class WaveExtensibleFileReader extends SunFileReader { } else { throw new UnsupportedAudioFileException(); } - long frameLength = dataSize / audioformat.getFrameSize(); - if (frameLength > Integer.MAX_VALUE) { - frameLength = AudioSystem.NOT_SPECIFIED; - } - return new AudioFileFormat(AudioFileFormat.Type.WAVE, audioformat, - (int) frameLength); + return new StandardFileFormat(AudioFileFormat.Type.WAVE, audioformat, + dataSize / audioformat.getFrameSize()); } @Override public AudioInputStream getAudioInputStream(final InputStream stream) throws UnsupportedAudioFileException, IOException { - final AudioFileFormat format = getAudioFileFormat(stream); + final StandardFileFormat format = getAudioFileFormat(stream); + final AudioFormat af = format.getFormat(); + final long length = format.getLongFrameLength(); // we've got everything, the stream is supported and it is at the // beginning of the header, so find the data chunk again and return an // AudioInputStream @@ -269,8 +266,6 @@ public final class WaveExtensibleFileReader extends SunFileReader { while (riffiterator.hasNextChunk()) { RIFFReader chunk = riffiterator.nextChunk(); if (chunk.getFormat().equals("data")) { - final AudioFormat af = format.getFormat(); - final long length = chunk.getSize() / af.getFrameSize(); return new AudioInputStream(chunk, af, length); } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java index 9bf8c9200ad..bf3abbf684a 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileFormat.java @@ -33,7 +33,7 @@ import javax.sound.sampled.AudioFormat; * * @author Jan Borgersen */ -final class WaveFileFormat extends AudioFileFormat { +final class WaveFileFormat extends StandardFileFormat { /** * Wave format type. @@ -73,9 +73,9 @@ final class WaveFileFormat extends AudioFileFormat { static final int WAVE_FORMAT_SX7383 = 0x1C07; static final int WAVE_FORMAT_EXTENSIBLE= 0xFFFE; - WaveFileFormat(AudioFileFormat.Type type, int lengthInBytes, AudioFormat format, int lengthInFrames) { - - super(type,lengthInBytes,format,lengthInFrames); + WaveFileFormat(final AudioFileFormat.Type type, final long byteLength, + final AudioFormat format, final long frameLength) { + super(type, byteLength, format, frameLength); AudioFormat.Encoding encoding = format.getEncoding(); diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileReader.java index 96a4bd7cd1f..7295b180ed1 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFileReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,7 @@ import javax.sound.sampled.UnsupportedAudioFileException; public final class WaveFileReader extends SunFileReader { @Override - AudioFileFormat getAudioFileFormatImpl(final InputStream stream) + StandardFileFormat getAudioFileFormatImpl(final InputStream stream) throws UnsupportedAudioFileException, IOException { // assumes sream is rewound @@ -64,9 +64,9 @@ public final class WaveFileReader extends SunFileReader { DataInputStream dis = new DataInputStream( stream ); int magic = dis.readInt(); - int fileLength = rllong(dis); + long /* unsigned int */ fileLength = rllong(dis) & 0xffffffffL; int waveMagic = dis.readInt(); - int totallength; + long totallength; if (fileLength <= 0) { fileLength = AudioSystem.NOT_SPECIFIED; totallength = AudioSystem.NOT_SPECIFIED; @@ -186,19 +186,18 @@ public final class WaveFileReader extends SunFileReader { } } // this is the length of the data chunk - int dataLength = rllong(dis); nread += 4; + long /* unsigned int */ dataLength = rllong(dis) & 0xffffffffL; nread += 4; // now build the new AudioFileFormat and return - + final int frameSize = calculatePCMFrameSize(sampleSizeInBits, channels); AudioFormat format = new AudioFormat(encoding, (float)sampleRate, sampleSizeInBits, channels, - calculatePCMFrameSize(sampleSizeInBits, channels), + frameSize, (float)sampleRate, false); - return new WaveFileFormat(AudioFileFormat.Type.WAVE, - totallength, - format, - dataLength / format.getFrameSize()); + long frameLength = dataLength / format.getFrameSize(); + return new WaveFileFormat(AudioFileFormat.Type.WAVE, totallength, + format, frameLength); } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileReader.java index 284877d1599..2c3be1507fc 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileReader.java +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileReader.java @@ -32,7 +32,6 @@ import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFormat.Encoding; import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; /** @@ -43,7 +42,7 @@ import javax.sound.sampled.UnsupportedAudioFileException; public final class WaveFloatFileReader extends SunFileReader { @Override - AudioFileFormat getAudioFileFormatImpl(final InputStream stream) + StandardFileFormat getAudioFileFormatImpl(final InputStream stream) throws UnsupportedAudioFileException, IOException { RIFFReader riffiterator = new RIFFReader(stream); @@ -88,20 +87,17 @@ public final class WaveFloatFileReader extends SunFileReader { AudioFormat audioformat = new AudioFormat( Encoding.PCM_FLOAT, samplerate, bits, channels, framesize, samplerate, false); - long frameLength = dataSize / audioformat.getFrameSize(); - if (frameLength > Integer.MAX_VALUE) { - frameLength = AudioSystem.NOT_SPECIFIED; - } - - return new AudioFileFormat(AudioFileFormat.Type.WAVE, audioformat, - (int) frameLength); + return new StandardFileFormat(AudioFileFormat.Type.WAVE, audioformat, + dataSize / audioformat.getFrameSize()); } @Override public AudioInputStream getAudioInputStream(final InputStream stream) throws UnsupportedAudioFileException, IOException { - final AudioFileFormat format = getAudioFileFormat(stream); + final StandardFileFormat format = getAudioFileFormat(stream); + final AudioFormat af = format.getFormat(); + final long length = format.getLongFrameLength(); // we've got everything, the stream is supported and it is at the // beginning of the header, so find the data chunk again and return an // AudioInputStream @@ -109,8 +105,6 @@ public final class WaveFloatFileReader extends SunFileReader { while (riffiterator.hasNextChunk()) { RIFFReader chunk = riffiterator.nextChunk(); if (chunk.getFormat().equals("data")) { - final AudioFormat af = format.getFormat(); - final long length = chunk.getSize() / af.getFrameSize(); return new AudioInputStream(chunk, af, length); } } diff --git a/jdk/src/java.desktop/share/classes/java/awt/Component.java b/jdk/src/java.desktop/share/classes/java/awt/Component.java index b2b51e08559..c2a021fd595 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/Component.java +++ b/jdk/src/java.desktop/share/classes/java/awt/Component.java @@ -9739,19 +9739,24 @@ public abstract class Component implements ImageObserver, MenuContainer, */ int getAccessibleIndexInParent() { synchronized (getTreeLock()) { - int index = -1; - Container parent = this.getParent(); - if (parent != null && parent instanceof Accessible) { - Component ca[] = parent.getComponents(); - for (int i = 0; i < ca.length; i++) { - if (ca[i] instanceof Accessible) { - index++; - } - if (this.equals(ca[i])) { - return index; - } + + AccessibleContext accContext = getAccessibleContext(); + if (accContext == null) { + return -1; + } + + Accessible parent = accContext.getAccessibleParent(); + if (parent == null) { + return -1; + } + + accContext = parent.getAccessibleContext(); + for (int i = 0; i < accContext.getAccessibleChildrenCount(); i++) { + if (this.equals(accContext.getAccessibleChild(i))) { + return i; } } + return -1; } } diff --git a/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java b/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java index 9e7646fd320..b45dd39a717 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java +++ b/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,7 +89,7 @@ import javax.accessibility.AccessibilityProvider; *
    For more information, see * Timing * Focus Transfers, a section in - * The Swing + * The Swing * Tutorial. * *

  • Making a top-level container visible. @@ -207,30 +207,34 @@ public abstract class Toolkit { } /** - * Returns whether dynamic layout of Containers on resize is - * currently active (both set in program - *( {@code isDynamicLayoutSet()} ) - *, and supported - * by the underlying operating system and/or window manager). - * If dynamic layout is currently inactive then Containers - * re-layout their components when resizing is completed. As a result - * the {@code Component.validate()} method will be invoked only - * once per resize. - * If dynamic layout is currently active then Containers - * re-layout their components on every native resize event and - * the {@code validate()} method will be invoked each time. - * The OS/WM support can be queried using - * the getDesktopProperty("awt.dynamicLayoutSupported") method. + * Returns whether dynamic layout of Containers on resize is currently + * enabled on the underlying operating system and/or window manager). If the + * platform supports it, {@code setDynamicLayout(boolean)} may be used to + * programmatically enable or disable platform dynamic layout. Regardless of + * whether that toggling is supported, or whether {@code true} or {@code + * false} is specified as an argument, or has never been called at all, this + * method will return the active current platform behavior and which will be + * followed by the JDK in determining layout policy during resizing. + *

    + * If dynamic layout is currently inactive then Containers re-layout their + * components when resizing is completed. As a result the + * {@code Component.validate()} method will be invoked only once per resize. + * If dynamic layout is currently active then Containers re-layout their + * components on every native resize event and the {@code validate()} method + * will be invoked each time. The OS/WM support can be queried using the + * getDesktopProperty("awt.dynamicLayoutSupported") method. This property + * will reflect the platform capability but is not sufficient to tell if it + * is presently enabled. * - * @return true if dynamic layout of Containers on resize is - * currently active, false otherwise. - * @exception HeadlessException if the GraphicsEnvironment.isHeadless() - * method returns true - * @see #setDynamicLayout(boolean dynamic) - * @see #isDynamicLayoutSet() - * @see #getDesktopProperty(String propertyName) - * @see java.awt.GraphicsEnvironment#isHeadless - * @since 1.4 + * @return true if dynamic layout of Containers on resize is currently + * active, false otherwise. + * @throws HeadlessException if the GraphicsEnvironment.isHeadless() method + * returns true + * @see #setDynamicLayout(boolean dynamic) + * @see #isDynamicLayoutSet() + * @see #getDesktopProperty(String propertyName) + * @see java.awt.GraphicsEnvironment#isHeadless + * @since 1.4 */ public boolean isDynamicLayoutActive() throws HeadlessException { diff --git a/jdk/src/java.desktop/share/classes/java/beans/XMLDecoder.java b/jdk/src/java.desktop/share/classes/java/beans/XMLDecoder.java index d86ecfaf6bd..daae045316b 100644 --- a/jdk/src/java.desktop/share/classes/java/beans/XMLDecoder.java +++ b/jdk/src/java.desktop/share/classes/java/beans/XMLDecoder.java @@ -53,8 +53,8 @@ import org.xml.sax.helpers.DefaultHandler; * *

    * For more information you might also want to check out - * Long Term Persistence of JavaBeans Components: XML Schema, + * + * Long Term Persistence of JavaBeans Components: XML Schema, * an article in The Swing Connection. * @see XMLEncoder * @see java.io.ObjectInputStream @@ -284,7 +284,8 @@ public class XMLDecoder implements AutoCloseable { * The {@code null} value may cause illegal parsing in such case. * The same problem may occur, if the {@code owner} class * does not contain expected method to call. See details here. + * href="http://www.oracle.com/technetwork/java/persistence3-139471.html"> + * here. * * @param owner the owner of the default handler * that can be used as a value of <java> element diff --git a/jdk/src/java.desktop/share/classes/java/beans/XMLEncoder.java b/jdk/src/java.desktop/share/classes/java/beans/XMLEncoder.java index ac4ab411ce4..7deaea30622 100644 --- a/jdk/src/java.desktop/share/classes/java/beans/XMLEncoder.java +++ b/jdk/src/java.desktop/share/classes/java/beans/XMLEncoder.java @@ -193,8 +193,8 @@ import java.nio.charset.UnsupportedCharsetException; * *

    * For more information you might also want to check out - * Using XMLEncoder, + * + * Using XMLEncoder, * an article in The Swing Connection. * @see XMLDecoder * @see java.io.ObjectOutputStream @@ -438,7 +438,8 @@ public class XMLEncoder extends Encoder implements AutoCloseable { *

    * For more information about using resource bundles with the * XMLEncoder, see - * http://java.sun.com/products/jfc/tsc/articles/persistence4/#i18n + * + * Creating Internationalized Applications, * * @param oldExp The expression that will be written * to the stream. diff --git a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/GeoTIFFTagSet.java b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/GeoTIFFTagSet.java index 28ee56abd3c..58adc761f29 100644 --- a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/GeoTIFFTagSet.java +++ b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/GeoTIFFTagSet.java @@ -87,9 +87,9 @@ public class GeoTIFFTagSet extends TIFFTagSet { } } - static class ModelTiePoint extends TIFFTag { - public ModelTiePoint() { - super("ModelTiePointTag", + static class ModelTiepoint extends TIFFTag { + public ModelTiepoint() { + super("ModelTiepointTag", TAG_MODEL_TIE_POINT, 1 << TIFFTag.TIFF_DOUBLE); } @@ -126,7 +126,7 @@ public class GeoTIFFTagSet extends TIFFTagSet { tags.add(new GeoTIFFTagSet.ModelPixelScale()); tags.add(new GeoTIFFTagSet.ModelTransformation()); - tags.add(new GeoTIFFTagSet.ModelTiePoint()); + tags.add(new GeoTIFFTagSet.ModelTiepoint()); tags.add(new GeoTIFFTagSet.GeoKeyDirectory()); tags.add(new GeoTIFFTagSet.GeoDoubleParams()); tags.add(new GeoTIFFTagSet.GeoAsciiParams()); diff --git a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java index 336f81550b7..a6ba3859d2b 100644 --- a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java +++ b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java @@ -412,7 +412,7 @@ public class TIFFField implements Cloneable { /** * Creates a {@code TIFFField} from a TIFF native image - * metadata node. If the value of the "tagNumber" attribute + * metadata node. If the value of the "number" attribute * of the node is not found in {@code tagSet} then a new * {@code TIFFTag} with name {@code TIFFTag.UNKNOWN_TAG_NAME} * will be created and assigned to the field. @@ -424,6 +424,10 @@ public class TIFFField implements Cloneable { * {@code null}. * @throws IllegalArgumentException if the name of the node is not * {@code "TIFFField"}. + * @throws NullPointerException if the node does not contain any data. + * @throws IllegalArgumentException if the combination of node attributes + * and data is not legal per the {@link #TIFFField(TIFFTag,int,int,Object)} + * constructor specification. * @return A new {@code TIFFField}. */ public static TIFFField createFromMetadataNode(TIFFTagSet tagSet, @@ -1089,6 +1093,15 @@ public class TIFFField implements Cloneable { * {@code TIFF_SBYTE} data will be returned in the range * [-128, 127]. * + *

    Data in {@code TIFF_FLOAT} and {@code TIFF_DOUBLE} are + * simply cast to {@code long} and may suffer from truncation. + * + *

    Data in {@code TIFF_SRATIONAL} or + * {@code TIFF_RATIONAL} format are evaluated by dividing the + * numerator into the denominator using double-precision + * arithmetic and then casting to {@code long}. Loss of + * precision and truncation may occur. + * *

    Data in {@code TIFF_ASCII} format will be parsed as by * the {@code Double.parseDouble} method, with the result * cast to {@code long}. @@ -1112,6 +1125,10 @@ public class TIFFField implements Cloneable { case TIFFTag.TIFF_LONG: case TIFFTag.TIFF_IFD_POINTER: return ((long[])data)[index]; + case TIFFTag.TIFF_FLOAT: + return (long)((float[])data)[index]; + case TIFFTag.TIFF_DOUBLE: + return (long)((double[])data)[index]; case TIFFTag.TIFF_SRATIONAL: int[] ivalue = getAsSRational(index); return (long)((double)ivalue[0]/ivalue[1]); @@ -1286,7 +1303,11 @@ public class TIFFField implements Cloneable { * version of the data item. Data of type * {@code TIFFTag.TIFF_RATIONAL} or {@code TIFF_SRATIONAL} are * represented as a pair of integers separated by a - * {@code '/'} character. + * {@code '/'} character. If the numerator of a + * {@code TIFFTag.TIFF_RATIONAL} or {@code TIFF_SRATIONAL} is an integral + * multiple of the denominator, then the value is represented as + * {@code "q/1"} where {@code q} is the quotient of the numerator and + * denominator. * * @param index The index of the data. * @return The data at the given index as a {@code String}. diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JRootPane.java b/jdk/src/java.desktop/share/classes/javax/swing/JRootPane.java index 4061f2e2471..80dfb2954b4 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JRootPane.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JRootPane.java @@ -194,7 +194,7 @@ import sun.security.action.GetBooleanAction; * @see JComponent * @see BoxLayout * - * @see + * @see * Mixing Heavy and Light Components * * @author David Kloba diff --git a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/package.html b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/package.html index cb8030258c3..43ff5ee8739 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/package.html @@ -37,10 +37,10 @@ component. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @@ -49,7 +49,7 @@ target="_top">The Java Tutorial. This document forms the complete API specification. For overviews, tutorials, examples, guides, and tool documentation, please see:

      -
    • How to Use Color Choosers, +
    • How to Use Color Choosers, a section in The Java Tutorial
    • not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial.

      Related Documentation

      For overviews, tutorials, examples, guides, and tool documentation, please see: diff --git a/jdk/src/java.desktop/share/classes/javax/swing/filechooser/package.html b/jdk/src/java.desktop/share/classes/javax/swing/filechooser/package.html index d850fc5b19e..fa06236262c 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/filechooser/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/filechooser/package.html @@ -37,10 +37,10 @@ Contains classes and interfaces used by the JFileChooser component. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @@ -49,7 +49,7 @@ target="_top">The Java Tutorial. This document forms the complete API specification. For overviews, tutorials, examples, guides, and tool documentation, please see:
        -
      • How to Use File Choosers, +
      • How to Use File Choosers, a section in The Java Tutorial
      • Internationalization Documentation diff --git a/jdk/src/java.desktop/share/classes/javax/swing/package.html b/jdk/src/java.desktop/share/classes/javax/swing/package.html index 8050000ae91..934bb9025da 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/package.html @@ -38,7 +38,7 @@ questions. (all-Java language) components that, to the maximum degree possible, work the same on all platforms. For a programmer's guide to using these components, see -Creating a GUI with JFC/Swing, a trail in The Java Tutorial. For other resources, see @@ -123,9 +123,9 @@ input. Refer to {@link javax.swing.SwingWorker} for the preferred way to do such processing when working with Swing.

        More information on this topic can be found in the -Swing tutorial, +Swing tutorial, in particular the section on -Concurrency in Swing. +Concurrency in Swing.

        @@ -134,13 +134,13 @@ in particular the section on

        For overviews, tutorials, examples, guides, and other documentation, please see:

        diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java index f6d211f5f9f..5ee8bedcf8e 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java @@ -210,6 +210,16 @@ public class BasicSpinnerUI extends SpinnerUI LookAndFeel.installBorder(spinner, "Spinner.border"); LookAndFeel.installColorsAndFont(spinner, "Spinner.background", "Spinner.foreground", "Spinner.font"); LookAndFeel.installProperty(spinner, "opaque", Boolean.TRUE); + + JComponent editor = spinner.getEditor(); + if (editor instanceof JSpinner.DefaultEditor) { + JTextField tf = ((JSpinner.DefaultEditor) editor).getTextField(); + if (tf != null) { + if (tf.getFont() instanceof UIResource) { + tf.setFont(new FontUIResource(spinner.getFont())); + } + } + } } diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/package.html b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/package.html index d02593c7455..347fc7cf9c8 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/package.html @@ -55,10 +55,10 @@ encouraged. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @since 1.2 diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/package.html b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/package.html index 1c41e7f9577..db16ddda090 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/package.html @@ -51,10 +51,10 @@ encouraged. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @since 1.2 diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/multi/doc-files/multi_tsc.html b/jdk/src/java.desktop/share/classes/javax/swing/plaf/multi/doc-files/multi_tsc.html index 512b1a581ea..343db5479e2 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/multi/doc-files/multi_tsc.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/multi/doc-files/multi_tsc.html @@ -18,7 +18,7 @@ Using the Multiplexing Look and Feel This document is based on an article originally published in -The Swing +The Swing Connection.

        @@ -65,12 +65,12 @@ This document has the following sections: Before reading further, you should be familiar with the concept of pluggable look and feels. For basic information, see -How to Set the Look and Feel, +How to Set the Look and Feel, a section in The Java Tutorial. For architectural details, you can read Pluggable look-and-feel architecture, a section within +href="http://www.oracle.com/technetwork/java/architecture-142923.html#pluggable">Pluggable look-and-feel architecture, a section within a Swing Connection article.

        diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/multi/package.html b/jdk/src/java.desktop/share/classes/javax/swing/plaf/multi/package.html index 65d1aeafcfc..32b0d6b21af 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/multi/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/multi/package.html @@ -53,10 +53,10 @@ the Multiplexing Look and Feel. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @since 1.2 diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/package.html b/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/package.html index 14cac304214..f91d73781fd 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/package.html @@ -88,10 +88,10 @@ encouraged.

        Note: Most of the Swing API is not thread safe. For details, see -Concurrency in Swing, a section in -The Java Tutorial. @since 1.7 diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/package.html b/jdk/src/java.desktop/share/classes/javax/swing/plaf/package.html index c207c89b103..0fc8c538143 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/package.html @@ -44,10 +44,10 @@ by the javax.swing.plaf.basic and Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @since 1.2 diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/doc-files/synthFileFormat.html b/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/doc-files/synthFileFormat.html index 202283049b5..0936b2951d3 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/doc-files/synthFileFormat.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/doc-files/synthFileFormat.html @@ -950,7 +950,7 @@ div.example { Beans persistance can be used to embed any Object. This is typically used for embedding your own Painters, but can be used for other arbritrary objects as well. Refer to http://java.sun.com/products/jfc/tsc/articles/persistence3/ for details on beans persistance. + href="http://www.oracle.com/technetwork/java/persistence3-139471.html">http://www.oracle.com/technetwork/java/persistence3-139471.html for details on beans persistance.

        Backing Style

        diff --git a/jdk/src/java.desktop/share/classes/javax/swing/table/package.html b/jdk/src/java.desktop/share/classes/javax/swing/table/package.html index f3fd20c8bb1..cf944823e91 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/table/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/table/package.html @@ -43,10 +43,10 @@ with the tables are viewed and managed. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @@ -54,7 +54,7 @@ target="_top">The Java Tutorial
        . For overviews, tutorials, examples, guides, and tool documentation, please see: diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/Document.java b/jdk/src/java.desktop/share/classes/javax/swing/text/Document.java index 12c9a09bc5c..4cab9c4fe2d 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/Document.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/Document.java @@ -166,7 +166,7 @@ import javax.swing.event.*; *

      * *

      For more information on the Document class, see - * The Swing Connection + * The Swing Connection * and most particularly the article, * * The Element Interface. diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/html/package.html b/jdk/src/java.desktop/share/classes/javax/swing/text/html/package.html index e0ab0354d53..c9c41b8cc22 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/package.html @@ -37,10 +37,10 @@ for creating HTML text editors. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial.

      Package Specification

      diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/html/parser/package.html b/jdk/src/java.desktop/share/classes/javax/swing/text/html/parser/package.html index d503bc741e7..05c53989142 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/parser/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/parser/package.html @@ -40,10 +40,10 @@ the HTMLEditorKit.ParserCallback interface. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @see javax.swing.text.html.HTMLEditorKit.ParserCallback diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/package.html b/jdk/src/java.desktop/share/classes/javax/swing/text/package.html index 4aa7804f544..1c38c251066 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/package.html @@ -41,17 +41,17 @@ and key mapping. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial.

      Related Documentation

      For overviews, tutorials, examples, guides, and tool documentation, please see: diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/package.html b/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/package.html index aa83e9fa502..9b62f229a93 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/package.html @@ -38,10 +38,10 @@ text editors. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @since 1.2 diff --git a/jdk/src/java.desktop/share/classes/javax/swing/tree/package.html b/jdk/src/java.desktop/share/classes/javax/swing/tree/package.html index b6b58bbdabe..e820b3cb364 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/tree/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/tree/package.html @@ -39,10 +39,10 @@ as how data associated with the tree nodes are viewed and managed. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial. @@ -50,7 +50,7 @@ target="_top">The Java Tutorial. For overviews, tutorials, examples, guides, and tool documentation, please see: diff --git a/jdk/src/java.desktop/share/classes/javax/swing/undo/package.html b/jdk/src/java.desktop/share/classes/javax/swing/undo/package.html index f4ae62d7b16..bf6d809fafb 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/undo/package.html +++ b/jdk/src/java.desktop/share/classes/javax/swing/undo/package.html @@ -37,17 +37,17 @@ in applications such as text editors. Most of the Swing API is not thread safe. For details, see Threads and Swing, +href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html" +target="_top">Concurrency in Swing, a section in -The Java Tutorial.

      Related Documentation

      For overviews, tutorials, examples, guides, and tool documentation, please see: diff --git a/jdk/src/java.desktop/share/classes/module-info.java b/jdk/src/java.desktop/share/classes/module-info.java index 5cf785de71f..77150e17b73 100644 --- a/jdk/src/java.desktop/share/classes/module-info.java +++ b/jdk/src/java.desktop/share/classes/module-info.java @@ -27,8 +27,6 @@ module java.desktop { requires public java.datatransfer; requires public java.xml; requires java.prefs; - // 8147544 - requires jdk.unsupported; exports java.applet; exports java.awt; diff --git a/jdk/src/java.desktop/share/classes/sun/applet/Main.java b/jdk/src/java.desktop/share/classes/sun/applet/Main.java index 086b1113614..6c28c8f9d11 100644 --- a/jdk/src/java.desktop/share/classes/sun/applet/Main.java +++ b/jdk/src/java.desktop/share/classes/sun/applet/Main.java @@ -104,7 +104,8 @@ public class Main { private int run(String [] args) { // DECODE ARGS try { - System.out.println(lookup("deprecated")); + System.err.println(lookup("deprecated")); + System.err.flush(); if (args.length == 0) { usage(); return 0; diff --git a/jdk/src/java.desktop/share/classes/sun/applet/resources/MsgAppletViewer.java b/jdk/src/java.desktop/share/classes/sun/applet/resources/MsgAppletViewer.java index 2b2bf2de74f..d9ba0253213 100644 --- a/jdk/src/java.desktop/share/classes/sun/applet/resources/MsgAppletViewer.java +++ b/jdk/src/java.desktop/share/classes/sun/applet/resources/MsgAppletViewer.java @@ -73,7 +73,7 @@ public class MsgAppletViewer extends ListResourceBundle { {"appletviewer.parse.warning.embed.requiresheight", "Warning: tag requires height attribute."}, {"appletviewer.parse.warning.embed.requireswidth", "Warning: tag requires width attribute."}, {"appletviewer.parse.warning.appnotLongersupported", "Warning: tag no longer supported, use instead:"}, - {"appletviewer.deprecated", "AppletViewer is deprecated."}, + {"appletviewer.deprecated", "Warning: Applet API and AppletViewer are deprecated."}, {"appletviewer.usage", "Usage: appletviewer url(s)\n\nwhere include:\n -encoding Specify character encoding used by HTML files\n -J Pass argument to the java interpreter\n\nThe -J option is non-standard and subject to change without notice."}, {"appletviewer.main.err.unsupportedopt", "Unsupported option: {0}"}, {"appletviewer.main.err.unrecognizedarg", "Unrecognized argument: {0}"}, diff --git a/jdk/src/jdk.unsupported/share/classes/sun/misc/SoftCache.java b/jdk/src/java.desktop/share/classes/sun/awt/SoftCache.java similarity index 99% rename from jdk/src/jdk.unsupported/share/classes/sun/misc/SoftCache.java rename to jdk/src/java.desktop/share/classes/sun/awt/SoftCache.java index 30bc2ec6068..7b7ea26be86 100644 --- a/jdk/src/jdk.unsupported/share/classes/sun/misc/SoftCache.java +++ b/jdk/src/java.desktop/share/classes/sun/awt/SoftCache.java @@ -23,7 +23,7 @@ * questions. */ -package sun.misc; +package sun.awt; import java.lang.ref.SoftReference; import java.lang.ref.ReferenceQueue; diff --git a/jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java b/jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java index fdaeb1ea7ad..8461974375f 100644 --- a/jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java +++ b/jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java @@ -65,7 +65,6 @@ import sun.awt.image.MultiResolutionToolkitImage; import sun.awt.image.ToolkitImage; import sun.awt.image.URLImageSource; import sun.font.FontDesignMetrics; -import sun.misc.SoftCache; import sun.net.util.URLUtil; import sun.security.action.GetBooleanAction; import sun.security.action.GetPropertyAction; diff --git a/jdk/src/java.desktop/share/classes/sun/awt/image/MultiResolutionToolkitImage.java b/jdk/src/java.desktop/share/classes/sun/awt/image/MultiResolutionToolkitImage.java index a8e67f767ca..26a86916824 100644 --- a/jdk/src/java.desktop/share/classes/sun/awt/image/MultiResolutionToolkitImage.java +++ b/jdk/src/java.desktop/share/classes/sun/awt/image/MultiResolutionToolkitImage.java @@ -29,7 +29,7 @@ import java.awt.image.ImageObserver; import java.awt.image.MultiResolutionImage; import java.util.Arrays; import java.util.List; -import sun.misc.SoftCache; +import sun.awt.SoftCache; public class MultiResolutionToolkitImage extends ToolkitImage implements MultiResolutionImage { diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine.c index 42d42ed041b..84d8a147aa3 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine.c @@ -73,7 +73,6 @@ */ #include "mlib_ImageCheck.h" -#include "mlib_ImageColormap.h" #include "mlib_ImageAffine.h" @@ -124,18 +123,6 @@ const type_affine_fun mlib_AffineFunArr_bc[] = { mlib_ImageAffine_d64_3ch_bc, mlib_ImageAffine_d64_4ch_bc }; -/***************************************************************/ -const type_affine_i_fun mlib_AffineFunArr_bc_i[] = { - mlib_ImageAffineIndex_U8_U8_3CH_BC, - mlib_ImageAffineIndex_U8_U8_4CH_BC, - mlib_ImageAffineIndex_S16_U8_3CH_BC, - mlib_ImageAffineIndex_S16_U8_4CH_BC, - mlib_ImageAffineIndex_U8_S16_3CH_BC, - mlib_ImageAffineIndex_U8_S16_4CH_BC, - mlib_ImageAffineIndex_S16_S16_3CH_BC, - mlib_ImageAffineIndex_S16_S16_4CH_BC -}; - /***************************************************************/ #ifdef i386 /* do not perform the coping by mlib_d64 data type for x86 */ #define MAX_T_IND 2 @@ -148,8 +135,7 @@ mlib_status mlib_ImageAffine_alltypes(mlib_image *dst, const mlib_image *src, const mlib_d64 *mtx, mlib_filter filter, - mlib_edge edge, - const void *colormap) + mlib_edge edge) { mlib_affine_param param[1]; mlib_status res; @@ -213,18 +199,6 @@ mlib_status mlib_ImageAffine_alltypes(mlib_image *dst, else return MLIB_FAILURE; /* unknown image type */ - if (colormap != NULL && filter != MLIB_NEAREST) { - if (t_ind != 0 && t_ind != 1) - return MLIB_FAILURE; - - if (mlib_ImageGetLutType(colormap) == MLIB_SHORT) - t_ind += 2; - t_ind = 2 * t_ind; - - if (mlib_ImageGetLutChannels(colormap) == 4) - t_ind++; - } - if (type == MLIB_BIT) { mlib_s32 s_bitoff = mlib_ImageGetBitOffset(src); mlib_s32 d_bitoff = mlib_ImageGetBitOffset(dst); @@ -253,25 +227,13 @@ mlib_status mlib_ImageAffine_alltypes(mlib_image *dst, case MLIB_BILINEAR: - if (colormap != NULL) { - res = mlib_AffineFunArr_bl_i[t_ind] (param, colormap); - } - else { - res = mlib_AffineFunArr_bl[4 * t_ind + (nchan - 1)] (param); - } - + res = mlib_AffineFunArr_bl[4 * t_ind + (nchan - 1)] (param); break; case MLIB_BICUBIC: case MLIB_BICUBIC2: - if (colormap != NULL) { - res = mlib_AffineFunArr_bc_i[t_ind] (param, colormap); - } - else { - res = mlib_AffineFunArr_bc[4 * t_ind + (nchan - 1)] (param); - } - + res = mlib_AffineFunArr_bc[4 * t_ind + (nchan - 1)] (param); break; } @@ -303,7 +265,7 @@ mlib_status mlib_ImageAffine_alltypes(mlib_image *dst, switch (edge) { case MLIB_EDGE_DST_FILL_ZERO: - mlib_ImageAffineEdgeZero(param, param_e, colormap); + mlib_ImageAffineEdgeZero(param, param_e); break; case MLIB_EDGE_OP_NEAREST: @@ -313,10 +275,10 @@ mlib_status mlib_ImageAffine_alltypes(mlib_image *dst, case MLIB_EDGE_SRC_EXTEND: if (filter == MLIB_BILINEAR) { - res = mlib_ImageAffineEdgeExtend_BL(param, param_e, colormap); + res = mlib_ImageAffineEdgeExtend_BL(param, param_e); } else { - res = mlib_ImageAffineEdgeExtend_BC(param, param_e, colormap); + res = mlib_ImageAffineEdgeExtend_BC(param, param_e); } break; @@ -355,7 +317,7 @@ mlib_status mlib_ImageAffine(mlib_image *dst, return MLIB_FAILURE; } - return mlib_ImageAffine_alltypes(dst, src, mtx, filter, edge, NULL); + return mlib_ImageAffine_alltypes(dst, src, mtx, filter, edge); } /***************************************************************/ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine.h index b9f8fe801b5..be21823729c 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine.h +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine.h @@ -162,99 +162,25 @@ mlib_status mlib_ImageAffine_d64_4ch_bc(mlib_affine_param *param); /***************************************************************/ void mlib_ImageAffineEdgeZero(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap); + mlib_affine_param *param_e); void mlib_ImageAffineEdgeNearest(mlib_affine_param *param, mlib_affine_param *param_e); mlib_status mlib_ImageAffineEdgeExtend_BL(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap); + mlib_affine_param *param_e); mlib_status mlib_ImageAffineEdgeExtend_BC(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap); - -mlib_status mlib_ImageAffineEdgeExtend_BC2(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap); - -/***************************************************************/ -typedef mlib_status (*type_affine_i_fun)(mlib_affine_param *param, const void *colormap); - -mlib_status mlib_ImageAffine_u8_u8_i_bl(mlib_affine_param *param, - const void *colormap); -mlib_status mlib_ImageAffine_u8_s16_i_bl(mlib_affine_param *param, - const void *colormap); -mlib_status mlib_ImageAffine_s16_u8_i_bl(mlib_affine_param *param, - const void *colormap); -mlib_status mlib_ImageAffine_s16_s16_i_bl(mlib_affine_param *param, - const void *colormap); - -mlib_status mlib_ImageAffine_u8_u8_i_bc(mlib_affine_param *param, - const void *colormap); -mlib_status mlib_ImageAffine_u8_s16_i_bc(mlib_affine_param *param, - const void *colormap); -mlib_status mlib_ImageAffine_s16_u8_i_bc(mlib_affine_param *param, - const void *colormap); -mlib_status mlib_ImageAffine_s16_s16_i_bc(mlib_affine_param *param, - const void *colormap); - -void mlib_ImageAffineEdgeZeroIndex(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap); - -void mlib_ImageAffineEdgeExtendIndex_BL(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap); - -void mlib_ImageAffineEdgeExtendIndex_BC(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap); - -void mlib_ImageAffineEdgeExtendIndex_BC2(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap); - -/***************************************************************/ -#define PROT_AFFINEINDEX_BC(ITYPE, LTYPE, NCHAN) \ - mlib_status mlib_ImageAffineIndex_##ITYPE##_##LTYPE##_##NCHAN##CH_BC(mlib_affine_param *param, \ - const void *colormap) - -PROT_AFFINEINDEX_BC(U8, U8, 3); -PROT_AFFINEINDEX_BC(U8, S16, 3); -PROT_AFFINEINDEX_BC(U8, U8, 4); -PROT_AFFINEINDEX_BC(U8, S16, 4); -PROT_AFFINEINDEX_BC(S16, U8, 3); -PROT_AFFINEINDEX_BC(S16, S16, 3); -PROT_AFFINEINDEX_BC(S16, U8, 4); -PROT_AFFINEINDEX_BC(S16, S16, 4); - -/***************************************************************/ -#define PROT_AFFINEINDEX_BL(ITYPE, LTYPE, NCHAN) \ - mlib_status mlib_ImageAffineIndex_##ITYPE##_##LTYPE##_##NCHAN##CH_BL(mlib_affine_param *param, \ - const void *colormap) - -PROT_AFFINEINDEX_BL(U8, U8, 3); -PROT_AFFINEINDEX_BL(U8, S16, 3); -PROT_AFFINEINDEX_BL(U8, U8, 4); -PROT_AFFINEINDEX_BL(U8, S16, 4); -PROT_AFFINEINDEX_BL(S16, U8, 3); -PROT_AFFINEINDEX_BL(S16, S16, 3); -PROT_AFFINEINDEX_BL(S16, U8, 4); -PROT_AFFINEINDEX_BL(S16, S16, 4); + mlib_affine_param *param_e); /***************************************************************/ mlib_status mlib_ImageAffine_alltypes(mlib_image *dst, const mlib_image *src, const mlib_d64 *mtx, mlib_filter filter, - mlib_edge edge, - const void *colormap); + mlib_edge edge); /***************************************************************/ -extern const type_affine_i_fun mlib_AffineFunArr_bl_i[]; extern const type_affine_fun mlib_AffineFunArr_nn[]; extern const type_affine_fun mlib_AffineFunArr_bl[]; extern const type_affine_fun mlib_AffineFunArr_bc[]; diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffineEdge.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffineEdge.c index e095a0e9c01..2cb39d0b55a 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffineEdge.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageAffineEdge.c @@ -73,7 +73,6 @@ */ #include "mlib_image.h" -#include "mlib_ImageColormap.h" #include "mlib_ImageAffine.h" /***************************************************************/ @@ -217,97 +216,6 @@ dp += channels; \ } -/***************************************************************/ -#define LUT(k, ind) plut[channels*sp[ind] + k] - -/***************************************************************/ -#define MLIB_EDGE_INDEX(ITYPE, DTYPE, size) \ - for (j = 0; j < size; j++) { \ - ySrc = ((Y - 32768) >> MLIB_SHIFT); \ - xSrc = ((X - 32768) >> MLIB_SHIFT); \ - \ - t = ((X - 32768) & MLIB_MASK) * scale; \ - u = ((Y - 32768) & MLIB_MASK) * scale; \ - \ - xDelta = (((xSrc + 1 - srcWidth )) >> MLIB_SIGN_SHIFT) & 1; \ - yDelta = (((ySrc + 1 - srcHeight)) >> MLIB_SIGN_SHIFT) & srcStride; \ - \ - xFlag = (xSrc >> (MLIB_SIGN_SHIFT - MLIB_SHIFT)); \ - xSrc = xSrc + (1 & xFlag); \ - xDelta = xDelta &~ xFlag; \ - \ - yFlag = (ySrc >> (MLIB_SIGN_SHIFT - MLIB_SHIFT)); \ - ySrc = ySrc + (1 & yFlag); \ - yDelta = yDelta &~ yFlag; \ - \ - sp = (ITYPE*)lineAddr[ySrc] + xSrc; \ - \ - for (k = 0; k < channels; k++) { \ - a00 = LUT(k, 0); \ - a01 = LUT(k, xDelta); \ - a10 = LUT(k, yDelta); \ - a11 = LUT(k, yDelta + xDelta); \ - pix0 = (a00 * (1 - t) + a01 * t) * (1 - u) + \ - (a10 * (1 - t) + a11 * t) * u; \ - \ - pbuff[k] = (mlib_s32)pix0; \ - } \ - pbuff += channels; \ - \ - X += dX; \ - Y += dY; \ - } - -/***************************************************************/ -#define MLIB_EDGE_INDEX_u8i(ITYPE, Left, Right) { \ - mlib_u8 *pbuff = buff; \ - \ - size = Right - Left; \ - \ - MLIB_EDGE_INDEX(ITYPE, mlib_u8, size); \ - \ - dp = (ITYPE*)data + Left; \ - \ - if (channels == 3) { \ - if (sizeof(ITYPE) == 1) { \ - mlib_ImageColorTrue2IndexLine_U8_U8_3 (buff, (void*)dp, size, colormap); \ - } else { \ - mlib_ImageColorTrue2IndexLine_U8_S16_3(buff, (void*)dp, size, colormap); \ - } \ - } else { \ - if (sizeof(ITYPE) == 1) { \ - mlib_ImageColorTrue2IndexLine_U8_U8_4 (buff, (void*)dp, size, colormap); \ - } else { \ - mlib_ImageColorTrue2IndexLine_U8_S16_4(buff, (void*)dp, size, colormap); \ - } \ - } \ -} - -/***************************************************************/ -#define MLIB_EDGE_INDEX_s16i(ITYPE, Left, Right) { \ - mlib_s16 *pbuff = buff; \ - \ - size = Right - Left; \ - \ - MLIB_EDGE_INDEX(ITYPE, mlib_s16, size); \ - \ - dp = (ITYPE*)data + Left; \ - \ - if (channels == 3) { \ - if (sizeof(ITYPE) == 1) { \ - mlib_ImageColorTrue2IndexLine_S16_U8_3 (buff, (void*)dp, size, colormap); \ - } else { \ - mlib_ImageColorTrue2IndexLine_S16_S16_3(buff, (void*)dp, size, colormap); \ - } \ - } else { \ - if (sizeof(ITYPE) == 1) { \ - mlib_ImageColorTrue2IndexLine_S16_U8_4 (buff, (void*)dp, size, colormap); \ - } else { \ - mlib_ImageColorTrue2IndexLine_S16_S16_4(buff, (void*)dp, size, colormap); \ - } \ - } \ -} - /***************************************************************/ #define GET_FLT_TBL(X, xf0, xf1, xf2, xf3) \ filterpos = ((X - 32768) >> flt_shift) & flt_mask; \ @@ -423,47 +331,6 @@ #define MLIB_EDGE_BC2(TYPE, Left, Right) \ MLIB_EDGE_BC_LINE(TYPE, Left, Right, GET_FLT_BC2) -/***************************************************************/ -#define MLIB_EDGE_INDEX_BC(ITYPE, DTYPE, size) \ - for (j = 0; j < size; j++) { \ - GET_FLT_TBL(X, xf0, xf1, xf2, xf3); \ - GET_FLT_TBL(Y, yf0, yf1, yf2, yf3); \ - \ - CALC_SRC_POS(X, Y, 1, srcStride); \ - \ - sp = (ITYPE*)lineAddr[ySrc] + xSrc; \ - \ - for (k = 0; k < channels; k++) { \ - c0 = LUT(k, yDelta0 + xDelta0) * xf0 + \ - LUT(k, yDelta0 ) * xf1 + \ - LUT(k, yDelta0 + xDelta1) * xf2 + \ - LUT(k, yDelta0 + xDelta2) * xf3; \ - \ - c1 = LUT(k, xDelta0) * xf0 + \ - LUT(k, 0 ) * xf1 + \ - LUT(k, xDelta1) * xf2 + \ - LUT(k, xDelta2) * xf3; \ - \ - c2 = LUT(k, yDelta1 + xDelta0) * xf0 + \ - LUT(k, yDelta1 ) * xf1 + \ - LUT(k, yDelta1 + xDelta1) * xf2 + \ - LUT(k, yDelta1 + xDelta2) * xf3; \ - \ - c3 = LUT(k, yDelta2 + xDelta0) * xf0 + \ - LUT(k, yDelta2 ) * xf1 + \ - LUT(k, yDelta2 + xDelta1) * xf2 + \ - LUT(k, yDelta2 + xDelta2) * xf3; \ - \ - val0 = c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3; \ - \ - SAT##DTYPE(pbuff[k], val0); \ - } \ - pbuff += channels; \ - \ - X += dX; \ - Y += dY; \ - } - /***************************************************************/ #define MLIB_PROCESS_EDGES_ZERO(TYPE) { \ TYPE *dp, *dstLineEnd; \ @@ -586,16 +453,11 @@ /***************************************************************/ void mlib_ImageAffineEdgeZero(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap) + mlib_affine_param *param_e) { GET_EDGE_PARAMS_ZERO(); mlib_s32 zero = 0; - if (colormap != NULL) { - zero = mlib_ImageGetLutOffset(colormap); - } - switch (type) { case MLIB_BYTE: MLIB_PROCESS_EDGES_ZERO(mlib_u8); @@ -654,8 +516,7 @@ void mlib_ImageAffineEdgeNearest(mlib_affine_param *param, /***************************************************************/ mlib_status mlib_ImageAffineEdgeExtend_BL(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap) + mlib_affine_param *param_e) { GET_EDGE_PARAMS(); mlib_d64 scale = 1.0 / (mlib_d64) MLIB_PREC; @@ -663,79 +524,6 @@ mlib_status mlib_ImageAffineEdgeExtend_BL(mlib_affine_param *param, mlib_d64 t, u, pix0; mlib_d64 a00, a01, a10, a11; - if (colormap != NULL) { - mlib_s32 max_xsize = param_e->max_xsize; - mlib_type ltype = mlib_ImageGetLutType(colormap); - mlib_d64 *plut = (mlib_d64 *) mlib_ImageGetLutDoubleData(colormap); - void *buff; - - channels = mlib_ImageGetLutChannels(colormap); - plut -= channels * mlib_ImageGetLutOffset(colormap); - - if (max_xsize == 0) { - return MLIB_SUCCESS; - } - - if (ltype == MLIB_BYTE) { - buff = mlib_malloc(channels * max_xsize); - } - else if (ltype == MLIB_SHORT) { - buff = mlib_malloc(channels * max_xsize * sizeof(mlib_s16)); - } else { - /* Unsupported type of lookup table. Report a failure */ - return MLIB_FAILURE; - } - - if (buff == NULL) - return MLIB_FAILURE; - - switch (ltype) { - case MLIB_BYTE: - switch (type) { - case MLIB_BYTE: - MLIB_PROCESS_EDGES(MLIB_EDGE_INDEX_u8i, mlib_u8); - break; - - case MLIB_SHORT: - srcStride >>= 1; - MLIB_PROCESS_EDGES(MLIB_EDGE_INDEX_u8i, mlib_s16); - break; - default: - /* Incompatible image type. Ignore it for now. */ - break; - } - - break; - - case MLIB_SHORT: - switch (type) { - case MLIB_BYTE: - MLIB_PROCESS_EDGES(MLIB_EDGE_INDEX_s16i, mlib_u8); - break; - - case MLIB_SHORT: - srcStride >>= 1; - MLIB_PROCESS_EDGES(MLIB_EDGE_INDEX_s16i, mlib_s16); - break; - default: - /* Incompatible image type. Ignore it for now. */ - break; - } - - break; - default: - /* Unsupported type of lookup table. - * Can not be here due to check on line 685, - * so just ignore it. - */ - break; - } - - mlib_free(buff); - - return MLIB_SUCCESS; - } - switch (type) { case MLIB_BYTE: MLIB_PROCESS_EDGES(MLIB_EDGE_BL, mlib_u8); @@ -775,12 +563,8 @@ mlib_status mlib_ImageAffineEdgeExtend_BL(mlib_affine_param *param, } /***************************************************************/ -#undef MLIB_EDGE_INDEX -#define MLIB_EDGE_INDEX MLIB_EDGE_INDEX_BC - mlib_status mlib_ImageAffineEdgeExtend_BC(mlib_affine_param *param, - mlib_affine_param *param_e, - const void *colormap) + mlib_affine_param *param_e) { GET_EDGE_PARAMS(); mlib_d64 scale = 1.0 / (mlib_d64) MLIB_PREC; @@ -789,7 +573,6 @@ mlib_status mlib_ImageAffineEdgeExtend_BC(mlib_affine_param *param, mlib_d64 xf0, xf1, xf2, xf3; mlib_d64 yf0, yf1, yf2, yf3; mlib_d64 c0, c1, c2, c3, val0; - mlib_type ltype; mlib_filter filter = param->filter; mlib_f32 *fptr; mlib_f32 const *flt_tbl; @@ -798,9 +581,7 @@ mlib_status mlib_ImageAffineEdgeExtend_BC(mlib_affine_param *param, mlib_s32 yDelta0, yDelta1, yDelta2; mlib_d64 sat; - ltype = (colormap != NULL) ? mlib_ImageGetLutType(colormap) : type; - - if (ltype == MLIB_BYTE) { + if (type == MLIB_BYTE) { flt_shift = FLT_SHIFT_U8; flt_mask = FLT_MASK_U8; flt_tbl = (filter == MLIB_BICUBIC) ? mlib_filters_u8f_bc : mlib_filters_u8f_bc2; @@ -813,78 +594,6 @@ mlib_status mlib_ImageAffineEdgeExtend_BC(mlib_affine_param *param, sat = (mlib_d64) 0x7FFF8000; /* saturation for U16 */ } - if (colormap != NULL) { - mlib_s32 max_xsize = param_e->max_xsize; - mlib_d64 *plut = (mlib_d64 *) mlib_ImageGetLutDoubleData(colormap); - void *buff; - - channels = mlib_ImageGetLutChannels(colormap); - plut -= channels * mlib_ImageGetLutOffset(colormap); - - if (max_xsize == 0) { - return MLIB_SUCCESS; - } - - if (ltype == MLIB_BYTE) { - buff = mlib_malloc(channels * max_xsize); - } - else if (ltype == MLIB_SHORT) { - buff = mlib_malloc(channels * max_xsize * sizeof(mlib_s16)); - } else { - /* Unsupported type of lookup table. */ - return MLIB_FAILURE; - } - - if (buff == NULL) - return MLIB_FAILURE; - - switch (ltype) { - case MLIB_BYTE: - switch (type) { - case MLIB_BYTE: - MLIB_PROCESS_EDGES(MLIB_EDGE_INDEX_u8i, mlib_u8); - break; - - case MLIB_SHORT: - srcStride >>= 1; - MLIB_PROCESS_EDGES(MLIB_EDGE_INDEX_u8i, mlib_s16); - break; - default: - /* Ignore incomatible image type. */ - break; - } - - break; - - case MLIB_SHORT: - switch (type) { - case MLIB_BYTE: - MLIB_PROCESS_EDGES(MLIB_EDGE_INDEX_s16i, mlib_u8); - break; - - case MLIB_SHORT: - srcStride >>= 1; - MLIB_PROCESS_EDGES(MLIB_EDGE_INDEX_s16i, mlib_s16); - break; - default: - /* Ignore incomatible image type. */ - break; - } - - break; - - default: - /* Unsupported type of lookup table. - * Can not be here due to check on line 836, - * so just ignore it. - */ - break; - } - - mlib_free(buff); - - return MLIB_SUCCESS; - } switch (type) { case MLIB_BYTE: diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageCheck.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageCheck.h index 3cfaea8c815..8c6a5b19ede 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageCheck.h +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageCheck.h @@ -82,12 +82,6 @@ extern "C" { return MLIB_FAILURE; \ } -#define MLIB_IMAGE_AND_COLORMAP_ARE_COMPAT(image,colormap) \ - if ((mlib_ImageGetChannels(image) != mlib_ImageGetLutChannels(colormap)) \ - || (mlib_ImageGetLutType(colormap) != mlib_ImageGetType(image))) { \ - return MLIB_FAILURE; \ - } - #define MLIB_IMAGE_GET_ALL_PARAMS(image, type, nchan, width, height, stride, pdata) \ type = mlib_ImageGetType(image); \ nchan = mlib_ImageGetChannels(image); \ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageColorTrue2Index.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageColorTrue2Index.c deleted file mode 100644 index 0028fd296c4..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageColorTrue2Index.c +++ /dev/null @@ -1,4256 +0,0 @@ -/* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * FUNCTION - * mlib_ImageColorTrue2Index - convert a true color image to an indexed - * color image - * - * SYNOPSIS - * mlib_status mlib_ImageColorTrue2Index(mlib_image *dst, - * const mlib_image *src, - * const void *colormap) - * - * ARGUMENTS - * colormap Internal data structure for inverse color mapping. - * dst Pointer to destination image. - * src Pointer to source image. - * - * DESCRIPTION - * Convert a true color image to a pseudo color image with the method - * of finding the nearest matched lut entry for each pixel. - * - * The src can be an MLIB_BYTE or MLIB_SHORT image with 3 or 4 channels. - * The dst must be a 1-channel MLIB_BYTE or MLIB_SHORT image. - * - * The lut might have either 3 or 4 channels. The type of the lut can be - * one of the following: - * MLIB_BYTE in, MLIB_BYTE out (i.e., BYTE-to-BYTE) - * MLIB_BYTE in, MLIB_SHORT out (i.e., BYTE-to-SHORT) - * MLIB_SHORT in, MLIB_SHORT out (i.e., SHORT-to-SHORT) - * MLIB_SHORT in, MLIB_BYTE out (i.e., SHORT-to-BYTE) - * - * The src image and the lut must have same number of channels. - */ - -#include "mlib_image.h" -#include "mlib_ImageColormap.h" -#include "mlib_ImageCheck.h" - -/***************************************************************/ - -/*#define USE_VIS_CODE*/ - -#ifdef USE_VIS_CODE -#include "vis_proto.h" -#define VIS_ALIGNADDR(X, Y) vis_alignaddr((void *)(X), (Y)) -#endif - -/***************************************************************/ - -#define LUT_BYTE_COLORS_3CHANNELS 1000 -#define LUT_BYTE_COLORS_4CHANNELS 3000 -#define LUT_SHORT_COLORS_3CHANNELS 1000 -#define LUT_SHORT_COLORS_4CHANNELS 1000 - -/***************************************************************/ - -#define MAIN_COLORTRUE2INDEX_LOOP( FROM_TYPE, TO_TYPE, NCHANNELS ) \ - for( y = 0; y < height; y++ ) \ - { \ - mlib_ImageColorTrue2IndexLine_##FROM_TYPE##_##TO_TYPE##_##NCHANNELS( \ - sdata, ddata, width, colormap ); \ - \ - sdata += sstride; \ - ddata += dstride; \ - } - -/***************************************************************/ - -#define COLOR_CUBE_U8_3_SEARCH( TABLE_POINTER_TYPE, SHIFT, STEP ) \ -{ \ - const mlib_u8 *c0, *c1, *c2; \ - TABLE_POINTER_TYPE *table = s->table; \ - mlib_s32 bits = s->bits; \ - mlib_s32 nbits = 8 - bits; \ - mlib_s32 mask = ~( ( 1 << nbits ) - 1 ); \ - mlib_s32 j; \ - \ - c0 = src + SHIFT; \ - c1 = src + 1 + SHIFT; \ - c2 = src + 2 + SHIFT; \ - \ - switch( bits ) \ - { \ - case 1: \ - case 2: \ - { \ - mlib_s32 bits0 = 8 - bits; \ - mlib_s32 bits1 = bits0 - bits; \ - mlib_s32 bits2 = bits1 - bits; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) >> bits2 ) | \ - ( ( *c1 & mask ) >> bits1 ) | \ - ( ( *c2 & mask ) >> bits0 ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - case 3: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << 1 ) | \ - ( ( *c1 & mask ) >> 2 ) | \ - ( ( *c2 & mask ) >> 5 ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - case 4: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << 4 ) | \ - ( *c1 & mask ) | \ - ( ( *c2 & mask ) >> 4 ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - case 5: \ - case 6: \ - case 7: \ - { \ - mlib_s32 bits0 = 8 - bits; \ - mlib_s32 bits1 = bits * 2 - 8; \ - mlib_s32 bits2 = bits1 + bits; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << bits2 ) | \ - ( ( *c1 & mask ) << bits1 ) | \ - ( ( *c2 & mask ) >> bits0 ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - case 8: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << 16 ) | \ - ( ( *c1 & mask ) << 8 ) | \ - ( *c2 & mask ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - } \ -} - -/***************************************************************/ -#define COLOR_CUBE_U8_4_SEARCH( TABLE_TYPE ) \ -{ \ - const mlib_u8 *c0, *c1, *c2, *c3; \ - TABLE_TYPE *table = s->table; \ - mlib_s32 bits = s->bits; \ - mlib_s32 nbits = 8 - bits; \ - mlib_s32 mask = ~( ( 1 << nbits ) - 1 ); \ - mlib_s32 j; \ - \ - c0 = src; \ - c1 = src + 1; \ - c2 = src + 2; \ - c3 = src + 3; \ - \ - switch( bits ) \ - { \ - case 1: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) >> 4 ) | \ - ( ( *c1 & mask ) >> 5 ) | \ - ( ( *c2 & mask ) >> 6 ) | \ - ( ( *c3 & mask ) >> 7 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 2: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( *c0 & mask ) | \ - ( ( *c1 & mask ) >> 2 ) | \ - ( ( *c2 & mask ) >> 4 ) | \ - ( ( *c3 & mask ) >> 6 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 3: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << 4 ) | \ - ( ( *c1 & mask ) << 1 ) | \ - ( ( *c2 & mask ) >> 2 ) | \ - ( ( *c3 & mask ) >> 5 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 4: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << 8 ) | \ - ( ( *c1 & mask ) << 4 ) | \ - ( *c2 & mask ) | \ - ( ( *c3 & mask ) >> 4 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 5: \ - case 6: \ - { \ - mlib_s32 bits3 = bits * 4 - 8; \ - mlib_s32 bits2 = bits3 - bits; \ - mlib_s32 bits1 = bits2 - bits; \ - mlib_s32 bits0 = 8 - bits; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << bits3 ) | \ - ( ( *c1 & mask ) << bits2 ) | \ - ( ( *c2 & mask ) << bits1 ) | \ - ( ( *c3 & mask ) >> bits0 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 7: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << 20 ) | \ - ( ( *c1 & mask ) << 13 ) | \ - ( ( *c2 & mask ) << 6 ) | \ - ( ( *c3 & mask ) >> 1 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 8: /* will never be called */ \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 & mask ) << 24 ) | \ - ( ( *c1 & mask ) << 16 ) | \ - ( ( *c2 & mask ) << 8 ) | \ - ( *c3 & mask ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - } \ -} - -/***************************************************************/ -#define COLOR_CUBE_S16_3_SEARCH( TABLE_TYPE, SHIFT, STEP ) \ -{ \ - const mlib_s16 *c0, *c1, *c2; \ - mlib_s32 bits = s->bits; \ - mlib_s32 nbits = 16 - bits; \ - mlib_s32 mask = ~( ( 1 << nbits ) - 1 ); \ - TABLE_TYPE *table = s->table; \ - mlib_s32 j; \ - \ - c0 = src + SHIFT; \ - c1 = src + 1 + SHIFT; \ - c2 = src + 2 + SHIFT; \ - \ - switch( bits ) \ - { \ - case 1: \ - case 2: \ - case 3: \ - case 4: \ - case 5: \ - { \ - mlib_s32 bits0 = 16 - bits; \ - mlib_s32 bits1 = bits0 - bits; \ - mlib_s32 bits2 = bits1 - bits; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( ( *c0 - MLIB_S16_MIN ) & mask ) >> bits2 ) | \ - ( ( ( *c1 - MLIB_S16_MIN ) & mask ) >> bits1 ) | \ - ( ( ( *c2 - MLIB_S16_MIN ) & mask ) >> bits0 ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - case 6: \ - case 7: \ - { \ - mlib_s32 bits0 = 16 - bits; \ - mlib_s32 bits1 = bits0 - bits; \ - mlib_s32 bits2 = bits * 3 - 16; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( ( *c0 - MLIB_S16_MIN ) & mask ) << bits2 ) | \ - ( ( ( *c1 - MLIB_S16_MIN ) & mask ) >> bits1 ) | \ - ( ( ( *c2 - MLIB_S16_MIN ) & mask ) >> bits0 ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - case 8: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( ( *c0 - MLIB_S16_MIN ) & mask ) << 8 ) | \ - ( ( *c1 - MLIB_S16_MIN ) & mask ) | \ - ( ( ( *c2 - MLIB_S16_MIN ) & mask ) >> 8 ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - case 9: \ - case 10: \ - { \ - mlib_s32 bits0 = 16 - bits; \ - mlib_s32 bits1 = 2 * bits - 16; \ - mlib_s32 bits2 = bits1 + bits; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( ( *c0 - MLIB_S16_MIN ) & mask ) << bits2 ) | \ - ( ( ( *c1 - MLIB_S16_MIN ) & mask ) << bits1 ) | \ - ( ( ( *c2 - MLIB_S16_MIN ) & mask ) >> bits0 ) ]; \ - \ - c0 += STEP; \ - c1 += STEP; \ - c2 += STEP; \ - } \ - break; \ - } \ - /* Other cases may not be considered as the table size will be more \ - than 2^32 */ \ - } \ -} - -/***************************************************************/ -#define COLOR_CUBE_S16_4_SEARCH( TABLE_TYPE ) \ -{ \ - const mlib_s16 *c0, *c1, *c2, *c3; \ - TABLE_TYPE *table = s->table; \ - mlib_s32 bits = s->bits; \ - mlib_s32 nbits = 16 - bits; \ - mlib_s32 mask = ~( ( 1 << nbits ) - 1 ); \ - mlib_s32 j; \ - \ - c0 = src; \ - c1 = src + 1; \ - c2 = src + 2; \ - c3 = src + 3; \ - \ - switch( bits ) \ - { \ - case 1: \ - case 2: \ - case 3: \ - { \ - mlib_s32 bits0 = 16 - bits; \ - mlib_s32 bits1 = bits0 - bits; \ - mlib_s32 bits2 = bits1 - bits; \ - mlib_s32 bits3 = bits2 - bits; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( ( *c0 - MLIB_S16_MIN ) & mask ) >> bits3 ) | \ - ( ( ( *c1 - MLIB_S16_MIN ) & mask ) >> bits2 ) | \ - ( ( ( *c2 - MLIB_S16_MIN ) & mask ) >> bits1 ) | \ - ( ( ( *c3 - MLIB_S16_MIN ) & mask ) >> bits0 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 4: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( *c0 - MLIB_S16_MIN ) & mask ) | \ - ( ( ( *c1 - MLIB_S16_MIN ) & mask ) >> 4 ) | \ - ( ( ( *c2 - MLIB_S16_MIN ) & mask ) >> 8 ) | \ - ( ( ( *c3 - MLIB_S16_MIN ) & mask ) >> 12 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 5: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( ( *c0 - MLIB_S16_MIN ) & mask ) << 4 ) | \ - ( ( ( *c1 - MLIB_S16_MIN ) & mask ) >> 1 ) | \ - ( ( ( *c2 - MLIB_S16_MIN ) & mask ) >> 6 ) | \ - ( ( ( *c3 - MLIB_S16_MIN ) & mask ) >> 11 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 6: \ - case 7: \ - { \ - mlib_s32 bits0 = 16 - bits; \ - mlib_s32 bits1 = bits0 - bits; \ - mlib_s32 bits3 = bits * 4 - 16; \ - mlib_s32 bits2 = bits3 - bits; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( ( *c0 - MLIB_S16_MIN ) & mask ) << bits3 ) | \ - ( ( ( *c1 - MLIB_S16_MIN ) & mask ) << bits2 ) | \ - ( ( ( *c2 - MLIB_S16_MIN ) & mask ) >> bits1 ) | \ - ( ( ( *c3 - MLIB_S16_MIN ) & mask ) >> bits0 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - case 8: \ - { \ - for( j = 0; j < length; j++ ) \ - { \ - dst[ j ] = table[ ( ( ( *c0 - MLIB_S16_MIN ) & mask ) << 16 ) | \ - ( ( ( *c1 - MLIB_S16_MIN ) & mask ) << 8 ) | \ - ( ( *c2 - MLIB_S16_MIN ) & mask ) | \ - ( ( ( *c3 - MLIB_S16_MIN ) & mask ) >> 8 ) ]; \ - \ - c0 += 4; \ - c1 += 4; \ - c2 += 4; \ - c3 += 4; \ - } \ - break; \ - } \ - /* Other cases may not be considered as the table size will be more \ - than 2^32 */ \ - } \ -} - -/***************************************************************/ -#define BINARY_TREE_SEARCH_RIGHT( POSITION, COLOR_MAX, SHIFT ) \ -{ \ - if( ( distance >= ( ( ( position[ POSITION ] + current_size - \ - c[ POSITION ] ) * ( position[ POSITION ] + current_size - \ - c[ POSITION ] ) ) >> SHIFT ) ) && \ - ( position[ POSITION ] + current_size != COLOR_MAX ) ) \ - continue_up = 1; \ -} - -/***************************************************************/ -#define BINARY_TREE_EXPLORE_RIGHT_3( POSITION, COLOR_MAX, IMAGE_TYPE, \ - FIRST_NEIBOUR, SECOND_NEIBOUR, SUBSTRACTION, SHIFT ) \ -{ \ - if( distance >= ( ( ( position[ POSITION ] + current_size - \ - c[ POSITION ] ) * ( position[ POSITION ] + \ - current_size - c[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - if( distance < ( ( ( COLOR_MAX - c[ POSITION ] ) * \ - ( COLOR_MAX - c[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - if( distance < ( ( ( position[ POSITION ] + \ - current_size * 2 - c[ POSITION ] ) * \ - ( position[ POSITION ] + current_size * 2 - \ - c[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - /* Check only a part of quadrant */ \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 1; \ - check_neibours[ SECOND_NEIBOUR ] += 1; \ - check_corner += 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Only a part of quadrant needs checking */ \ - distance = \ - mlib_search_quadrant_part_to_left_##IMAGE_TYPE##_3( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c, p, \ - position[ POSITION ] + current_size, pass - 1, POSITION ); \ - } \ - else /* Check whole quadrant */ \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 2; \ - check_neibours[ SECOND_NEIBOUR ] += 2; \ - check_corner += 2; \ - continue_up = 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it */ \ - distance = mlib_search_quadrant_##IMAGE_TYPE##_3( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c[ 0 ], c[ 1 ], c[ 2 ], p ); \ - } \ - } \ - else /* Cell is on the edge of the space */ \ - { \ - if( position[ POSITION ] + current_size * 2 == \ - COLOR_MAX ) \ - { \ - /* Check only a part of quadrant */ \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 1; \ - check_neibours[ SECOND_NEIBOUR ] += 1; \ - check_corner += 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Only a part of quadrant needs checking */ \ - distance = \ - mlib_search_quadrant_part_to_left_##IMAGE_TYPE##_3( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c, p, \ - position[ POSITION ] + current_size, \ - pass - 1, POSITION ); \ - } \ - else /* Check whole quadrant */ \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 2; \ - check_neibours[ SECOND_NEIBOUR ] += 2; \ - check_corner += 2; \ - continue_up = 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it */ \ - distance = mlib_search_quadrant_##IMAGE_TYPE##_3( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c[ 0 ], c[ 1 ], c[ 2 ], p ); \ - } \ - } \ - } \ -} - -/***************************************************************/ -#define BINARY_TREE_EXPLORE_RIGHT_4( POSITION, COLOR_MAX, IMAGE_TYPE, \ - FIRST_NEIBOUR, SECOND_NEIBOUR, THIRD_NEIBOUR, SUBSTRACTION, SHIFT ) \ -{ \ - if( distance >= ( ( ( position[ POSITION ] + current_size - \ - c[ POSITION ] ) * ( position[ POSITION ] + \ - current_size - c[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - if( distance < ( ( ( COLOR_MAX - c[ POSITION ] ) * \ - ( COLOR_MAX - c[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - if( distance < ( ( ( position[ POSITION ] + \ - current_size * 2 - c[ POSITION ] ) * \ - ( position[ POSITION ] + current_size * 2 - \ - c[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - /* Check only a part of quadrant */ \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 1; \ - check_neibours[ SECOND_NEIBOUR ] += 1; \ - check_neibours[ THIRD_NEIBOUR ] += 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, c[ 3 ], \ - p[ 3 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Only a part of quadrant needs checking */ \ - distance = \ - mlib_search_quadrant_part_to_left_##IMAGE_TYPE##_4( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c, p, \ - position[ POSITION ] + current_size, pass - 1, POSITION ); \ - } \ - else /* Check whole quadrant */ \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 2; \ - check_neibours[ SECOND_NEIBOUR ] += 2; \ - check_neibours[ THIRD_NEIBOUR ] += 2; \ - continue_up = 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, c[ 3 ], \ - p[ 3 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it */ \ - distance = mlib_search_quadrant_##IMAGE_TYPE##_4( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c[ 0 ], c[ 1 ], c[ 2 ], c[ 3 ], p ); \ - } \ - } \ - else /* Cell is on the edge of the space */ \ - { \ - if( position[ POSITION ] + current_size * 2 == \ - COLOR_MAX ) \ - { \ - /* Check only a part of quadrant */ \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 1; \ - check_neibours[ SECOND_NEIBOUR ] += 1; \ - check_neibours[ THIRD_NEIBOUR ] += 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, c[ 3 ], \ - p[ 3 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Only a part of quadrant needs checking */ \ - distance = \ - mlib_search_quadrant_part_to_left_##IMAGE_TYPE##_4( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c, p, \ - position[ POSITION ] + current_size, \ - pass - 1, POSITION ); \ - } \ - else /* Check whole quadrant */ \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 2; \ - check_neibours[ SECOND_NEIBOUR ] += 2; \ - check_neibours[ THIRD_NEIBOUR ] += 2; \ - continue_up = 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, c[ 3 ], \ - p[ 3 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it */ \ - distance = mlib_search_quadrant_##IMAGE_TYPE##_4( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c[ 0 ], c[ 1 ], c[ 2 ], c[ 3 ], p ); \ - } \ - } \ - } \ -} - -/***************************************************************/ -#define BINARY_TREE_SEARCH_LEFT( POSITION, SHIFT ) \ -{ \ - if( ( distance > ( ( ( position[ POSITION ] - c[ POSITION ] ) * \ - ( position[ POSITION ] - c[ POSITION ] ) ) >> SHIFT ) ) && \ - position[ POSITION ] ) \ - continue_up = 1; \ -} - -/***************************************************************/ -#define BINARY_TREE_EXPLORE_LEFT_3( POSITION, IMAGE_TYPE, \ - FIRST_NEIBOUR, SECOND_NEIBOUR, SUBSTRACTION, SHIFT ) \ -{ \ - if( distance > \ - ( ( ( c[ POSITION ] - position[ POSITION ] ) * \ - ( c[ POSITION ] - position[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - if( distance <= ( ( c[ POSITION ] * c[ POSITION ] ) >> SHIFT ) ) \ - { \ - if( distance <= ( ( ( c[ POSITION ] + current_size - \ - position[ POSITION ] ) * \ - ( c[ POSITION ] + current_size - \ - position[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 1; \ - check_neibours[ SECOND_NEIBOUR ] += 1; \ - check_corner += 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Only a part of quadrant needs checking */ \ - distance = \ - mlib_search_quadrant_part_to_right_##IMAGE_TYPE##_3( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c, p, \ - position[ POSITION ] - current_size, pass - 1, POSITION ); \ - } \ - else /* Check whole quadrant */ \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 2; \ - check_neibours[ SECOND_NEIBOUR ] += 2; \ - check_corner += 2; \ - continue_up = 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it */ \ - distance = mlib_search_quadrant_##IMAGE_TYPE##_3( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c[ 0 ], c[ 1 ], c[ 2 ], p ); \ - } \ - } \ - else \ - { \ - if( !( position[ POSITION ] - current_size ) ) \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 1; \ - check_neibours[ SECOND_NEIBOUR ] += 1; \ - check_corner += 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Only a part of quadrant needs checking */ \ - distance = \ - mlib_search_quadrant_part_to_right_##IMAGE_TYPE##_3( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c, p, \ - position[ POSITION ] - current_size, pass - 1, POSITION ); \ - } \ - else \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 2; \ - check_neibours[ SECOND_NEIBOUR ] += 2; \ - check_corner += 2; \ - continue_up = 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it */ \ - distance = mlib_search_quadrant_##IMAGE_TYPE##_3( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c[ 0 ], c[ 1 ], c[ 2 ], p ); \ - } \ - } \ - } \ -} - -/***************************************************************/ -#define BINARY_TREE_EXPLORE_LEFT_4( POSITION, IMAGE_TYPE, \ - FIRST_NEIBOUR, SECOND_NEIBOUR, THIRD_NEIBOUR, SUBSTRACTION, SHIFT ) \ -{ \ - if( distance > \ - ( ( ( c[ POSITION ] - position[ POSITION ] ) * \ - ( c[ POSITION ] - position[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - if( distance <= ( ( c[ POSITION ] * c[ POSITION ] ) >> SHIFT ) ) \ - { \ - if( distance <= ( ( ( c[ POSITION ] + current_size - \ - position[ POSITION ] ) * \ - ( c[ POSITION ] + current_size - \ - position[ POSITION ] ) ) >> SHIFT ) ) \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 1; \ - check_neibours[ SECOND_NEIBOUR ] += 1; \ - check_neibours[ THIRD_NEIBOUR ] += 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, c[ 3 ], \ - p[ 3 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Only a part of quadrant needs checking */ \ - distance = \ - mlib_search_quadrant_part_to_right_##IMAGE_TYPE##_4( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c, p, \ - position[ POSITION ] - current_size, pass - 1, POSITION ); \ - } \ - else /* Check whole quadrant */ \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 2; \ - check_neibours[ SECOND_NEIBOUR ] += 2; \ - check_neibours[ THIRD_NEIBOUR ] += 2; \ - continue_up = 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, c[ 3 ], \ - p[ 3 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it */ \ - distance = mlib_search_quadrant_##IMAGE_TYPE##_4( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c[ 0 ], c[ 1 ], c[ 2 ], c[ 3 ], p ); \ - } \ - } \ - else \ - { \ - if( !( position[ POSITION ] - current_size ) ) \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 1; \ - check_neibours[ SECOND_NEIBOUR ] += 1; \ - check_neibours[ THIRD_NEIBOUR ] += 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, c[ 3 ], \ - p[ 3 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Only a part of quadrant needs checking */ \ - distance = \ - mlib_search_quadrant_part_to_right_##IMAGE_TYPE##_4( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c, p, \ - position[ POSITION ] - current_size, pass - 1, POSITION ); \ - } \ - else \ - { \ - mlib_s32 qq = q ^ ( 1 << POSITION ); \ - \ - check_neibours[ FIRST_NEIBOUR ] += 2; \ - check_neibours[ SECOND_NEIBOUR ] += 2; \ - check_neibours[ THIRD_NEIBOUR ] += 2; \ - continue_up = 1; \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. \ - Check the distance */ \ - mlib_s32 new_found_color = \ - node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ] - SUBSTRACTION, c[ 1 ], \ - p[ 1 ][ new_found_color ] - SUBSTRACTION, c[ 2 ], \ - p[ 2 ][ new_found_color ] - SUBSTRACTION, c[ 3 ], \ - p[ 3 ][ new_found_color ] - SUBSTRACTION, SHIFT ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it */ \ - distance = mlib_search_quadrant_##IMAGE_TYPE##_4( \ - node->contents.quadrants[ qq ], \ - distance, &found_color, c[ 0 ], c[ 1 ], c[ 2 ], c[ 3 ], p ); \ - } \ - } \ - } \ -} - -/***************************************************************/ -#define CHECK_QUADRANT_U8_3( qq ) \ -{ \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. Check the distance */ \ - mlib_s32 new_found_color = node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_3( c[ 0 ], \ - p[ 0 ][ new_found_color ], c[ 1 ], \ - p[ 1 ][ new_found_color ], c[ 2 ], \ - p[ 2 ][ new_found_color ], 0 ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it all */ \ - distance = mlib_search_quadrant_U8_3( \ - node->contents.quadrants[ qq ], distance, &found_color, \ - c[ 0 ], c[ 1 ], c[ 2 ], p ); \ -/* Else there is just an empty cell */ \ -} - -/***************************************************************/ -#define CHECK_QUADRANT_S16_3( qq ) \ -{ \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. Check the distance */ \ - mlib_s32 new_found_color = node->contents.index[ qq ]; \ - mlib_u32 palc0, palc1, palc2, newdistance; \ - \ - palc0 = p[ 0 ][ new_found_color ] - MLIB_S16_MIN; \ - palc1 = p[ 1 ][ new_found_color ] - MLIB_S16_MIN; \ - palc2 = p[ 2 ][ new_found_color ] - MLIB_S16_MIN; \ - \ - newdistance = FIND_DISTANCE_3( c[ 0 ], palc0, \ - c[ 1 ], palc1, \ - c[ 2 ], palc2, 2 ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it all */ \ - distance = mlib_search_quadrant_S16_3( \ - node->contents.quadrants[ qq ], distance, &found_color, \ - c[ 0 ], c[ 1 ], c[ 2 ], p ); \ -/* Else there is just an empty cell */ \ -} - -/***************************************************************/ -#define BINARY_TREE_SEARCH_3( SOURCE_IMAGE, POINTER_TYPE, BITS, \ - COLOR_MAX, SUBTRACTION, POINTER_SHIFT, STEP, SHIFT ) \ -{ \ - const POINTER_TYPE *channels[ 3 ], *p[ 3 ]; \ - mlib_u32 c[ 3 ]; \ - mlib_s32 j; \ - \ - p[ 0 ] = s->lut[ 0 ]; \ - p[ 1 ] = s->lut[ 1 ]; \ - p[ 2 ] = s->lut[ 2 ]; \ - channels[ 0 ] = src + POINTER_SHIFT; \ - channels[ 1 ] = src + 1 + POINTER_SHIFT; \ - channels[ 2 ] = src + 2 + POINTER_SHIFT; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - mlib_s32 pass = BITS - 1; \ - mlib_u32 position[ 3 ] = { 0, 0, 0 }; \ - mlib_s32 we_found_it = 0; \ - struct lut_node_3 *node = s->table; \ - /* Stack pointer pointers to the first free element of stack. */ \ - /* The node we are in is in the `node' */ \ - struct \ - { \ - struct lut_node_3 *node; \ - mlib_s32 q; \ - } stack[ BITS ]; \ - mlib_s32 stack_pointer = 0; \ - \ - c[ 0 ] = *channels[ 0 ] - SUBTRACTION; \ - c[ 1 ] = *channels[ 1 ] - SUBTRACTION; \ - c[ 2 ] = *channels[ 2 ] - SUBTRACTION; \ - \ - do \ - { \ - mlib_s32 q; \ - mlib_u32 current_size = 1 << pass; \ - \ - q = ( ( c[ 0 ] >> pass ) & 1 ) | \ - ( ( ( c[ 1 ] << 1 ) >> pass ) & 2 ) | \ - ( ( ( c[ 2 ] << 2 ) >> pass ) & 4 ); \ - \ - position[ 0 ] |= c[ 0 ] & current_size; \ - position[ 1 ] |= c[ 1 ] & current_size; \ - position[ 2 ] |= c[ 2 ] & current_size; \ - \ - if( node->tag & ( 1 << q ) ) \ - { \ - /* \ - Here is a cell with one color. We need to be sure it's \ - the one that is the closest to our color \ - */ \ - mlib_s32 palindex = node->contents.index[ q ]; \ - mlib_u32 palc[ 3 ]; \ - mlib_s32 identical; \ - \ - palc[ 0 ] = p[ 0 ][ palindex ] - SUBTRACTION; \ - palc[ 1 ] = p[ 1 ][ palindex ] - SUBTRACTION; \ - palc[ 2 ] = p[ 2 ][ palindex ] - SUBTRACTION; \ - \ - identical = ( palc[ 0 ] - c[ 0 ] ) | ( palc[ 1 ] - c[ 1 ] ) | \ - ( palc[ 2 ] - c[ 2 ] ); \ - \ - if( !identical || BITS - pass == bits ) \ - { \ - /* Oh, here it is :) */ \ - dst[ j ] = palindex + s->offset; \ - we_found_it = 1; \ - } \ - else \ - { \ - mlib_u32 distance; \ - /* First index is the channel, second is the number of the \ - side */ \ - mlib_s32 found_color; \ - mlib_s32 continue_up; \ - \ - distance = FIND_DISTANCE_3( c[ 0 ], palc[ 0 ], \ - c[ 1 ], palc[ 1 ], c[ 2 ], palc[ 2 ], SHIFT ); \ - found_color = palindex; \ - \ - do \ - { \ - mlib_s32 check_corner; \ - \ - /* \ - Neibours are enumerated in a cicle: \ - 0 - between quadrants 0 and 1, \ - 1 - between quadrants 1 and 2 and \ - 2 - between quadrants 2 and 0 \ - */ \ - mlib_s32 check_neibours[ 3 ]; \ - \ - /* \ - Others are three two neibour quadrants \ - \ - Side number is [ ][ ], e.g. 2 is 0..010b, so the sides it has \ - near are: \ - [ 0 (coordinate number) ][ 0 (bit 0 in the number) ] \ - [ 1 (coordinate number) ][ 1 (bit 1 in the number) ] \ - \ - Now we can look in the three nearest quadrants. Do \ - we really need it ? Check it. \ - */ \ - \ - check_corner = check_neibours[ 0 ] = check_neibours[ 1 ] = \ - check_neibours[ 2 ] = 0; \ - continue_up = 0; \ - \ - if( q & 1 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_3( 0, SOURCE_IMAGE, 2, 0, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_3( 0, COLOR_MAX, SOURCE_IMAGE, 2, 0, \ - SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 2 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_3( 1, SOURCE_IMAGE, 0, 1, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_3( 1, COLOR_MAX, SOURCE_IMAGE, 0, 1, \ - SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 4 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_3( 2, SOURCE_IMAGE, 1, 2, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_3( 2, COLOR_MAX, SOURCE_IMAGE, 1, 2, \ - SUBTRACTION, SHIFT ); \ - } \ - \ - if( check_neibours[ 0 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 3; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_3( qq ); \ - } \ - \ - if( check_neibours[ 1 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 6; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_3( qq ); \ - } \ - \ - if( check_neibours[ 2 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 5; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_3( qq ); \ - } \ - \ - if( check_corner >= 3 ) \ - { \ - mlib_s32 qq = q ^ 7; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_3( qq ); \ - } \ - \ - if( q & 1 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 0, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 0, SHIFT ); \ - } \ - \ - if( q & 2 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 1, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 1, SHIFT ); \ - } \ - \ - if( q & 4 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 2, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 2, SHIFT ); \ - } \ - \ - position[ 0 ] &= ~( c[ 0 ] & current_size ); \ - position[ 1 ] &= ~( c[ 1 ] & current_size ); \ - position[ 2 ] &= ~( c[ 2 ] & current_size ); \ - \ - current_size <<= 1; \ - \ - pass++; \ - \ - stack_pointer--; \ - q = stack[ stack_pointer ].q; \ - node = stack[ stack_pointer ].node; \ - } while( continue_up ); \ - \ - dst[ j ] = found_color + s->offset; \ - \ - we_found_it = 1; \ - } \ - } \ - else if( node->contents.quadrants[ q ] ) \ - { \ - /* Descend one level */ \ - stack[ stack_pointer ].node = node; \ - stack[ stack_pointer++ ].q = q; \ - node = node->contents.quadrants[ q ]; \ - } \ - else \ - { \ - /* Found the empty quadrant. Look around */ \ - mlib_u32 distance = MLIB_U32_MAX; \ - mlib_s32 found_color; \ - mlib_s32 continue_up; \ - \ - /* \ - As we had come to this level, it is warranted that there \ - are other points on this level near the empty quadrant \ - */ \ - do \ - { \ - mlib_s32 check_corner; \ - mlib_s32 check_neibours[ 3 ]; \ - \ - check_corner = check_neibours[ 0 ] = check_neibours[ 1 ] = \ - check_neibours[ 2 ] = 0; \ - continue_up = 0; \ - \ - if( q & 1 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_3( 0, SOURCE_IMAGE, 2, 0, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_3( 0, COLOR_MAX, SOURCE_IMAGE, 2, 0, \ - SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 2 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_3( 1, SOURCE_IMAGE, 0, 1, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_3( 1, COLOR_MAX, SOURCE_IMAGE, 0, 1, \ - SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 4 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_3( 2, SOURCE_IMAGE, 1, 2, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_3( 2, COLOR_MAX, SOURCE_IMAGE, 1, 2, \ - SUBTRACTION, SHIFT ); \ - } \ - \ - if( check_neibours[ 0 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 3; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_3( qq ); \ - } \ - \ - if( check_neibours[ 1 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 6; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_3( qq ); \ - } \ - \ - if( check_neibours[ 2 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 5; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_3( qq ); \ - } \ - \ - if( check_corner >= 3 ) \ - { \ - mlib_s32 qq = q ^ 7; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_3( qq ); \ - } \ - \ - if( q & 1 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 0, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 0, SHIFT ); \ - } \ - \ - if( q & 2 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 1, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 1, SHIFT ); \ - } \ - \ - if( q & 4 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 2, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 2, SHIFT ); \ - } \ - \ - position[ 0 ] &= ~( c[ 0 ] & current_size ); \ - position[ 1 ] &= ~( c[ 1 ] & current_size ); \ - position[ 2 ] &= ~( c[ 2 ] & current_size ); \ - \ - current_size <<= 1; \ - \ - pass++; \ - \ - stack_pointer--; \ - q = stack[ stack_pointer ].q; \ - node = stack[ stack_pointer ].node; \ - } while( continue_up ); \ - \ - dst[ j ] = found_color + s->offset; \ - we_found_it = 1; \ - } \ - \ - pass--; \ - \ - } while( !we_found_it ); \ - \ - channels[ 0 ] += STEP; \ - channels[ 1 ] += STEP; \ - channels[ 2 ] += STEP; \ - } \ -} - -/***************************************************************/ -#define CHECK_QUADRANT_U8_4( qq ) \ -{ \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. Check the distance */ \ - mlib_s32 new_found_color = node->contents.index[ qq ]; \ - mlib_u32 newdistance = FIND_DISTANCE_4( c[ 0 ], \ - p[ 0 ][ new_found_color ], c[ 1 ], \ - p[ 1 ][ new_found_color ], c[ 2 ], \ - p[ 2 ][ new_found_color ], c[ 3 ], \ - p[ 3 ][ new_found_color ], 0 ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it all */ \ - distance = mlib_search_quadrant_U8_4( \ - node->contents.quadrants[ qq ], distance, &found_color, \ - c[ 0 ], c[ 1 ], c[ 2 ], c[ 3 ], p ); \ -/* Else there is just an empty cell */ \ -} - -/***************************************************************/ -#define CHECK_QUADRANT_S16_4( qq ) \ -{ \ - if( node->tag & ( 1 << qq ) ) \ - { \ - /* Here is another color cell. Check the distance */ \ - mlib_s32 new_found_color = node->contents.index[ qq ]; \ - mlib_u32 palc0, palc1, palc2, palc3, newdistance; \ - \ - palc0 = p[ 0 ][ new_found_color ] - MLIB_S16_MIN; \ - palc1 = p[ 1 ][ new_found_color ] - MLIB_S16_MIN; \ - palc2 = p[ 2 ][ new_found_color ] - MLIB_S16_MIN; \ - palc3 = p[ 3 ][ new_found_color ] - MLIB_S16_MIN; \ - \ - newdistance = FIND_DISTANCE_4( c[ 0 ], palc0, \ - c[ 1 ], palc1, \ - c[ 2 ], palc2, \ - c[ 3 ], palc3, 2 ); \ - \ - if( newdistance < distance ) \ - { \ - found_color = new_found_color; \ - distance = newdistance; \ - } \ - } \ - else if( node->contents.quadrants[ qq ] ) \ - /* Here is a full node. Just explore it all */ \ - distance = mlib_search_quadrant_S16_4( \ - node->contents.quadrants[ qq ], distance, &found_color, \ - c[ 0 ], c[ 1 ], c[ 2 ], c[ 3 ], p ); \ -/* Else there is just an empty cell */ \ -} - -/***************************************************************/ -#define BINARY_TREE_SEARCH_4( SOURCE_IMAGE, POINTER_TYPE, BITS, \ - COLOR_MAX, SUBTRACTION, SHIFT ) \ -{ \ - const POINTER_TYPE *channels[ 4 ], *p[ 4 ]; \ - mlib_u32 c[ 4 ]; \ - mlib_s32 j; \ - \ - p[ 0 ] = s->lut[ 0 ]; \ - p[ 1 ] = s->lut[ 1 ]; \ - p[ 2 ] = s->lut[ 2 ]; \ - p[ 3 ] = s->lut[ 3 ]; \ - channels[ 0 ] = src; \ - channels[ 1 ] = src + 1; \ - channels[ 2 ] = src + 2; \ - channels[ 3 ] = src + 3; \ - \ - for( j = 0; j < length; j++ ) \ - { \ - mlib_s32 pass = BITS - 1; \ - mlib_u32 position[ 4 ] = { 0, 0, 0, 0 }; \ - mlib_s32 we_found_it = 0; \ - struct lut_node_4 *node = s->table; \ - /* Stack pointer pointers to the first free element of stack. */ \ - /* The node we are in is in the `node' */ \ - struct \ - { \ - struct lut_node_4 *node; \ - mlib_s32 q; \ - } stack[ BITS ]; \ - mlib_s32 stack_pointer = 0; \ - \ - c[ 0 ] = *channels[ 0 ] - SUBTRACTION; \ - c[ 1 ] = *channels[ 1 ] - SUBTRACTION; \ - c[ 2 ] = *channels[ 2 ] - SUBTRACTION; \ - c[ 3 ] = *channels[ 3 ] - SUBTRACTION; \ - \ - do \ - { \ - mlib_s32 q; \ - mlib_u32 current_size = 1 << pass; \ - \ - q = ( ( c[ 0 ] >> pass ) & 1 ) | \ - ( ( ( c[ 1 ] << 1 ) >> pass ) & 2 ) | \ - ( ( ( c[ 2 ] << 2 ) >> pass ) & 4 ) | \ - ( ( ( c[ 3 ] << 3 ) >> pass ) & 8 ); \ - \ - position[ 0 ] |= c[ 0 ] & current_size; \ - position[ 1 ] |= c[ 1 ] & current_size; \ - position[ 2 ] |= c[ 2 ] & current_size; \ - position[ 3 ] |= c[ 3 ] & current_size; \ - \ - if( node->tag & ( 1 << q ) ) \ - { \ - /* \ - Here is a cell with one color. We need to be sure it's \ - the one that is the closest to our color \ - */ \ - mlib_s32 palindex = node->contents.index[ q ]; \ - mlib_u32 palc[ 4 ]; \ - mlib_s32 identical; \ - \ - palc[ 0 ] = p[ 0 ][ palindex ] - SUBTRACTION; \ - palc[ 1 ] = p[ 1 ][ palindex ] - SUBTRACTION; \ - palc[ 2 ] = p[ 2 ][ palindex ] - SUBTRACTION; \ - palc[ 3 ] = p[ 3 ][ palindex ] - SUBTRACTION; \ - \ - identical = ( palc[ 0 ] - c[ 0 ] ) | ( palc[ 1 ] - c[ 1 ] ) | \ - ( palc[ 2 ] - c[ 2 ] ) | ( palc[ 3 ] - c[ 3 ] ); \ - \ - if( !identical || BITS - pass == bits ) \ - { \ - /* Oh, here it is :) */ \ - dst[ j ] = palindex + s->offset; \ - we_found_it = 1; \ - } \ - else \ - { \ - mlib_u32 distance; \ - /* First index is the channel, second is the number of the \ - side */ \ - mlib_s32 found_color; \ - mlib_s32 continue_up; \ - \ - distance = FIND_DISTANCE_4( c[ 0 ], palc[ 0 ], \ - c[ 1 ], palc[ 1 ], c[ 2 ], palc[ 2 ], c[ 3 ], palc[ 3 ], SHIFT ); \ - found_color = palindex; \ - \ - do \ - { \ - mlib_s32 check_corner; \ - mlib_s32 check_neibours[ 6 ]; \ - mlib_s32 check_far_neibours[ 4 ]; \ - \ - /* \ - Check neibours: quadrants that are different by 2 bits \ - from the quadrant, that we are in: \ - 3 - 0 \ - 5 - 1 \ - 6 - 2 \ - 9 - 3 \ - 10 - 4 \ - 12 - 5 \ - Far quadrants: different by 3 bits: \ - 7 - 0 \ - 11 - 1 \ - 13 - 2 \ - 14 - 3 \ - */ \ - \ - check_neibours[ 0 ] = check_neibours[ 1 ] = \ - check_neibours[ 2 ] = check_neibours[ 3 ] = \ - check_neibours[ 4 ] = check_neibours[ 5 ] = 0; \ - continue_up = 0; \ - \ - if( q & 1 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_4( 0, SOURCE_IMAGE, 0, 1, 3, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_4( 0, COLOR_MAX, SOURCE_IMAGE, \ - 0, 1, 3, SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 2 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_4( 1, SOURCE_IMAGE, 0, 2, 4, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_4( 1, COLOR_MAX, SOURCE_IMAGE, \ - 0, 2, 4, SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 4 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_4( 2, SOURCE_IMAGE, 1, 2, 5, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_4( 2, COLOR_MAX, SOURCE_IMAGE, \ - 1, 2, 5, SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 8 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_4( 3, SOURCE_IMAGE, 3, 4, 5, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_4( 3, COLOR_MAX, SOURCE_IMAGE, \ - 3, 4, 5, SUBTRACTION, SHIFT ); \ - } \ - \ - check_far_neibours[ 0 ] = check_neibours[ 0 ] + \ - check_neibours[ 1 ] + check_neibours[ 2 ]; \ - check_far_neibours[ 1 ] = check_neibours[ 0 ] + \ - check_neibours[ 3 ] + check_neibours[ 4 ]; \ - check_far_neibours[ 2 ] = check_neibours[ 1 ] + \ - check_neibours[ 3 ] + check_neibours[ 5 ]; \ - check_far_neibours[ 3 ] = check_neibours[ 2 ] + \ - check_neibours[ 4 ] + check_neibours[ 5 ]; \ - \ - check_corner = check_far_neibours[ 0 ] + \ - check_far_neibours[ 1 ] + \ - check_far_neibours[ 2 ] + \ - check_far_neibours[ 3 ]; \ - \ - if( check_neibours[ 0 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 3; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 1 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 5; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 2 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 6; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 3 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 9; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 4 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 10; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 5 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 12; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_far_neibours[ 0 ] >= 3 ) \ - { \ - mlib_s32 qq = q ^ 7; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_far_neibours[ 1 ] >= 3 ) \ - { \ - mlib_s32 qq = q ^ 11; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_far_neibours[ 2 ] >= 3 ) \ - { \ - mlib_s32 qq = q ^ 13; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_far_neibours[ 3 ] >= 3 ) \ - { \ - mlib_s32 qq = q ^ 14; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_corner >= 4 ) \ - { \ - mlib_s32 qq = q ^ 15; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( q & 1 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 0, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 0, SHIFT ); \ - } \ - \ - if( q & 2 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 1, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 1, SHIFT ); \ - } \ - \ - if( q & 4 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 2, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 2, SHIFT ); \ - } \ - \ - if( q & 8 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 3, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 3, SHIFT ); \ - } \ - \ - position[ 0 ] &= ~( c[ 0 ] & current_size ); \ - position[ 1 ] &= ~( c[ 1 ] & current_size ); \ - position[ 2 ] &= ~( c[ 2 ] & current_size ); \ - position[ 3 ] &= ~( c[ 3 ] & current_size ); \ - \ - current_size <<= 1; \ - \ - pass++; \ - \ - stack_pointer--; \ - q = stack[ stack_pointer ].q; \ - node = stack[ stack_pointer ].node; \ - } while( continue_up ); \ - \ - dst[ j ] = found_color + s->offset; \ - we_found_it = 1; \ - } \ - } \ - else if( node->contents.quadrants[ q ] ) \ - { \ - /* Descend one level */ \ - stack[ stack_pointer ].node = node; \ - stack[ stack_pointer++ ].q = q; \ - node = node->contents.quadrants[ q ]; \ - } \ - else \ - { \ - /* Found the empty quadrant. Look around */ \ - mlib_u32 distance = MLIB_U32_MAX; \ - mlib_s32 found_color; \ - mlib_s32 continue_up; \ - \ - /* \ - As we had come to this level, it is warranted that there \ - are other points on this level near the empty quadrant \ - */ \ - do \ - { \ - mlib_s32 check_corner; \ - mlib_s32 check_neibours[ 6 ]; \ - mlib_s32 check_far_neibours[ 4 ]; \ - \ - /* \ - Check neibours: quadrants that are different by 2 bits \ - from the quadrant, that we are in: \ - 3 - 0 \ - 5 - 1 \ - 6 - 2 \ - 9 - 3 \ - 10 - 4 \ - 12 - 5 \ - Far quadrants: different by 3 bits: \ - 7 - 0 \ - 11 - 1 \ - 13 - 2 \ - 14 - 3 \ - */ \ - \ - check_neibours[ 0 ] = check_neibours[ 1 ] = \ - check_neibours[ 2 ] = check_neibours[ 3 ] = \ - check_neibours[ 4 ] = check_neibours[ 5 ] = 0; \ - continue_up = 0; \ - \ - if( q & 1 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_4( 0, SOURCE_IMAGE, 0, 1, 3, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_4( 0, COLOR_MAX, SOURCE_IMAGE, \ - 0, 1, 3, SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 2 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_4( 1, SOURCE_IMAGE, 0, 2, 4, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_4( 1, COLOR_MAX, SOURCE_IMAGE, \ - 0, 2, 4, SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 4 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_4( 2, SOURCE_IMAGE, 1, 2, 5, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_4( 2, COLOR_MAX, SOURCE_IMAGE, \ - 1, 2, 5, SUBTRACTION, SHIFT ); \ - } \ - \ - if( q & 8 ) \ - { \ - BINARY_TREE_EXPLORE_LEFT_4( 3, SOURCE_IMAGE, 3, 4, 5, \ - SUBTRACTION, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_EXPLORE_RIGHT_4( 3, COLOR_MAX, SOURCE_IMAGE, \ - 3, 4, 5, SUBTRACTION, SHIFT ); \ - } \ - \ - check_far_neibours[ 0 ] = check_neibours[ 0 ] + \ - check_neibours[ 1 ] + check_neibours[ 2 ]; \ - check_far_neibours[ 1 ] = check_neibours[ 0 ] + \ - check_neibours[ 3 ] + check_neibours[ 4 ]; \ - check_far_neibours[ 2 ] = check_neibours[ 1 ] + \ - check_neibours[ 3 ] + check_neibours[ 5 ]; \ - check_far_neibours[ 3 ] = check_neibours[ 2 ] + \ - check_neibours[ 4 ] + check_neibours[ 5 ]; \ - \ - check_corner = check_far_neibours[ 0 ] + \ - check_far_neibours[ 1 ] + \ - check_far_neibours[ 2 ] + \ - check_far_neibours[ 3 ]; \ - \ - if( check_neibours[ 0 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 3; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 1 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 5; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 2 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 6; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 3 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 9; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 4 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 10; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_neibours[ 5 ] >= 2 ) \ - { \ - mlib_s32 qq = q ^ 12; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_far_neibours[ 0 ] >= 3 ) \ - { \ - mlib_s32 qq = q ^ 7; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_far_neibours[ 1 ] >= 3 ) \ - { \ - mlib_s32 qq = q ^ 11; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_far_neibours[ 2 ] >= 3 ) \ - { \ - mlib_s32 qq = q ^ 13; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_far_neibours[ 3 ] >= 3 ) \ - { \ - mlib_s32 qq = q ^ 14; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( check_corner >= 4 ) \ - { \ - mlib_s32 qq = q ^ 15; \ - CHECK_QUADRANT_##SOURCE_IMAGE##_4( qq ); \ - } \ - \ - if( q & 1 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 0, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 0, SHIFT ); \ - } \ - \ - if( q & 2 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 1, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 1, SHIFT ); \ - } \ - \ - if( q & 4 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 2, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 2, SHIFT ); \ - } \ - \ - if( q & 8 ) \ - { \ - BINARY_TREE_SEARCH_RIGHT( 3, COLOR_MAX, SHIFT ); \ - } \ - else \ - { \ - BINARY_TREE_SEARCH_LEFT( 3, SHIFT ); \ - } \ - \ - position[ 0 ] &= ~( c[ 0 ] & current_size ); \ - position[ 1 ] &= ~( c[ 1 ] & current_size ); \ - position[ 2 ] &= ~( c[ 2 ] & current_size ); \ - position[ 3 ] &= ~( c[ 3 ] & current_size ); \ - \ - current_size <<= 1; \ - \ - pass++; \ - \ - stack_pointer--; \ - q = stack[ stack_pointer ].q; \ - node = stack[ stack_pointer ].node; \ - } while( continue_up ); \ - \ - dst[ j ] = found_color + s->offset; \ - we_found_it = 1; \ - } \ - \ - pass--; \ - \ - } while( !we_found_it ); \ - \ - channels[ 0 ] += 4; \ - channels[ 1 ] += 4; \ - channels[ 2 ] += 4; \ - channels[ 3 ] += 4; \ - } \ -} - -/***************************************************************/ -#define FIND_NEAREST_U8_3_C( SHIFT, STEP ) \ - mlib_s32 i, k, k_min, min_dist, diff, mask; \ - mlib_s32 offset = mlib_ImageGetLutOffset( s ) - 1; \ - mlib_s32 entries = s -> lutlength; \ - mlib_d64 *double_lut = mlib_ImageGetLutDoubleData( s ); \ - mlib_d64 col0, col1, col2; \ - mlib_d64 dist, len0, len1, len2; \ - \ - for ( i = 0; i < length; i++ ) { \ - col0 = src[ STEP * i + SHIFT ]; \ - col1 = src[ STEP * i + 1 + SHIFT ]; \ - col2 = src[ STEP * i + 2 + SHIFT ]; \ - min_dist = MLIB_S32_MAX; \ - k_min = 1; \ - len0 = double_lut[ 0 ] - col0; \ - len1 = double_lut[ 1 ] - col1; \ - len2 = double_lut[ 2 ] - col2; \ - \ - for ( k = 1; k <= entries; k++ ) { \ - dist = len0 * len0; \ - len0 = double_lut[ 3 * k ] - col0; \ - dist += len1 * len1; \ - len1 = double_lut[ 3 * k + 1 ] - col1; \ - dist += len2 * len2; \ - len2 = double_lut[ 3 * k + 2 ] - col2; \ - diff = ( mlib_s32 )dist - min_dist; \ - mask = diff >> 31; \ - min_dist += diff & mask; \ - k_min += ( k - k_min ) & mask; \ - } \ - \ - dst[ i ] = k_min + offset; \ - } - -/***************************************************************/ -#define FIND_NEAREST_U8_4_C \ - mlib_s32 i, k, k_min, min_dist, diff, mask; \ - mlib_s32 offset = mlib_ImageGetLutOffset( s ) - 1; \ - mlib_s32 entries = s -> lutlength; \ - mlib_d64 *double_lut = mlib_ImageGetLutDoubleData( s ); \ - mlib_d64 col0, col1, col2, col3; \ - mlib_d64 dist, len0, len1, len2, len3; \ - \ - for ( i = 0; i < length; i++ ) { \ - col0 = src[ 4 * i ]; \ - col1 = src[ 4 * i + 1 ]; \ - col2 = src[ 4 * i + 2 ]; \ - col3 = src[ 4 * i + 3 ]; \ - min_dist = MLIB_S32_MAX; \ - k_min = 1; \ - len0 = double_lut[ 0 ] - col0; \ - len1 = double_lut[ 1 ] - col1; \ - len2 = double_lut[ 2 ] - col2; \ - len3 = double_lut[ 3 ] - col3; \ - \ - for ( k = 1; k <= entries; k++ ) { \ - dist = len0 * len0; \ - len0 = double_lut[ 4 * k ] - col0; \ - dist += len1 * len1; \ - len1 = double_lut[ 4 * k + 1 ] - col1; \ - dist += len2 * len2; \ - len2 = double_lut[ 4 * k + 2 ] - col2; \ - dist += len3 * len3; \ - len3 = double_lut[ 4 * k + 3 ] - col3; \ - diff = ( mlib_s32 )dist - min_dist; \ - mask = diff >> 31; \ - min_dist += diff & mask; \ - k_min += ( k - k_min ) & mask; \ - } \ - \ - dst[ i ] = k_min + offset; \ - } - -/***************************************************************/ -#define FSQR_S16_HI(dsrc) \ - vis_fpadd32( vis_fmuld8ulx16( vis_read_hi( dsrc ), vis_read_hi( dsrc ) ), \ - vis_fmuld8sux16( vis_read_hi( dsrc ), vis_read_hi( dsrc ) ) ) - -/***************************************************************/ -#define FSQR_S16_LO(dsrc) \ - vis_fpadd32( vis_fmuld8ulx16( vis_read_lo( dsrc ), vis_read_lo( dsrc) ), \ - vis_fmuld8sux16( vis_read_lo( dsrc ), vis_read_lo( dsrc ) ) ) - -/***************************************************************/ -#define FIND_NEAREST_U8_3 \ -{ \ - mlib_d64 *dpsrc, dsrc, dsrc1, ddist, ddist1, ddist2, ddist3; \ - mlib_d64 dcolor, dind, dres, dres1, dpind[1], dpmin[1]; \ - mlib_d64 done = vis_to_double_dup( 1 ), \ - dmax = vis_to_double_dup( MLIB_S32_MAX ); \ - mlib_f32 *lut = ( mlib_f32 * )mlib_ImageGetLutNormalTable( s ); \ - mlib_f32 fone = vis_to_float( 0x100 ); \ - mlib_s32 i, k, mask; \ - mlib_s32 gsr[1]; \ - mlib_s32 offset = mlib_ImageGetLutOffset( s ) - 1; \ - mlib_s32 entries = s->lutlength; \ - \ - gsr[0] = vis_read_gsr(); \ - for( i = 0; i <= ( length-2 ); i += 2 ) \ - { \ - dpsrc = VIS_ALIGNADDR( src, -1 ); \ - src += 6; \ - dsrc = dpsrc[ 0 ]; \ - dsrc1 = dpsrc[ 1 ]; \ - dsrc1 = vis_faligndata( dsrc, dsrc1 ); \ - dsrc = vis_fmul8x16al( vis_read_hi( dsrc1 ), fone ); \ - VIS_ALIGNADDR( dpsrc, 3 ); \ - dsrc1 = vis_faligndata( dsrc1, dsrc1 ); \ - dsrc1 = vis_fmul8x16al( vis_read_hi( dsrc1 ), fone ); \ - dpind[ 0 ] = dind = done; \ - dpmin[ 0 ] = dmax; \ - dcolor = vis_fmul8x16al( lut[ 0 ], fone ); \ - for( k = 1; k <= entries; k++ ) \ - { \ - ddist1 = vis_fpsub16( dcolor, dsrc ); \ - ddist = FSQR_S16_HI( ddist1 ); \ - ddist1 = FSQR_S16_LO( ddist1 ); \ - dres = vis_fpadd32( ddist, ddist1 ); \ - ddist3 = vis_fpsub16( dcolor, dsrc1 ); \ - ddist2 = FSQR_S16_HI( ddist3 ); \ - ddist3 = FSQR_S16_LO( ddist3 ); \ - dres1 = vis_fpadd32( ddist2, ddist3 ); \ - dcolor = vis_fmul8x16al( lut[ k ], fone ); \ - dres = vis_freg_pair( \ - vis_fpadd32s( vis_read_hi( dres ), vis_read_lo( dres ) ), \ - vis_fpadd32s( vis_read_hi( dres1 ), vis_read_lo( dres1 ) ) ); \ - mask = vis_fcmplt32( dres, dpmin[ 0 ] ); \ - vis_pst_32( dind, ( void * )dpind, mask ); \ - dind = vis_fpadd32( dind, done ); \ - vis_pst_32( dres, ( void * )dpmin, mask ); \ - } \ - dst[ i ] = ( ( mlib_s32 * )dpind )[ 0 ] + offset; \ - dst[ i + 1 ] = ( ( mlib_s32 * )dpind)[ 1 ] + offset; \ - } \ - if( i < length ) \ - { \ - dpsrc = VIS_ALIGNADDR( src, -1 ); \ - dsrc = dpsrc[ 0 ]; \ - dsrc1 = dpsrc[ 1 ]; \ - dsrc1 = vis_faligndata( dsrc, dsrc1 ); \ - dsrc = vis_fmul8x16al( vis_read_hi( dsrc1 ), fone ); \ - dpind[ 0 ] = dind = done; \ - dpmin[ 0 ] = dmax; \ - for( k = 0; k < entries; k++ ) \ - { \ - dcolor = vis_fmul8x16al( lut[ k ], fone ); \ - ddist1 = vis_fpsub16( dcolor, dsrc ); \ - ddist = FSQR_S16_HI( ddist1 ); \ - ddist1 = FSQR_S16_LO( ddist1 ); \ - dres = vis_fpadd32( ddist, ddist1 ); \ - dres = vis_write_lo( dres, \ - vis_fpadd32s( vis_read_hi( dres ), vis_read_lo( dres ) ) ); \ - mask = vis_fcmplt32( dres, dpmin[ 0 ] ); \ - vis_pst_32( dind, ( void * )dpind, mask ); \ - dind = vis_fpadd32( dind, done ); \ - vis_pst_32( dres, ( void * )dpmin, mask ); \ - } \ - dst[ i ] = ( ( mlib_s32 * )dpind)[ 1 ] + offset; \ - } \ - vis_write_gsr(gsr[0]); \ -} - -/***************************************************************/ -#define FIND_NEAREST_U8_3_IN4 \ -{ \ - mlib_d64 *dpsrc, dsrc, dsrc1, ddist, ddist1, ddist2, ddist3; \ - mlib_d64 dcolor, dind, dres, dres1, dpind[1], dpmin[1]; \ - mlib_d64 done = vis_to_double_dup( 1 ), \ - dmax = vis_to_double_dup( MLIB_S32_MAX ); \ - mlib_f32 *lut = ( mlib_f32 * )mlib_ImageGetLutNormalTable( s ); \ - mlib_f32 fone = vis_to_float( 0x100 ); \ - mlib_s32 i, k, mask, gsr[1]; \ - mlib_s32 offset = mlib_ImageGetLutOffset( s ) - 1; \ - mlib_s32 entries = s->lutlength; \ - \ - gsr[0] = vis_read_gsr(); \ - dpsrc = VIS_ALIGNADDR( src, 0 ); \ - for( i = 0; i <= ( length-2 ); i += 2 ) \ - { \ - dsrc = dpsrc[ 0 ]; \ - dsrc1 = dpsrc[ 1 ]; \ - dsrc1 = vis_faligndata( dsrc, dsrc1 ); \ - dpsrc++; \ - dsrc = vis_fmul8x16al( vis_read_hi( dsrc1 ), fone ); \ - dsrc1 = vis_fmul8x16al( vis_read_lo( dsrc1 ), fone ); \ - dpind[ 0 ] = dind = done; \ - dpmin[ 0 ] = dmax; \ - dcolor = vis_fmul8x16al( lut[ 0 ], fone ); \ - for( k = 1; k <= entries; k++ ) \ - { \ - ddist1 = vis_fpsub16( dcolor, dsrc ); \ - ddist = FSQR_S16_HI( ddist1 ); \ - ddist1 = FSQR_S16_LO( ddist1 ); \ - dres = vis_fpadd32( ddist, ddist1 ); \ - ddist3 = vis_fpsub16( dcolor, dsrc1 ); \ - ddist2 = FSQR_S16_HI( ddist3 ); \ - ddist3 = FSQR_S16_LO( ddist3 ); \ - dres1 = vis_fpadd32( ddist2, ddist3 ); \ - dcolor = vis_fmul8x16al( lut[ k ], fone ); \ - dres = vis_freg_pair( \ - vis_fpadd32s( vis_read_hi( dres ), vis_read_lo( dres ) ), \ - vis_fpadd32s( vis_read_hi( dres1 ), vis_read_lo( dres1 ) ) ); \ - mask = vis_fcmplt32( dres, dpmin[ 0 ] ); \ - vis_pst_32( dind, ( void * )dpind, mask ); \ - dind = vis_fpadd32( dind, done ); \ - vis_pst_32( dres, ( void * )dpmin, mask ); \ - } \ - dst[ i ] = ( ( mlib_s32 * )dpind )[ 0 ] + offset; \ - dst[ i + 1 ] = ( ( mlib_s32 * )dpind)[ 1 ] + offset; \ - } \ - if( i < length ) \ - { \ - dsrc = dpsrc[ 0 ]; \ - dsrc1 = dpsrc[ 1 ]; \ - dsrc1 = vis_faligndata( dsrc, dsrc1 ); \ - dsrc = vis_fmul8x16al( vis_read_hi( dsrc1 ), fone ); \ - dpind[ 0 ] = dind = done; \ - dpmin[ 0 ] = dmax; \ - for( k = 0; k < entries; k++ ) \ - { \ - dcolor = vis_fmul8x16al( lut[ k ], fone ); \ - ddist1 = vis_fpsub16( dcolor, dsrc ); \ - ddist = FSQR_S16_HI( ddist1 ); \ - ddist1 = FSQR_S16_LO( ddist1 ); \ - dres = vis_fpadd32( ddist, ddist1 ); \ - dres = vis_write_lo( dres, \ - vis_fpadd32s( vis_read_hi( dres ), vis_read_lo( dres ) ) ); \ - mask = vis_fcmplt32( dres, dpmin[ 0 ] ); \ - vis_pst_32( dind, ( void * )dpind, mask ); \ - dind = vis_fpadd32( dind, done ); \ - vis_pst_32( dres, ( void * )dpmin, mask ); \ - } \ - dst[ i ] = ( ( mlib_s32 * )dpind)[ 1 ] + offset; \ - } \ - vis_write_gsr(gsr[0]); \ -} - -/***************************************************************/ -#define FIND_NEAREST_U8_4 \ -{ \ - mlib_d64 *dpsrc, dsrc, dsrc1, ddist, ddist1, ddist2, ddist3; \ - mlib_d64 dcolor, dind, dres, dres1, dpind[ 1 ], dpmin[ 1 ]; \ - mlib_d64 done = vis_to_double_dup( 1 ), \ - dmax = vis_to_double_dup( MLIB_S32_MAX ); \ - mlib_f32 *lut = ( mlib_f32 * )mlib_ImageGetLutNormalTable( s ); \ - mlib_f32 fone = vis_to_float( 0x100 ); \ - mlib_s32 i, k, mask, gsr[1]; \ - mlib_s32 offset = mlib_ImageGetLutOffset( s ) - 1; \ - mlib_s32 entries = s->lutlength; \ - \ - gsr[0] = vis_read_gsr(); \ - dpsrc = VIS_ALIGNADDR( src, 0 ); \ - for( i = 0; i <= ( length-2 ); i += 2 ) \ - { \ - dsrc = dpsrc[ 0 ]; \ - dsrc1 = dpsrc[ 1 ]; \ - dsrc1 = vis_faligndata( dsrc, dsrc1 ); \ - dpsrc++; \ - dsrc = vis_fmul8x16al( vis_read_hi( dsrc1 ), fone ); \ - dsrc1 = vis_fmul8x16al( vis_read_lo( dsrc1 ), fone ); \ - dpind[ 0 ] = dind = done; \ - dpmin[ 0 ] = dmax; \ - dcolor = vis_fmul8x16al(lut[0], fone); \ - for( k = 1; k <= entries; k++ ) \ - { \ - ddist1 = vis_fpsub16( dcolor, dsrc ); \ - ddist = FSQR_S16_HI( ddist1 ); \ - ddist1 = FSQR_S16_LO( ddist1 ); \ - dres = vis_fpadd32( ddist, ddist1 ); \ - ddist3 = vis_fpsub16( dcolor, dsrc1 ); \ - ddist2 = FSQR_S16_HI( ddist3 ); \ - ddist3 = FSQR_S16_LO( ddist3 ); \ - dres1 = vis_fpadd32( ddist2, ddist3 ); \ - dcolor = vis_fmul8x16al( lut[ k ], fone ); \ - dres = vis_freg_pair( \ - vis_fpadd32s( vis_read_hi( dres ), vis_read_lo( dres ) ), \ - vis_fpadd32s( vis_read_hi( dres1 ), vis_read_lo( dres1 ) ) ); \ - mask = vis_fcmplt32( dres, dpmin[ 0 ] ); \ - vis_pst_32( dind, ( void * )dpind, mask ); \ - dind = vis_fpadd32( dind, done ); \ - vis_pst_32( dres, ( void * )dpmin, mask ); \ - } \ - dst[ i ] = ( ( mlib_s32 * )dpind )[ 0 ] + offset; \ - dst[ i + 1 ] = ( ( mlib_s32 * )dpind )[ 1 ] + offset; \ - } \ - if( i < length ) \ - { \ - dsrc = dpsrc[ 0 ]; \ - dsrc1 = dpsrc[ 1 ]; \ - dsrc1 = vis_faligndata( dsrc, dsrc1 ); \ - dsrc = vis_fmul8x16al( vis_read_hi( dsrc1 ), fone ); \ - dpind[ 0 ] = dind = done; \ - dpmin[ 0 ] = dmax; \ - for( k = 0; k < entries; k++ ) \ - { \ - dcolor = vis_fmul8x16al( lut[ k ], fone ); \ - ddist1 = vis_fpsub16( dcolor, dsrc ); \ - ddist = FSQR_S16_HI( ddist1 ); \ - ddist1 = FSQR_S16_LO( ddist1 ); \ - dres = vis_fpadd32( ddist, ddist1 ); \ - dres = vis_write_lo( dres, \ - vis_fpadd32s( vis_read_hi( dres ), vis_read_lo( dres ) ) ); \ - mask = vis_fcmplt32( dres, dpmin[ 0 ] ); \ - vis_pst_32( dind, ( void * )dpind, mask ); \ - dind = vis_fpadd32( dind, done ); \ - vis_pst_32( dres, ( void * )dpmin, mask ); \ - } \ - dst[ i ] = ( ( mlib_s32 * )dpind )[ 1 ] + offset; \ - } \ - vis_write_gsr(gsr[0]); \ -} - -/***************************************************************/ -#define FIND_NEAREST_S16_3( SHIFT, STEP ) \ - mlib_s32 i, k, k_min, min_dist, diff, mask; \ - mlib_s32 offset = mlib_ImageGetLutOffset( s ) - 1; \ - mlib_s32 entries = s->lutlength; \ - mlib_d64 *double_lut = mlib_ImageGetLutDoubleData( s ); \ - mlib_d64 col0, col1, col2; \ - mlib_d64 dist, len0, len1, len2; \ - \ - for( i = 0; i < length; i++ ) \ - { \ - col0 = src[ STEP * i + SHIFT ]; \ - col1 = src[ STEP * i + 1 + SHIFT ]; \ - col2 = src[ STEP * i + 2 + SHIFT ]; \ - min_dist = MLIB_S32_MAX; \ - k_min = 1; \ - len0 = double_lut[ 0 ] - col0; \ - len1 = double_lut[ 1 ] - col1; \ - len2 = double_lut[ 2 ] - col2; \ - for( k = 1; k <= entries; k++ ) \ - { \ - dist = len0 * len0; \ - len0 = double_lut[ 3 * k ] - col0; \ - dist += len1 * len1; \ - len1 = double_lut[ 3 * k + 1 ] - col1; \ - dist += len2 * len2; \ - len2 = double_lut[ 3 * k + 2 ] - col2; \ - diff = ( mlib_s32 )( dist * 0.125 ) - min_dist; \ - mask = diff >> 31; \ - min_dist += diff & mask; \ - k_min += ( k - k_min ) & mask; \ - } \ - dst[ i ] = k_min + offset; \ - } - -/***************************************************************/ -#define FIND_NEAREST_S16_4 \ - mlib_s32 i, k, k_min, min_dist, diff, mask; \ - mlib_s32 offset = mlib_ImageGetLutOffset( s ) - 1; \ - mlib_s32 entries = s->lutlength; \ - mlib_d64 *double_lut = mlib_ImageGetLutDoubleData( s ); \ - mlib_d64 col0, col1, col2, col3; \ - mlib_d64 dist, len0, len1, len2, len3; \ - \ - for( i = 0; i < length; i++ ) \ - { \ - col0 = src[ 4 * i ]; \ - col1 = src[ 4 * i + 1 ]; \ - col2 = src[ 4 * i + 2 ]; \ - col3 = src[ 4 * i + 3 ]; \ - min_dist = MLIB_S32_MAX; \ - k_min = 1; \ - len0 = double_lut[ 0 ] - col0; \ - len1 = double_lut[ 1 ] - col1; \ - len2 = double_lut[ 2 ] - col2; \ - len3 = double_lut[ 3 ] - col3; \ - for( k = 1; k <= entries; k++ ) \ - { \ - dist = len0 * len0; \ - len0 = double_lut[ 4 * k ] - col0; \ - dist += len1 * len1; \ - len1 = double_lut[ 4 * k + 1 ] - col1; \ - dist += len2 * len2; \ - len2 = double_lut[ 4 * k + 2 ] - col2; \ - dist += len3 * len3; \ - len3 = double_lut[ 4 * k + 3 ] - col3; \ - diff = ( mlib_s32 )( dist * 0.125 ) - min_dist; \ - mask = diff >> 31; \ - min_dist += diff & mask; \ - k_min += ( k - k_min ) & mask; \ - } \ - dst[ i ] = k_min + offset; \ - } - -/***************************************************************/ -mlib_status mlib_ImageColorTrue2Index(mlib_image *dst, - const mlib_image *src, - const void *colormap) -{ - mlib_s32 y, width, height, sstride, dstride, schann; - mlib_colormap *s = (mlib_colormap *)colormap; - mlib_s32 channels; - mlib_type stype, dtype; - - MLIB_IMAGE_CHECK(src); - MLIB_IMAGE_CHECK(dst); - MLIB_IMAGE_SIZE_EQUAL(src, dst); - MLIB_IMAGE_HAVE_CHAN(dst, 1); - - if (!colormap) - return MLIB_NULLPOINTER; - - channels = s->channels; - stype = mlib_ImageGetType(src); - dtype = mlib_ImageGetType(dst); - width = mlib_ImageGetWidth(src); - height = mlib_ImageGetHeight(src); - sstride = mlib_ImageGetStride(src); - dstride = mlib_ImageGetStride(dst); - schann = mlib_ImageGetChannels(src); - - if (stype != s->intype || dtype != s->outtype) - return MLIB_FAILURE; - - if (channels != schann) - return MLIB_FAILURE; - - switch (stype) { - case MLIB_BYTE: - { - mlib_u8 *sdata = mlib_ImageGetData(src); - - switch (dtype) { - case MLIB_BYTE: - { - mlib_u8 *ddata = mlib_ImageGetData(dst); - - switch (channels) { - case 3: - { - MAIN_COLORTRUE2INDEX_LOOP(U8, U8, 3); - return MLIB_SUCCESS; - } - - case 4: - { - MAIN_COLORTRUE2INDEX_LOOP(U8, U8, 4); - return MLIB_SUCCESS; - } - - default: - return MLIB_FAILURE; - } - } - - case MLIB_SHORT: - { - mlib_s16 *ddata = mlib_ImageGetData(dst); - - dstride /= 2; - switch (channels) { - case 3: - { - MAIN_COLORTRUE2INDEX_LOOP(U8, S16, 3); - return MLIB_SUCCESS; - } - - case 4: - { - MAIN_COLORTRUE2INDEX_LOOP(U8, S16, 4); - return MLIB_SUCCESS; - } - - default: - return MLIB_FAILURE; - } - } - default: - /* Unsupported type of destination image */ - return MLIB_FAILURE; - } - } - - case MLIB_SHORT: - { - mlib_s16 *sdata = mlib_ImageGetData(src); - - sstride /= 2; - switch (dtype) { - case MLIB_BYTE: - { - mlib_u8 *ddata = mlib_ImageGetData(dst); - - switch (channels) { - case 3: - { - MAIN_COLORTRUE2INDEX_LOOP(S16, U8, 3); - return MLIB_SUCCESS; - } - - case 4: - { - MAIN_COLORTRUE2INDEX_LOOP(S16, U8, 4); - return MLIB_SUCCESS; - } - - default: - return MLIB_FAILURE; - } - } - - case MLIB_SHORT: - { - mlib_s16 *ddata = mlib_ImageGetData(dst); - - dstride /= 2; - switch (channels) { - case 3: - { - MAIN_COLORTRUE2INDEX_LOOP(S16, S16, 3); - return MLIB_SUCCESS; - } - - case 4: - { - MAIN_COLORTRUE2INDEX_LOOP(S16, S16, 4); - return MLIB_SUCCESS; - } - - default: - return MLIB_FAILURE; - } - } - default: - /* Unsupported type of destination image */ - return MLIB_FAILURE; - } - } - - default: - return MLIB_FAILURE; - } -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_U8_3(struct lut_node_3 *node, - mlib_u32 distance, - mlib_s32 *found_color, - mlib_u32 c0, - mlib_u32 c1, - mlib_u32 c2, - const mlib_u8 **base) -{ - mlib_s32 i; - - for (i = 0; i < 8; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newdistance = FIND_DISTANCE_3(c0, newpalc0, c1, newpalc1, c2, newpalc2, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) - distance = - mlib_search_quadrant_U8_3(node->contents.quadrants[i], distance, - found_color, c0, c1, c2, base); - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_part_to_left_U8_3(struct lut_node_3 *node, - mlib_u32 distance, - mlib_s32 *found_color, - const mlib_u32 *c, - const mlib_u8 **base, - mlib_u32 position, - mlib_s32 pass, - mlib_s32 dir_bit) -{ - mlib_u32 current_size = 1 << pass; - mlib_s32 i; - static mlib_s32 opposite_quadrants[3][4] = { - {0, 2, 4, 6}, - {0, 1, 4, 5}, - {0, 1, 2, 3} - }; - -/* Search only quadrant's half untill it is necessary to check the - whole quadrant */ - - if (distance < (position + current_size - c[dir_bit]) * (position + current_size - c[dir_bit])) { /* Search half of quadrant */ - for (i = 0; i < 4; i++) { - mlib_s32 qq = opposite_quadrants[dir_bit][i]; - - if (node->tag & (1 << qq)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[qq]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newdistance = FIND_DISTANCE_3(c[0], newpalc0, c[1], newpalc1, c[2], newpalc2, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[qq]) - distance = - mlib_search_quadrant_part_to_left_U8_3(node->contents.quadrants[qq], - distance, found_color, c, base, - position, pass - 1, dir_bit); - } - } - else { /* Search whole quadrant */ - - mlib_s32 mask = 1 << dir_bit; - - for (i = 0; i < 8; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newdistance = FIND_DISTANCE_3(c[0], newpalc0, c[1], newpalc1, c[2], newpalc2, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) { - - if (i & mask) - /* This quadrant may require partial checking */ - distance = - mlib_search_quadrant_part_to_left_U8_3(node->contents.quadrants[i], - distance, found_color, c, - base, - position + current_size, - pass - 1, dir_bit); - else - /* Here we should check all */ - distance = - mlib_search_quadrant_U8_3(node->contents.quadrants[i], distance, - found_color, c[0], c[1], c[2], base); - } - } - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_part_to_right_U8_3(struct lut_node_3 *node, - mlib_u32 distance, - mlib_s32 *found_color, - const mlib_u32 *c, - const mlib_u8 **base, - mlib_u32 position, - mlib_s32 pass, - mlib_s32 dir_bit) -{ - mlib_u32 current_size = 1 << pass; - mlib_s32 i; - static mlib_s32 opposite_quadrants[3][4] = { - {1, 3, 5, 7}, - {2, 3, 6, 7}, - {4, 5, 6, 7} - }; - -/* Search only quadrant's half untill it is necessary to check the - whole quadrant */ - - if (distance <= (c[dir_bit] - position - current_size) * (c[dir_bit] - position - current_size)) { /* Search half of quadrant */ - for (i = 0; i < 4; i++) { - mlib_s32 qq = opposite_quadrants[dir_bit][i]; - - if (node->tag & (1 << qq)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[qq]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newdistance = FIND_DISTANCE_3(c[0], newpalc0, c[1], newpalc1, c[2], newpalc2, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[qq]) - distance = - mlib_search_quadrant_part_to_right_U8_3(node->contents.quadrants[qq], - distance, found_color, c, - base, position + current_size, - pass - 1, dir_bit); - } - } - else { /* Search whole quadrant */ - - mlib_s32 mask = 1 << dir_bit; - - for (i = 0; i < 8; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newdistance = FIND_DISTANCE_3(c[0], newpalc0, c[1], newpalc1, c[2], newpalc2, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) { - - if (i & mask) - /* Here we should check all */ - distance = - mlib_search_quadrant_U8_3(node->contents.quadrants[i], distance, - found_color, c[0], c[1], c[2], base); - else - /* This quadrant may require partial checking */ - distance = - mlib_search_quadrant_part_to_right_U8_3(node->contents.quadrants[i], - distance, found_color, c, - base, position, pass - 1, dir_bit); - } - } - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_S16_3(struct lut_node_3 *node, - mlib_u32 distance, - mlib_s32 *found_color, - mlib_u32 c0, - mlib_u32 c1, - mlib_u32 c2, - const mlib_s16 **base) -{ - mlib_s32 i; - - for (i = 0; i < 8; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_3(c0, newpalc0, c1, newpalc1, c2, newpalc2, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) - distance = - mlib_search_quadrant_S16_3(node->contents.quadrants[i], distance, - found_color, c0, c1, c2, base); - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_part_to_left_S16_3(struct lut_node_3 *node, - mlib_u32 distance, - mlib_s32 *found_color, - const mlib_u32 *c, - const mlib_s16 **base, - mlib_u32 position, - mlib_s32 pass, - mlib_s32 dir_bit) -{ - mlib_u32 current_size = 1 << pass; - mlib_s32 i; - static mlib_s32 opposite_quadrants[3][4] = { - {0, 2, 4, 6}, - {0, 1, 4, 5}, - {0, 1, 2, 3} - }; - -/* Search only quadrant's half untill it is necessary to check the - whole quadrant */ - - if (distance < (((position + current_size - c[dir_bit]) * (position + current_size - c[dir_bit])) >> 2)) { /* Search half of quadrant */ - for (i = 0; i < 4; i++) { - mlib_s32 qq = opposite_quadrants[dir_bit][i]; - - if (node->tag & (1 << qq)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[qq]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_3(c[0], newpalc0, c[1], newpalc1, c[2], newpalc2, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[qq]) - distance = - mlib_search_quadrant_part_to_left_S16_3(node->contents.quadrants[qq], - distance, found_color, c, - base, position, pass - 1, dir_bit); - } - } - else { /* Search whole quadrant */ - - mlib_s32 mask = 1 << dir_bit; - - for (i = 0; i < 8; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_3(c[0], newpalc0, c[1], newpalc1, c[2], newpalc2, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) { - - if (i & mask) - /* This quadrant may require partial checking */ - distance = - mlib_search_quadrant_part_to_left_S16_3(node->contents.quadrants[i], - distance, found_color, c, - base, - position + current_size, - pass - 1, dir_bit); - else - /* Here we should check all */ - distance = - mlib_search_quadrant_S16_3(node->contents.quadrants[i], distance, - found_color, c[0], c[1], c[2], base); - } - } - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_part_to_right_S16_3(struct lut_node_3 *node, - mlib_u32 distance, - mlib_s32 *found_color, - const mlib_u32 *c, - const mlib_s16 **base, - mlib_u32 position, - mlib_s32 pass, - mlib_s32 dir_bit) -{ - mlib_u32 current_size = 1 << pass; - mlib_s32 i; - static mlib_s32 opposite_quadrants[3][4] = { - {1, 3, 5, 7}, - {2, 3, 6, 7}, - {4, 5, 6, 7} - }; - -/* Search only quadrant's half untill it is necessary to check the - whole quadrant */ - - if (distance <= (((c[dir_bit] - position - current_size) * (c[dir_bit] - position - current_size)) >> 2)) { /* Search half of quadrant */ - for (i = 0; i < 4; i++) { - mlib_s32 qq = opposite_quadrants[dir_bit][i]; - - if (node->tag & (1 << qq)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[qq]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_3(c[0], newpalc0, c[1], newpalc1, c[2], newpalc2, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[qq]) - distance = - mlib_search_quadrant_part_to_right_S16_3(node->contents.quadrants[qq], - distance, found_color, c, - base, - position + current_size, - pass - 1, dir_bit); - } - } - else { /* Search whole quadrant */ - - mlib_s32 mask = 1 << dir_bit; - - for (i = 0; i < 8; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_3(c[0], newpalc0, c[1], newpalc1, c[2], newpalc2, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) { - - if (i & mask) - /* Here we should check all */ - distance = - mlib_search_quadrant_S16_3(node->contents.quadrants[i], distance, - found_color, c[0], c[1], c[2], base); - else - /* This quadrant may require partial checking */ - distance = - mlib_search_quadrant_part_to_right_S16_3(node->contents. - quadrants[i], distance, - found_color, c, base, - position, pass - 1, dir_bit); - } - } - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_U8_4(struct lut_node_4 *node, - mlib_u32 distance, - mlib_s32 *found_color, - mlib_u32 c0, - mlib_u32 c1, - mlib_u32 c2, - mlib_u32 c3, - const mlib_u8 **base) -{ - mlib_s32 i; - - for (i = 0; i < 16; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newpalc3 = base[3][newindex]; - newdistance = FIND_DISTANCE_4(c0, newpalc0, - c1, newpalc1, c2, newpalc2, c3, newpalc3, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) - distance = - mlib_search_quadrant_U8_4(node->contents.quadrants[i], distance, - found_color, c0, c1, c2, c3, base); - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_part_to_left_U8_4(struct lut_node_4 *node, - mlib_u32 distance, - mlib_s32 *found_color, - const mlib_u32 *c, - const mlib_u8 **base, - mlib_u32 position, - mlib_s32 pass, - mlib_s32 dir_bit) -{ - mlib_u32 current_size = 1 << pass; - mlib_s32 i; - static mlib_s32 opposite_quadrants[4][8] = { - {0, 2, 4, 6, 8, 10, 12, 14}, - {0, 1, 4, 5, 8, 9, 12, 13}, - {0, 1, 2, 3, 8, 9, 10, 11}, - {0, 1, 2, 3, 4, 5, 6, 7} - }; - -/* Search only quadrant's half untill it is necessary to check the - whole quadrant */ - - if (distance < (position + current_size - c[dir_bit]) * (position + current_size - c[dir_bit])) { /* Search half of quadrant */ - for (i = 0; i < 8; i++) { - mlib_s32 qq = opposite_quadrants[dir_bit][i]; - - if (node->tag & (1 << qq)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[qq]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newpalc3 = base[3][newindex]; - newdistance = FIND_DISTANCE_4(c[0], newpalc0, - c[1], newpalc1, c[2], newpalc2, c[3], newpalc3, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[qq]) - distance = - mlib_search_quadrant_part_to_left_U8_4(node->contents.quadrants[qq], - distance, found_color, c, base, - position, pass - 1, dir_bit); - } - } - else { /* Search whole quadrant */ - - mlib_s32 mask = 1 << dir_bit; - - for (i = 0; i < 16; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newpalc3 = base[3][newindex]; - newdistance = FIND_DISTANCE_4(c[0], newpalc0, - c[1], newpalc1, c[2], newpalc2, c[3], newpalc3, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) { - - if (i & mask) - /* This quadrant may require partial checking */ - distance = - mlib_search_quadrant_part_to_left_U8_4(node->contents.quadrants[i], - distance, found_color, c, - base, - position + current_size, - pass - 1, dir_bit); - else - /* Here we should check all */ - distance = - mlib_search_quadrant_U8_4(node->contents.quadrants[i], distance, - found_color, c[0], c[1], c[2], c[3], base); - } - } - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_part_to_right_U8_4(struct lut_node_4 *node, - mlib_u32 distance, - mlib_s32 *found_color, - const mlib_u32 *c, - const mlib_u8 **base, - mlib_u32 position, - mlib_s32 pass, - mlib_s32 dir_bit) -{ - mlib_u32 current_size = 1 << pass; - mlib_s32 i; - static mlib_s32 opposite_quadrants[4][8] = { - {1, 3, 5, 7, 9, 11, 13, 15}, - {2, 3, 6, 7, 10, 11, 14, 15}, - {4, 5, 6, 7, 12, 13, 14, 15}, - {8, 9, 10, 11, 12, 13, 14, 15} - }; - -/* Search only quadrant's half untill it is necessary to check the - whole quadrant */ - - if (distance <= (c[dir_bit] - position - current_size) * (c[dir_bit] - position - current_size)) { /* Search half of quadrant */ - for (i = 0; i < 8; i++) { - mlib_s32 qq = opposite_quadrants[dir_bit][i]; - - if (node->tag & (1 << qq)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[qq]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newpalc3 = base[3][newindex]; - newdistance = FIND_DISTANCE_4(c[0], newpalc0, - c[1], newpalc1, c[2], newpalc2, c[3], newpalc3, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[qq]) - distance = - mlib_search_quadrant_part_to_right_U8_4(node->contents.quadrants[qq], - distance, found_color, c, - base, position + current_size, - pass - 1, dir_bit); - } - } - else { /* Search whole quadrant */ - - mlib_s32 mask = 1 << dir_bit; - - for (i = 0; i < 16; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex]; - newpalc1 = base[1][newindex]; - newpalc2 = base[2][newindex]; - newpalc3 = base[3][newindex]; - newdistance = FIND_DISTANCE_4(c[0], newpalc0, - c[1], newpalc1, c[2], newpalc2, c[3], newpalc3, 0); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) { - - if (i & mask) - /* Here we should check all */ - distance = - mlib_search_quadrant_U8_4(node->contents.quadrants[i], distance, - found_color, c[0], c[1], c[2], c[3], base); - else - /* This quadrant may require partial checking */ - distance = - mlib_search_quadrant_part_to_right_U8_4(node->contents.quadrants[i], - distance, found_color, c, - base, position, pass - 1, dir_bit); - } - } - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_S16_4(struct lut_node_4 *node, - mlib_u32 distance, - mlib_s32 *found_color, - mlib_u32 c0, - mlib_u32 c1, - mlib_u32 c2, - mlib_u32 c3, - const mlib_s16 **base) -{ - mlib_s32 i; - - for (i = 0; i < 16; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newpalc3 = base[3][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_4(c0, newpalc0, - c1, newpalc1, c2, newpalc2, c3, newpalc3, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) - distance = - mlib_search_quadrant_S16_4(node->contents.quadrants[i], distance, - found_color, c0, c1, c2, c3, base); - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_part_to_left_S16_4(struct lut_node_4 *node, - mlib_u32 distance, - mlib_s32 *found_color, - const mlib_u32 *c, - const mlib_s16 **base, - mlib_u32 position, - mlib_s32 pass, - mlib_s32 dir_bit) -{ - mlib_u32 current_size = 1 << pass; - mlib_s32 i; - static mlib_s32 opposite_quadrants[4][8] = { - {0, 2, 4, 6, 8, 10, 12, 14}, - {0, 1, 4, 5, 8, 9, 12, 13}, - {0, 1, 2, 3, 8, 9, 10, 11}, - {0, 1, 2, 3, 4, 5, 6, 7} - }; - -/* Search only quadrant's half untill it is necessary to check the - whole quadrant */ - - if (distance < (((position + current_size - c[dir_bit]) * (position + current_size - c[dir_bit])) >> 2)) { /* Search half of quadrant */ - for (i = 0; i < 8; i++) { - mlib_s32 qq = opposite_quadrants[dir_bit][i]; - - if (node->tag & (1 << qq)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[qq]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newpalc3 = base[3][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_4(c[0], newpalc0, - c[1], newpalc1, c[2], newpalc2, c[3], newpalc3, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[qq]) - distance = - mlib_search_quadrant_part_to_left_S16_4(node->contents.quadrants[qq], - distance, found_color, c, - base, position, pass - 1, dir_bit); - } - } - else { /* Search whole quadrant */ - - mlib_s32 mask = 1 << dir_bit; - - for (i = 0; i < 16; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newpalc3 = base[3][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_4(c[0], newpalc0, - c[1], newpalc1, c[2], newpalc2, c[3], newpalc3, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) { - - if (i & mask) - /* This quadrant may require partial checking */ - distance = - mlib_search_quadrant_part_to_left_S16_4(node->contents.quadrants[i], - distance, found_color, c, - base, - position + current_size, - pass - 1, dir_bit); - else - /* Here we should check all */ - distance = - mlib_search_quadrant_S16_4(node->contents.quadrants[i], distance, - found_color, c[0], c[1], c[2], c[3], base); - } - } - } - - return distance; -} - -/***************************************************************/ -mlib_u32 mlib_search_quadrant_part_to_right_S16_4(struct lut_node_4 *node, - mlib_u32 distance, - mlib_s32 *found_color, - const mlib_u32 *c, - const mlib_s16 **base, - mlib_u32 position, - mlib_s32 pass, - mlib_s32 dir_bit) -{ - mlib_u32 current_size = 1 << pass; - mlib_s32 i; - static mlib_s32 opposite_quadrants[4][8] = { - {1, 3, 5, 7, 9, 11, 13, 15}, - {2, 3, 6, 7, 10, 11, 14, 15}, - {4, 5, 6, 7, 12, 13, 14, 15}, - {8, 9, 10, 11, 12, 13, 14, 15} - }; - -/* Search only quadrant's half untill it is necessary to check the - whole quadrant */ - - if (distance <= (((c[dir_bit] - position - current_size) * (c[dir_bit] - position - current_size)) >> 2)) { /* Search half of quadrant */ - for (i = 0; i < 8; i++) { - mlib_s32 qq = opposite_quadrants[dir_bit][i]; - - if (node->tag & (1 << qq)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[qq]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newpalc3 = base[3][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_4(c[0], newpalc0, - c[1], newpalc1, c[2], newpalc2, c[3], newpalc3, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[qq]) - distance = - mlib_search_quadrant_part_to_right_S16_4(node->contents.quadrants[qq], - distance, found_color, c, - base, - position + current_size, - pass - 1, dir_bit); - } - } - else { /* Search whole quadrant */ - - mlib_s32 mask = 1 << dir_bit; - - for (i = 0; i < 16; i++) { - - if (node->tag & (1 << i)) { - /* Here is alone color cell. Check the distance */ - mlib_s32 newindex = node->contents.index[i]; - mlib_u32 newpalc0, newpalc1, newpalc2, newpalc3; - mlib_u32 newdistance; - - newpalc0 = base[0][newindex] - MLIB_S16_MIN; - newpalc1 = base[1][newindex] - MLIB_S16_MIN; - newpalc2 = base[2][newindex] - MLIB_S16_MIN; - newpalc3 = base[3][newindex] - MLIB_S16_MIN; - newdistance = FIND_DISTANCE_4(c[0], newpalc0, - c[1], newpalc1, c[2], newpalc2, c[3], newpalc3, 2); - - if (distance > newdistance) { - *found_color = newindex; - distance = newdistance; - } - } - else if (node->contents.quadrants[i]) { - - if (i & mask) - /* Here we should check all */ - distance = - mlib_search_quadrant_S16_4(node->contents.quadrants[i], distance, - found_color, c[0], c[1], c[2], c[3], base); - else - /* This quadrant may require partial checking */ - distance = - mlib_search_quadrant_part_to_right_S16_4(node->contents. - quadrants[i], distance, - found_color, c, base, - position, pass - 1, dir_bit); - } - } - } - - return distance; -} - -/***************************************************************/ - -#define TAB_SIZE_mlib_u8 256 -#define TAB_SIZE_mlib_s16 1024 - -#define SRC_mlib_u8(i) src[i] -#define SRC_mlib_s16(i) (((mlib_u16*)src)[i] >> 6) - -/***************************************************************/ - -#define DIMENSIONS_SEARCH_3(STYPE, DTYPE, STEP) \ -{ \ - DTYPE *tab0 = ((mlib_colormap *)state)->table; \ - DTYPE *tab1 = tab0 + TAB_SIZE_##STYPE; \ - DTYPE *tab2 = tab1 + TAB_SIZE_##STYPE; \ - mlib_s32 i; \ - \ - for (i = 0; i < length; i++) { \ - dst[i] = tab0[SRC_##STYPE(0)] + tab1[SRC_##STYPE(1)] + \ - tab2[SRC_##STYPE(2)]; \ - src += STEP; \ - } \ -} - -/***************************************************************/ - -#define DIMENSIONS_SEARCH_4(STYPE, DTYPE) \ -{ \ - DTYPE *tab0 = ((mlib_colormap *)state)->table; \ - DTYPE *tab1 = tab0 + TAB_SIZE_##STYPE; \ - DTYPE *tab2 = tab1 + TAB_SIZE_##STYPE; \ - DTYPE *tab3 = tab2 + TAB_SIZE_##STYPE; \ - mlib_s32 i; \ - \ - for (i = 0; i < length; i++) { \ - dst[i] = tab0[SRC_##STYPE(0)] + tab1[SRC_##STYPE(1)] + \ - tab2[SRC_##STYPE(2)] + tab3[SRC_##STYPE(3)]; \ - src += 4; \ - } \ -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_U8_U8_3(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - - switch (s->method) { -#if LUT_BYTE_COLORS_3CHANNELS <= 256 - case LUT_BINARY_TREE_SEARCH: - { - mlib_s32 bits = s->bits; - BINARY_TREE_SEARCH_3(U8, mlib_u8, 8, (MLIB_U8_MAX + 1), 0, 0, 3, 0); - } - break; - -#endif /* LUT_BYTE_COLORS_3CHANNELS <= 256 */ - case LUT_COLOR_CUBE_SEARCH: - { - COLOR_CUBE_U8_3_SEARCH(mlib_u8, 0, 3); - } - break; - - case LUT_STUPID_SEARCH: - { -#ifdef USE_VIS_CODE - FIND_NEAREST_U8_3; -#else - FIND_NEAREST_U8_3_C(0, 3); -#endif - } - break; - - case LUT_COLOR_DIMENSIONS: - DIMENSIONS_SEARCH_3(mlib_u8, mlib_u8, 3) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_U8_U8_3_in_4(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - - switch (s->method) { -#if LUT_BYTE_COLORS_3CHANNELS <= 256 - case LUT_BINARY_TREE_SEARCH: - { - mlib_s32 bits = s->bits; - BINARY_TREE_SEARCH_3(U8, mlib_u8, 8, (MLIB_U8_MAX + 1), 0, 1, 4, 0); - break; - } - -#endif /* LUT_BYTE_COLORS_3CHANNELS <= 256 */ - case LUT_COLOR_CUBE_SEARCH: - { - COLOR_CUBE_U8_3_SEARCH(mlib_u8, 1, 4); - break; - } - - case LUT_STUPID_SEARCH: - { -#ifdef USE_VIS_CODE - FIND_NEAREST_U8_3_IN4; -#else - FIND_NEAREST_U8_3_C(1, 4); -#endif - break; - } - - case LUT_COLOR_DIMENSIONS: - src++; - DIMENSIONS_SEARCH_3(mlib_u8, mlib_u8, 4) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_U8_U8_4(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - - switch (s->method) { -#if LUT_BYTE_COLORS_4CHANNELS <= 256 - case LUT_BINARY_TREE_SEARCH: - { - mlib_s32 bits = s->bits; - BINARY_TREE_SEARCH_4(U8, mlib_u8, 8, (MLIB_U8_MAX + 1), 0, 0); - break; - } - -#endif /* LUT_BYTE_COLORS_4CHANNELS <= 256 */ - case LUT_COLOR_CUBE_SEARCH: - { - COLOR_CUBE_U8_4_SEARCH(mlib_u8); - break; - } - - case LUT_STUPID_SEARCH: - { -#ifdef USE_VIS_CODE - FIND_NEAREST_U8_4; -#else - FIND_NEAREST_U8_4_C; -#endif - break; - } - - case LUT_COLOR_DIMENSIONS: - DIMENSIONS_SEARCH_4(mlib_u8, mlib_u8) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_U8_S16_3(const mlib_u8 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - mlib_s32 bits = s->bits; - - switch (s->method) { - case LUT_BINARY_TREE_SEARCH: - { - BINARY_TREE_SEARCH_3(U8, mlib_u8, 8, (MLIB_U8_MAX + 1), 0, 0, 3, 0); - break; - } - - case LUT_COLOR_CUBE_SEARCH: - { - switch (s->indexsize) { - case 1: - { - COLOR_CUBE_U8_3_SEARCH(mlib_u8, 0, 3); - break; - } - - case 2: - { - COLOR_CUBE_U8_3_SEARCH(mlib_s16, 0, 3); - break; - } - } - - break; - } - - case LUT_STUPID_SEARCH: - { -#ifdef USE_VIS_CODE - FIND_NEAREST_U8_3; -#else - FIND_NEAREST_U8_3_C(0, 3); -#endif - break; - } - - case LUT_COLOR_DIMENSIONS: - DIMENSIONS_SEARCH_3(mlib_u8, mlib_s16, 3) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_U8_S16_3_in_4(const mlib_u8 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - mlib_s32 bits = s->bits; - - switch (s->method) { - case LUT_BINARY_TREE_SEARCH: - { - BINARY_TREE_SEARCH_3(U8, mlib_u8, 8, (MLIB_U8_MAX + 1), 0, 1, 4, 0); - break; - } - - case LUT_COLOR_CUBE_SEARCH: - { - switch (s->indexsize) { - case 1: - { - COLOR_CUBE_U8_3_SEARCH(mlib_u8, 1, 4); - break; - } - - case 2: - { - COLOR_CUBE_U8_3_SEARCH(mlib_s16, 1, 4); - break; - } - } - - break; - } - - case LUT_STUPID_SEARCH: - { -#ifdef USE_VIS_CODE - FIND_NEAREST_U8_3_IN4; -#else - FIND_NEAREST_U8_3_C(1, 4); -#endif - break; - } - - case LUT_COLOR_DIMENSIONS: - src++; - DIMENSIONS_SEARCH_3(mlib_u8, mlib_s16, 4) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_U8_S16_4(const mlib_u8 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - mlib_s32 bits = s->bits; - - switch (s->method) { - case LUT_BINARY_TREE_SEARCH: - { - BINARY_TREE_SEARCH_4(U8, mlib_u8, 8, (MLIB_U8_MAX + 1), 0, 0); - break; - } - - case LUT_COLOR_CUBE_SEARCH: - { - switch (s->indexsize) { - case 1: - { - COLOR_CUBE_U8_4_SEARCH(mlib_u8); - break; - } - - case 2: - { - COLOR_CUBE_U8_4_SEARCH(mlib_s16); - break; - } - } - - break; - } - - case LUT_STUPID_SEARCH: - { -#ifdef USE_VIS_CODE - FIND_NEAREST_U8_4; -#else - FIND_NEAREST_U8_4_C; -#endif - break; - } - - case LUT_COLOR_DIMENSIONS: - DIMENSIONS_SEARCH_4(mlib_u8, mlib_s16) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_S16_S16_3(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - mlib_s32 bits = s->bits; - - switch (s->method) { - case LUT_BINARY_TREE_SEARCH: - { - BINARY_TREE_SEARCH_3(S16, mlib_s16, 16, ((MLIB_S16_MAX + 1) * 2), - MLIB_S16_MIN, 0, 3, 2); - break; - } - - case LUT_COLOR_CUBE_SEARCH: - { - switch (s->indexsize) { - case 1: - { - COLOR_CUBE_S16_3_SEARCH(mlib_u8, 0, 3); - break; - } - - case 2: - { - COLOR_CUBE_S16_3_SEARCH(mlib_s16, 0, 3); - break; - } - } - - break; - } - - case LUT_STUPID_SEARCH: - { - FIND_NEAREST_S16_3(0, 3); - break; - } - - case LUT_COLOR_DIMENSIONS: - DIMENSIONS_SEARCH_3(mlib_s16, mlib_s16, 3) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_S16_S16_3_in_4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - mlib_s32 bits = s->bits; - - switch (s->method) { - case LUT_BINARY_TREE_SEARCH: - { - BINARY_TREE_SEARCH_3(S16, mlib_s16, 16, ((MLIB_S16_MAX + 1) * 2), - MLIB_S16_MIN, 1, 4, 2); - break; - } - - case LUT_COLOR_CUBE_SEARCH: - { - switch (s->indexsize) { - case 1: - { - COLOR_CUBE_S16_3_SEARCH(mlib_u8, 1, 4); - break; - } - - case 2: - { - COLOR_CUBE_S16_3_SEARCH(mlib_s16, 1, 4); - break; - } - } - - break; - } - - case LUT_STUPID_SEARCH: - { - FIND_NEAREST_S16_3(1, 4); - break; - } - - case LUT_COLOR_DIMENSIONS: - src++; - DIMENSIONS_SEARCH_3(mlib_s16, mlib_s16, 4) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_S16_S16_4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - mlib_s32 bits = s->bits; - - switch (s->method) { - case LUT_BINARY_TREE_SEARCH: - { - BINARY_TREE_SEARCH_4(S16, mlib_s16, 16, ((MLIB_S16_MAX + 1) * 2), - MLIB_S16_MIN, 2); - break; - } - - case LUT_COLOR_CUBE_SEARCH: - { - switch (s->indexsize) { - case 1: - { - COLOR_CUBE_S16_4_SEARCH(mlib_u8); - break; - } - - case 2: - { - COLOR_CUBE_S16_4_SEARCH(mlib_s16); - break; - } - } - - break; - } - - case LUT_STUPID_SEARCH: - { - FIND_NEAREST_S16_4; - break; - } - - case LUT_COLOR_DIMENSIONS: - DIMENSIONS_SEARCH_4(mlib_s16, mlib_s16) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_S16_U8_3(const mlib_s16 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - - switch (s->method) { -#if LUT_SHORT_COLORS_3CHANNELS <= 256 - case LUT_BINARY_TREE_SEARCH: - { - mlib_s32 bits = s->bits; - BINARY_TREE_SEARCH_3(S16, mlib_s16, 16, ((MLIB_S16_MAX + 1) * 2), - MLIB_S16_MIN, 0, 3, 2); - break; - } - -#endif /* LUT_SHORT_COLORS_3CHANNELS <= 256 */ - case LUT_COLOR_CUBE_SEARCH: - { - COLOR_CUBE_S16_3_SEARCH(mlib_u8, 0, 3); - break; - } - - case LUT_STUPID_SEARCH: - { - FIND_NEAREST_S16_3(0, 3); - break; - } - - case LUT_COLOR_DIMENSIONS: - DIMENSIONS_SEARCH_3(mlib_s16, mlib_u8, 3) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_S16_U8_3_in_4(const mlib_s16 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - - switch (s->method) { -#if LUT_SHORT_COLORS_3CHANNELS <= 256 - case LUT_BINARY_TREE_SEARCH: - { - mlib_s32 bits = s->bits; - BINARY_TREE_SEARCH_3(S16, mlib_s16, 16, ((MLIB_S16_MAX + 1) * 2), - MLIB_S16_MIN, 1, 4, 2); - break; - } - -#endif /* LUT_SHORT_COLORS_3CHANNELS <= 256 */ - case LUT_COLOR_CUBE_SEARCH: - { - COLOR_CUBE_S16_3_SEARCH(mlib_u8, 1, 4); - break; - } - - case LUT_STUPID_SEARCH: - { - FIND_NEAREST_S16_3(1, 4); - break; - } - - case LUT_COLOR_DIMENSIONS: - src++; - DIMENSIONS_SEARCH_3(mlib_s16, mlib_u8, 4) - break; - } -} - -/***************************************************************/ -void mlib_ImageColorTrue2IndexLine_S16_U8_4(const mlib_s16 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *state) -{ - mlib_colormap *s = (mlib_colormap *)state; - - switch (s->method) { -#if LUT_SHORT_COLORS_4CHANNELS <= 256 - case LUT_BINARY_TREE_SEARCH: - { - mlib_s32 bits = s->bits; - BINARY_TREE_SEARCH_4(S16, mlib_s16, 16, ((MLIB_S16_MAX + 1) * 2), - MLIB_S16_MIN, 2); - break; - } - -#endif /* LUT_SHORT_COLORS_4CHANNELS <= 256 */ - case LUT_COLOR_CUBE_SEARCH: - { - COLOR_CUBE_S16_4_SEARCH(mlib_u8); - break; - } - - case LUT_STUPID_SEARCH: - { - FIND_NEAREST_S16_4; - break; - } - - case LUT_COLOR_DIMENSIONS: - DIMENSIONS_SEARCH_4(mlib_s16, mlib_u8) - break; - } -} - -/***************************************************************/ - -#ifndef VIS - -void mlib_c_ImageThresh1_U81_1B(void *psrc, - void *pdst, - mlib_s32 src_stride, - mlib_s32 dst_stride, - mlib_s32 width, - mlib_s32 height, - void *thresh, - void *ghigh, - void *glow, - mlib_s32 dbit_off); - -/***************************************************************/ - -void mlib_ImageColorTrue2IndexLine_U8_BIT_1(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 bit_offset, - mlib_s32 length, - const void *state) -{ - mlib_u8 *lut = ((mlib_colormap *)state)->table; - mlib_s32 thresh[1]; - mlib_s32 ghigh[1]; - mlib_s32 glow[1]; - - thresh[0] = lut[2]; - - glow[0] = lut[0] - lut[1]; - ghigh[0] = lut[1] - lut[0]; - - mlib_c_ImageThresh1_U81_1B((void*)src, dst, 0, 0, length, 1, - thresh, ghigh, glow, bit_offset); -} - -#else - -/***************************************************************/ - -void mlib_v_ImageThresh1B_U8_1(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 dbit_off, - const mlib_s32 *th, - mlib_s32 hc, - mlib_s32 lc); - -/***************************************************************/ - -void mlib_ImageColorTrue2IndexLine_U8_BIT_1(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 bit_offset, - mlib_s32 length, - const void *state) -{ - mlib_u8 *lut = ((mlib_colormap *)state)->table; - mlib_s32 thresh[4]; - mlib_s32 ghigh[1]; - mlib_s32 glow[1]; - - thresh[0] = thresh[1] = thresh[2] = thresh[3] = lut[2]; - - glow[0] = (lut[1] < lut[0]) ? 0xFF : 0; - ghigh[0] = (lut[1] < lut[0]) ? 0 : 0xFF; - - mlib_v_ImageThresh1B_U8_1((void*)src, 0, dst, 0, length, 1, - bit_offset, thresh, ghigh[0], glow[0]); -} - -/***************************************************************/ - -#endif diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageColormap.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageColormap.h deleted file mode 100644 index 331851bfc7a..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageColormap.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -#ifndef __MLIB_IMAGECOLORMAP_H -#define __MLIB_IMAGECOLORMAP_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -typedef struct { - void **lut; - mlib_s32 channels; - mlib_type intype; - mlib_s32 offset; - void *table; - mlib_s32 bits; - mlib_s32 method; - mlib_s32 lutlength; - mlib_s32 indexsize; - mlib_type outtype; - void *normal_table; - mlib_d64 *double_lut; -} mlib_colormap; - -/***************************************************************/ -#define LUT_COLOR_CUBE_SEARCH 0 -#define LUT_BINARY_TREE_SEARCH 1 -#define LUT_STUPID_SEARCH 2 -#define LUT_COLOR_DIMENSIONS 3 - -/***************************************************************/ - -/* Bit set in the tag denotes that the corresponding quadrant is a - palette index, not node. If the bit is clear, this means that that - is a pointer to the down level node. If the bit is clear and the - corresponding quadrant is NULL, then there is no way down there and - this quadrant is clear. */ - -struct lut_node_3 { - mlib_u8 tag; - union { - struct lut_node_3 *quadrants[8]; - long index[8]; - } contents; -}; - -struct lut_node_4 { - mlib_u16 tag; - union { - struct lut_node_4 *quadrants[16]; - long index[16]; - } contents; -}; - -/***************************************************************/ - -#define mlib_ImageGetLutData(colormap) \ - ((void **)((( mlib_colormap *)( colormap))->lut)) - -/***************************************************************/ -#define mlib_ImageGetLutNormalTable(colormap) \ - ((void *)((( mlib_colormap *)( colormap))->normal_table)) - -/***************************************************************/ -#define mlib_ImageGetLutInversTable(colormap) \ - ((void *)((( mlib_colormap *)( colormap))->table)) - -/***************************************************************/ -#define mlib_ImageGetLutChannels(colormap) \ - ((mlib_s32)((( mlib_colormap *)( colormap))->channels)) - -/***************************************************************/ -#define mlib_ImageGetLutType(colormap) \ - ((mlib_type)((( mlib_colormap *)( colormap))->intype)) - -/***************************************************************/ -#define mlib_ImageGetIndexSize(colormap) \ - ((mlib_s32)((( mlib_colormap *)( colormap))->indexsize)) - -/***************************************************************/ -#define mlib_ImageGetOutType(colormap) \ - ((mlib_type)((( mlib_colormap *)( colormap))->outtype)) - -/***************************************************************/ -#define mlib_ImageGetLutOffset(colormap) \ - ((mlib_s32)((( mlib_colormap *)( colormap))->offset)) - -/***************************************************************/ -#define mlib_ImageGetBits(colormap) \ - ((mlib_s32)((( mlib_colormap *)( colormap))->bits)) - -/***************************************************************/ -#define mlib_ImageGetMethod(colormap) \ - ((mlib_s32)((( mlib_colormap *)( colormap))->method)) - -/***************************************************************/ -#define mlib_ImageGetLutDoubleData(colormap) \ - ((mlib_d64 *)((( mlib_colormap *)( colormap))->double_lut)) - -/***************************************************************/ -#define FIND_DISTANCE_3( x1, x2, y1, y2, z1, z2, SHIFT ) \ - (( ( ( ( x1 ) - ( x2 ) ) * ( ( x1 ) - ( x2 ) ) ) >> SHIFT ) + \ - ( ( ( ( y1 ) - ( y2 ) ) * ( ( y1 ) - ( y2 ) ) ) >> SHIFT ) + \ - ( ( ( ( z1 ) - ( z2 ) ) * ( ( z1 ) - ( z2 ) ) ) >> SHIFT ) ) - -/***************************************************************/ -#define FIND_DISTANCE_4( x1, x2, y1, y2, z1, z2, w1, w2, SHIFT ) \ - (( ( ( ( x1 ) - ( x2 ) ) * ( ( x1 ) - ( x2 ) ) ) >> SHIFT ) + \ - ( ( ( ( y1 ) - ( y2 ) ) * ( ( y1 ) - ( y2 ) ) ) >> SHIFT ) + \ - ( ( ( ( z1 ) - ( z2 ) ) * ( ( z1 ) - ( z2 ) ) ) >> SHIFT ) + \ - ( ( ( ( w1 ) - ( w2 ) ) * ( ( w1 ) - ( w2 ) ) ) >> SHIFT ) ) - -/***************************************************************/ - -void mlib_ImageColorTrue2IndexLine_U8_BIT_1(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 bit_offset, - mlib_s32 length, - const void *state); - - -void mlib_ImageColorTrue2IndexLine_U8_U8_3(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_U8_U8_3_in_4(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_U8_U8_4(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_U8_S16_3(const mlib_u8 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_U8_S16_3_in_4(const mlib_u8 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_U8_S16_4(const mlib_u8 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_S16_S16_3(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_S16_S16_3_in_4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_S16_S16_4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_S16_U8_3(const mlib_s16 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_S16_U8_3_in_4(const mlib_s16 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *colormap); - - -void mlib_ImageColorTrue2IndexLine_S16_U8_4(const mlib_s16 *src, - mlib_u8 *dst, - mlib_s32 length, - const void *colormap); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* __MLIB_IMAGECOLORMAP_H */ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv.h index a4f37d90386..dc4b6bd4cd7 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv.h +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv.h @@ -41,466 +41,6 @@ return status; \ } #endif /* FREE_AND_RETURN_STATUS */ -void mlib_ImageXor80_aa(mlib_u8 *dl, - mlib_s32 wid, - mlib_s32 hgt, - mlib_s32 str); - -void mlib_ImageXor80(mlib_u8 *dl, - mlib_s32 wid, - mlib_s32 hgt, - mlib_s32 str, - mlib_s32 nchan, - mlib_s32 cmask); - -mlib_status mlib_conv2x2ext_d64(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv2x2ext_f32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv2x2ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv2x2ext_s32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv2x2ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv2x2ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv2x2nw_d64(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv2x2nw_f32(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv2x2nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv2x2nw_s32(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv2x2nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv2x2nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3ext_bit(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3ext_d64(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv3x3ext_f32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv3x3ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3ext_s32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3nw_bit(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3nw_d64(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv3x3nw_f32(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv3x3nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3nw_s32(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv4x4ext_d64(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv4x4ext_f32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv4x4ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv4x4ext_s32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv4x4ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv4x4ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv4x4nw_d64(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv4x4nw_f32(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv4x4nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv4x4nw_s32(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv4x4nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv4x4nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv5x5ext_d64(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv5x5ext_f32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv5x5ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv5x5ext_s32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv5x5ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv5x5ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv5x5nw_d64(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv5x5nw_f32(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask); - -mlib_status mlib_conv5x5nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv5x5nw_s32(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv5x5nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv5x5nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv7x7ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv7x7ext_s32(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv7x7ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv7x7ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv7x7nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv7x7nw_s32(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv7x7nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv7x7nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - mlib_status mlib_convMxNext_s32(mlib_image *dst, const mlib_image *src, const mlib_s32 *kernel, diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv2x2_f.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv2x2_f.c deleted file mode 100644 index f10cbe61eb2..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv2x2_f.c +++ /dev/null @@ -1,1118 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -/* - * FUNCTION - * Internal functions for mlib_ImageConv2x2 on U8/S16/U16 types - * and MLIB_EDGE_DST_NO_WRITE mask. - */ - -#include "mlib_image.h" -#include "mlib_ImageConv.h" -#include "mlib_c_ImageConv.h" - -/***************************************************************/ -#ifdef i386 /* do not copy by mlib_d64 data type for x86 */ - -typedef struct { - mlib_s32 int0, int1; -} two_int; - -#define TYPE_64BIT two_int - -#else /* i386 */ - -#define TYPE_64BIT mlib_d64 - -#endif /* i386 ( do not copy by mlib_d64 data type for x86 ) */ - -/***************************************************************/ -#define LOAD_KERNEL_INTO_DOUBLE() \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - /* keep kernel in regs */ \ - k0 = scalef * kern[0]; k1 = scalef * kern[1]; k2 = scalef * kern[2]; \ - k3 = scalef * kern[3] - -/***************************************************************/ -#define GET_SRC_DST_PARAMETERS(type) \ - hgt = mlib_ImageGetHeight(src); \ - wid = mlib_ImageGetWidth(src); \ - nchannel = mlib_ImageGetChannels(src); \ - sll = mlib_ImageGetStride(src) / sizeof(type); \ - dll = mlib_ImageGetStride(dst) / sizeof(type); \ - adr_src = (type *)mlib_ImageGetData(src); \ - adr_dst = (type *)mlib_ImageGetData(dst) - -/***************************************************************/ -#ifndef MLIB_USE_FTOI_CLAMPING - -#define CLAMP_S32(x) \ - (((x) <= MLIB_S32_MIN) ? MLIB_S32_MIN : \ - (((x) >= MLIB_S32_MAX) ? MLIB_S32_MAX : (mlib_s32)(x))) - -#else - -#define CLAMP_S32(x) ((mlib_s32)(x)) - -#endif /* MLIB_USE_FTOI_CLAMPING */ - -/***************************************************************/ -#if defined(_LITTLE_ENDIAN) && !defined(_NO_LONGLONG) - -/* NB: Explicit cast to DTYPE is necessary to avoid warning from Microsoft VC compiler. - And we need to explicitly define cast behavior if source exceeds destination range. - (it is undefined according to C99 spec). We use mask here because this macro is typically - used to extract bit regions. */ - -#define STORE2(res0, res1) \ - dp[0 ] = (DTYPE) ((res1) & DTYPE_MASK); \ - dp[chan1] = (DTYPE) ((res0) & DTYPE_MASK) - -#else - -#define STORE2(res0, res1) \ - dp[0 ] = (DTYPE) ((res0) & DTYPE_MASK); \ - dp[chan1] = (DTYPE) ((res1) & DTYPE_MASK) - -#endif /* defined(_LITTLE_ENDIAN) && !defined(_NO_LONGLONG) */ - -/***************************************************************/ -#ifdef _NO_LONGLONG - -#define LOAD_BUFF(buff) \ - buff[i ] = sp[0]; \ - buff[i + 1] = sp[chan1] - -#else /* _NO_LONGLONG */ - -#ifdef _LITTLE_ENDIAN - -#define LOAD_BUFF(buff) \ - *(mlib_s64*)(buff + i) = (((mlib_s64)sp[chan1]) << 32) | ((mlib_s64)sp[0] & 0xffffffff) - -#else /* _LITTLE_ENDIAN */ - -#define LOAD_BUFF(buff) \ - *(mlib_s64*)(buff + i) = (((mlib_s64)sp[0]) << 32) | ((mlib_s64)sp[chan1] & 0xffffffff) - -#endif /* _LITTLE_ENDIAN */ - -#endif /* _NO_LONGLONG */ - -/***************************************************************/ -typedef union { - TYPE_64BIT d64; - struct { - mlib_s32 i0, i1; - } i32s; -} d64_2x32; - -/***************************************************************/ -#define D_KER 1 - -#define BUFF_LINE 256 - -/***************************************************************/ -#define XOR_80(x) x ^= 0x80 - -void mlib_ImageXor80_aa(mlib_u8 *dl, - mlib_s32 wid, - mlib_s32 hgt, - mlib_s32 str) -{ - mlib_u8 *dp, *dend; -#ifdef _NO_LONGLONG - mlib_u32 cadd = 0x80808080; -#else /* _NO_LONGLONG */ - mlib_u64 cadd = MLIB_U64_CONST(0x8080808080808080); -#endif /* _NO_LONGLONG */ - mlib_s32 j; - - if (wid == str) { - wid *= hgt; - hgt = 1; - } - - for (j = 0; j < hgt; j++) { - dend = dl + wid; - - for (dp = dl; ((mlib_addr)dp & 7) && (dp < dend); dp++) XOR_80(dp[0]); - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (; dp <= (dend - 8); dp += 8) { -#ifdef _NO_LONGLONG - *((mlib_s32*)dp) ^= cadd; - *((mlib_s32*)dp+1) ^= cadd; -#else /* _NO_LONGLONG */ - *((mlib_u64*)dp) ^= cadd; -#endif /* _NO_LONGLONG */ - } - - for (; (dp < dend); dp++) XOR_80(dp[0]); - - dl += str; - } -} - -/***************************************************************/ -void mlib_ImageXor80(mlib_u8 *dl, - mlib_s32 wid, - mlib_s32 hgt, - mlib_s32 str, - mlib_s32 nchan, - mlib_s32 cmask) -{ - mlib_s32 i, j, c; - - for (j = 0; j < hgt; j++) { - for (c = 0; c < nchan; c++) { - if (cmask & (1 << (nchan - 1 - c))) { - mlib_u8 *dp = dl + c; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid; i++) XOR_80(dp[i*nchan]); - } - } - - dl += str; - } -} - -/***************************************************************/ -#define DTYPE mlib_s16 -#define DTYPE_MASK 0xffff - -mlib_status mlib_c_conv2x2nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff_arr[2*BUFF_LINE]; - mlib_s32 *pbuff = (mlib_s32*)buff_arr, *buffo, *buff0, *buff1, *buff2, *buffT; - DTYPE *adr_src, *sl, *sp, *sl1; - DTYPE *adr_dst, *dl, *dp; - mlib_d64 k0, k1, k2, k3, scalef = 65536.0; - mlib_d64 p00, p01, p02, - p10, p11, p12; - mlib_s32 wid, hgt, sll, dll, wid1; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c; - LOAD_KERNEL_INTO_DOUBLE(); - GET_SRC_DST_PARAMETERS(DTYPE); - - wid1 = (wid + 1) &~ 1; - - if (wid1 > BUFF_LINE) { - pbuff = mlib_malloc(4*sizeof(mlib_s32)*wid1); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffo = pbuff; - buff0 = buffo + wid1; - buff1 = buff0 + wid1; - buff2 = buff1 + wid1; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= D_KER; - hgt -= D_KER; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + D_KER; i++) { - buff0[i - 1] = (mlib_s32)sl[i*chan1]; - buff1[i - 1] = (mlib_s32)sl1[i*chan1]; - } - - sl += (D_KER + 1)*sll; - - for (j = 0; j < hgt; j++) { - sp = sl; - dp = dl; - - buff2[-1] = (mlib_s32)sp[0]; - sp += chan1; - - p02 = buff0[-1]; - p12 = buff1[-1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ - d64_2x32 sd0, sd1, dd; - - p00 = p02; p10 = p12; - - sd0.d64 = *(TYPE_64BIT*)(buff0 + i); - sd1.d64 = *(TYPE_64BIT*)(buff1 + i); - p01 = (mlib_d64)sd0.i32s.i0; - p02 = (mlib_d64)sd0.i32s.i1; - p11 = (mlib_d64)sd1.i32s.i0; - p12 = (mlib_d64)sd1.i32s.i1; - - LOAD_BUFF(buff2); - - dd.i32s.i0 = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3); - dd.i32s.i1 = CLAMP_S32(p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3); - *(TYPE_64BIT*)(buffo + i) = dd.d64; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; - STORE2(o64_1 >> 16, o64_2 >> 16); - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); - STORE2(o64 >> 48, o64 >> 16); - -#endif /* _NO_LONGLONG */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i - 1]; p10 = buff1[i - 1]; - p01 = buff0[i]; p11 = buff1[i]; - - buff2[i] = (mlib_s32)sp[0]; - - buffo[i] = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3); - dp[0] = buffo[i] >> 16; - - sp += chan1; - dp += chan1; - } - - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buffT; - } - } - - if (pbuff != (mlib_s32*)buff_arr) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -mlib_status mlib_c_conv2x2ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff_arr[2*BUFF_LINE]; - mlib_s32 *pbuff = (mlib_s32*)buff_arr, *buffo, *buff0, *buff1, *buff2, *buffT; - DTYPE *adr_src, *sl, *sp, *sl1; - DTYPE *adr_dst, *dl, *dp; - mlib_d64 k0, k1, k2, k3, scalef = 65536.0; - mlib_d64 p00, p01, p02, - p10, p11, p12; - mlib_s32 wid, hgt, sll, dll, wid1; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c, swid; - LOAD_KERNEL_INTO_DOUBLE(); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + D_KER; - - wid1 = (swid + 1) &~ 1; - - if (wid1 > BUFF_LINE) { - pbuff = mlib_malloc(4*sizeof(mlib_s32)*wid1); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffo = pbuff; - buff0 = buffo + wid1; - buff1 = buff0 + wid1; - buff2 = buff1 + wid1; - - swid -= dx_r; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((hgt - dy_b) > 0) sl1 = sl + sll; - else sl1 = sl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i - 1] = (mlib_s32)sl[i*chan1]; - buff1[i - 1] = (mlib_s32)sl1[i*chan1]; - } - - if (dx_r != 0) { - buff0[swid - 1] = buff0[swid - 2]; - buff1[swid - 1] = buff1[swid - 2]; - } - - if ((hgt - dy_b) > 1) sl = sl1 + sll; - else sl = sl1; - - for (j = 0; j < hgt; j++) { - sp = sl; - dp = dl; - - buff2[-1] = (mlib_s32)sp[0]; - sp += chan1; - - p02 = buff0[-1]; - p12 = buff1[-1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ - d64_2x32 sd0, sd1, dd; - - p00 = p02; p10 = p12; - - sd0.d64 = *(TYPE_64BIT*)(buff0 + i); - sd1.d64 = *(TYPE_64BIT*)(buff1 + i); - p01 = (mlib_d64)sd0.i32s.i0; - p02 = (mlib_d64)sd0.i32s.i1; - p11 = (mlib_d64)sd1.i32s.i0; - p12 = (mlib_d64)sd1.i32s.i1; - - LOAD_BUFF(buff2); - - dd.i32s.i0 = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3); - dd.i32s.i1 = CLAMP_S32(p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3); - *(TYPE_64BIT*)(buffo + i) = dd.d64; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; - STORE2(o64_1 >> 16, o64_2 >> 16); - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); - STORE2(o64 >> 48, o64 >> 16); - -#endif /* _NO_LONGLONG */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i - 1]; p10 = buff1[i - 1]; - p01 = buff0[i]; p11 = buff1[i]; - - buff2[i] = (mlib_s32)sp[0]; - - buffo[i] = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3); - dp[0] = buffo[i] >> 16; - - sp += chan1; - dp += chan1; - } - - if (dx_r != 0) buff2[swid - 1] = buff2[swid - 2]; - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buffT; - } - } - - if (pbuff != (mlib_s32*)buff_arr) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef DTYPE -#define DTYPE mlib_u16 - -mlib_status mlib_c_conv2x2nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff_arr[2*BUFF_LINE]; - mlib_s32 *pbuff = (mlib_s32*)buff_arr, *buffo, *buff0, *buff1, *buff2, *buffT; - DTYPE *adr_src, *sl, *sp, *sl1; - DTYPE *adr_dst, *dl, *dp; - mlib_d64 k0, k1, k2, k3, scalef = 65536.0; - mlib_d64 p00, p01, p02, - p10, p11, p12; - mlib_s32 wid, hgt, sll, dll, wid1; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c; - mlib_d64 doff = 0x7FFF8000; - LOAD_KERNEL_INTO_DOUBLE(); - GET_SRC_DST_PARAMETERS(DTYPE); - - wid1 = (wid + 1) &~ 1; - - if (wid1 > BUFF_LINE) { - pbuff = mlib_malloc(4*sizeof(mlib_s32)*wid1); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffo = pbuff; - buff0 = buffo + wid1; - buff1 = buff0 + wid1; - buff2 = buff1 + wid1; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= D_KER; - hgt -= D_KER; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + D_KER; i++) { - buff0[i - 1] = (mlib_s32)sl[i*chan1]; - buff1[i - 1] = (mlib_s32)sl1[i*chan1]; - } - - sl += (D_KER + 1)*sll; - - for (j = 0; j < hgt; j++) { - sp = sl; - dp = dl; - - buff2[-1] = (mlib_s32)sp[0]; - sp += chan1; - - p02 = buff0[-1]; - p12 = buff1[-1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ - d64_2x32 sd0, sd1, dd; - - p00 = p02; p10 = p12; - - sd0.d64 = *(TYPE_64BIT*)(buff0 + i); - sd1.d64 = *(TYPE_64BIT*)(buff1 + i); - p01 = (mlib_d64)sd0.i32s.i0; - p02 = (mlib_d64)sd0.i32s.i1; - p11 = (mlib_d64)sd1.i32s.i0; - p12 = (mlib_d64)sd1.i32s.i1; - - LOAD_BUFF(buff2); - - dd.i32s.i0 = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3 - doff); - dd.i32s.i1 = CLAMP_S32(p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3 - doff); - *(TYPE_64BIT*)(buffo + i) = dd.d64; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; - o64_1 = o64_1 ^ 0x80000000U; - o64_2 = o64_2 ^ 0x80000000U; - STORE2(o64_1 >> 16, o64_2 >> 16); - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); - o64 = o64 ^ MLIB_U64_CONST(0x8000000080000000); - STORE2(o64 >> 48, o64 >> 16); - -#endif /* _NO_LONGLONG */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i - 1]; p10 = buff1[i - 1]; - p01 = buff0[i]; p11 = buff1[i]; - - buff2[i] = (mlib_s32)sp[0]; - - buffo[i] = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3 - doff); - dp[0] = (buffo[i] >> 16) ^ 0x8000; - - sp += chan1; - dp += chan1; - } - - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buffT; - } - } - - if (pbuff != (mlib_s32*)buff_arr) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -mlib_status mlib_c_conv2x2ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff_arr[2*BUFF_LINE]; - mlib_s32 *pbuff = (mlib_s32*)buff_arr, *buffo, *buff0, *buff1, *buff2, *buffT; - DTYPE *adr_src, *sl, *sp, *sl1; - DTYPE *adr_dst, *dl, *dp; - mlib_d64 k0, k1, k2, k3, scalef = 65536.0; - mlib_d64 p00, p01, p02, - p10, p11, p12; - mlib_s32 wid, hgt, sll, dll, wid1; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c, swid; - mlib_d64 doff = 0x7FFF8000; - LOAD_KERNEL_INTO_DOUBLE(); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + D_KER; - - wid1 = (swid + 1) &~ 1; - - if (wid1 > BUFF_LINE) { - pbuff = mlib_malloc(4*sizeof(mlib_s32)*wid1); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffo = pbuff; - buff0 = buffo + wid1; - buff1 = buff0 + wid1; - buff2 = buff1 + wid1; - - swid -= dx_r; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((hgt - dy_b) > 0) sl1 = sl + sll; - else sl1 = sl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i - 1] = (mlib_s32)sl[i*chan1]; - buff1[i - 1] = (mlib_s32)sl1[i*chan1]; - } - - if (dx_r != 0) { - buff0[swid - 1] = buff0[swid - 2]; - buff1[swid - 1] = buff1[swid - 2]; - } - - if ((hgt - dy_b) > 1) sl = sl1 + sll; - else sl = sl1; - - for (j = 0; j < hgt; j++) { - sp = sl; - dp = dl; - - buff2[-1] = (mlib_s32)sp[0]; - sp += chan1; - - p02 = buff0[-1]; - p12 = buff1[-1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ - d64_2x32 sd0, sd1, dd; - - p00 = p02; p10 = p12; - - sd0.d64 = *(TYPE_64BIT*)(buff0 + i); - sd1.d64 = *(TYPE_64BIT*)(buff1 + i); - p01 = (mlib_d64)sd0.i32s.i0; - p02 = (mlib_d64)sd0.i32s.i1; - p11 = (mlib_d64)sd1.i32s.i0; - p12 = (mlib_d64)sd1.i32s.i1; - - LOAD_BUFF(buff2); - - dd.i32s.i0 = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3 - doff); - dd.i32s.i1 = CLAMP_S32(p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3 - doff); - *(TYPE_64BIT*)(buffo + i) = dd.d64; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; - o64_1 = o64_1 ^ 0x80000000U; - o64_2 = o64_2 ^ 0x80000000U; - STORE2(o64_1 >> 16, o64_2 >> 16); - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); - o64 = o64 ^ MLIB_U64_CONST(0x8000000080000000); - STORE2(o64 >> 48, o64 >> 16); - -#endif /* _NO_LONGLONG */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i - 1]; p10 = buff1[i - 1]; - p01 = buff0[i]; p11 = buff1[i]; - - buff2[i] = (mlib_s32)sp[0]; - - buffo[i] = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3 - doff); - dp[0] = (buffo[i] >> 16) ^ 0x8000; - - sp += chan1; - dp += chan1; - } - - if (dx_r != 0) buff2[swid - 1] = buff2[swid - 2]; - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buffT; - } - } - - if (pbuff != (mlib_s32*)buff_arr) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef DTYPE -#define DTYPE mlib_u8 - -mlib_status mlib_c_conv2x2nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff_arr[2*BUFF_LINE]; - mlib_s32 *pbuff = (mlib_s32*)buff_arr, *buffo, *buff0, *buff1, *buff2, *buffT; - DTYPE *adr_src, *sl, *sp, *sl1; - DTYPE *adr_dst, *dl, *dp; - mlib_d64 k0, k1, k2, k3, scalef = (1 << 24); - mlib_d64 p00, p01, p02, - p10, p11, p12; - mlib_s32 wid, hgt, sll, dll, wid1; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c; - LOAD_KERNEL_INTO_DOUBLE(); - GET_SRC_DST_PARAMETERS(DTYPE); - - wid1 = (wid + 1) &~ 1; - - if (wid1 > BUFF_LINE) { - pbuff = mlib_malloc(4*sizeof(mlib_s32)*wid1); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffo = pbuff; - buff0 = buffo + wid1; - buff1 = buff0 + wid1; - buff2 = buff1 + wid1; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= D_KER; - hgt -= D_KER; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + D_KER; i++) { - buff0[i - 1] = (mlib_s32)sl[i*chan1]; - buff1[i - 1] = (mlib_s32)sl1[i*chan1]; - } - - sl += (D_KER + 1)*sll; - - for (j = 0; j < hgt; j++) { - sp = sl; - dp = dl; - - buff2[-1] = (mlib_s32)sp[0]; - sp += chan1; - - p02 = buff0[-1]; - p12 = buff1[-1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ - d64_2x32 sd0, sd1, dd; - - p00 = p02; p10 = p12; - - sd0.d64 = *(TYPE_64BIT*)(buff0 + i); - sd1.d64 = *(TYPE_64BIT*)(buff1 + i); - p01 = (mlib_d64)sd0.i32s.i0; - p02 = (mlib_d64)sd0.i32s.i1; - p11 = (mlib_d64)sd1.i32s.i0; - p12 = (mlib_d64)sd1.i32s.i1; - - LOAD_BUFF(buff2); - - dd.i32s.i0 = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3 - (1u << 31)); - dd.i32s.i1 = CLAMP_S32(p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3 - (1u << 31)); - *(TYPE_64BIT*)(buffo + i) = dd.d64; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; - STORE2(o64_1 >> 24, o64_2 >> 24); - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); - STORE2(o64 >> 56, o64 >> 24); - -#endif /* _NO_LONGLONG */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i - 1]; p10 = buff1[i - 1]; - p01 = buff0[i]; p11 = buff1[i]; - - buff2[i] = (mlib_s32)sp[0]; - - buffo[i] = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3 - (1u << 31)); - dp[0] = (buffo[i] >> 24); - - sp += chan1; - dp += chan1; - } - - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buffT; - } - } - - { - mlib_s32 amask = (1 << nchannel) - 1; - - if ((cmask & amask) != amask) { - mlib_ImageXor80(adr_dst, wid, hgt, dll, nchannel, cmask); - } else { - mlib_ImageXor80_aa(adr_dst, wid*nchannel, hgt, dll); - } - } - - if (pbuff != (mlib_s32*)buff_arr) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -mlib_status mlib_c_conv2x2ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff_arr[4*BUFF_LINE]; - mlib_s32 *pbuff = (mlib_s32*)buff_arr, *buffo, *buff0, *buff1, *buff2, *buffT; - DTYPE *adr_src, *sl, *sp, *sl1; - DTYPE *adr_dst, *dl, *dp; - mlib_d64 k0, k1, k2, k3, scalef = (1 << 24); - mlib_d64 p00, p01, p02, - p10, p11, p12; - mlib_s32 wid, hgt, sll, dll, wid1; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c, swid; - LOAD_KERNEL_INTO_DOUBLE(); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + D_KER; - - wid1 = (swid + 1) &~ 1; - - if (wid1 > BUFF_LINE) { - pbuff = mlib_malloc(4*sizeof(mlib_s32)*wid1); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffo = pbuff; - buff0 = buffo + wid1; - buff1 = buff0 + wid1; - buff2 = buff1 + wid1; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - swid -= dx_r; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((hgt - dy_b) > 0) sl1 = sl + sll; - else sl1 = sl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i - 1] = (mlib_s32)sl[i*chan1]; - buff1[i - 1] = (mlib_s32)sl1[i*chan1]; - } - - if (dx_r != 0) { - buff0[swid - 1] = buff0[swid - 2]; - buff1[swid - 1] = buff1[swid - 2]; - } - - if ((hgt - dy_b) > 1) sl = sl1 + sll; - else sl = sl1; - - for (j = 0; j < hgt; j++) { - sp = sl; - dp = dl; - - buff2[-1] = (mlib_s32)sp[0]; - sp += chan1; - - p02 = buff0[-1]; - p12 = buff1[-1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ - d64_2x32 sd0, sd1, dd; - - p00 = p02; p10 = p12; - - sd0.d64 = *(TYPE_64BIT*)(buff0 + i); - sd1.d64 = *(TYPE_64BIT*)(buff1 + i); - p01 = (mlib_d64)sd0.i32s.i0; - p02 = (mlib_d64)sd0.i32s.i1; - p11 = (mlib_d64)sd1.i32s.i0; - p12 = (mlib_d64)sd1.i32s.i1; - - LOAD_BUFF(buff2); - - dd.i32s.i0 = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3 - (1u << 31)); - dd.i32s.i1 = CLAMP_S32(p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3 - (1u << 31)); - *(TYPE_64BIT*)(buffo + i) = dd.d64; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; - STORE2(o64_1 >> 24, o64_2 >> 24); - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); - STORE2(o64 >> 56, o64 >> 24); - -#endif /* _NO_LONGLONG */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i - 1]; p10 = buff1[i - 1]; - p01 = buff0[i]; p11 = buff1[i]; - - buff2[i] = (mlib_s32)sp[0]; - - buffo[i] = CLAMP_S32(p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3 - (1u << 31)); - dp[0] = (buffo[i] >> 24); - - sp += chan1; - dp += chan1; - } - - if (dx_r != 0) buff2[swid - 1] = buff2[swid - 2]; - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buffT; - } - } - - { - mlib_s32 amask = (1 << nchannel) - 1; - - if ((cmask & amask) != amask) { - mlib_ImageXor80(adr_dst, wid, hgt, dll, nchannel, cmask); - } else { - mlib_ImageXor80_aa(adr_dst, wid*nchannel, hgt, dll); - } - } - - if (pbuff != (mlib_s32*)buff_arr) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16ext.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16ext.c index 11a68ad31f2..7226fd789ec 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16ext.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16ext.c @@ -79,9 +79,6 @@ #endif /* IMG_TYPE == 1 */ -/***************************************************************/ -#define KSIZE1 (KSIZE - 1) - /***************************************************************/ #define PARAM \ mlib_image *dst, \ @@ -162,9 +159,6 @@ #endif /* _LITTLE_ENDIAN */ #endif /* _NO_LONGLONG */ -/***************************************************************/ -#define MLIB_D2_24 16777216.0f - /***************************************************************/ typedef union { mlib_d64 d64; @@ -174,52 +168,6 @@ typedef union { } i32s; } d64_2x32; -/***************************************************************/ -#define BUFF_LINE 256 - -/***************************************************************/ -#define DEF_VARS(type) \ - type *adr_src, *sl, *sp, *sl1; \ - type *adr_dst, *dl, *dp; \ - FTYPE *pbuff = buff; \ - mlib_s32 *buffi, *buffo; \ - mlib_s32 wid, hgt, sll, dll; \ - mlib_s32 nchannel, chan1, chan2; \ - mlib_s32 i, j, c, swid - -/***************************************************************/ -#define LOAD_KERNEL3() \ - FTYPE scalef = DSCALE; \ - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8; \ - FTYPE p00, p01, p02, p03, \ - p10, p11, p12, p13, \ - p20, p21, p22, p23; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - /* keep kernel in regs */ \ - k0 = scalef * kern[0]; k1 = scalef * kern[1]; k2 = scalef * kern[2]; \ - k3 = scalef * kern[3]; k4 = scalef * kern[4]; k5 = scalef * kern[5]; \ - k6 = scalef * kern[6]; k7 = scalef * kern[7]; k8 = scalef * kern[8] - -/***************************************************************/ -#define LOAD_KERNEL(SIZE) \ - FTYPE scalef = DSCALE; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - for (j = 0; j < SIZE; j++) k[j] = scalef * kern[j] - /***************************************************************/ #define GET_SRC_DST_PARAMETERS(type) \ hgt = mlib_ImageGetHeight(src); \ @@ -277,1334 +225,6 @@ typedef union { #endif /* IMG_TYPE == 1 */ #endif /* __sparc */ -/***************************************************************/ -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3) -{ - FTYPE buff[(KSIZE + 2)*BUFF_LINE], *buff0, *buff1, *buff2, *buff3, *buffT; - DEF_VARS(DTYPE); - DTYPE *sl2; -#ifndef __sparc - mlib_s32 d0, d1; -#endif /* __sparc */ - LOAD_KERNEL3(); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buffo = (mlib_s32*)(buff3 + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((hgt - dy_b) > 0) sl2 = sl1 + sll; - else sl2 = sl1; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl2 + sll; - else sl = sl2; - - for (j = 0; j < hgt; j++) { - FTYPE s0, s1; - - p02 = buff0[0]; - p12 = buff1[0]; - p22 = buff2[0]; - - p03 = buff0[1]; - p13 = buff1[1]; - p23 = buff2[1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp = sl; - dp = dl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef __sparc -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - d64_2x32 dd; - - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff3[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff3[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - -#ifndef __sparc - - d0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - d1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - -#else /* __sparc */ - - dd.i32s.i0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - dd.i32s.i1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - *(FTYPE *)(buffo + i) = dd.d64; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64_1), FROM_S32(o64_2)); -#else - STORE2(o64_1 >> 24, o64_2 >> 24); -#endif /* IMG_TYPE != 1 */ - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64 >> 32), FROM_S32(o64)); -#else - STORE2(o64 >> 56, o64 >> 24); -#endif /* IMG_TYPE != 1 */ -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - - buffi[i] = (mlib_s32)sp[0]; - buff3[i + dx_l] = (FTYPE)buffi[i]; - -#ifndef __sparc - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); - - dp[0] = FROM_S32(d0); - -#else /* __sparc */ - - buffo[i] = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); -#if IMG_TYPE != 1 - dp[0] = FROM_S32(buffo[i]); -#else - dp[0] = buffo[i] >> 24; -#endif /* IMG_TYPE != 1 */ -#endif /* __sparc */ - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buffi[i] = (mlib_s32)sp[0]; - buff3[i + dx_l] = (FTYPE)buffi[i]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff3[i] = buff3[dx_l]; - for (i = 0; i < dx_r; i++) buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buffT; - } - } - -#ifdef __sparc -#if IMG_TYPE == 1 - { - mlib_s32 amask = (1 << nchannel) - 1; - - if ((cmask & amask) != amask) { - mlib_ImageXor80(adr_dst, wid, hgt, dll, nchannel, cmask); - } else { - mlib_ImageXor80_aa(adr_dst, wid*nchannel, hgt, dll); - } - } - -#endif /* IMG_TYPE == 1 */ -#endif /* __sparc */ - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(3x3) -{ - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2, *sp_1, *sp_2; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, delta_chan; - mlib_s32 i, j, c; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8; - mlib_s32 p02, p03, - p12, p13, - p22, p23; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - /* keep kernel in regs */ - k0 = kern[0] >> shift1; k1 = kern[1] >> shift1; k2 = kern[2] >> shift1; - k3 = kern[3] >> shift1; k4 = kern[4] >> shift1; k5 = kern[5] >> shift1; - k6 = kern[6] >> shift1; k7 = kern[7] >> shift1; k8 = kern[8] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - chan1 = nchannel; - chan2 = chan1 + chan1; - delta_chan = 0; - - if ((1 > dx_l) && (1 < wid + KSIZE1 - dx_r)) delta_chan = chan1; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sp_1 = sl; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_2 = sl; - - if ((hgt - dy_b) > 0) sl += sll; - - for (j = 0; j < hgt; j++) { - mlib_s32 s0, s1; - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sp_1; - sp_1 = sp_2; - sp_2 = sl; - - sp1 = sp_1; - sp2 = sp_2; - - p02 = sp0[0]; - p12 = sp1[0]; - p22 = sp2[0]; - - p03 = sp0[delta_chan]; - p13 = sp1[delta_chan]; - p23 = sp2[delta_chan]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += (chan1 + delta_chan); - sp1 += (chan1 + delta_chan); - sp2 += (chan1 + delta_chan); - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; p23 = sp2[chan1]; - - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - pix1 = (s1 + p02 * k1 + p03 * k2 + p12 * k4 + - p13 * k5 + p22 * k7 + p23 * k8) >> shift2; - - CLAMP_STORE(dp[0], pix0); - CLAMP_STORE(dp[chan1], pix1); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - dp += chan2; - } - - p02 = p03; p12 = p13; p22 = p23; - - for (; i < wid - dx_r; i++) { - p03 = sp0[0]; p13 = sp1[0]; p23 = sp2[0]; - pix0 = (s0 + p03 * k2 + p13 * k5 + p23 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0); - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - p02 = p03; p12 = p13; p22 = p23; - sp0 += chan1; - sp1 += chan1; - sp2 += chan1; - dp += chan1; - } - - sp0 -= chan1; - sp1 -= chan1; - sp2 -= chan1; - - for (; i < wid; i++) { - p03 = sp0[0]; p13 = sp1[0]; p23 = sp2[0]; - pix0 = (s0 + p03 * k2 + p13 * k5 + p23 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0); - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - p02 = p03; p12 = p13; p22 = p23; - dp += chan1; - } - - if (j < hgt - dy_b - 1) sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7; - FTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14, - p20, p21, p22, p23, - p30, p31, p32, p33; - DEF_VARS(DTYPE); - DTYPE *sl2, *sl3; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buff4 = buff3 + swid; - buffd = buff4 + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((hgt - dy_b) > 0) sl3 = sl2 + sll; - else sl3 = sl2; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - buff3[i] = (FTYPE)sl3[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - buff3[i + dx_l] = (FTYPE)sl3[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl3 + sll; - else sl = sl3; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop on two first lines of kernel - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; - k4 = k[4]; k5 = k[5]; k6 = k[6]; k7 = k[7]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff1[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff4[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff4[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp += chan2; - } - - /* - * Second loop on two last lines of kernel - */ - k0 = k[ 8]; k1 = k[ 9]; k2 = k[10]; k3 = k[11]; - k4 = k[12]; k5 = k[13]; k6 = k[14]; k7 = k[15]; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - - buff4[i + dx_l] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + - p10 * k[4] + p11 * k[5] + p12 * k[6] + p13 * k[7] + - p20 * k[ 8] + p21 * k[ 9] + p22 * k[10] + p23 * k[11] + - p30 * k[12] + p31 * k[13] + p32 * k[14] + p33 * k[15]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buff4[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff4[i] = buff4[dx_l]; - for (i = 0; i < dx_r; i++) buff4[swid + dx_l + i] = buff4[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buff5, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - FTYPE p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15, - p20, p21, p22, p23, p24, - p30, p31, p32, p33, p34, - p40, p41, p42, p43, p44; - DEF_VARS(DTYPE); - DTYPE *sl2, *sl3, *sl4; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buff4 = buff3 + swid; - buff5 = buff4 + swid; - buffd = buff5 + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl3 = sl2 + sll; - else sl3 = sl2; - - if ((hgt - dy_b) > 0) sl4 = sl3 + sll; - else sl4 = sl3; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - buff3[i] = (FTYPE)sl3[0]; - buff4[i] = (FTYPE)sl4[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - buff3[i + dx_l] = (FTYPE)sl3[i*chan1]; - buff4[i + dx_l] = (FTYPE)sl4[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - buff4[swid + dx_l + i] = buff4[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl4 + sll; - else sl = sl4; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - p14 = buff1[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - LOAD_BUFF(buffi); - - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - p05 = buff0[i + 5]; p15 = buff1[i + 5]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - } - - /* - * Second loop - */ - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - - p02 = buff2[i + 2]; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - p05 = buff2[i + 5]; p15 = buff3[i + 5]; - - dd.d64 = *(FTYPE *)(buffi + i); - buff5[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff5[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - } - - /* - * 3 loop - */ - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = buff4[0]; - p03 = buff4[1]; - p04 = buff4[2]; - p05 = buff4[3]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = buff4[i + 4]; p05 = buff4[i + 5]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; p24 = buff2[i + 4]; p34 = buff3[i + 4]; - - p40 = buff4[i]; p41 = buff4[i + 1]; p42 = buff4[i + 2]; - p43 = buff4[i + 3]; p44 = buff4[i + 4]; - - buff5[i + dx_l] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + p04 * k[4] + - p10 * k[5] + p11 * k[6] + p12 * k[7] + p13 * k[8] + p14 * k[9] + - p20 * k[10] + p21 * k[11] + p22 * k[12] + p23 * k[13] + p24 * k[14] + - p30 * k[15] + p31 * k[16] + p32 * k[17] + p33 * k[18] + p34 * k[19] + - p40 * k[20] + p41 * k[21] + p42 * k[22] + p43 * k[23] + p44 * k[24]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buff5[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff5[i] = buff5[dx_l]; - for (i = 0; i < dx_r; i++) buff5[swid + dx_l + i] = buff5[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buff5; - buff5 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(5x5) -{ - mlib_s32 buff[BUFF_LINE]; - mlib_s32 *buffd; - mlib_s32 k[KSIZE*KSIZE]; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - mlib_s32 p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15; - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2, *sp3, *sp4; - DTYPE *sp_1, *sp_2, *sp_3, *sp_4; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 *pbuff = buff; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, chan4; - mlib_s32 delta_chan1, delta_chan2, delta_chan3; - mlib_s32 i, j, c; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - for (j = 0; j < KSIZE*KSIZE; j++) k[j] = kern[j] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc(sizeof(mlib_s32)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffd = pbuff; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - if ((1 > dx_l) && (1 < wid + KSIZE1 - dx_r)) delta_chan1 = chan1; - else delta_chan1 = 0; - - if ((2 > dx_l) && (2 < wid + KSIZE1 - dx_r)) delta_chan2 = delta_chan1 + chan1; - else delta_chan2 = delta_chan1; - - if ((3 > dx_l) && (3 < wid + KSIZE1 - dx_r)) delta_chan3 = delta_chan2 + chan1; - else delta_chan3 = delta_chan2; - - chan4 = chan1 + delta_chan3; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sp_1 = sl; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_2 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_3 = sl; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_4 = sl; - - if ((hgt - dy_b) > 0) sl += sll; - - for (j = 0; j < hgt; j++) { - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sp_1; - sp_1 = sp_2; - sp_2 = sp_3; - sp_3 = sp_4; - sp_4 = sl; - - sp1 = sp_1; - sp2 = sp_2; - sp3 = sp_3; - sp4 = sp_4; - - /* - * First loop - */ - - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[delta_chan1]; p13 = sp1[delta_chan1]; - p04 = sp0[delta_chan2]; p14 = sp1[delta_chan2]; - p05 = sp0[delta_chan3]; p15 = sp1[delta_chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - p11 = p12; p12 = p13; p13 = p14; p14 = p15; - - for (; i < wid - dx_r; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - - sp0 += chan1; - sp1 += chan1; - } - - sp0 -= chan1; - sp1 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * Second loop - */ - - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = sp2[0]; p12 = sp3[0]; - p03 = sp2[delta_chan1]; p13 = sp3[delta_chan1]; - p04 = sp2[delta_chan2]; p14 = sp3[delta_chan2]; - p05 = sp2[delta_chan3]; p15 = sp3[delta_chan3]; - - sp2 += chan4; - sp3 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp2[0]; p14 = sp3[0]; - p05 = sp2[chan1]; p15 = sp3[chan1]; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp2 += chan2; - sp3 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - p11 = p12; p12 = p13; p13 = p14; p14 = p15; - - for (; i < wid - dx_r; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp2[0]; p14 = sp3[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - - sp2 += chan1; - sp3 += chan1; - } - - sp2 -= chan1; - sp3 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp2[0]; p14 = sp3[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * 3 loop - */ - - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = sp4[0]; - p03 = sp4[delta_chan1]; - p04 = sp4[delta_chan2]; - p05 = sp4[delta_chan3]; - - sp4 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp4[0]; p05 = sp4[chan1]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - pix1 = (buffd[i + 1] + p01 * k0 + p02 * k1 + p03 * k2 + - p04 * k3 + p05 * k4) >> shift2; - - CLAMP_STORE(dp[0], pix0); - CLAMP_STORE(dp[chan1], pix1); - - dp += chan2; - sp4 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - - for (; i < wid - dx_r; i++) { - p00 = p01; p01 = p02; p02 = p03; p03 = p04; - - p04 = sp4[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0); - - dp += chan1; - sp4 += chan1; - } - - sp4 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p01 = p02; p02 = p03; p03 = p04; - - p04 = sp4[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0); - - dp += chan1; - } - - /* next line */ - - if (j < hgt - dy_b - 1) sl += sll; - dl += dll; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#if IMG_TYPE == 1 - -#undef KSIZE -#define KSIZE 7 - -mlib_status CONV_FUNC(7x7) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE], *buffs[2*(KSIZE + 1)], *buffd; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 l, m, buff_ind; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6; - FTYPE p0, p1, p2, p3, p4, p5, p6, p7; - DTYPE *sl2, *sl3, *sl4, *sl5, *sl6; - DEF_VARS(DTYPE); - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - for (l = 0; l < KSIZE + 1; l++) buffs[l] = pbuff + l*swid; - for (l = 0; l < KSIZE + 1; l++) buffs[l + (KSIZE + 1)] = buffs[l]; - buffd = buffs[KSIZE] + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl3 = sl2 + sll; - else sl3 = sl2; - - if ((4 > dy_t) && (4 < hgt + KSIZE1 - dy_b)) sl4 = sl3 + sll; - else sl4 = sl3; - - if ((5 > dy_t) && (5 < hgt + KSIZE1 - dy_b)) sl5 = sl4 + sll; - else sl5 = sl4; - - if ((hgt - dy_b) > 0) sl6 = sl5 + sll; - else sl6 = sl5; - - for (i = 0; i < dx_l; i++) { - buffs[0][i] = (FTYPE)sl[0]; - buffs[1][i] = (FTYPE)sl1[0]; - buffs[2][i] = (FTYPE)sl2[0]; - buffs[3][i] = (FTYPE)sl3[0]; - buffs[4][i] = (FTYPE)sl4[0]; - buffs[5][i] = (FTYPE)sl5[0]; - buffs[6][i] = (FTYPE)sl6[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buffs[0][i + dx_l] = (FTYPE)sl[i*chan1]; - buffs[1][i + dx_l] = (FTYPE)sl1[i*chan1]; - buffs[2][i + dx_l] = (FTYPE)sl2[i*chan1]; - buffs[3][i + dx_l] = (FTYPE)sl3[i*chan1]; - buffs[4][i + dx_l] = (FTYPE)sl4[i*chan1]; - buffs[5][i + dx_l] = (FTYPE)sl5[i*chan1]; - buffs[6][i + dx_l] = (FTYPE)sl6[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buffs[0][swid + dx_l + i] = buffs[0][swid + dx_l - 1]; - buffs[1][swid + dx_l + i] = buffs[1][swid + dx_l - 1]; - buffs[2][swid + dx_l + i] = buffs[2][swid + dx_l - 1]; - buffs[3][swid + dx_l + i] = buffs[3][swid + dx_l - 1]; - buffs[4][swid + dx_l + i] = buffs[4][swid + dx_l - 1]; - buffs[5][swid + dx_l + i] = buffs[5][swid + dx_l - 1]; - buffs[6][swid + dx_l + i] = buffs[6][swid + dx_l - 1]; - } - - buff_ind = 0; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid; i++) buffd[i] = 0.0; - - if ((hgt - dy_b) > 1) sl = sl6 + sll; - else sl = sl6; - - for (j = 0; j < hgt; j++) { - FTYPE **buffc = buffs + buff_ind; - FTYPE *buffn = buffc[KSIZE]; - FTYPE *pk = k; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l]; - d64_2x32 dd; - - sp = sl; - dp = dl; - - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = *pk++; k1 = *pk++; k2 = *pk++; k3 = *pk++; - k4 = *pk++; k5 = *pk++; k6 = *pk++; - - if (l < (KSIZE - 1)) { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - buffd[i ] += p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6; - buffd[i + 1] += p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6; - } - - } else { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buffn[i + dx_l ] = (FTYPE)dd.i32s.i0; - buffn[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - d0 = D2I(p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6 + buffd[i ]); - d1 = D2I(p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - buffd[i ] = 0.0; - buffd[i + 1] = 0.0; - - sp += chan2; - dp += chan2; - } - } - } - - /* last pixels */ - for (; i < wid; i++) { - FTYPE *pk = k, s = 0; - mlib_s32 d0; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l] + i; - - for (m = 0; m < KSIZE; m++) s += buff[m] * (*pk++); - } - - d0 = D2I(s); - dp[0] = FROM_S32(d0); - - buffn[i + dx_l] = (FTYPE)sp[0]; - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buffn[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buffn[i] = buffn[dx_l]; - for (i = 0; i < dx_r; i++) buffn[swid + dx_l + i] = buffn[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= KSIZE + 1) buff_ind = 0; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* IMG_TYPE == 1 */ - /***************************************************************/ #define MAX_KER 7 #define MAX_N 15 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c index 0be65cda597..4d0ba0ce493 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_16nw.c @@ -143,9 +143,6 @@ typedef union { } f32s; } d64_2x32; -/***************************************************************/ -#define BUFF_LINE 256 - /***************************************************************/ #define DEF_VARS(type) \ type *adr_src, *sl, *sp = NULL; \ @@ -155,39 +152,6 @@ typedef union { mlib_s32 nchannel, chan1; \ mlib_s32 i, j, c -/***************************************************************/ -#define LOAD_KERNEL3() \ - FTYPE scalef = DSCALE; \ - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8; \ - FTYPE p00, p01, p02, p03, \ - p10, p11, p12, p13, \ - p20, p21, p22, p23; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - /* keep kernel in regs */ \ - k0 = scalef * kern[0]; k1 = scalef * kern[1]; k2 = scalef * kern[2]; \ - k3 = scalef * kern[3]; k4 = scalef * kern[4]; k5 = scalef * kern[5]; \ - k6 = scalef * kern[6]; k7 = scalef * kern[7]; k8 = scalef * kern[8] - -/***************************************************************/ -#define LOAD_KERNEL(SIZE) \ - FTYPE scalef = DSCALE; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - for (j = 0; j < SIZE; j++) k[j] = scalef * kern[j] - /***************************************************************/ #define GET_SRC_DST_PARAMETERS(type) \ hgt = mlib_ImageGetHeight(src); \ @@ -245,1162 +209,6 @@ typedef union { #endif /* IMG_TYPE == 1 */ #endif /* __sparc */ -/***************************************************************/ -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 2)*BUFF_LINE], *buff0, *buff1, *buff2, *buff3, *buffT; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2; -#ifndef __sparc - mlib_s32 d0, d1; -#endif /* __sparc */ - LOAD_KERNEL3(); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buffo = (mlib_s32*)(buff3 + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - FTYPE s0, s1; - - p02 = buff0[0]; - p12 = buff1[0]; - p22 = buff2[0]; - - p03 = buff0[1]; - p13 = buff1[1]; - p23 = buff2[1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp = sl; - dp = dl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef __sparc -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - d64_2x32 dd; - - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff3[i ] = (FTYPE)dd.i32s.i0; - buff3[i + 1] = (FTYPE)dd.i32s.i1; - -#ifndef __sparc - d0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - d1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - -#else /* __sparc */ - - dd.i32s.i0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - dd.i32s.i1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - *(FTYPE *)(buffo + i) = dd.d64; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64_1), FROM_S32(o64_2)); -#else - STORE2(o64_1 >> 24, o64_2 >> 24); -#endif /* IMG_TYPE != 1 */ - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64 >> 32), FROM_S32(o64)); -#else - STORE2(o64 >> 56, o64 >> 24); -#endif /* IMG_TYPE != 1 */ -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - - buffi[i] = (mlib_s32)sp[0]; - buff3[i] = (FTYPE)buffi[i]; - -#ifndef __sparc - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); - - dp[0] = FROM_S32(d0); - -#else /* __sparc */ - - buffo[i] = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); -#if IMG_TYPE != 1 - dp[0] = FROM_S32(buffo[i]); -#else - dp[0] = buffo[i] >> 24; -#endif /* IMG_TYPE != 1 */ -#endif /* __sparc */ - - sp += chan1; - dp += chan1; - } - - buffi[wid] = (mlib_s32)sp[0]; - buff3[wid] = (FTYPE)buffi[wid]; - buffi[wid + 1] = (mlib_s32)sp[chan1]; - buff3[wid + 1] = (FTYPE)buffi[wid + 1]; - - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buffT; - } - } - -#ifdef __sparc -#if IMG_TYPE == 1 - { - mlib_s32 amask = (1 << nchannel) - 1; - - if ((cmask & amask) != amask) { - mlib_ImageXor80(adr_dst, wid, hgt, dll, nchannel, cmask); - } else { - mlib_ImageXor80_aa(adr_dst, wid*nchannel, hgt, dll); - } - } - -#endif /* IMG_TYPE == 1 */ -#endif /* __sparc */ - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8; - mlib_s32 p02, p03, - p12, p13, - p22, p23; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - /* keep kernel in regs */ - k0 = kern[0] >> shift1; k1 = kern[1] >> shift1; k2 = kern[2] >> shift1; - k3 = kern[3] >> shift1; k4 = kern[4] >> shift1; k5 = kern[5] >> shift1; - k6 = kern[6] >> shift1; k7 = kern[7] >> shift1; k8 = kern[8] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - mlib_s32 s0, s1; - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sl; - sp1 = sp0 + sll; - sp2 = sp1 + sll; - - p02 = sp0[0]; - p12 = sp1[0]; - p22 = sp2[0]; - - p03 = sp0[chan1]; - p13 = sp1[chan1]; - p23 = sp2[chan1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; p23 = sp2[chan1]; - - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - pix1 = (s1 + p02 * k1 + p03 * k2 + p12 * k4 + - p13 * k5 + p22 * k7 + p23 * k8) >> shift2; - - CLAMP_STORE(dp[0], pix0); - CLAMP_STORE(dp[chan1], pix1); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - dp += chan2; - } - - if (wid & 1) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0); - } - - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7; - FTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14, - p20, p21, p22, p23, - p30, p31, p32, p33; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2, *sl3; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buff4 = buff3 + wid; - buffd = buff4 + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - buff3[i] = (FTYPE)sl3[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop on two first lines of kernel - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; - k4 = k[4]; k5 = k[5]; k6 = k[6]; k7 = k[7]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff1[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff4[i ] = (FTYPE)dd.i32s.i0; - buff4[i + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp += chan2; - dp += chan2; - } - - /* - * Second loop on two last lines of kernel - */ - k0 = k[ 8]; k1 = k[ 9]; k2 = k[10]; k3 = k[11]; - k4 = k[12]; k5 = k[13]; k6 = k[14]; k7 = k[15]; - - sp = sl; - dp = dl; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - sp += chan2; - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - - buff4[i] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + - p10 * k[4] + p11 * k[5] + p12 * k[6] + p13 * k[7] + - p20 * k[ 8] + p21 * k[ 9] + p22 * k[10] + p23 * k[11] + - p30 * k[12] + p31 * k[13] + p32 * k[14] + p33 * k[15]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - buff4[wid ] = (FTYPE)sp[0]; - buff4[wid + 1] = (FTYPE)sp[chan1]; - buff4[wid + 2] = (FTYPE)sp[chan2]; - - /* next line */ - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buff5, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - FTYPE p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15, - p20, p21, p22, p23, p24, - p30, p31, p32, p33, p34, - p40, p41, p42, p43, p44; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2, *sl3, *sl4; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buff4 = buff3 + wid; - buff5 = buff4 + wid; - buffd = buff5 + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; - sl4 = sl3 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - buff3[i] = (FTYPE)sl3[i*chan1]; - buff4[i] = (FTYPE)sl4[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - p14 = buff1[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - LOAD_BUFF(buffi); - - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - p05 = buff0[i + 5]; p15 = buff1[i + 5]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - dp += chan2; - } - - /* - * Second loop - */ - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - sp = sl; - dp = dl; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - p14 = buff3[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - - p02 = buff2[i + 2]; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - p05 = buff2[i + 5]; p15 = buff3[i + 5]; - - dd.d64 = *(FTYPE *)(buffi + i); - buff5[i ] = (FTYPE)dd.i32s.i0; - buff5[i + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - dp += chan2; - } - - /* - * 3 loop - */ - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - sp = sl; - dp = dl; - - p02 = buff4[0]; - p03 = buff4[1]; - p04 = buff4[2]; - p05 = buff4[3]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = buff4[i + 4]; p05 = buff4[i + 5]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - sp += chan2; - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; p24 = buff2[i + 4]; p34 = buff3[i + 4]; - - p40 = buff4[i]; p41 = buff4[i + 1]; p42 = buff4[i + 2]; - p43 = buff4[i + 3]; p44 = buff4[i + 4]; - - buff5[i] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + p04 * k[4] + - p10 * k[5] + p11 * k[6] + p12 * k[7] + p13 * k[8] + p14 * k[9] + - p20 * k[10] + p21 * k[11] + p22 * k[12] + p23 * k[13] + p24 * k[14] + - p30 * k[15] + p31 * k[16] + p32 * k[17] + p33 * k[18] + p34 * k[19] + - p40 * k[20] + p41 * k[21] + p42 * k[22] + p43 * k[23] + p44 * k[24]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - buff5[wid ] = (FTYPE)sp[0]; - buff5[wid + 1] = (FTYPE)sp[chan1]; - buff5[wid + 2] = (FTYPE)sp[chan2]; - buff5[wid + 3] = (FTYPE)sp[chan2 + chan1]; - - /* next line */ - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buff5; - buff5 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_s32 buff[BUFF_LINE]; - mlib_s32 *buffd; - mlib_s32 k[KSIZE*KSIZE]; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - mlib_s32 p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15; - DTYPE *adr_src, *sl, *sp0, *sp1; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 *pbuff = buff; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, chan3, chan4; - mlib_s32 i, j, c; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - for (j = 0; j < KSIZE*KSIZE; j++) k[j] = kern[j] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc(sizeof(mlib_s32)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffd = pbuff; - - chan1 = nchannel; - chan2 = chan1 + chan1; - chan3 = chan2 + chan1; - chan4 = chan3 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - mlib_s32 pix0, pix1; - /* - * First loop - */ - sp0 = sl; - sp1 = sp0 + sll; - dp = dl; - - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * Second loop - */ - sp0 = sl + 2*sll; - sp1 = sp0 + sll; - dp = dl; - - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * 3 loop - */ - dp = dl; - sp0 = sl + 4*sll; - - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = sp0[0]; - p03 = sp0[chan1]; - p04 = sp0[chan2]; - p05 = sp0[chan3]; - - sp0 += chan2 + chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; p05 = sp0[chan1]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - pix1 = (buffd[i + 1] + p01 * k0 + p02 * k1 + p03 * k2 + - p04 * k3 + p05 * k4) >> shift2; - - CLAMP_STORE(dp[0], pix0); - CLAMP_STORE(dp[chan1], pix1); - - dp += chan2; - sp0 += chan2; - } - - if (wid & 1) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0); - } - - /* next line */ - sl += sll; - dl += dll; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#if IMG_TYPE == 1 - -#undef KSIZE -#define KSIZE 7 - -mlib_status CONV_FUNC(7x7)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE], *buffs[2*(KSIZE + 1)], *buffd; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 l, m, buff_ind; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6; - FTYPE p0, p1, p2, p3, p4, p5, p6, p7; - DTYPE *sl2, *sl3, *sl4, *sl5, *sl6; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - for (l = 0; l < KSIZE + 1; l++) buffs[l] = pbuff + l*wid; - for (l = 0; l < KSIZE + 1; l++) buffs[l + (KSIZE + 1)] = buffs[l]; - buffd = buffs[KSIZE] + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; - sl4 = sl3 + sll; - sl5 = sl4 + sll; - sl6 = sl5 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buffs[0][i] = (FTYPE)sl[i*chan1]; - buffs[1][i] = (FTYPE)sl1[i*chan1]; - buffs[2][i] = (FTYPE)sl2[i*chan1]; - buffs[3][i] = (FTYPE)sl3[i*chan1]; - buffs[4][i] = (FTYPE)sl4[i*chan1]; - buffs[5][i] = (FTYPE)sl5[i*chan1]; - buffs[6][i] = (FTYPE)sl6[i*chan1]; - } - - buff_ind = 0; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid; i++) buffd[i] = 0.0; - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - FTYPE **buffc = buffs + buff_ind; - FTYPE *buffn = buffc[KSIZE]; - FTYPE *pk = k; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l]; - d64_2x32 dd; - - sp = sl; - dp = dl; - - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = *pk++; k1 = *pk++; k2 = *pk++; k3 = *pk++; - k4 = *pk++; k5 = *pk++; k6 = *pk++; - - if (l < (KSIZE - 1)) { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - buffd[i ] += p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6; - buffd[i + 1] += p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6; - } - - } else { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buffn[i ] = (FTYPE)dd.i32s.i0; - buffn[i + 1] = (FTYPE)dd.i32s.i1; - - d0 = D2I(p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6 + buffd[i ]); - d1 = D2I(p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - buffd[i ] = 0.0; - buffd[i + 1] = 0.0; - - sp += chan2; - dp += chan2; - } - } - } - - /* last pixels */ - for (; i < wid; i++) { - FTYPE *pk = k, s = 0; - mlib_s32 d0; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l] + i; - - for (m = 0; m < KSIZE; m++) s += buff[m] * (*pk++); - } - - d0 = D2I(s); - dp[0] = FROM_S32(d0); - - buffn[i] = (FTYPE)sp[0]; - - sp += chan1; - dp += chan1; - } - - for (l = 0; l < (KSIZE - 1); l++) buffn[wid + l] = sp[l*chan1]; - - /* next line */ - sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= KSIZE + 1) buff_ind = 0; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* IMG_TYPE == 1 */ - /***************************************************************/ #define MAX_KER 7 #define MAX_N 15 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c index b0697c831dc..1b5b120f963 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_32nw.c @@ -35,8 +35,6 @@ #include "mlib_ImageConv.h" /***************************************************************/ -#define BUFF_LINE 256 - #define CACHE_SIZE (64*1024) /***************************************************************/ @@ -82,837 +80,6 @@ mlib_d64 *pbuff = buff; \ mlib_s32 i, j, c -/***************************************************************/ -#define CALC_SCALE() \ - scalef = 1.0; \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon) - -/***************************************************************/ -#undef KSIZE -#define KSIZE 2 - -mlib_status CONV_FUNC(2x2)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff[(KSIZE + 1)*BUFF_LINE]; - mlib_d64 k0, k1, k2, k3; - mlib_d64 p00, p01, p02, p03, - p10, p11, p12, p13; - mlib_d64 d2; - DEF_VARS(mlib_s32); - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 chan3 = chan1 + chan2; - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 1)*sizeof(mlib_d64)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - /* keep kernel in regs */ - CALC_SCALE(); - k0 = scalef * kern[0]; k1 = scalef * kern[1]; - k2 = scalef * kern[2]; k3 = scalef * kern[3]; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (mlib_d64)sl[i*chan1]; - buff1[i] = (mlib_d64)sl1[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - p03 = buff0[0]; - p13 = buff1[0]; - - sp = sl; - dp = dl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 3); i += 3) { - - p00 = p03; p10 = p13; - - p01 = buff0[i + 1]; p11 = buff1[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - - buff2[i ] = (mlib_d64)sp[0]; - buff2[i + 1] = (mlib_d64)sp[chan1]; - buff2[i + 2] = (mlib_d64)sp[chan2]; - - d0 = p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3; - d1 = p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3; - d2 = p02 * k0 + p03 * k1 + p12 * k2 + p13 * k3; - - CLAMP_S32(dp[0 ], d0); - CLAMP_S32(dp[chan1], d1); - CLAMP_S32(dp[chan2], d2); - - sp += chan3; - dp += chan3; - } - - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; - - buff2[i] = (mlib_d64)sp[0]; - - d0 = p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3; - CLAMP_S32(dp[0], d0); - - sp += chan1; - dp += chan1; - } - - buff2[wid] = (mlib_d64)sp[0]; - - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff[(KSIZE + 1)*BUFF_LINE], *buff3; - mlib_d64 k0, k1, k2, k3, k4, k5, k6, k7, k8; - mlib_d64 p00, p01, p02, p03, - p10, p11, p12, p13, - p20, p21, p22, p23; - mlib_s32 *sl2; - DEF_VARS(mlib_s32); - mlib_s32 chan2 = chan1 + chan1; - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 1)*sizeof(mlib_d64)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - CALC_SCALE(); - k0 = scalef * kern[0]; k1 = scalef * kern[1]; k2 = scalef * kern[2]; - k3 = scalef * kern[3]; k4 = scalef * kern[4]; k5 = scalef * kern[5]; - k6 = scalef * kern[6]; k7 = scalef * kern[7]; k8 = scalef * kern[8]; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (mlib_d64)sl[i*chan1]; - buff1[i] = (mlib_d64)sl1[i*chan1]; - buff2[i] = (mlib_d64)sl2[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - mlib_d64 s0, s1; - - p02 = buff0[0]; - p12 = buff1[0]; - p22 = buff2[0]; - - p03 = buff0[1]; - p13 = buff1[1]; - p23 = buff2[1]; - - sp = sl; - dp = dl; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; - - buff3[i ] = (mlib_d64)sp[0]; - buff3[i + 1] = (mlib_d64)sp[chan1]; - - d0 = s0 + p02 * k2 + p12 * k5 + p22 * k8; - d1 = s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8; - - CLAMP_S32(dp[0 ], d0); - CLAMP_S32(dp[chan1], d1); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - - buff3[i] = (mlib_d64)sp[0]; - - d0 = (p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); - - CLAMP_S32(dp[0], d0); - - sp += chan1; - dp += chan1; - } - - buff3[wid ] = (mlib_d64)sp[0]; - buff3[wid + 1] = (mlib_d64)sp[chan1]; - - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff[(KSIZE + 2)*BUFF_LINE], *buff3, *buff4, *buff5; - mlib_d64 k[KSIZE*KSIZE]; - mlib_d64 k0, k1, k2, k3, k4, k5, k6, k7; - mlib_d64 p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14, - p20, p21, p22, p23, - p30, p31, p32, p33; - mlib_s32 *sl2, *sl3; - DEF_VARS(mlib_s32); - mlib_s32 chan2 = chan1 + chan1; - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(mlib_d64)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buff4 = buff3 + wid; - buff5 = buff4 + wid; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - CALC_SCALE(); - for (j = 0; j < 16; j++) k[j] = scalef * kern[j]; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (mlib_d64)sl[i*chan1]; - buff1[i] = (mlib_d64)sl1[i*chan1]; - buff2[i] = (mlib_d64)sl2[i*chan1]; - buff3[i] = (mlib_d64)sl3[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - /* - * First loop on two first lines of kernel - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; - k4 = k[4]; k5 = k[5]; k6 = k[6]; k7 = k[7]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff1[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - - buff4[i] = (mlib_d64)sp[0]; - buff4[i + 1] = (mlib_d64)sp[chan1]; - - buff5[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - buff5[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp += chan2; - dp += chan2; - } - - /* - * Second loop on two last lines of kernel - */ - k0 = k[ 8]; k1 = k[ 9]; k2 = k[10]; k3 = k[11]; - k4 = k[12]; k5 = k[13]; k6 = k[14]; k7 = k[15]; - - sp = sl; - dp = dl; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - - d0 = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7 + buff5[i]); - d1 = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7 + buff5[i + 1]); - - CLAMP_S32(dp[0 ], d0); - CLAMP_S32(dp[chan1], d1); - - sp += chan2; - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - - buff4[i] = (mlib_d64)sp[0]; - - d0 = (p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + - p10 * k[4] + p11 * k[5] + p12 * k[6] + p13 * k[7] + - p20 * k[ 8] + p21 * k[ 9] + p22 * k[10] + p23 * k[11] + - p30 * k[12] + p31 * k[13] + p32 * k[14] + p33 * k[15]); - - CLAMP_S32(dp[0], d0); - - sp += chan1; - dp += chan1; - } - - buff4[wid ] = (mlib_d64)sp[0]; - buff4[wid + 1] = (mlib_d64)sp[chan1]; - buff4[wid + 2] = (mlib_d64)sp[chan2]; - - /* next line */ - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff[(KSIZE + 2)*BUFF_LINE], *buff3, *buff4, *buff5, *buff6; - mlib_d64 k[KSIZE*KSIZE]; - mlib_d64 k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - mlib_d64 p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15, - p20, p21, p22, p23, p24, - p30, p31, p32, p33, p34, - p40, p41, p42, p43, p44; - mlib_s32 *sl2, *sl3, *sl4; - DEF_VARS(mlib_s32); - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 chan3 = chan1 + chan2; - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(mlib_d64)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buff4 = buff3 + wid; - buff5 = buff4 + wid; - buff6 = buff5 + wid; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - CALC_SCALE(); - for (j = 0; j < 25; j++) k[j] = scalef * kern[j]; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; - sl4 = sl3 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (mlib_d64)sl[i*chan1]; - buff1[i] = (mlib_d64)sl1[i*chan1]; - buff2[i] = (mlib_d64)sl2[i*chan1]; - buff3[i] = (mlib_d64)sl3[i*chan1]; - buff4[i] = (mlib_d64)sl4[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - /* - * First loop - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - p14 = buff1[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - p05 = buff0[i + 5]; p15 = buff1[i + 5]; - - buff6[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buff6[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - dp += chan2; - } - - /* - * Second loop - */ - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - sp = sl; - dp = dl; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - - p02 = buff2[i + 2]; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - p05 = buff2[i + 5]; p15 = buff3[i + 5]; - - buff6[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buff6[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - dp += chan2; - } - - /* - * 3 loop - */ - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - sp = sl; - dp = dl; - - p02 = buff4[0]; - p03 = buff4[1]; - p04 = buff4[2]; - p05 = buff4[3]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = buff4[i + 4]; p05 = buff4[i + 5]; - - buff5[i ] = (mlib_d64)sp[0]; - buff5[i + 1] = (mlib_d64)sp[chan1]; - - d0 = p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + buff6[i]; - d1 = p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + buff6[i + 1]; - - CLAMP_S32(dp[0 ], d0); - CLAMP_S32(dp[chan1], d1); - - sp += chan2; - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; p24 = buff2[i + 4]; p34 = buff3[i + 4]; - - p40 = buff4[i]; p41 = buff4[i + 1]; p42 = buff4[i + 2]; - p43 = buff4[i + 3]; p44 = buff4[i + 4]; - - buff5[i] = (mlib_d64)sp[0]; - - d0 = (p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + p04 * k[4] + - p10 * k[5] + p11 * k[6] + p12 * k[7] + p13 * k[8] + p14 * k[9] + - p20 * k[10] + p21 * k[11] + p22 * k[12] + p23 * k[13] + p24 * k[14] + - p30 * k[15] + p31 * k[16] + p32 * k[17] + p33 * k[18] + p34 * k[19] + - p40 * k[20] + p41 * k[21] + p42 * k[22] + p43 * k[23] + p44 * k[24]); - - CLAMP_S32(dp[0], d0); - - sp += chan1; - dp += chan1; - } - - buff5[wid ] = (mlib_d64)sp[0]; - buff5[wid + 1] = (mlib_d64)sp[chan1]; - buff5[wid + 2] = (mlib_d64)sp[chan2]; - buff5[wid + 3] = (mlib_d64)sp[chan3]; - - /* next line */ - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buff5; - buff5 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 7 - -mlib_status CONV_FUNC(7x7)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_d64 buff[(KSIZE + 2)*BUFF_LINE], *buffs[2*(KSIZE + 1)], *buffd; - mlib_d64 k[KSIZE*KSIZE]; - mlib_d64 k0, k1, k2, k3, k4, k5, k6; - mlib_d64 p0, p1, p2, p3, p4, p5, p6, p7; - mlib_d64 d0, d1; - mlib_s32 l, m, buff_ind, *sl2, *sl3, *sl4, *sl5, *sl6; - mlib_d64 scalef; - DEF_VARS_MxN(mlib_s32); - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 *sl1; - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(mlib_d64)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - for (l = 0; l < KSIZE + 1; l++) buffs[l] = pbuff + l*wid; - for (l = 0; l < KSIZE + 1; l++) buffs[l + (KSIZE + 1)] = buffs[l]; - buffd = buffs[KSIZE] + wid; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - CALC_SCALE(); - for (j = 0; j < 49; j++) k[j] = scalef * kern[j]; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; - sl4 = sl3 + sll; - sl5 = sl4 + sll; - sl6 = sl5 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buffs[0][i] = (mlib_d64)sl[i*chan1]; - buffs[1][i] = (mlib_d64)sl1[i*chan1]; - buffs[2][i] = (mlib_d64)sl2[i*chan1]; - buffs[3][i] = (mlib_d64)sl3[i*chan1]; - buffs[4][i] = (mlib_d64)sl4[i*chan1]; - buffs[5][i] = (mlib_d64)sl5[i*chan1]; - buffs[6][i] = (mlib_d64)sl6[i*chan1]; - } - - buff_ind = 0; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid; i++) buffd[i] = 0.0; - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind; - mlib_d64 *buffn = buffc[KSIZE]; - mlib_d64 *pk = k; - - for (l = 0; l < KSIZE; l++) { - mlib_d64 *buff = buffc[l]; - - sp = sl; - dp = dl; - - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = *pk++; k1 = *pk++; k2 = *pk++; k3 = *pk++; - k4 = *pk++; k5 = *pk++; k6 = *pk++; - - if (l < (KSIZE - 1)) { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - buffd[i ] += p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6; - buffd[i + 1] += p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6; - } - - } else { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - buffn[i ] = (mlib_d64)sp[0]; - buffn[i + 1] = (mlib_d64)sp[chan1]; - - d0 = p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6 + buffd[i ]; - d1 = p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6 + buffd[i + 1]; - - CLAMP_S32(dp[0 ], d0); - CLAMP_S32(dp[chan1], d1); - - buffd[i ] = 0.0; - buffd[i + 1] = 0.0; - - sp += chan2; - dp += chan2; - } - } - } - - /* last pixels */ - for (; i < wid; i++) { - mlib_d64 *pk = k, s = 0; - - for (l = 0; l < KSIZE; l++) { - mlib_d64 *buff = buffc[l] + i; - - for (m = 0; m < KSIZE; m++) s += buff[m] * (*pk++); - } - - CLAMP_S32(dp[0], s); - - buffn[i] = (mlib_d64)sp[0]; - - sp += chan1; - dp += chan1; - } - - for (l = 0; l < (KSIZE - 1); l++) buffn[wid + l] = sp[l*chan1]; - - /* next line */ - sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= KSIZE + 1) buff_ind = 0; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - /***************************************************************/ #define FTYPE mlib_d64 #define DTYPE mlib_s32 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8ext.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8ext.c index c7420a9136b..15799a46d32 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8ext.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8ext.c @@ -79,9 +79,6 @@ #endif /* IMG_TYPE == 1 */ -/***************************************************************/ -#define KSIZE1 (KSIZE - 1) - /***************************************************************/ #define PARAM \ mlib_image *dst, \ @@ -125,21 +122,6 @@ /***************************************************************/ #define D2I(x) CLAMP_S32((x) SAT_OFF) -/***************************************************************/ -#ifdef _LITTLE_ENDIAN - -#define STORE2(res0, res1) \ - dp[0 ] = res1; \ - dp[chan1] = res0 - -#else - -#define STORE2(res0, res1) \ - dp[0 ] = res0; \ - dp[chan1] = res1 - -#endif /* _LITTLE_ENDIAN */ - /***************************************************************/ #ifdef _NO_LONGLONG @@ -162,9 +144,6 @@ #endif /* _LITTLE_ENDIAN */ #endif /* _NO_LONGLONG */ -/***************************************************************/ -#define MLIB_D2_24 16777216.0f - /***************************************************************/ typedef union { mlib_d64 d64; @@ -174,52 +153,6 @@ typedef union { } i32s; } d64_2x32; -/***************************************************************/ -#define BUFF_LINE 256 - -/***************************************************************/ -#define DEF_VARS(type) \ - type *adr_src, *sl, *sp, *sl1; \ - type *adr_dst, *dl, *dp; \ - FTYPE *pbuff = buff; \ - mlib_s32 *buffi, *buffo; \ - mlib_s32 wid, hgt, sll, dll; \ - mlib_s32 nchannel, chan1, chan2; \ - mlib_s32 i, j, c, swid - -/***************************************************************/ -#define LOAD_KERNEL3() \ - FTYPE scalef = DSCALE; \ - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8; \ - FTYPE p00, p01, p02, p03, \ - p10, p11, p12, p13, \ - p20, p21, p22, p23; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - /* keep kernel in regs */ \ - k0 = scalef * kern[0]; k1 = scalef * kern[1]; k2 = scalef * kern[2]; \ - k3 = scalef * kern[3]; k4 = scalef * kern[4]; k5 = scalef * kern[5]; \ - k6 = scalef * kern[6]; k7 = scalef * kern[7]; k8 = scalef * kern[8] - -/***************************************************************/ -#define LOAD_KERNEL(SIZE) \ - FTYPE scalef = DSCALE; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - for (j = 0; j < SIZE; j++) k[j] = scalef * kern[j] - /***************************************************************/ #define GET_SRC_DST_PARAMETERS(type) \ hgt = mlib_ImageGetHeight(src); \ @@ -277,1334 +210,6 @@ typedef union { #endif /* IMG_TYPE == 1 */ #endif /* __sparc */ -/***************************************************************/ -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3) -{ - FTYPE buff[(KSIZE + 2)*BUFF_LINE], *buff0, *buff1, *buff2, *buff3, *buffT; - DEF_VARS(DTYPE); - DTYPE *sl2; -#ifndef __sparc - mlib_s32 d0, d1; -#endif /* __sparc */ - LOAD_KERNEL3(); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buffo = (mlib_s32*)(buff3 + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((hgt - dy_b) > 0) sl2 = sl1 + sll; - else sl2 = sl1; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl2 + sll; - else sl = sl2; - - for (j = 0; j < hgt; j++) { - FTYPE s0, s1; - - p02 = buff0[0]; - p12 = buff1[0]; - p22 = buff2[0]; - - p03 = buff0[1]; - p13 = buff1[1]; - p23 = buff2[1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp = sl; - dp = dl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef __sparc -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - d64_2x32 dd; - - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff3[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff3[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - -#ifndef __sparc - - d0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - d1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - -#else /* __sparc */ - - dd.i32s.i0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - dd.i32s.i1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - *(FTYPE *)(buffo + i) = dd.d64; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64_1), FROM_S32(o64_2)); -#else - STORE2(o64_1 >> 24, o64_2 >> 24); -#endif /* IMG_TYPE != 1 */ - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64 >> 32), FROM_S32(o64)); -#else - STORE2(o64 >> 56, o64 >> 24); -#endif /* IMG_TYPE != 1 */ -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - - buffi[i] = (mlib_s32)sp[0]; - buff3[i + dx_l] = (FTYPE)buffi[i]; - -#ifndef __sparc - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); - - dp[0] = FROM_S32(d0); - -#else /* __sparc */ - - buffo[i] = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); -#if IMG_TYPE != 1 - dp[0] = FROM_S32(buffo[i]); -#else - dp[0] = buffo[i] >> 24; -#endif /* IMG_TYPE != 1 */ -#endif /* __sparc */ - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buffi[i] = (mlib_s32)sp[0]; - buff3[i + dx_l] = (FTYPE)buffi[i]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff3[i] = buff3[dx_l]; - for (i = 0; i < dx_r; i++) buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buffT; - } - } - -#ifdef __sparc -#if IMG_TYPE == 1 - { - mlib_s32 amask = (1 << nchannel) - 1; - - if ((cmask & amask) != amask) { - mlib_ImageXor80(adr_dst, wid, hgt, dll, nchannel, cmask); - } else { - mlib_ImageXor80_aa(adr_dst, wid*nchannel, hgt, dll); - } - } - -#endif /* IMG_TYPE == 1 */ -#endif /* __sparc */ - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(3x3) -{ - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2, *sp_1, *sp_2; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, delta_chan; - mlib_s32 i, j, c; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8; - mlib_s32 p02, p03, - p12, p13, - p22, p23; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - /* keep kernel in regs */ - k0 = kern[0] >> shift1; k1 = kern[1] >> shift1; k2 = kern[2] >> shift1; - k3 = kern[3] >> shift1; k4 = kern[4] >> shift1; k5 = kern[5] >> shift1; - k6 = kern[6] >> shift1; k7 = kern[7] >> shift1; k8 = kern[8] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - chan1 = nchannel; - chan2 = chan1 + chan1; - delta_chan = 0; - - if ((1 > dx_l) && (1 < wid + KSIZE1 - dx_r)) delta_chan = chan1; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sp_1 = sl; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_2 = sl; - - if ((hgt - dy_b) > 0) sl += sll; - - for (j = 0; j < hgt; j++) { - mlib_s32 s0, s1; - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sp_1; - sp_1 = sp_2; - sp_2 = sl; - - sp1 = sp_1; - sp2 = sp_2; - - p02 = sp0[0]; - p12 = sp1[0]; - p22 = sp2[0]; - - p03 = sp0[delta_chan]; - p13 = sp1[delta_chan]; - p23 = sp2[delta_chan]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += (chan1 + delta_chan); - sp1 += (chan1 + delta_chan); - sp2 += (chan1 + delta_chan); - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; p23 = sp2[chan1]; - - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - pix1 = (s1 + p02 * k1 + p03 * k2 + p12 * k4 + - p13 * k5 + p22 * k7 + p23 * k8) >> shift2; - - CLAMP_STORE(dp[0], pix0) - CLAMP_STORE(dp[chan1], pix1) - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - dp += chan2; - } - - p02 = p03; p12 = p13; p22 = p23; - - for (; i < wid - dx_r; i++) { - p03 = sp0[0]; p13 = sp1[0]; p23 = sp2[0]; - pix0 = (s0 + p03 * k2 + p13 * k5 + p23 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0) - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - p02 = p03; p12 = p13; p22 = p23; - sp0 += chan1; - sp1 += chan1; - sp2 += chan1; - dp += chan1; - } - - sp0 -= chan1; - sp1 -= chan1; - sp2 -= chan1; - - for (; i < wid; i++) { - p03 = sp0[0]; p13 = sp1[0]; p23 = sp2[0]; - pix0 = (s0 + p03 * k2 + p13 * k5 + p23 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0) - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - p02 = p03; p12 = p13; p22 = p23; - dp += chan1; - } - - if (j < hgt - dy_b - 1) sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7; - FTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14, - p20, p21, p22, p23, - p30, p31, p32, p33; - DEF_VARS(DTYPE); - DTYPE *sl2, *sl3; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buff4 = buff3 + swid; - buffd = buff4 + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((hgt - dy_b) > 0) sl3 = sl2 + sll; - else sl3 = sl2; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - buff3[i] = (FTYPE)sl3[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - buff3[i + dx_l] = (FTYPE)sl3[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl3 + sll; - else sl = sl3; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop on two first lines of kernel - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; - k4 = k[4]; k5 = k[5]; k6 = k[6]; k7 = k[7]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff1[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff4[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff4[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp += chan2; - } - - /* - * Second loop on two last lines of kernel - */ - k0 = k[ 8]; k1 = k[ 9]; k2 = k[10]; k3 = k[11]; - k4 = k[12]; k5 = k[13]; k6 = k[14]; k7 = k[15]; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - - buff4[i + dx_l] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + - p10 * k[4] + p11 * k[5] + p12 * k[6] + p13 * k[7] + - p20 * k[ 8] + p21 * k[ 9] + p22 * k[10] + p23 * k[11] + - p30 * k[12] + p31 * k[13] + p32 * k[14] + p33 * k[15]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buff4[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff4[i] = buff4[dx_l]; - for (i = 0; i < dx_r; i++) buff4[swid + dx_l + i] = buff4[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buff5, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - FTYPE p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15, - p20, p21, p22, p23, p24, - p30, p31, p32, p33, p34, - p40, p41, p42, p43, p44; - DEF_VARS(DTYPE); - DTYPE *sl2, *sl3, *sl4; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buff4 = buff3 + swid; - buff5 = buff4 + swid; - buffd = buff5 + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl3 = sl2 + sll; - else sl3 = sl2; - - if ((hgt - dy_b) > 0) sl4 = sl3 + sll; - else sl4 = sl3; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - buff3[i] = (FTYPE)sl3[0]; - buff4[i] = (FTYPE)sl4[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - buff3[i + dx_l] = (FTYPE)sl3[i*chan1]; - buff4[i + dx_l] = (FTYPE)sl4[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - buff4[swid + dx_l + i] = buff4[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl4 + sll; - else sl = sl4; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - p14 = buff1[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - LOAD_BUFF(buffi); - - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - p05 = buff0[i + 5]; p15 = buff1[i + 5]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - } - - /* - * Second loop - */ - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - - p02 = buff2[i + 2]; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - p05 = buff2[i + 5]; p15 = buff3[i + 5]; - - dd.d64 = *(FTYPE *)(buffi + i); - buff5[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff5[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - } - - /* - * 3 loop - */ - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = buff4[0]; - p03 = buff4[1]; - p04 = buff4[2]; - p05 = buff4[3]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = buff4[i + 4]; p05 = buff4[i + 5]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; p24 = buff2[i + 4]; p34 = buff3[i + 4]; - - p40 = buff4[i]; p41 = buff4[i + 1]; p42 = buff4[i + 2]; - p43 = buff4[i + 3]; p44 = buff4[i + 4]; - - buff5[i + dx_l] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + p04 * k[4] + - p10 * k[5] + p11 * k[6] + p12 * k[7] + p13 * k[8] + p14 * k[9] + - p20 * k[10] + p21 * k[11] + p22 * k[12] + p23 * k[13] + p24 * k[14] + - p30 * k[15] + p31 * k[16] + p32 * k[17] + p33 * k[18] + p34 * k[19] + - p40 * k[20] + p41 * k[21] + p42 * k[22] + p43 * k[23] + p44 * k[24]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buff5[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff5[i] = buff5[dx_l]; - for (i = 0; i < dx_r; i++) buff5[swid + dx_l + i] = buff5[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buff5; - buff5 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(5x5) -{ - mlib_s32 buff[BUFF_LINE]; - mlib_s32 *buffd; - mlib_s32 k[KSIZE*KSIZE]; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - mlib_s32 p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15; - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2, *sp3, *sp4; - DTYPE *sp_1, *sp_2, *sp_3, *sp_4; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 *pbuff = buff; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, chan4; - mlib_s32 delta_chan1, delta_chan2, delta_chan3; - mlib_s32 i, j, c; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - for (j = 0; j < KSIZE*KSIZE; j++) k[j] = kern[j] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc(sizeof(mlib_s32)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffd = pbuff; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - if ((1 > dx_l) && (1 < wid + KSIZE1 - dx_r)) delta_chan1 = chan1; - else delta_chan1 = 0; - - if ((2 > dx_l) && (2 < wid + KSIZE1 - dx_r)) delta_chan2 = delta_chan1 + chan1; - else delta_chan2 = delta_chan1; - - if ((3 > dx_l) && (3 < wid + KSIZE1 - dx_r)) delta_chan3 = delta_chan2 + chan1; - else delta_chan3 = delta_chan2; - - chan4 = chan1 + delta_chan3; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sp_1 = sl; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_2 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_3 = sl; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_4 = sl; - - if ((hgt - dy_b) > 0) sl += sll; - - for (j = 0; j < hgt; j++) { - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sp_1; - sp_1 = sp_2; - sp_2 = sp_3; - sp_3 = sp_4; - sp_4 = sl; - - sp1 = sp_1; - sp2 = sp_2; - sp3 = sp_3; - sp4 = sp_4; - - /* - * First loop - */ - - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[delta_chan1]; p13 = sp1[delta_chan1]; - p04 = sp0[delta_chan2]; p14 = sp1[delta_chan2]; - p05 = sp0[delta_chan3]; p15 = sp1[delta_chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - p11 = p12; p12 = p13; p13 = p14; p14 = p15; - - for (; i < wid - dx_r; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - - sp0 += chan1; - sp1 += chan1; - } - - sp0 -= chan1; - sp1 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * Second loop - */ - - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = sp2[0]; p12 = sp3[0]; - p03 = sp2[delta_chan1]; p13 = sp3[delta_chan1]; - p04 = sp2[delta_chan2]; p14 = sp3[delta_chan2]; - p05 = sp2[delta_chan3]; p15 = sp3[delta_chan3]; - - sp2 += chan4; - sp3 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp2[0]; p14 = sp3[0]; - p05 = sp2[chan1]; p15 = sp3[chan1]; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp2 += chan2; - sp3 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - p11 = p12; p12 = p13; p13 = p14; p14 = p15; - - for (; i < wid - dx_r; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp2[0]; p14 = sp3[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - - sp2 += chan1; - sp3 += chan1; - } - - sp2 -= chan1; - sp3 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp2[0]; p14 = sp3[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * 3 loop - */ - - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = sp4[0]; - p03 = sp4[delta_chan1]; - p04 = sp4[delta_chan2]; - p05 = sp4[delta_chan3]; - - sp4 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp4[0]; p05 = sp4[chan1]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - pix1 = (buffd[i + 1] + p01 * k0 + p02 * k1 + p03 * k2 + - p04 * k3 + p05 * k4) >> shift2; - - CLAMP_STORE(dp[0], pix0) - CLAMP_STORE(dp[chan1], pix1) - - dp += chan2; - sp4 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - - for (; i < wid - dx_r; i++) { - p00 = p01; p01 = p02; p02 = p03; p03 = p04; - - p04 = sp4[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0) - - dp += chan1; - sp4 += chan1; - } - - sp4 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p01 = p02; p02 = p03; p03 = p04; - - p04 = sp4[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0) - - dp += chan1; - } - - /* next line */ - - if (j < hgt - dy_b - 1) sl += sll; - dl += dll; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#if IMG_TYPE == 1 - -#undef KSIZE -#define KSIZE 7 - -mlib_status CONV_FUNC(7x7) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE], *buffs[2*(KSIZE + 1)], *buffd; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 l, m, buff_ind; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6; - FTYPE p0, p1, p2, p3, p4, p5, p6, p7; - DTYPE *sl2, *sl3, *sl4, *sl5, *sl6; - DEF_VARS(DTYPE); - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - for (l = 0; l < KSIZE + 1; l++) buffs[l] = pbuff + l*swid; - for (l = 0; l < KSIZE + 1; l++) buffs[l + (KSIZE + 1)] = buffs[l]; - buffd = buffs[KSIZE] + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl3 = sl2 + sll; - else sl3 = sl2; - - if ((4 > dy_t) && (4 < hgt + KSIZE1 - dy_b)) sl4 = sl3 + sll; - else sl4 = sl3; - - if ((5 > dy_t) && (5 < hgt + KSIZE1 - dy_b)) sl5 = sl4 + sll; - else sl5 = sl4; - - if ((hgt - dy_b) > 0) sl6 = sl5 + sll; - else sl6 = sl5; - - for (i = 0; i < dx_l; i++) { - buffs[0][i] = (FTYPE)sl[0]; - buffs[1][i] = (FTYPE)sl1[0]; - buffs[2][i] = (FTYPE)sl2[0]; - buffs[3][i] = (FTYPE)sl3[0]; - buffs[4][i] = (FTYPE)sl4[0]; - buffs[5][i] = (FTYPE)sl5[0]; - buffs[6][i] = (FTYPE)sl6[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buffs[0][i + dx_l] = (FTYPE)sl[i*chan1]; - buffs[1][i + dx_l] = (FTYPE)sl1[i*chan1]; - buffs[2][i + dx_l] = (FTYPE)sl2[i*chan1]; - buffs[3][i + dx_l] = (FTYPE)sl3[i*chan1]; - buffs[4][i + dx_l] = (FTYPE)sl4[i*chan1]; - buffs[5][i + dx_l] = (FTYPE)sl5[i*chan1]; - buffs[6][i + dx_l] = (FTYPE)sl6[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buffs[0][swid + dx_l + i] = buffs[0][swid + dx_l - 1]; - buffs[1][swid + dx_l + i] = buffs[1][swid + dx_l - 1]; - buffs[2][swid + dx_l + i] = buffs[2][swid + dx_l - 1]; - buffs[3][swid + dx_l + i] = buffs[3][swid + dx_l - 1]; - buffs[4][swid + dx_l + i] = buffs[4][swid + dx_l - 1]; - buffs[5][swid + dx_l + i] = buffs[5][swid + dx_l - 1]; - buffs[6][swid + dx_l + i] = buffs[6][swid + dx_l - 1]; - } - - buff_ind = 0; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid; i++) buffd[i] = 0.0; - - if ((hgt - dy_b) > 1) sl = sl6 + sll; - else sl = sl6; - - for (j = 0; j < hgt; j++) { - FTYPE **buffc = buffs + buff_ind; - FTYPE *buffn = buffc[KSIZE]; - FTYPE *pk = k; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l]; - d64_2x32 dd; - - sp = sl; - dp = dl; - - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = *pk++; k1 = *pk++; k2 = *pk++; k3 = *pk++; - k4 = *pk++; k5 = *pk++; k6 = *pk++; - - if (l < (KSIZE - 1)) { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - buffd[i ] += p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6; - buffd[i + 1] += p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6; - } - - } else { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buffn[i + dx_l ] = (FTYPE)dd.i32s.i0; - buffn[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - d0 = D2I(p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6 + buffd[i ]); - d1 = D2I(p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - buffd[i ] = 0.0; - buffd[i + 1] = 0.0; - - sp += chan2; - dp += chan2; - } - } - } - - /* last pixels */ - for (; i < wid; i++) { - FTYPE *pk = k, s = 0; - mlib_s32 d0; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l] + i; - - for (m = 0; m < KSIZE; m++) s += buff[m] * (*pk++); - } - - d0 = D2I(s); - dp[0] = FROM_S32(d0); - - buffn[i + dx_l] = (FTYPE)sp[0]; - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buffn[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buffn[i] = buffn[dx_l]; - for (i = 0; i < dx_r; i++) buffn[swid + dx_l + i] = buffn[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= KSIZE + 1) buff_ind = 0; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* IMG_TYPE == 1 */ - /***************************************************************/ #define MAX_KER 7 #define MAX_N 15 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c index c81dbd08a35..4cdba6d1fa5 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_8nw.c @@ -144,9 +144,6 @@ typedef union { } f32s; } d64_2x32; -/***************************************************************/ -#define BUFF_LINE 256 - /***************************************************************/ #define DEF_VARS(type) \ type *adr_src, *sl, *sp = NULL; \ @@ -156,39 +153,6 @@ typedef union { mlib_s32 nchannel, chan1; \ mlib_s32 i, j, c -/***************************************************************/ -#define LOAD_KERNEL3() \ - FTYPE scalef = DSCALE; \ - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8; \ - FTYPE p00, p01, p02, p03, \ - p10, p11, p12, p13, \ - p20, p21, p22, p23; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - /* keep kernel in regs */ \ - k0 = scalef * kern[0]; k1 = scalef * kern[1]; k2 = scalef * kern[2]; \ - k3 = scalef * kern[3]; k4 = scalef * kern[4]; k5 = scalef * kern[5]; \ - k6 = scalef * kern[6]; k7 = scalef * kern[7]; k8 = scalef * kern[8] - -/***************************************************************/ -#define LOAD_KERNEL(SIZE) \ - FTYPE scalef = DSCALE; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - for (j = 0; j < SIZE; j++) k[j] = scalef * kern[j] - /***************************************************************/ #define GET_SRC_DST_PARAMETERS(type) \ hgt = mlib_ImageGetHeight(src); \ @@ -246,1162 +210,6 @@ typedef union { #endif /* IMG_TYPE == 1 */ #endif /* __sparc */ -/***************************************************************/ -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 2)*BUFF_LINE], *buff0, *buff1, *buff2, *buff3, *buffT; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2; -#ifndef __sparc - mlib_s32 d0, d1; -#endif /* __sparc */ - LOAD_KERNEL3(); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buffo = (mlib_s32*)(buff3 + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - FTYPE s0, s1; - - p02 = buff0[0]; - p12 = buff1[0]; - p22 = buff2[0]; - - p03 = buff0[1]; - p13 = buff1[1]; - p23 = buff2[1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp = sl; - dp = dl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef __sparc -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - d64_2x32 dd; - - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff3[i ] = (FTYPE)dd.i32s.i0; - buff3[i + 1] = (FTYPE)dd.i32s.i1; - -#ifndef __sparc - d0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - d1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - -#else /* __sparc */ - - dd.i32s.i0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - dd.i32s.i1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - *(FTYPE *)(buffo + i) = dd.d64; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64_1), FROM_S32(o64_2)); -#else - STORE2(o64_1 >> 24, o64_2 >> 24); -#endif /* IMG_TYPE != 1 */ - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64 >> 32), FROM_S32(o64)); -#else - STORE2(o64 >> 56, o64 >> 24); -#endif /* IMG_TYPE != 1 */ -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - - buffi[i] = (mlib_s32)sp[0]; - buff3[i] = (FTYPE)buffi[i]; - -#ifndef __sparc - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); - - dp[0] = FROM_S32(d0); - -#else /* __sparc */ - - buffo[i] = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); -#if IMG_TYPE != 1 - dp[0] = FROM_S32(buffo[i]); -#else - dp[0] = buffo[i] >> 24; -#endif /* IMG_TYPE != 1 */ -#endif /* __sparc */ - - sp += chan1; - dp += chan1; - } - - buffi[wid] = (mlib_s32)sp[0]; - buff3[wid] = (FTYPE)buffi[wid]; - buffi[wid + 1] = (mlib_s32)sp[chan1]; - buff3[wid + 1] = (FTYPE)buffi[wid + 1]; - - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buffT; - } - } - -#ifdef __sparc -#if IMG_TYPE == 1 - { - mlib_s32 amask = (1 << nchannel) - 1; - - if ((cmask & amask) != amask) { - mlib_ImageXor80(adr_dst, wid, hgt, dll, nchannel, cmask); - } else { - mlib_ImageXor80_aa(adr_dst, wid*nchannel, hgt, dll); - } - } - -#endif /* IMG_TYPE == 1 */ -#endif /* __sparc */ - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8; - mlib_s32 p02, p03, - p12, p13, - p22, p23; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - /* keep kernel in regs */ - k0 = kern[0] >> shift1; k1 = kern[1] >> shift1; k2 = kern[2] >> shift1; - k3 = kern[3] >> shift1; k4 = kern[4] >> shift1; k5 = kern[5] >> shift1; - k6 = kern[6] >> shift1; k7 = kern[7] >> shift1; k8 = kern[8] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - mlib_s32 s0, s1; - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sl; - sp1 = sp0 + sll; - sp2 = sp1 + sll; - - p02 = sp0[0]; - p12 = sp1[0]; - p22 = sp2[0]; - - p03 = sp0[chan1]; - p13 = sp1[chan1]; - p23 = sp2[chan1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; p23 = sp2[chan1]; - - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - pix1 = (s1 + p02 * k1 + p03 * k2 + p12 * k4 + - p13 * k5 + p22 * k7 + p23 * k8) >> shift2; - - CLAMP_STORE(dp[0], pix0) - CLAMP_STORE(dp[chan1], pix1) - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - dp += chan2; - } - - if (wid & 1) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0) - } - - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7; - FTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14, - p20, p21, p22, p23, - p30, p31, p32, p33; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2, *sl3; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buff4 = buff3 + wid; - buffd = buff4 + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - buff3[i] = (FTYPE)sl3[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop on two first lines of kernel - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; - k4 = k[4]; k5 = k[5]; k6 = k[6]; k7 = k[7]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff1[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff4[i ] = (FTYPE)dd.i32s.i0; - buff4[i + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp += chan2; - dp += chan2; - } - - /* - * Second loop on two last lines of kernel - */ - k0 = k[ 8]; k1 = k[ 9]; k2 = k[10]; k3 = k[11]; - k4 = k[12]; k5 = k[13]; k6 = k[14]; k7 = k[15]; - - sp = sl; - dp = dl; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - sp += chan2; - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - - buff4[i] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + - p10 * k[4] + p11 * k[5] + p12 * k[6] + p13 * k[7] + - p20 * k[ 8] + p21 * k[ 9] + p22 * k[10] + p23 * k[11] + - p30 * k[12] + p31 * k[13] + p32 * k[14] + p33 * k[15]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - buff4[wid ] = (FTYPE)sp[0]; - buff4[wid + 1] = (FTYPE)sp[chan1]; - buff4[wid + 2] = (FTYPE)sp[chan2]; - - /* next line */ - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buff5, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - FTYPE p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15, - p20, p21, p22, p23, p24, - p30, p31, p32, p33, p34, - p40, p41, p42, p43, p44; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2, *sl3, *sl4; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buff4 = buff3 + wid; - buff5 = buff4 + wid; - buffd = buff5 + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; - sl4 = sl3 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - buff3[i] = (FTYPE)sl3[i*chan1]; - buff4[i] = (FTYPE)sl4[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - p14 = buff1[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - LOAD_BUFF(buffi); - - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - p05 = buff0[i + 5]; p15 = buff1[i + 5]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - dp += chan2; - } - - /* - * Second loop - */ - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - sp = sl; - dp = dl; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - p14 = buff3[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - - p02 = buff2[i + 2]; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - p05 = buff2[i + 5]; p15 = buff3[i + 5]; - - dd.d64 = *(FTYPE *)(buffi + i); - buff5[i ] = (FTYPE)dd.i32s.i0; - buff5[i + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - dp += chan2; - } - - /* - * 3 loop - */ - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - sp = sl; - dp = dl; - - p02 = buff4[0]; - p03 = buff4[1]; - p04 = buff4[2]; - p05 = buff4[3]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = buff4[i + 4]; p05 = buff4[i + 5]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - sp += chan2; - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; p24 = buff2[i + 4]; p34 = buff3[i + 4]; - - p40 = buff4[i]; p41 = buff4[i + 1]; p42 = buff4[i + 2]; - p43 = buff4[i + 3]; p44 = buff4[i + 4]; - - buff5[i] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + p04 * k[4] + - p10 * k[5] + p11 * k[6] + p12 * k[7] + p13 * k[8] + p14 * k[9] + - p20 * k[10] + p21 * k[11] + p22 * k[12] + p23 * k[13] + p24 * k[14] + - p30 * k[15] + p31 * k[16] + p32 * k[17] + p33 * k[18] + p34 * k[19] + - p40 * k[20] + p41 * k[21] + p42 * k[22] + p43 * k[23] + p44 * k[24]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - buff5[wid ] = (FTYPE)sp[0]; - buff5[wid + 1] = (FTYPE)sp[chan1]; - buff5[wid + 2] = (FTYPE)sp[chan2]; - buff5[wid + 3] = (FTYPE)sp[chan2 + chan1]; - - /* next line */ - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buff5; - buff5 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_s32 buff[BUFF_LINE]; - mlib_s32 *buffd; - mlib_s32 k[KSIZE*KSIZE]; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - mlib_s32 p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15; - DTYPE *adr_src, *sl, *sp0, *sp1; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 *pbuff = buff; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, chan3, chan4; - mlib_s32 i, j, c; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - for (j = 0; j < KSIZE*KSIZE; j++) k[j] = kern[j] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc(sizeof(mlib_s32)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffd = pbuff; - - chan1 = nchannel; - chan2 = chan1 + chan1; - chan3 = chan2 + chan1; - chan4 = chan3 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - mlib_s32 pix0, pix1; - /* - * First loop - */ - sp0 = sl; - sp1 = sp0 + sll; - dp = dl; - - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * Second loop - */ - sp0 = sl + 2*sll; - sp1 = sp0 + sll; - dp = dl; - - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * 3 loop - */ - dp = dl; - sp0 = sl + 4*sll; - - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = sp0[0]; - p03 = sp0[chan1]; - p04 = sp0[chan2]; - p05 = sp0[chan3]; - - sp0 += chan2 + chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; p05 = sp0[chan1]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - pix1 = (buffd[i + 1] + p01 * k0 + p02 * k1 + p03 * k2 + - p04 * k3 + p05 * k4) >> shift2; - - CLAMP_STORE(dp[0], pix0) - CLAMP_STORE(dp[chan1], pix1) - - dp += chan2; - sp0 += chan2; - } - - if (wid & 1) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0) - } - - /* next line */ - sl += sll; - dl += dll; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#if IMG_TYPE == 1 - -#undef KSIZE -#define KSIZE 7 - -mlib_status CONV_FUNC(7x7)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE], *buffs[2*(KSIZE + 1)], *buffd; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 l, m, buff_ind; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6; - FTYPE p0, p1, p2, p3, p4, p5, p6, p7; - DTYPE *sl2, *sl3, *sl4, *sl5, *sl6; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - for (l = 0; l < KSIZE + 1; l++) buffs[l] = pbuff + l*wid; - for (l = 0; l < KSIZE + 1; l++) buffs[l + (KSIZE + 1)] = buffs[l]; - buffd = buffs[KSIZE] + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; - sl4 = sl3 + sll; - sl5 = sl4 + sll; - sl6 = sl5 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buffs[0][i] = (FTYPE)sl[i*chan1]; - buffs[1][i] = (FTYPE)sl1[i*chan1]; - buffs[2][i] = (FTYPE)sl2[i*chan1]; - buffs[3][i] = (FTYPE)sl3[i*chan1]; - buffs[4][i] = (FTYPE)sl4[i*chan1]; - buffs[5][i] = (FTYPE)sl5[i*chan1]; - buffs[6][i] = (FTYPE)sl6[i*chan1]; - } - - buff_ind = 0; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid; i++) buffd[i] = 0.0; - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - FTYPE **buffc = buffs + buff_ind; - FTYPE *buffn = buffc[KSIZE]; - FTYPE *pk = k; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l]; - d64_2x32 dd; - - sp = sl; - dp = dl; - - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = *pk++; k1 = *pk++; k2 = *pk++; k3 = *pk++; - k4 = *pk++; k5 = *pk++; k6 = *pk++; - - if (l < (KSIZE - 1)) { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - buffd[i ] += p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6; - buffd[i + 1] += p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6; - } - - } else { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buffn[i ] = (FTYPE)dd.i32s.i0; - buffn[i + 1] = (FTYPE)dd.i32s.i1; - - d0 = D2I(p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6 + buffd[i ]); - d1 = D2I(p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - buffd[i ] = 0.0; - buffd[i + 1] = 0.0; - - sp += chan2; - dp += chan2; - } - } - } - - /* last pixels */ - for (; i < wid; i++) { - FTYPE *pk = k, s = 0; - mlib_s32 d0; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l] + i; - - for (m = 0; m < KSIZE; m++) s += buff[m] * (*pk++); - } - - d0 = D2I(s); - dp[0] = FROM_S32(d0); - - buffn[i] = (FTYPE)sp[0]; - - sp += chan1; - dp += chan1; - } - - for (l = 0; l < (KSIZE - 1); l++) buffn[wid + l] = sp[l*chan1]; - - /* next line */ - sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= KSIZE + 1) buff_ind = 0; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* IMG_TYPE == 1 */ - /***************************************************************/ #define MAX_KER 7 #define MAX_N 15 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_D64nw.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_D64nw.c index 551ea197876..ef111ba1f44 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_D64nw.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_D64nw.c @@ -74,495 +74,6 @@ type *dl, *dp = NULL; \ mlib_s32 i = 0, j, c -/***************************************************************/ -#undef KSIZE -#define KSIZE 2 - -mlib_status CONV_FUNC(2x2)(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask) -{ - DEF_VARS(DTYPE); - DTYPE *sp0, *sp1; - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 chan3 = chan1 + chan2; - mlib_s32 chan4 = chan3 + chan1; - DTYPE k0, k1, k2, k3; - DTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14; - - /* keep kernel in regs */ - k0 = (DTYPE)kern[0]; k1 = (DTYPE)kern[1]; - k2 = (DTYPE)kern[2]; k3 = (DTYPE)kern[3]; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - dl = adr_dst + c; - sl = adr_src + c; - - for (j = 0; j < hgt; j++) { - dp = dl; - sp0 = sl; - sp1 = sp0 + sll; - - p04 = sp0[0]; - p14 = sp1[0]; - - sp0 += chan1; - sp1 += chan1; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 4); i += 4) { - p00 = p04; p10 = p14; - - p01 = sp0[0]; p11 = sp1[0]; - p02 = sp0[chan1]; p12 = sp1[chan1]; - p03 = sp0[chan2]; p13 = sp1[chan2]; - p04 = sp0[chan3]; p14 = sp1[chan3]; - - dp[0 ] = p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3; - dp[chan1] = p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3; - dp[chan2] = p02 * k0 + p03 * k1 + p12 * k2 + p13 * k3; - dp[chan3] = p03 * k0 + p04 * k1 + p13 * k2 + p14 * k3; - - dp += chan4; - sp0 += chan4; - sp1 += chan4; - } - - if (i < wid) { - p00 = p04; p10 = p14; - p01 = sp0[0]; p11 = sp1[0]; - dp[0] = p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3; - - if ((i + 1) < wid) { - p02 = sp0[chan1]; p12 = sp1[chan1]; - dp[chan1] = p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3; - - if ((i + 2) < wid) { - p03 = sp0[chan2]; p13 = sp1[chan2]; - dp[chan2] = p02 * k0 + p03 * k1 + p12 * k2 + p13 * k3; - } - } - } - - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask) -{ - DEF_VARS(DTYPE); - mlib_s32 chan2 = chan1 + chan1; - DTYPE *sp0, *sp1; - DTYPE *sp2; - DTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8; - DTYPE p02, p03, p12, p13, p22, p23; - - /* keep kernel in regs */ - k0 = (DTYPE)kern[0]; k1 = (DTYPE)kern[1]; k2 = (DTYPE)kern[2]; - k3 = (DTYPE)kern[3]; k4 = (DTYPE)kern[4]; k5 = (DTYPE)kern[5]; - k6 = (DTYPE)kern[6]; k7 = (DTYPE)kern[7]; k8 = (DTYPE)kern[8]; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - DTYPE s0, s1; - - dp = dl; - sp0 = sl; - sp1 = sp0 + sll; - sp2 = sp1 + sll; - - p02 = sp0[0]; - p12 = sp1[0]; - p22 = sp2[0]; - - p03 = sp0[chan1]; - p13 = sp1[chan1]; - p23 = sp2[chan1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; p23 = sp2[chan1]; - - dp[0 ] = s0 + p02 * k2 + p12 * k5 + p22 * k8; - dp[chan1] = s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - dp += chan2; - } - - if (wid & 1) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - dp[0] = s0 + p02 * k2 + p12 * k5 + p22 * k8; - } - - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4)(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *k, - mlib_s32 cmask) -{ - DTYPE k0, k1, k2, k3, k4, k5, k6, k7; - DTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14; - DEF_VARS(DTYPE); - DTYPE *sp0, *sp1; - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 chan3 = chan1 + chan2; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - /* - * First loop on two first lines of kernel - */ - sp0 = sl; - sp1 = sp0 + sll; - dp = dl; - - k0 = (DTYPE)k[0]; k1 = (DTYPE)k[1]; k2 = (DTYPE)k[2]; k3 = (DTYPE)k[3]; - k4 = (DTYPE)k[4]; k5 = (DTYPE)k[5]; k6 = (DTYPE)k[6]; k7 = (DTYPE)k[7]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - - sp0 += chan3; - sp1 += chan3; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - p03 = sp0[0]; p13 = sp1[0]; - p04 = sp0[chan1]; p14 = sp1[chan1]; - - dp[0 ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - dp[chan1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = sp0[0]; p13 = sp1[0]; - - dp[0] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - } - - /* - * Second loop on two last lines of kernel - */ - sp0 = sl + 2*sll; - sp1 = sp0 + sll; - dp = dl; - - k0 = (DTYPE)k[ 8]; k1 = (DTYPE)k[ 9]; k2 = (DTYPE)k[10]; k3 = (DTYPE)k[11]; - k4 = (DTYPE)k[12]; k5 = (DTYPE)k[13]; k6 = (DTYPE)k[14]; k7 = (DTYPE)k[15]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - - sp0 += chan3; - sp1 += chan3; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - p03 = sp0[0]; p13 = sp1[0]; - p04 = sp0[chan1]; p14 = sp1[chan1]; - - dp[0 ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - dp[chan1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = sp0[0]; p13 = sp1[0]; - - dp[0] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - } - - /* next line */ - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *k, - mlib_s32 cmask) -{ - DTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - DTYPE p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15; - DEF_VARS(DTYPE); - DTYPE *sp0, *sp1; - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 chan3 = chan1 + chan2; - mlib_s32 chan4 = chan3 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - /* - * First loop - */ - sp0 = sl; - sp1 = sp0 + sll; - dp = dl; - - k0 = (DTYPE)k[0]; k1 = (DTYPE)k[1]; k2 = (DTYPE)k[2]; k3 = (DTYPE)k[3]; k4 = (DTYPE)k[4]; - k5 = (DTYPE)k[5]; k6 = (DTYPE)k[6]; k7 = (DTYPE)k[7]; k8 = (DTYPE)k[8]; k9 = (DTYPE)k[9]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - dp[ 0] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - dp[chan1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - dp[0] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * Second loop - */ - sp0 = sl + 2*sll; - sp1 = sp0 + sll; - dp = dl; - - k0 = (DTYPE)k[10]; k1 = (DTYPE)k[11]; k2 = (DTYPE)k[12]; k3 = (DTYPE)k[13]; k4 = (DTYPE)k[14]; - k5 = (DTYPE)k[15]; k6 = (DTYPE)k[16]; k7 = (DTYPE)k[17]; k8 = (DTYPE)k[18]; k9 = (DTYPE)k[19]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - dp[ 0] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - dp[chan1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - dp[0] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * 3 loop - */ - dp = dl; - sp0 = sl + 4*sll; - - k0 = (DTYPE)k[20]; k1 = (DTYPE)k[21]; k2 = (DTYPE)k[22]; k3 = (DTYPE)k[23]; k4 = (DTYPE)k[24]; - - p02 = sp0[0]; - p03 = sp0[chan1]; - p04 = sp0[chan2]; - p05 = sp0[chan3]; - - sp0 += chan2 + chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; p05 = sp0[chan1]; - - dp[0 ] += p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4; - dp[chan1] += p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4; - - dp += chan2; - sp0 += chan2; - } - - if (wid & 1) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; - - dp[0] += p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4; - } - - /* next line */ - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - /***************************************************************/ #define BUFF_SIZE 1600 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_F32nw.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_F32nw.c index 7e279d7a61e..c825c97c437 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_F32nw.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_F32nw.c @@ -74,495 +74,6 @@ type *dl, *dp = NULL; \ mlib_s32 i, j, c -/***************************************************************/ -#undef KSIZE -#define KSIZE 2 - -mlib_status CONV_FUNC(2x2)(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask) -{ - DEF_VARS(DTYPE); - DTYPE *sp0, *sp1; - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 chan3 = chan1 + chan2; - mlib_s32 chan4 = chan3 + chan1; - DTYPE k0, k1, k2, k3; - DTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14; - - /* keep kernel in regs */ - k0 = (DTYPE)kern[0]; k1 = (DTYPE)kern[1]; - k2 = (DTYPE)kern[2]; k3 = (DTYPE)kern[3]; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - dl = adr_dst + c; - sl = adr_src + c; - - for (j = 0; j < hgt; j++) { - dp = dl; - sp0 = sl; - sp1 = sp0 + sll; - - p04 = sp0[0]; - p14 = sp1[0]; - - sp0 += chan1; - sp1 += chan1; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 4); i += 4) { - p00 = p04; p10 = p14; - - p01 = sp0[0]; p11 = sp1[0]; - p02 = sp0[chan1]; p12 = sp1[chan1]; - p03 = sp0[chan2]; p13 = sp1[chan2]; - p04 = sp0[chan3]; p14 = sp1[chan3]; - - dp[0 ] = p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3; - dp[chan1] = p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3; - dp[chan2] = p02 * k0 + p03 * k1 + p12 * k2 + p13 * k3; - dp[chan3] = p03 * k0 + p04 * k1 + p13 * k2 + p14 * k3; - - dp += chan4; - sp0 += chan4; - sp1 += chan4; - } - - if (i < wid) { - p00 = p04; p10 = p14; - p01 = sp0[0]; p11 = sp1[0]; - dp[0] = p00 * k0 + p01 * k1 + p10 * k2 + p11 * k3; - - if ((i + 1) < wid) { - p02 = sp0[chan1]; p12 = sp1[chan1]; - dp[chan1] = p01 * k0 + p02 * k1 + p11 * k2 + p12 * k3; - - if ((i + 2) < wid) { - p03 = sp0[chan2]; p13 = sp1[chan2]; - dp[chan2] = p02 * k0 + p03 * k1 + p12 * k2 + p13 * k3; - } - } - } - - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *kern, - mlib_s32 cmask) -{ - DEF_VARS(DTYPE); - mlib_s32 chan2 = chan1 + chan1; - DTYPE *sp0, *sp1; - DTYPE *sp2; - DTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8; - DTYPE p02, p03, p12, p13, p22, p23; - - /* keep kernel in regs */ - k0 = (DTYPE)kern[0]; k1 = (DTYPE)kern[1]; k2 = (DTYPE)kern[2]; - k3 = (DTYPE)kern[3]; k4 = (DTYPE)kern[4]; k5 = (DTYPE)kern[5]; - k6 = (DTYPE)kern[6]; k7 = (DTYPE)kern[7]; k8 = (DTYPE)kern[8]; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - DTYPE s0, s1; - - dp = dl; - sp0 = sl; - sp1 = sp0 + sll; - sp2 = sp1 + sll; - - p02 = sp0[0]; - p12 = sp1[0]; - p22 = sp2[0]; - - p03 = sp0[chan1]; - p13 = sp1[chan1]; - p23 = sp2[chan1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; p23 = sp2[chan1]; - - dp[0 ] = s0 + p02 * k2 + p12 * k5 + p22 * k8; - dp[chan1] = s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - dp += chan2; - } - - if (wid & 1) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - dp[0] = s0 + p02 * k2 + p12 * k5 + p22 * k8; - } - - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4)(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *k, - mlib_s32 cmask) -{ - DTYPE k0, k1, k2, k3, k4, k5, k6, k7; - DTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14; - DEF_VARS(DTYPE); - DTYPE *sp0, *sp1; - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 chan3 = chan1 + chan2; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - /* - * First loop on two first lines of kernel - */ - sp0 = sl; - sp1 = sp0 + sll; - dp = dl; - - k0 = (DTYPE)k[0]; k1 = (DTYPE)k[1]; k2 = (DTYPE)k[2]; k3 = (DTYPE)k[3]; - k4 = (DTYPE)k[4]; k5 = (DTYPE)k[5]; k6 = (DTYPE)k[6]; k7 = (DTYPE)k[7]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - - sp0 += chan3; - sp1 += chan3; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - p03 = sp0[0]; p13 = sp1[0]; - p04 = sp0[chan1]; p14 = sp1[chan1]; - - dp[0 ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - dp[chan1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = sp0[0]; p13 = sp1[0]; - - dp[0] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - } - - /* - * Second loop on two last lines of kernel - */ - sp0 = sl + 2*sll; - sp1 = sp0 + sll; - dp = dl; - - k0 = (DTYPE)k[ 8]; k1 = (DTYPE)k[ 9]; k2 = (DTYPE)k[10]; k3 = (DTYPE)k[11]; - k4 = (DTYPE)k[12]; k5 = (DTYPE)k[13]; k6 = (DTYPE)k[14]; k7 = (DTYPE)k[15]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - - sp0 += chan3; - sp1 += chan3; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - p03 = sp0[0]; p13 = sp1[0]; - p04 = sp0[chan1]; p14 = sp1[chan1]; - - dp[0 ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - dp[chan1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = sp0[0]; p13 = sp1[0]; - - dp[0] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - } - - /* next line */ - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *k, - mlib_s32 cmask) -{ - DTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - DTYPE p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15; - DEF_VARS(DTYPE); - DTYPE *sp0, *sp1; - mlib_s32 chan2 = chan1 + chan1; - mlib_s32 chan3 = chan1 + chan2; - mlib_s32 chan4 = chan3 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - /* - * First loop - */ - sp0 = sl; - sp1 = sp0 + sll; - dp = dl; - - k0 = (DTYPE)k[0]; k1 = (DTYPE)k[1]; k2 = (DTYPE)k[2]; k3 = (DTYPE)k[3]; k4 = (DTYPE)k[4]; - k5 = (DTYPE)k[5]; k6 = (DTYPE)k[6]; k7 = (DTYPE)k[7]; k8 = (DTYPE)k[8]; k9 = (DTYPE)k[9]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - dp[ 0] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - dp[chan1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - dp[0] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * Second loop - */ - sp0 = sl + 2*sll; - sp1 = sp0 + sll; - dp = dl; - - k0 = (DTYPE)k[10]; k1 = (DTYPE)k[11]; k2 = (DTYPE)k[12]; k3 = (DTYPE)k[13]; k4 = (DTYPE)k[14]; - k5 = (DTYPE)k[15]; k6 = (DTYPE)k[16]; k7 = (DTYPE)k[17]; k8 = (DTYPE)k[18]; k9 = (DTYPE)k[19]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - dp[ 0] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - dp[chan1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - dp[0] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * 3 loop - */ - dp = dl; - sp0 = sl + 4*sll; - - k0 = (DTYPE)k[20]; k1 = (DTYPE)k[21]; k2 = (DTYPE)k[22]; k3 = (DTYPE)k[23]; k4 = (DTYPE)k[24]; - - p02 = sp0[0]; - p03 = sp0[chan1]; - p04 = sp0[chan2]; - p05 = sp0[chan3]; - - sp0 += chan2 + chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; p05 = sp0[chan1]; - - dp[0 ] += p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4; - dp[chan1] += p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4; - - dp += chan2; - sp0 += chan2; - } - - if (wid & 1) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; - - dp[0] += p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4; - } - - /* next line */ - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - /***************************************************************/ #define BUFF_SIZE 1600 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16ext.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16ext.c index 926459d1170..b6a641039fa 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16ext.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16ext.c @@ -79,9 +79,6 @@ #endif /* IMG_TYPE == 1 */ -/***************************************************************/ -#define KSIZE1 (KSIZE - 1) - /***************************************************************/ #define PARAM \ mlib_image *dst, \ @@ -162,9 +159,6 @@ #endif /* _LITTLE_ENDIAN */ #endif /* _NO_LONGLONG */ -/***************************************************************/ -#define MLIB_D2_24 16777216.0f - /***************************************************************/ typedef union { mlib_d64 d64; @@ -174,9 +168,6 @@ typedef union { } i32s; } d64_2x32; -/***************************************************************/ -#define BUFF_LINE 256 - /***************************************************************/ #define DEF_VARS(type) \ type *adr_src, *sl, *sp, *sl1; \ @@ -187,39 +178,6 @@ typedef union { mlib_s32 nchannel, chan1, chan2; \ mlib_s32 i, j, c, swid -/***************************************************************/ -#define LOAD_KERNEL3() \ - FTYPE scalef = DSCALE; \ - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8; \ - FTYPE p00, p01, p02, p03, \ - p10, p11, p12, p13, \ - p20, p21, p22, p23; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - /* keep kernel in regs */ \ - k0 = scalef * kern[0]; k1 = scalef * kern[1]; k2 = scalef * kern[2]; \ - k3 = scalef * kern[3]; k4 = scalef * kern[4]; k5 = scalef * kern[5]; \ - k6 = scalef * kern[6]; k7 = scalef * kern[7]; k8 = scalef * kern[8] - -/***************************************************************/ -#define LOAD_KERNEL(SIZE) \ - FTYPE scalef = DSCALE; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - for (j = 0; j < SIZE; j++) k[j] = scalef * kern[j] - /***************************************************************/ #define GET_SRC_DST_PARAMETERS(type) \ hgt = mlib_ImageGetHeight(src); \ @@ -277,1334 +235,6 @@ typedef union { #endif /* IMG_TYPE == 1 */ #endif /* __sparc */ -/***************************************************************/ -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3) -{ - FTYPE buff[(KSIZE + 2)*BUFF_LINE], *buff0, *buff1, *buff2, *buff3, *buffT; - DEF_VARS(DTYPE); - DTYPE *sl2; -#ifndef __sparc - mlib_s32 d0, d1; -#endif /* __sparc */ - LOAD_KERNEL3(); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buffo = (mlib_s32*)(buff3 + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((hgt - dy_b) > 0) sl2 = sl1 + sll; - else sl2 = sl1; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl2 + sll; - else sl = sl2; - - for (j = 0; j < hgt; j++) { - FTYPE s0, s1; - - p02 = buff0[0]; - p12 = buff1[0]; - p22 = buff2[0]; - - p03 = buff0[1]; - p13 = buff1[1]; - p23 = buff2[1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp = sl; - dp = dl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef __sparc -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - d64_2x32 dd; - - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff3[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff3[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - -#ifndef __sparc - - d0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - d1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - -#else /* __sparc */ - - dd.i32s.i0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - dd.i32s.i1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - *(FTYPE *)(buffo + i) = dd.d64; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64_1), FROM_S32(o64_2)); -#else - STORE2(o64_1 >> 24, o64_2 >> 24); -#endif /* IMG_TYPE != 1 */ - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64 >> 32), FROM_S32(o64)); -#else - STORE2(o64 >> 56, o64 >> 24); -#endif /* IMG_TYPE != 1 */ -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - - buffi[i] = (mlib_s32)sp[0]; - buff3[i + dx_l] = (FTYPE)buffi[i]; - -#ifndef __sparc - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); - - dp[0] = FROM_S32(d0); - -#else /* __sparc */ - - buffo[i] = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); -#if IMG_TYPE != 1 - dp[0] = FROM_S32(buffo[i]); -#else - dp[0] = buffo[i] >> 24; -#endif /* IMG_TYPE != 1 */ -#endif /* __sparc */ - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buffi[i] = (mlib_s32)sp[0]; - buff3[i + dx_l] = (FTYPE)buffi[i]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff3[i] = buff3[dx_l]; - for (i = 0; i < dx_r; i++) buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buffT; - } - } - -#ifdef __sparc -#if IMG_TYPE == 1 - { - mlib_s32 amask = (1 << nchannel) - 1; - - if ((cmask & amask) != amask) { - mlib_ImageXor80(adr_dst, wid, hgt, dll, nchannel, cmask); - } else { - mlib_ImageXor80_aa(adr_dst, wid*nchannel, hgt, dll); - } - } - -#endif /* IMG_TYPE == 1 */ -#endif /* __sparc */ - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(3x3) -{ - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2, *sp_1, *sp_2; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, delta_chan; - mlib_s32 i, j, c; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8; - mlib_s32 p02, p03, - p12, p13, - p22, p23; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - /* keep kernel in regs */ - k0 = kern[0] >> shift1; k1 = kern[1] >> shift1; k2 = kern[2] >> shift1; - k3 = kern[3] >> shift1; k4 = kern[4] >> shift1; k5 = kern[5] >> shift1; - k6 = kern[6] >> shift1; k7 = kern[7] >> shift1; k8 = kern[8] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - chan1 = nchannel; - chan2 = chan1 + chan1; - delta_chan = 0; - - if ((1 > dx_l) && (1 < wid + KSIZE1 - dx_r)) delta_chan = chan1; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sp_1 = sl; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_2 = sl; - - if ((hgt - dy_b) > 0) sl += sll; - - for (j = 0; j < hgt; j++) { - mlib_s32 s0, s1; - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sp_1; - sp_1 = sp_2; - sp_2 = sl; - - sp1 = sp_1; - sp2 = sp_2; - - p02 = sp0[0]; - p12 = sp1[0]; - p22 = sp2[0]; - - p03 = sp0[delta_chan]; - p13 = sp1[delta_chan]; - p23 = sp2[delta_chan]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += (chan1 + delta_chan); - sp1 += (chan1 + delta_chan); - sp2 += (chan1 + delta_chan); - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; p23 = sp2[chan1]; - - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - pix1 = (s1 + p02 * k1 + p03 * k2 + p12 * k4 + - p13 * k5 + p22 * k7 + p23 * k8) >> shift2; - - CLAMP_STORE(dp[0], pix0); - CLAMP_STORE(dp[chan1], pix1); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - dp += chan2; - } - - p02 = p03; p12 = p13; p22 = p23; - - for (; i < wid - dx_r; i++) { - p03 = sp0[0]; p13 = sp1[0]; p23 = sp2[0]; - pix0 = (s0 + p03 * k2 + p13 * k5 + p23 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0); - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - p02 = p03; p12 = p13; p22 = p23; - sp0 += chan1; - sp1 += chan1; - sp2 += chan1; - dp += chan1; - } - - sp0 -= chan1; - sp1 -= chan1; - sp2 -= chan1; - - for (; i < wid; i++) { - p03 = sp0[0]; p13 = sp1[0]; p23 = sp2[0]; - pix0 = (s0 + p03 * k2 + p13 * k5 + p23 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0); - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - p02 = p03; p12 = p13; p22 = p23; - dp += chan1; - } - - if (j < hgt - dy_b - 1) sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7; - FTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14, - p20, p21, p22, p23, - p30, p31, p32, p33; - DEF_VARS(DTYPE); - DTYPE *sl2, *sl3; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buff4 = buff3 + swid; - buffd = buff4 + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((hgt - dy_b) > 0) sl3 = sl2 + sll; - else sl3 = sl2; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - buff3[i] = (FTYPE)sl3[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - buff3[i + dx_l] = (FTYPE)sl3[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl3 + sll; - else sl = sl3; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop on two first lines of kernel - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; - k4 = k[4]; k5 = k[5]; k6 = k[6]; k7 = k[7]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff1[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff4[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff4[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp += chan2; - } - - /* - * Second loop on two last lines of kernel - */ - k0 = k[ 8]; k1 = k[ 9]; k2 = k[10]; k3 = k[11]; - k4 = k[12]; k5 = k[13]; k6 = k[14]; k7 = k[15]; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - - buff4[i + dx_l] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + - p10 * k[4] + p11 * k[5] + p12 * k[6] + p13 * k[7] + - p20 * k[ 8] + p21 * k[ 9] + p22 * k[10] + p23 * k[11] + - p30 * k[12] + p31 * k[13] + p32 * k[14] + p33 * k[15]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buff4[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff4[i] = buff4[dx_l]; - for (i = 0; i < dx_r; i++) buff4[swid + dx_l + i] = buff4[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buff5, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - FTYPE p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15, - p20, p21, p22, p23, p24, - p30, p31, p32, p33, p34, - p40, p41, p42, p43, p44; - DEF_VARS(DTYPE); - DTYPE *sl2, *sl3, *sl4; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (swid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*swid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + swid; - buff2 = buff1 + swid; - buff3 = buff2 + swid; - buff4 = buff3 + swid; - buff5 = buff4 + swid; - buffd = buff5 + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl3 = sl2 + sll; - else sl3 = sl2; - - if ((hgt - dy_b) > 0) sl4 = sl3 + sll; - else sl4 = sl3; - - for (i = 0; i < dx_l; i++) { - buff0[i] = (FTYPE)sl[0]; - buff1[i] = (FTYPE)sl1[0]; - buff2[i] = (FTYPE)sl2[0]; - buff3[i] = (FTYPE)sl3[0]; - buff4[i] = (FTYPE)sl4[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buff0[i + dx_l] = (FTYPE)sl[i*chan1]; - buff1[i + dx_l] = (FTYPE)sl1[i*chan1]; - buff2[i + dx_l] = (FTYPE)sl2[i*chan1]; - buff3[i + dx_l] = (FTYPE)sl3[i*chan1]; - buff4[i + dx_l] = (FTYPE)sl4[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buff0[swid + dx_l + i] = buff0[swid + dx_l - 1]; - buff1[swid + dx_l + i] = buff1[swid + dx_l - 1]; - buff2[swid + dx_l + i] = buff2[swid + dx_l - 1]; - buff3[swid + dx_l + i] = buff3[swid + dx_l - 1]; - buff4[swid + dx_l + i] = buff4[swid + dx_l - 1]; - } - - if ((hgt - dy_b) > 1) sl = sl4 + sll; - else sl = sl4; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - p14 = buff1[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - LOAD_BUFF(buffi); - - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - p05 = buff0[i + 5]; p15 = buff1[i + 5]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - } - - /* - * Second loop - */ - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - - p02 = buff2[i + 2]; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - p05 = buff2[i + 5]; p15 = buff3[i + 5]; - - dd.d64 = *(FTYPE *)(buffi + i); - buff5[i + dx_l ] = (FTYPE)dd.i32s.i0; - buff5[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - } - - /* - * 3 loop - */ - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = buff4[0]; - p03 = buff4[1]; - p04 = buff4[2]; - p05 = buff4[3]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = buff4[i + 4]; p05 = buff4[i + 5]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; p24 = buff2[i + 4]; p34 = buff3[i + 4]; - - p40 = buff4[i]; p41 = buff4[i + 1]; p42 = buff4[i + 2]; - p43 = buff4[i + 3]; p44 = buff4[i + 4]; - - buff5[i + dx_l] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + p04 * k[4] + - p10 * k[5] + p11 * k[6] + p12 * k[7] + p13 * k[8] + p14 * k[9] + - p20 * k[10] + p21 * k[11] + p22 * k[12] + p23 * k[13] + p24 * k[14] + - p30 * k[15] + p31 * k[16] + p32 * k[17] + p33 * k[18] + p34 * k[19] + - p40 * k[20] + p41 * k[21] + p42 * k[22] + p43 * k[23] + p44 * k[24]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buff5[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buff5[i] = buff5[dx_l]; - for (i = 0; i < dx_r; i++) buff5[swid + dx_l + i] = buff5[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buff5; - buff5 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(5x5) -{ - mlib_s32 buff[BUFF_LINE]; - mlib_s32 *buffd; - mlib_s32 k[KSIZE*KSIZE]; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - mlib_s32 p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15; - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2, *sp3, *sp4; - DTYPE *sp_1, *sp_2, *sp_3, *sp_4; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 *pbuff = buff; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, chan4; - mlib_s32 delta_chan1, delta_chan2, delta_chan3; - mlib_s32 i, j, c; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - for (j = 0; j < KSIZE*KSIZE; j++) k[j] = kern[j] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc(sizeof(mlib_s32)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffd = pbuff; - - chan1 = nchannel; - chan2 = chan1 + chan1; - - if ((1 > dx_l) && (1 < wid + KSIZE1 - dx_r)) delta_chan1 = chan1; - else delta_chan1 = 0; - - if ((2 > dx_l) && (2 < wid + KSIZE1 - dx_r)) delta_chan2 = delta_chan1 + chan1; - else delta_chan2 = delta_chan1; - - if ((3 > dx_l) && (3 < wid + KSIZE1 - dx_r)) delta_chan3 = delta_chan2 + chan1; - else delta_chan3 = delta_chan2; - - chan4 = chan1 + delta_chan3; - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sp_1 = sl; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_2 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_3 = sl; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl += sll; - sp_4 = sl; - - if ((hgt - dy_b) > 0) sl += sll; - - for (j = 0; j < hgt; j++) { - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sp_1; - sp_1 = sp_2; - sp_2 = sp_3; - sp_3 = sp_4; - sp_4 = sl; - - sp1 = sp_1; - sp2 = sp_2; - sp3 = sp_3; - sp4 = sp_4; - - /* - * First loop - */ - - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[delta_chan1]; p13 = sp1[delta_chan1]; - p04 = sp0[delta_chan2]; p14 = sp1[delta_chan2]; - p05 = sp0[delta_chan3]; p15 = sp1[delta_chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - p11 = p12; p12 = p13; p13 = p14; p14 = p15; - - for (; i < wid - dx_r; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - - sp0 += chan1; - sp1 += chan1; - } - - sp0 -= chan1; - sp1 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * Second loop - */ - - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = sp2[0]; p12 = sp3[0]; - p03 = sp2[delta_chan1]; p13 = sp3[delta_chan1]; - p04 = sp2[delta_chan2]; p14 = sp3[delta_chan2]; - p05 = sp2[delta_chan3]; p15 = sp3[delta_chan3]; - - sp2 += chan4; - sp3 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp2[0]; p14 = sp3[0]; - p05 = sp2[chan1]; p15 = sp3[chan1]; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp2 += chan2; - sp3 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - p11 = p12; p12 = p13; p13 = p14; p14 = p15; - - for (; i < wid - dx_r; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp2[0]; p14 = sp3[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - - sp2 += chan1; - sp3 += chan1; - } - - sp2 -= chan1; - sp3 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p10 = p11; - p01 = p02; p11 = p12; - p02 = p03; p12 = p13; - p03 = p04; p13 = p14; - - p04 = sp2[0]; p14 = sp3[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * 3 loop - */ - - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = sp4[0]; - p03 = sp4[delta_chan1]; - p04 = sp4[delta_chan2]; - p05 = sp4[delta_chan3]; - - sp4 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - dx_r - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp4[0]; p05 = sp4[chan1]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - pix1 = (buffd[i + 1] + p01 * k0 + p02 * k1 + p03 * k2 + - p04 * k3 + p05 * k4) >> shift2; - - CLAMP_STORE(dp[0], pix0); - CLAMP_STORE(dp[chan1], pix1); - - dp += chan2; - sp4 += chan2; - } - - p01 = p02; p02 = p03; p03 = p04; p04 = p05; - - for (; i < wid - dx_r; i++) { - p00 = p01; p01 = p02; p02 = p03; p03 = p04; - - p04 = sp4[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0); - - dp += chan1; - sp4 += chan1; - } - - sp4 -= chan1; - - for (; i < wid; i++) { - p00 = p01; p01 = p02; p02 = p03; p03 = p04; - - p04 = sp4[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0); - - dp += chan1; - } - - /* next line */ - - if (j < hgt - dy_b - 1) sl += sll; - dl += dll; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#if IMG_TYPE == 1 - -#undef KSIZE -#define KSIZE 7 - -mlib_status CONV_FUNC(7x7) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE], *buffs[2*(KSIZE + 1)], *buffd; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 l, m, buff_ind; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6; - FTYPE p0, p1, p2, p3, p4, p5, p6, p7; - DTYPE *sl2, *sl3, *sl4, *sl5, *sl6; - DEF_VARS(DTYPE); - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - swid = wid + KSIZE1; - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE )*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - for (l = 0; l < KSIZE + 1; l++) buffs[l] = pbuff + l*swid; - for (l = 0; l < KSIZE + 1; l++) buffs[l + (KSIZE + 1)] = buffs[l]; - buffd = buffs[KSIZE] + swid; - buffo = (mlib_s32*)(buffd + swid); - buffi = buffo + (swid &~ 1); - - swid -= (dx_l + dx_r); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - if ((1 > dy_t) && (1 < hgt + KSIZE1 - dy_b)) sl1 = sl + sll; - else sl1 = sl; - - if ((2 > dy_t) && (2 < hgt + KSIZE1 - dy_b)) sl2 = sl1 + sll; - else sl2 = sl1; - - if ((3 > dy_t) && (3 < hgt + KSIZE1 - dy_b)) sl3 = sl2 + sll; - else sl3 = sl2; - - if ((4 > dy_t) && (4 < hgt + KSIZE1 - dy_b)) sl4 = sl3 + sll; - else sl4 = sl3; - - if ((5 > dy_t) && (5 < hgt + KSIZE1 - dy_b)) sl5 = sl4 + sll; - else sl5 = sl4; - - if ((hgt - dy_b) > 0) sl6 = sl5 + sll; - else sl6 = sl5; - - for (i = 0; i < dx_l; i++) { - buffs[0][i] = (FTYPE)sl[0]; - buffs[1][i] = (FTYPE)sl1[0]; - buffs[2][i] = (FTYPE)sl2[0]; - buffs[3][i] = (FTYPE)sl3[0]; - buffs[4][i] = (FTYPE)sl4[0]; - buffs[5][i] = (FTYPE)sl5[0]; - buffs[6][i] = (FTYPE)sl6[0]; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < swid; i++) { - buffs[0][i + dx_l] = (FTYPE)sl[i*chan1]; - buffs[1][i + dx_l] = (FTYPE)sl1[i*chan1]; - buffs[2][i + dx_l] = (FTYPE)sl2[i*chan1]; - buffs[3][i + dx_l] = (FTYPE)sl3[i*chan1]; - buffs[4][i + dx_l] = (FTYPE)sl4[i*chan1]; - buffs[5][i + dx_l] = (FTYPE)sl5[i*chan1]; - buffs[6][i + dx_l] = (FTYPE)sl6[i*chan1]; - } - - for (i = 0; i < dx_r; i++) { - buffs[0][swid + dx_l + i] = buffs[0][swid + dx_l - 1]; - buffs[1][swid + dx_l + i] = buffs[1][swid + dx_l - 1]; - buffs[2][swid + dx_l + i] = buffs[2][swid + dx_l - 1]; - buffs[3][swid + dx_l + i] = buffs[3][swid + dx_l - 1]; - buffs[4][swid + dx_l + i] = buffs[4][swid + dx_l - 1]; - buffs[5][swid + dx_l + i] = buffs[5][swid + dx_l - 1]; - buffs[6][swid + dx_l + i] = buffs[6][swid + dx_l - 1]; - } - - buff_ind = 0; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid; i++) buffd[i] = 0.0; - - if ((hgt - dy_b) > 1) sl = sl6 + sll; - else sl = sl6; - - for (j = 0; j < hgt; j++) { - FTYPE **buffc = buffs + buff_ind; - FTYPE *buffn = buffc[KSIZE]; - FTYPE *pk = k; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l]; - d64_2x32 dd; - - sp = sl; - dp = dl; - - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = *pk++; k1 = *pk++; k2 = *pk++; k3 = *pk++; - k4 = *pk++; k5 = *pk++; k6 = *pk++; - - if (l < (KSIZE - 1)) { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - buffd[i ] += p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6; - buffd[i + 1] += p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6; - } - - } else { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buffn[i + dx_l ] = (FTYPE)dd.i32s.i0; - buffn[i + dx_l + 1] = (FTYPE)dd.i32s.i1; - - d0 = D2I(p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6 + buffd[i ]); - d1 = D2I(p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - buffd[i ] = 0.0; - buffd[i + 1] = 0.0; - - sp += chan2; - dp += chan2; - } - } - } - - /* last pixels */ - for (; i < wid; i++) { - FTYPE *pk = k, s = 0; - mlib_s32 d0; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l] + i; - - for (m = 0; m < KSIZE; m++) s += buff[m] * (*pk++); - } - - d0 = D2I(s); - dp[0] = FROM_S32(d0); - - buffn[i + dx_l] = (FTYPE)sp[0]; - - sp += chan1; - dp += chan1; - } - - for (; i < swid; i++) { - buffn[i + dx_l] = (FTYPE)sp[0]; - sp += chan1; - } - - for (i = 0; i < dx_l; i++) buffn[i] = buffn[dx_l]; - for (i = 0; i < dx_r; i++) buffn[swid + dx_l + i] = buffn[swid + dx_l - 1]; - - /* next line */ - - if (j < hgt - dy_b - 2) sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= KSIZE + 1) buff_ind = 0; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* IMG_TYPE == 1 */ - /***************************************************************/ #define MAX_KER 7 #define MAX_N 15 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c index 2aebcb86bae..9bfbe939abb 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_ImageConv_u16nw.c @@ -143,9 +143,6 @@ typedef union { } f32s; } d64_2x32; -/***************************************************************/ -#define BUFF_LINE 256 - /***************************************************************/ #define DEF_VARS(type) \ type *adr_src, *sl, *sp = NULL; \ @@ -155,39 +152,6 @@ typedef union { mlib_s32 nchannel, chan1; \ mlib_s32 i, j, c -/***************************************************************/ -#define LOAD_KERNEL3() \ - FTYPE scalef = DSCALE; \ - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8; \ - FTYPE p00, p01, p02, p03, \ - p10, p11, p12, p13, \ - p20, p21, p22, p23; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - /* keep kernel in regs */ \ - k0 = scalef * kern[0]; k1 = scalef * kern[1]; k2 = scalef * kern[2]; \ - k3 = scalef * kern[3]; k4 = scalef * kern[4]; k5 = scalef * kern[5]; \ - k6 = scalef * kern[6]; k7 = scalef * kern[7]; k8 = scalef * kern[8] - -/***************************************************************/ -#define LOAD_KERNEL(SIZE) \ - FTYPE scalef = DSCALE; \ - \ - while (scalef_expon > 30) { \ - scalef /= (1 << 30); \ - scalef_expon -= 30; \ - } \ - \ - scalef /= (1 << scalef_expon); \ - \ - for (j = 0; j < SIZE; j++) k[j] = scalef * kern[j] - /***************************************************************/ #define GET_SRC_DST_PARAMETERS(type) \ hgt = mlib_ImageGetHeight(src); \ @@ -245,1162 +209,6 @@ typedef union { #endif /* IMG_TYPE == 1 */ #endif /* __sparc */ -/***************************************************************/ -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 2)*BUFF_LINE], *buff0, *buff1, *buff2, *buff3, *buffT; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2; -#ifndef __sparc - mlib_s32 d0, d1; -#endif /* __sparc */ - LOAD_KERNEL3(); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 2)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buffo = (mlib_s32*)(buff3 + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - FTYPE s0, s1; - - p02 = buff0[0]; - p12 = buff1[0]; - p22 = buff2[0]; - - p03 = buff0[1]; - p13 = buff1[1]; - p23 = buff2[1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp = sl; - dp = dl; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { -#ifdef __sparc -#ifdef _NO_LONGLONG - mlib_s32 o64_1, o64_2; -#else /* _NO_LONGLONG */ - mlib_s64 o64; -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - d64_2x32 dd; - - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff3[i ] = (FTYPE)dd.i32s.i0; - buff3[i + 1] = (FTYPE)dd.i32s.i1; - -#ifndef __sparc - d0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - d1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - -#else /* __sparc */ - - dd.i32s.i0 = D2I(s0 + p02 * k2 + p12 * k5 + p22 * k8); - dd.i32s.i1 = D2I(s1 + p02 * k1 + p03 * k2 + p12 * k4 + p13 * k5 + p22 * k7 + p23 * k8); - *(FTYPE *)(buffo + i) = dd.d64; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - -#ifdef _NO_LONGLONG - - o64_1 = buffo[i]; - o64_2 = buffo[i+1]; -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64_1), FROM_S32(o64_2)); -#else - STORE2(o64_1 >> 24, o64_2 >> 24); -#endif /* IMG_TYPE != 1 */ - -#else /* _NO_LONGLONG */ - - o64 = *(mlib_s64*)(buffo + i); -#if IMG_TYPE != 1 - STORE2(FROM_S32(o64 >> 32), FROM_S32(o64)); -#else - STORE2(o64 >> 56, o64 >> 24); -#endif /* IMG_TYPE != 1 */ -#endif /* _NO_LONGLONG */ -#endif /* __sparc */ - - sp += chan2; - dp += chan2; - } - - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; - - buffi[i] = (mlib_s32)sp[0]; - buff3[i] = (FTYPE)buffi[i]; - -#ifndef __sparc - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); - - dp[0] = FROM_S32(d0); - -#else /* __sparc */ - - buffo[i] = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p10 * k3 + p11 * k4 + - p12 * k5 + p20 * k6 + p21 * k7 + p22 * k8); -#if IMG_TYPE != 1 - dp[0] = FROM_S32(buffo[i]); -#else - dp[0] = buffo[i] >> 24; -#endif /* IMG_TYPE != 1 */ -#endif /* __sparc */ - - sp += chan1; - dp += chan1; - } - - buffi[wid] = (mlib_s32)sp[0]; - buff3[wid] = (FTYPE)buffi[wid]; - buffi[wid + 1] = (mlib_s32)sp[chan1]; - buff3[wid + 1] = (FTYPE)buffi[wid + 1]; - - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buffT; - } - } - -#ifdef __sparc -#if IMG_TYPE == 1 - { - mlib_s32 amask = (1 << nchannel) - 1; - - if ((cmask & amask) != amask) { - mlib_ImageXor80(adr_dst, wid, hgt, dll, nchannel, cmask); - } else { - mlib_ImageXor80_aa(adr_dst, wid*nchannel, hgt, dll); - } - } - -#endif /* IMG_TYPE == 1 */ -#endif /* __sparc */ - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(3x3)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - DTYPE *adr_src, *sl, *sp0, *sp1, *sp2; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2; - mlib_s32 i, j, c; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8; - mlib_s32 p02, p03, - p12, p13, - p22, p23; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - /* keep kernel in regs */ - k0 = kern[0] >> shift1; k1 = kern[1] >> shift1; k2 = kern[2] >> shift1; - k3 = kern[3] >> shift1; k4 = kern[4] >> shift1; k5 = kern[5] >> shift1; - k6 = kern[6] >> shift1; k7 = kern[7] >> shift1; k8 = kern[8] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - mlib_s32 s0, s1; - mlib_s32 pix0, pix1; - - dp = dl; - sp0 = sl; - sp1 = sp0 + sll; - sp2 = sp1 + sll; - - p02 = sp0[0]; - p12 = sp1[0]; - p22 = sp2[0]; - - p03 = sp0[chan1]; - p13 = sp1[chan1]; - p23 = sp2[chan1]; - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; p23 = sp2[chan1]; - - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - pix1 = (s1 + p02 * k1 + p03 * k2 + p12 * k4 + - p13 * k5 + p22 * k7 + p23 * k8) >> shift2; - - CLAMP_STORE(dp[0], pix0); - CLAMP_STORE(dp[chan1], pix1); - - s0 = p02 * k0 + p03 * k1 + p12 * k3 + p13 * k4 + p22 * k6 + p23 * k7; - s1 = p03 * k0 + p13 * k3 + p23 * k6; - - sp0 += chan2; - sp1 += chan2; - sp2 += chan2; - dp += chan2; - } - - if (wid & 1) { - p02 = sp0[0]; p12 = sp1[0]; p22 = sp2[0]; - pix0 = (s0 + p02 * k2 + p12 * k5 + p22 * k8) >> shift2; - CLAMP_STORE(dp[0], pix0); - } - - sl += sll; - dl += dll; - } - } - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#undef KSIZE -#define KSIZE 4 - -mlib_status CONV_FUNC(4x4)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7; - FTYPE p00, p01, p02, p03, p04, - p10, p11, p12, p13, p14, - p20, p21, p22, p23, - p30, p31, p32, p33; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2, *sl3; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buff4 = buff3 + wid; - buffd = buff4 + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - buff3[i] = (FTYPE)sl3[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop on two first lines of kernel - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; - k4 = k[4]; k5 = k[5]; k6 = k[6]; k7 = k[7]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff1[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buff4[i ] = (FTYPE)dd.i32s.i0; - buff4[i + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7); - - sp += chan2; - dp += chan2; - } - - /* - * Second loop on two last lines of kernel - */ - k0 = k[ 8]; k1 = k[ 9]; k2 = k[10]; k3 = k[11]; - k4 = k[12]; k5 = k[13]; k6 = k[14]; k7 = k[15]; - - sp = sl; - dp = dl; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + - p10 * k4 + p11 * k5 + p12 * k6 + p13 * k7 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + - p11 * k4 + p12 * k5 + p13 * k6 + p14 * k7 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - sp += chan2; - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - - buff4[i] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + - p10 * k[4] + p11 * k[5] + p12 * k[6] + p13 * k[7] + - p20 * k[ 8] + p21 * k[ 9] + p22 * k[10] + p23 * k[11] + - p30 * k[12] + p31 * k[13] + p32 * k[14] + p33 * k[15]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - buff4[wid ] = (FTYPE)sp[0]; - buff4[wid + 1] = (FTYPE)sp[chan1]; - buff4[wid + 2] = (FTYPE)sp[chan2]; - - /* next line */ - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 5 - -mlib_status CONV_FUNC(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE]; - FTYPE *buff0, *buff1, *buff2, *buff3, *buff4, *buff5, *buffd, *buffT; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - FTYPE p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15, - p20, p21, p22, p23, p24, - p30, p31, p32, p33, p34, - p40, p41, p42, p43, p44; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - DTYPE *sl2, *sl3, *sl4; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buff0 = pbuff; - buff1 = buff0 + wid; - buff2 = buff1 + wid; - buff3 = buff2 + wid; - buff4 = buff3 + wid; - buff5 = buff4 + wid; - buffd = buff5 + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; - sl4 = sl3 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buff0[i] = (FTYPE)sl[i*chan1]; - buff1[i] = (FTYPE)sl1[i*chan1]; - buff2[i] = (FTYPE)sl2[i*chan1]; - buff3[i] = (FTYPE)sl3[i*chan1]; - buff4[i] = (FTYPE)sl4[i*chan1]; - } - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - d64_2x32 dd; - - /* - * First loop - */ - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - sp = sl; - dp = dl; - - p02 = buff0[0]; - p12 = buff1[0]; - p03 = buff0[1]; - p13 = buff1[1]; - p04 = buff0[2]; - p14 = buff1[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - - LOAD_BUFF(buffi); - - p03 = buff0[i + 3]; p13 = buff1[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; - p05 = buff0[i + 5]; p15 = buff1[i + 5]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - dp += chan2; - } - - /* - * Second loop - */ - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - sp = sl; - dp = dl; - - p02 = buff2[0]; - p12 = buff3[0]; - p03 = buff2[1]; - p13 = buff3[1]; - p04 = buff2[2]; - p14 = buff3[2]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - - p02 = buff2[i + 2]; p12 = buff3[i + 2]; - p03 = buff2[i + 3]; p13 = buff3[i + 3]; - p04 = buff2[i + 4]; p14 = buff3[i + 4]; - p05 = buff2[i + 5]; p15 = buff3[i + 5]; - - dd.d64 = *(FTYPE *)(buffi + i); - buff5[i ] = (FTYPE)dd.i32s.i0; - buff5[i + 1] = (FTYPE)dd.i32s.i1; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp += chan2; - dp += chan2; - } - - /* - * 3 loop - */ - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - sp = sl; - dp = dl; - - p02 = buff4[0]; - p03 = buff4[1]; - p04 = buff4[2]; - p05 = buff4[3]; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = buff4[i + 4]; p05 = buff4[i + 5]; - - d0 = D2I(p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + buffd[i]); - d1 = D2I(p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - sp += chan2; - dp += chan2; - } - - /* last pixels */ - for (; i < wid; i++) { - p00 = buff0[i]; p10 = buff1[i]; p20 = buff2[i]; p30 = buff3[i]; - p01 = buff0[i + 1]; p11 = buff1[i + 1]; p21 = buff2[i + 1]; p31 = buff3[i + 1]; - p02 = buff0[i + 2]; p12 = buff1[i + 2]; p22 = buff2[i + 2]; p32 = buff3[i + 2]; - p03 = buff0[i + 3]; p13 = buff1[i + 3]; p23 = buff2[i + 3]; p33 = buff3[i + 3]; - p04 = buff0[i + 4]; p14 = buff1[i + 4]; p24 = buff2[i + 4]; p34 = buff3[i + 4]; - - p40 = buff4[i]; p41 = buff4[i + 1]; p42 = buff4[i + 2]; - p43 = buff4[i + 3]; p44 = buff4[i + 4]; - - buff5[i] = (FTYPE)sp[0]; - - buffo[i] = D2I(p00 * k[0] + p01 * k[1] + p02 * k[2] + p03 * k[3] + p04 * k[4] + - p10 * k[5] + p11 * k[6] + p12 * k[7] + p13 * k[8] + p14 * k[9] + - p20 * k[10] + p21 * k[11] + p22 * k[12] + p23 * k[13] + p24 * k[14] + - p30 * k[15] + p31 * k[16] + p32 * k[17] + p33 * k[18] + p34 * k[19] + - p40 * k[20] + p41 * k[21] + p42 * k[22] + p43 * k[23] + p44 * k[24]); - - dp[0] = FROM_S32(buffo[i]); - - sp += chan1; - dp += chan1; - } - - buff5[wid ] = (FTYPE)sp[0]; - buff5[wid + 1] = (FTYPE)sp[chan1]; - buff5[wid + 2] = (FTYPE)sp[chan2]; - buff5[wid + 3] = (FTYPE)sp[chan2 + chan1]; - - /* next line */ - sl += sll; - dl += dll; - - buffT = buff0; - buff0 = buff1; - buff1 = buff2; - buff2 = buff3; - buff3 = buff4; - buff4 = buff5; - buff5 = buffT; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#ifndef __sparc /* for x86, using integer multiplies is faster */ - -mlib_status CONV_FUNC_I(5x5)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - mlib_s32 buff[BUFF_LINE]; - mlib_s32 *buffd; - mlib_s32 k[KSIZE*KSIZE]; - mlib_s32 shift1, shift2; - mlib_s32 k0, k1, k2, k3, k4, k5, k6, k7, k8, k9; - mlib_s32 p00, p01, p02, p03, p04, p05, - p10, p11, p12, p13, p14, p15; - DTYPE *adr_src, *sl, *sp0, *sp1; - DTYPE *adr_dst, *dl, *dp; - mlib_s32 *pbuff = buff; - mlib_s32 wid, hgt, sll, dll; - mlib_s32 nchannel, chan1, chan2, chan3, chan4; - mlib_s32 i, j, c; - -#if IMG_TYPE != 1 - shift1 = 16; -#else - shift1 = 8; -#endif /* IMG_TYPE != 1 */ - - shift2 = scalef_expon - shift1; - - for (j = 0; j < KSIZE*KSIZE; j++) k[j] = kern[j] >> shift1; - - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc(sizeof(mlib_s32)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - buffd = pbuff; - - chan1 = nchannel; - chan2 = chan1 + chan1; - chan3 = chan2 + chan1; - chan4 = chan3 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < chan1; c++) { - if (!(cmask & (1 << (chan1 - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - for (j = 0; j < hgt; j++) { - mlib_s32 pix0, pix1; - /* - * First loop - */ - sp0 = sl; - sp1 = sp0 + sll; - dp = dl; - - k0 = k[0]; k1 = k[1]; k2 = k[2]; k3 = k[3]; k4 = k[4]; - k5 = k[5]; k6 = k[6]; k7 = k[7]; k8 = k[8]; k9 = k[9]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] = (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] = (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * Second loop - */ - sp0 = sl + 2*sll; - sp1 = sp0 + sll; - dp = dl; - - k0 = k[10]; k1 = k[11]; k2 = k[12]; k3 = k[13]; k4 = k[14]; - k5 = k[15]; k6 = k[16]; k7 = k[17]; k8 = k[18]; k9 = k[19]; - - p02 = sp0[0]; p12 = sp1[0]; - p03 = sp0[chan1]; p13 = sp1[chan1]; - p04 = sp0[chan2]; p14 = sp1[chan2]; - p05 = sp0[chan3]; p15 = sp1[chan3]; - - sp0 += chan4; - sp1 += chan4; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - p05 = sp0[chan1]; p15 = sp1[chan1]; - - buffd[i ] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - buffd[i + 1] += (p01 * k0 + p02 * k1 + p03 * k2 + p04 * k3 + p05 * k4 + - p11 * k5 + p12 * k6 + p13 * k7 + p14 * k8 + p15 * k9); - - sp0 += chan2; - sp1 += chan2; - dp += chan2; - } - - if (wid & 1) { - p00 = p02; p10 = p12; - p01 = p03; p11 = p13; - p02 = p04; p12 = p14; - p03 = p05; p13 = p15; - - p04 = sp0[0]; p14 = sp1[0]; - - buffd[i] += (p00 * k0 + p01 * k1 + p02 * k2 + p03 * k3 + p04 * k4 + - p10 * k5 + p11 * k6 + p12 * k7 + p13 * k8 + p14 * k9); - } - - /* - * 3 loop - */ - dp = dl; - sp0 = sl + 4*sll; - - k0 = k[20]; k1 = k[21]; k2 = k[22]; k3 = k[23]; k4 = k[24]; - - p02 = sp0[0]; - p03 = sp0[chan1]; - p04 = sp0[chan2]; - p05 = sp0[chan3]; - - sp0 += chan2 + chan2; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; p05 = sp0[chan1]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - pix1 = (buffd[i + 1] + p01 * k0 + p02 * k1 + p03 * k2 + - p04 * k3 + p05 * k4) >> shift2; - - CLAMP_STORE(dp[0], pix0); - CLAMP_STORE(dp[chan1], pix1); - - dp += chan2; - sp0 += chan2; - } - - if (wid & 1) { - p00 = p02; p01 = p03; p02 = p04; p03 = p05; - - p04 = sp0[0]; - - pix0 = (buffd[i ] + p00 * k0 + p01 * k1 + p02 * k2 + - p03 * k3 + p04 * k4) >> shift2; - CLAMP_STORE(dp[0], pix0); - } - - /* next line */ - sl += sll; - dl += dll; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* __sparc ( for x86, using integer multiplies is faster ) */ - -/***************************************************************/ -#if IMG_TYPE == 1 - -#undef KSIZE -#define KSIZE 7 - -mlib_status CONV_FUNC(7x7)(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scalef_expon, - mlib_s32 cmask) -{ - FTYPE buff[(KSIZE + 3)*BUFF_LINE], *buffs[2*(KSIZE + 1)], *buffd; - FTYPE k[KSIZE*KSIZE]; - mlib_s32 l, m, buff_ind; - mlib_s32 d0, d1; - FTYPE k0, k1, k2, k3, k4, k5, k6; - FTYPE p0, p1, p2, p3, p4, p5, p6, p7; - DTYPE *sl2, *sl3, *sl4, *sl5, *sl6; - DEF_VARS(DTYPE); - DTYPE *sl1; - mlib_s32 chan2; - mlib_s32 *buffo, *buffi; - LOAD_KERNEL(KSIZE*KSIZE); - GET_SRC_DST_PARAMETERS(DTYPE); - - if (wid > BUFF_LINE) { - pbuff = mlib_malloc((KSIZE + 3)*sizeof(FTYPE)*wid); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - for (l = 0; l < KSIZE + 1; l++) buffs[l] = pbuff + l*wid; - for (l = 0; l < KSIZE + 1; l++) buffs[l + (KSIZE + 1)] = buffs[l]; - buffd = buffs[KSIZE] + wid; - buffo = (mlib_s32*)(buffd + wid); - buffi = buffo + (wid &~ 1); - - chan1 = nchannel; - chan2 = chan1 + chan1; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - - adr_dst += ((KSIZE - 1)/2)*(dll + chan1); - - for (c = 0; c < nchannel; c++) { - if (!(cmask & (1 << (nchannel - 1 - c)))) continue; - - sl = adr_src + c; - dl = adr_dst + c; - - sl1 = sl + sll; - sl2 = sl1 + sll; - sl3 = sl2 + sll; - sl4 = sl3 + sll; - sl5 = sl4 + sll; - sl6 = sl5 + sll; -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid + (KSIZE - 1); i++) { - buffs[0][i] = (FTYPE)sl[i*chan1]; - buffs[1][i] = (FTYPE)sl1[i*chan1]; - buffs[2][i] = (FTYPE)sl2[i*chan1]; - buffs[3][i] = (FTYPE)sl3[i*chan1]; - buffs[4][i] = (FTYPE)sl4[i*chan1]; - buffs[5][i] = (FTYPE)sl5[i*chan1]; - buffs[6][i] = (FTYPE)sl6[i*chan1]; - } - - buff_ind = 0; - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i < wid; i++) buffd[i] = 0.0; - - sl += KSIZE*sll; - - for (j = 0; j < hgt; j++) { - FTYPE **buffc = buffs + buff_ind; - FTYPE *buffn = buffc[KSIZE]; - FTYPE *pk = k; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l]; - d64_2x32 dd; - - sp = sl; - dp = dl; - - p2 = buff[0]; p3 = buff[1]; p4 = buff[2]; - p5 = buff[3]; p6 = buff[4]; p7 = buff[5]; - - k0 = *pk++; k1 = *pk++; k2 = *pk++; k3 = *pk++; - k4 = *pk++; k5 = *pk++; k6 = *pk++; - - if (l < (KSIZE - 1)) { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - buffd[i ] += p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6; - buffd[i + 1] += p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6; - } - - } else { -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (i = 0; i <= (wid - 2); i += 2) { - p0 = p2; p1 = p3; p2 = p4; p3 = p5; p4 = p6; p5 = p7; - - p6 = buff[i + 6]; p7 = buff[i + 7]; - - LOAD_BUFF(buffi); - - dd.d64 = *(FTYPE *)(buffi + i); - buffn[i ] = (FTYPE)dd.i32s.i0; - buffn[i + 1] = (FTYPE)dd.i32s.i1; - - d0 = D2I(p0*k0 + p1*k1 + p2*k2 + p3*k3 + p4*k4 + p5*k5 + p6*k6 + buffd[i ]); - d1 = D2I(p1*k0 + p2*k1 + p3*k2 + p4*k3 + p5*k4 + p6*k5 + p7*k6 + buffd[i + 1]); - - dp[0 ] = FROM_S32(d0); - dp[chan1] = FROM_S32(d1); - - buffd[i ] = 0.0; - buffd[i + 1] = 0.0; - - sp += chan2; - dp += chan2; - } - } - } - - /* last pixels */ - for (; i < wid; i++) { - FTYPE *pk = k, s = 0; - mlib_s32 d0; - - for (l = 0; l < KSIZE; l++) { - FTYPE *buff = buffc[l] + i; - - for (m = 0; m < KSIZE; m++) s += buff[m] * (*pk++); - } - - d0 = D2I(s); - dp[0] = FROM_S32(d0); - - buffn[i] = (FTYPE)sp[0]; - - sp += chan1; - dp += chan1; - } - - for (l = 0; l < (KSIZE - 1); l++) buffn[wid + l] = sp[l*chan1]; - - /* next line */ - sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= KSIZE + 1) buff_ind = 0; - } - } - - if (pbuff != buff) mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -#endif /* IMG_TYPE == 1 */ - /***************************************************************/ #define MAX_KER 7 #define MAX_N 15 diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageAffineIndex_BC.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageAffineIndex_BC.c deleted file mode 100644 index cd763f534a4..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageAffineIndex_BC.c +++ /dev/null @@ -1,413 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -#include "mlib_image.h" -#include "mlib_ImageAffine.h" -#include "mlib_ImageColormap.h" - -/***************************************************************/ -#define MLIB_LIMIT 512 -#define MLIB_SHIFT 16 -#define MLIB_PREC (1 << MLIB_SHIFT) -#define MLIB_MASK (MLIB_PREC - 1) - -/***************************************************************/ -#define DTYPE MLIB_TYPE - -/***************************************************************/ -#define DECLAREVAR_IND() \ - DECLAREVAR0(); \ - mlib_s32 *warp_tbl = param -> warp_tbl; \ - mlib_s32 xSrc, ySrc; \ - mlib_s32 srcYStride = param -> srcYStride; \ - mlib_s32 max_xsize = param -> max_xsize; \ - mlib_filter filter = param -> filter; \ - MLIB_TYPE *sp, *dl; \ - mlib_d64 xf0, xf1, xf2, xf3; \ - mlib_d64 yf0, yf1, yf2, yf3; \ - mlib_d64 c0, c1, c2, c3, val0; \ - mlib_s32 filterpos; \ - mlib_f32 *fptr; \ - mlib_d64 s0, s1, s2, s3; \ - mlib_s32 i, size - -/***************************************************************/ -#define GET_FILTERS_KOEF() \ - filterpos = (X >> FILTER_SHIFT) & FILTER_MASK; \ - fptr = (mlib_f32 *) ((mlib_u8 *)mlib_filters_table + filterpos); \ - \ - xf0 = fptr[0]; \ - xf1 = fptr[1]; \ - xf2 = fptr[2]; \ - xf3 = fptr[3]; \ - \ - filterpos = (Y >> FILTER_SHIFT) & FILTER_MASK; \ - fptr = (mlib_f32 *) ((mlib_u8 *)mlib_filters_table + filterpos); \ - \ - yf0 = fptr[0]; \ - yf1 = fptr[1]; \ - yf2 = fptr[2]; \ - yf3 = fptr[3] - -/***************************************************************/ -#define GET_POINTER() \ - xSrc = (X >> MLIB_SHIFT)-1; \ - ySrc = (Y >> MLIB_SHIFT)-1; \ - sp = ((MLIB_TYPE **)lineAddr)[ySrc] + xSrc - -/***************************************************************/ -#define LOAD_FIRST_ROW(nchan, chan) \ - s0 = *(lut + sp[0]*nchan + chan); \ - s1 = *(lut + sp[1]*nchan + chan); \ - s2 = *(lut + sp[2]*nchan + chan); \ - s3 = *(lut + sp[3]*nchan + chan) - -/***************************************************************/ -#define COUNT_NEXT_ROW(dst, nchan, chan) \ - sp = (MLIB_TYPE*)((mlib_addr)sp + srcYStride); \ - dst = ((*(lut + sp[0]*nchan + chan))*xf0 + \ - (*(lut + sp[1]*nchan + chan))*xf1 + \ - (*(lut + sp[2]*nchan + chan))*xf2 + \ - (*(lut + sp[3]*nchan + chan))*xf3) - -/***************************************************************/ -#ifdef MLIB_USE_FTOI_CLAMPING - -/***********/ -#define STORE_SAT_VALUE_U8(ind) \ - dp[ind] = ((mlib_s32)(val0 - (mlib_d64)0x7F800000) >> 24) ^ 0x80 - -/***********/ -#define STORE_SAT_VALUE_S16(ind) \ - dp[ind] = ((mlib_s32)(val0)) >> 16 - -#else - -/***********/ -#define STORE_SAT_VALUE_U8(ind) \ - val0 -= (mlib_d64)0x7F800000; \ - if (val0 >= MLIB_S32_MAX) \ - dp[ind] = MLIB_U8_MAX; \ - else if (val0 <= MLIB_S32_MIN) \ - dp[ind] = MLIB_U8_MIN; \ - else \ - dp[ind] = ((mlib_s32)val0 >> 24) ^ 0x80 - -/***********/ -#define STORE_SAT_VALUE_S16(ind) \ - if (val0 >= MLIB_S32_MAX) \ - dp[ind] = MLIB_S16_MAX; \ - else if (val0 <= MLIB_S32_MIN) \ - dp[ind] = MLIB_S16_MIN; \ - else \ - dp[ind] = (mlib_s32)val0 >> 16 - -#endif /* MLIB_USE_FTOI_CLAMPING */ - -/***************************************************************/ -#define MAKE_BC_3CH(lut_format) \ - X += dX; \ - Y += dY; \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 3, 0); \ - COUNT_NEXT_ROW(c2, 3, 0); \ - COUNT_NEXT_ROW(c3, 3, 0); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(3, 1); \ - STORE_SAT_VALUE_##lut_format(0); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 3, 1); \ - COUNT_NEXT_ROW(c2, 3, 1); \ - COUNT_NEXT_ROW(c3, 3, 1); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(3, 2); \ - STORE_SAT_VALUE_##lut_format(1); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 3, 2); \ - COUNT_NEXT_ROW(c2, 3, 2); \ - COUNT_NEXT_ROW(c3, 3, 2); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - GET_FILTERS_KOEF(); \ - GET_POINTER(); \ - LOAD_FIRST_ROW(3, 0); \ - STORE_SAT_VALUE_##lut_format(2); - -/***************************************************************/ -#define MAKE_LAST_PIXEL_BC_3CH(lut_format) \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 3, 0); \ - COUNT_NEXT_ROW(c2, 3, 0); \ - COUNT_NEXT_ROW(c3, 3, 0); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(3, 1); \ - STORE_SAT_VALUE_##lut_format(0); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 3, 1); \ - COUNT_NEXT_ROW(c2, 3, 1); \ - COUNT_NEXT_ROW(c3, 3, 1); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(3, 2); \ - STORE_SAT_VALUE_##lut_format(1); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 3, 2); \ - COUNT_NEXT_ROW(c2, 3, 2); \ - COUNT_NEXT_ROW(c3, 3, 2); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - STORE_SAT_VALUE_##lut_format(2); - -/***************************************************************/ -#define MAKE_BC_4CH(lut_format) \ - X += dX; \ - Y += dY; \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 4, 0); \ - COUNT_NEXT_ROW(c2, 4, 0); \ - COUNT_NEXT_ROW(c3, 4, 0); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(4, 1); \ - STORE_SAT_VALUE_##lut_format(0); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 4, 1); \ - COUNT_NEXT_ROW(c2, 4, 1); \ - COUNT_NEXT_ROW(c3, 4, 1); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(4, 2); \ - STORE_SAT_VALUE_##lut_format(1); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 4, 2); \ - COUNT_NEXT_ROW(c2, 4, 2); \ - COUNT_NEXT_ROW(c3, 4, 2); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(4, 3); \ - STORE_SAT_VALUE_##lut_format(2); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 4, 3); \ - COUNT_NEXT_ROW(c2, 4, 3); \ - COUNT_NEXT_ROW(c3, 4, 3); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - GET_FILTERS_KOEF(); \ - GET_POINTER(); \ - LOAD_FIRST_ROW(4, 0); \ - STORE_SAT_VALUE_##lut_format(3); - -/***************************************************************/ -#define MAKE_LAST_PIXEL_BC_4CH(lut_format) \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 4, 0); \ - COUNT_NEXT_ROW(c2, 4, 0); \ - COUNT_NEXT_ROW(c3, 4, 0); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(4, 1); \ - STORE_SAT_VALUE_##lut_format(0); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 4, 1); \ - COUNT_NEXT_ROW(c2, 4, 1); \ - COUNT_NEXT_ROW(c3, 4, 1); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(4, 2); \ - STORE_SAT_VALUE_##lut_format(1); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 4, 2); \ - COUNT_NEXT_ROW(c2, 4, 2); \ - COUNT_NEXT_ROW(c3, 4, 2); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - sp = (MLIB_TYPE*)((mlib_addr)sp - 3*srcYStride); \ - LOAD_FIRST_ROW(4, 3); \ - STORE_SAT_VALUE_##lut_format(2); \ - c0 = (s0*xf0 + s1*xf1 + s2*xf2 + s3*xf3); \ - COUNT_NEXT_ROW(c1, 4, 3); \ - COUNT_NEXT_ROW(c2, 4, 3); \ - COUNT_NEXT_ROW(c3, 4, 3); \ - val0 = (c0*yf0 + c1*yf1 + c2*yf2 + c3*yf3); \ - STORE_SAT_VALUE_##lut_format(3); - -/***************************************************************/ -#define FILTER_U8 ((filter == MLIB_BICUBIC) ? mlib_filters_u8f_bc : mlib_filters_u8f_bc2) -#define FILTER_S16 ((filter == MLIB_BICUBIC) ? mlib_filters_s16f_bc : mlib_filters_s16f_bc2) - -/***************************************************************/ -#define mlib_U8 mlib_u8 -#define mlib_S16 mlib_s16 - -/***************************************************************/ -#define FUNC_AFFINEINDEX_BC_0(ITYPE, LTYPE, NCHAN) \ - mlib_status mlib_ImageAffineIndex_##ITYPE##_##LTYPE##_##NCHAN##CH_BC(mlib_affine_param *param, \ - const void *colormap) \ - { \ - DECLAREVAR_IND(); \ - mlib_##LTYPE buff_lcl[NCHAN * MLIB_LIMIT], *pbuff = buff_lcl, *dp; \ - mlib_d64 *lut = ((mlib_d64*)mlib_ImageGetLutDoubleData(colormap) - \ - NCHAN * mlib_ImageGetLutOffset(colormap)); \ - const mlib_f32 *mlib_filters_table = FILTER_##LTYPE; \ - \ - if (max_xsize > MLIB_LIMIT) { \ - pbuff = mlib_malloc(NCHAN * sizeof(mlib_##LTYPE) * max_xsize); \ - if (pbuff == NULL) return MLIB_FAILURE; \ - } \ - \ - for (j = yStart; j <= yFinish; j++) { \ - \ - NEW_LINE(1); \ - dp = pbuff; \ - \ - GET_FILTERS_KOEF(); \ - GET_POINTER(); \ - LOAD_FIRST_ROW(NCHAN, 0); - - /* pragma pipeloop(0) must be here */ - -/***************************************************************/ -#define FUNC_AFFINEINDEX_BC_1(ITYPE, LTYPE, NCHAN) \ - \ - for (i = 0; i < (xRight - xLeft); i++, dp += NCHAN) { \ - MAKE_BC_##NCHAN##CH(LTYPE); \ - } \ - \ - MAKE_LAST_PIXEL_BC_##NCHAN##CH(LTYPE); \ - \ - mlib_ImageColorTrue2IndexLine_##LTYPE##_##ITYPE##_##NCHAN \ - (pbuff, dl, xRight - xLeft + 1, colormap); \ - } \ - \ - if (pbuff != buff_lcl) mlib_free(pbuff); \ - \ - return MLIB_SUCCESS; \ - } - -/***************************************************************/ -#undef MLIB_TYPE -#define MLIB_TYPE mlib_u8 - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 4 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 8) - 1) << 4) - -FUNC_AFFINEINDEX_BC_0(U8, U8, 3) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BC_1(U8, U8, 3) - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 3 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 9) - 1) << 4) - -FUNC_AFFINEINDEX_BC_0(U8, S16, 3) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BC_1(U8, S16, 3) - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 4 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 8) - 1) << 4) - -FUNC_AFFINEINDEX_BC_0(U8, U8, 4) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BC_1(U8, U8, 4) - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 3 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 9) - 1) << 4) - -FUNC_AFFINEINDEX_BC_0(U8, S16, 4) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BC_1(U8, S16, 4) - -/***************************************************************/ -#undef MLIB_TYPE -#define MLIB_TYPE mlib_s16 - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 4 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 8) - 1) << 4) - -FUNC_AFFINEINDEX_BC_0(S16, U8, 3) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BC_1(S16, U8, 3) - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 3 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 9) - 1) << 4) - -FUNC_AFFINEINDEX_BC_0(S16, S16, 3) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BC_1(S16, S16, 3) - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 4 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 8) - 1) << 4) - -FUNC_AFFINEINDEX_BC_0(S16, U8, 4) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BC_1(S16, U8, 4) - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 3 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 9) - 1) << 4) - -FUNC_AFFINEINDEX_BC_0(S16, S16, 4) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BC_1(S16, S16, 4) - -/***************************************************************/ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageAffineIndex_BL.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageAffineIndex_BL.c deleted file mode 100644 index 83ef3e5b1f5..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageAffineIndex_BL.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -#include "mlib_image.h" -#include "mlib_ImageAffine.h" -#include "mlib_ImageColormap.h" - -/***************************************************************/ -#define MLIB_LIMIT 512 - -/***************************************************************/ -#define DTYPE MLIB_TYPE - -/***************************************************************/ -#define DECLAREVAR_IND() \ - DECLAREVAR0(); \ - mlib_s32 *warp_tbl = param -> warp_tbl; \ - mlib_s32 xSrc, ySrc; \ - mlib_s32 srcYStride = param -> srcYStride; \ - mlib_s32 max_xsize = param -> max_xsize; \ - MLIB_TYPE *sp0, *sp1; \ - MLIB_TYPE *dl; \ - mlib_d64 scale = 1.0 / 65536.0; \ - mlib_s32 i, size - -/***************************************************************/ -#define DECLARE_INTERNAL_VAR_3CH() \ - mlib_d64 fdx, fdy; \ - mlib_d64 a00_0, a01_0, a10_0, a11_0; \ - mlib_d64 a00_1, a01_1, a10_1, a11_1; \ - mlib_d64 a00_2, a01_2, a10_2, a11_2; \ - mlib_d64 pix0_0, pix1_0, res0; \ - mlib_d64 pix0_1, pix1_1, res1; \ - mlib_d64 pix0_2, pix1_2, res2 - -/***************************************************************/ -#define DECLARE_INTERNAL_VAR_4CH() \ - mlib_d64 fdx, fdy; \ - mlib_d64 a00_0, a01_0, a10_0, a11_0; \ - mlib_d64 a00_1, a01_1, a10_1, a11_1; \ - mlib_d64 a00_2, a01_2, a10_2, a11_2; \ - mlib_d64 a00_3, a01_3, a10_3, a11_3; \ - mlib_d64 pix0_0, pix1_0, res0; \ - mlib_d64 pix0_1, pix1_1, res1; \ - mlib_d64 pix0_2, pix1_2, res2; \ - mlib_d64 pix0_3, pix1_3, res3 - -/***************************************************************/ -#define GET_PIXELS_POINTERS() \ - fdx = (X & MLIB_MASK) * scale; \ - fdy = (Y & MLIB_MASK) * scale; \ - ySrc = MLIB_POINTER_SHIFT(Y); Y += dY; \ - xSrc = X >> MLIB_SHIFT; X += dX; \ - sp0 = MLIB_POINTER_GET(lineAddr, ySrc) + xSrc; \ - sp1 = (MLIB_TYPE *)((mlib_u8 *)sp0 + srcYStride) - -/***************************************************************/ -#define GET_COLOR_POINTERS(ind) \ - pcolor00 = (lut + sp0[0]*ind); \ - pcolor10 = (lut + sp1[0]*ind); \ - pcolor01 = (lut + sp0[1]*ind); \ - pcolor11 = (lut + sp1[1]*ind) - -/***************************************************************/ -#define COUNT_BL_U8(ind) \ - pix0_##ind = a00_##ind + fdy * (a10_##ind - a00_##ind); \ - pix1_##ind = a01_##ind + fdy * (a11_##ind - a01_##ind); \ - res##ind = pix0_##ind + fdx * (pix1_##ind - pix0_##ind) + 0.5 - -/***************************************************************/ -#define COUNT_BL_U8_3CH() \ - COUNT_BL_U8(0); \ - COUNT_BL_U8(1); \ - COUNT_BL_U8(2); - -/***************************************************************/ -#define COUNT_BL_U8_4CH() \ - COUNT_BL_U8_3CH(); \ - COUNT_BL_U8(3); - -/***************************************************************/ -#define COUNT_BL_S16(ind) \ - pix0_##ind = a00_##ind + fdy * (a10_##ind - a00_##ind); \ - pix1_##ind = a01_##ind + fdy * (a11_##ind - a01_##ind); \ - res##ind = pix0_##ind + fdx * (pix1_##ind - pix0_##ind) - -/***************************************************************/ -#define COUNT_BL_S16_3CH() \ - COUNT_BL_S16(0); \ - COUNT_BL_S16(1); \ - COUNT_BL_S16(2); - -/***************************************************************/ -#define COUNT_BL_S16_4CH() \ - COUNT_BL_S16_3CH(); \ - COUNT_BL_S16(3); - -/***************************************************************/ -#define LOAD(ind) \ - a00_##ind = pcolor00[ind]; \ - a01_##ind = pcolor01[ind]; \ - a10_##ind = pcolor10[ind]; \ - a11_##ind = pcolor11[ind] - -/***************************************************************/ -#define LOAD_3CH() \ - LOAD(0); \ - LOAD(1); \ - LOAD(2); - -/***************************************************************/ -#define LOAD_4CH() \ - LOAD_3CH(); \ - LOAD(3); - -/***************************************************************/ -#define STORE_INTO_INTERM_BUF_3CH(LTYPE) \ - dp[0] = (mlib_##LTYPE)res0; \ - dp[1] = (mlib_##LTYPE)res1; \ - dp[2] = (mlib_##LTYPE)res2 - -/***************************************************************/ -#define STORE_INTO_INTERM_BUF_4CH(LTYPE) \ - dp[0] = (mlib_##LTYPE)res0; \ - dp[1] = (mlib_##LTYPE)res1; \ - dp[2] = (mlib_##LTYPE)res2; \ - dp[3] = (mlib_##LTYPE)res3 - -/***************************************************************/ -#undef MLIB_TYPE -#define MLIB_TYPE mlib_u8 - -/***************************************************************/ -#define mlib_U8 mlib_u8 -#define mlib_S16 mlib_s16 - -/***************************************************************/ -#define FUNC_AFFINEINDEX_BL_0(ITYPE, LTYPE, NCHAN) \ - mlib_status mlib_ImageAffineIndex_##ITYPE##_##LTYPE##_##NCHAN##CH_BL(mlib_affine_param *param, \ - const void *colormap) \ - { \ - DECLAREVAR_IND(); \ - mlib_##LTYPE *dp, buff_lcl[NCHAN*MLIB_LIMIT], *pbuff = buff_lcl; \ - mlib_d64 *pcolor00, *pcolor10, *pcolor01, *pcolor11; \ - mlib_d64 *lut = mlib_ImageGetLutDoubleData(colormap); \ - \ - lut -= NCHAN*mlib_ImageGetLutOffset(colormap); \ - \ - if (max_xsize > MLIB_LIMIT) { \ - pbuff = mlib_malloc(NCHAN * sizeof(mlib_##LTYPE) * max_xsize); \ - if (pbuff == NULL) return MLIB_FAILURE; \ - } \ - \ - for (j = yStart; j <= yFinish; j++) { \ - DECLARE_INTERNAL_VAR_##NCHAN##CH(); \ - \ - NEW_LINE(1); \ - dp = pbuff; \ - \ - GET_PIXELS_POINTERS(); \ - GET_COLOR_POINTERS(NCHAN); \ - LOAD_##NCHAN##CH(); - - /* pragma pipeloop(0) must be here */ - -/***************************************************************/ -#define FUNC_AFFINEINDEX_BL_1(ITYPE, LTYPE, NCHAN) \ - for (i = 0; i < (xRight - xLeft); i++, dp += NCHAN) { \ - COUNT_BL_##LTYPE##_##NCHAN##CH(); \ - \ - GET_PIXELS_POINTERS(); \ - GET_COLOR_POINTERS(NCHAN); \ - LOAD_##NCHAN##CH(); \ - \ - STORE_INTO_INTERM_BUF_##NCHAN##CH(LTYPE); \ - } \ - \ - COUNT_BL_##LTYPE##_##NCHAN##CH(); \ - STORE_INTO_INTERM_BUF_##NCHAN##CH(LTYPE); \ - \ - mlib_ImageColorTrue2IndexLine_##LTYPE##_##ITYPE##_##NCHAN \ - (pbuff, dl, xRight - xLeft + 1, colormap); \ - } \ - \ - if (pbuff != buff_lcl) mlib_free(pbuff); \ - \ - return MLIB_SUCCESS; \ - } - -/***************************************************************/ -#undef MLIB_TYPE -#define MLIB_TYPE mlib_u8 - -FUNC_AFFINEINDEX_BL_0(U8, U8, 3) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BL_1(U8, U8, 3) - -FUNC_AFFINEINDEX_BL_0(U8, S16, 3) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BL_1(U8, S16, 3) - -FUNC_AFFINEINDEX_BL_0(U8, U8, 4) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BL_1(U8, U8, 4) - -FUNC_AFFINEINDEX_BL_0(U8, S16, 4) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BL_1(U8, S16, 4) - -/***************************************************************/ -#undef MLIB_TYPE -#define MLIB_TYPE mlib_s16 - -FUNC_AFFINEINDEX_BL_0(S16, U8, 3) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BL_1(S16, U8, 3) - -FUNC_AFFINEINDEX_BL_0(S16, S16, 3) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BL_1(S16, S16, 3) - -FUNC_AFFINEINDEX_BL_0(S16, U8, 4) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BL_1(S16, U8, 4) - -FUNC_AFFINEINDEX_BL_0(S16, S16, 4) -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ -FUNC_AFFINEINDEX_BL_1(S16, S16, 4) - -/***************************************************************/ -const type_affine_i_fun mlib_AffineFunArr_bl_i[] = { - mlib_ImageAffineIndex_U8_U8_3CH_BL, - mlib_ImageAffineIndex_U8_U8_4CH_BL, - mlib_ImageAffineIndex_S16_U8_3CH_BL, - mlib_ImageAffineIndex_S16_U8_4CH_BL, - mlib_ImageAffineIndex_U8_S16_3CH_BL, - mlib_ImageAffineIndex_U8_S16_4CH_BL, - mlib_ImageAffineIndex_S16_S16_3CH_BL, - mlib_ImageAffineIndex_S16_S16_4CH_BL -}; -/***************************************************************/ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageBlendTable.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageBlendTable.c deleted file mode 100644 index 2447f769e69..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageBlendTable.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include -#include "mlib_c_ImageBlendTable.h" - -const mlib_f32 mlib_c_blend_u8[] = { - 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, - 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, - 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, - 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f, - 32.0f, 33.0f, 34.0f, 35.0f, 36.0f, 37.0f, 38.0f, 39.0f, - 40.0f, 41.0f, 42.0f, 43.0f, 44.0f, 45.0f, 46.0f, 47.0f, - 48.0f, 49.0f, 50.0f, 51.0f, 52.0f, 53.0f, 54.0f, 55.0f, - 56.0f, 57.0f, 58.0f, 59.0f, 60.0f, 61.0f, 62.0f, 63.0f, - 64.0f, 65.0f, 66.0f, 67.0f, 68.0f, 69.0f, 70.0f, 71.0f, - 72.0f, 73.0f, 74.0f, 75.0f, 76.0f, 77.0f, 78.0f, 79.0f, - 80.0f, 81.0f, 82.0f, 83.0f, 84.0f, 85.0f, 86.0f, 87.0f, - 88.0f, 89.0f, 90.0f, 91.0f, 92.0f, 93.0f, 94.0f, 95.0f, - 96.0f, 97.0f, 98.0f, 99.0f, 100.0f, 101.0f, 102.0f, 103.0f, - 104.0f, 105.0f, 106.0f, 107.0f, 108.0f, 109.0f, 110.0f, 111.0f, - 112.0f, 113.0f, 114.0f, 115.0f, 116.0f, 117.0f, 118.0f, 119.0f, - 120.0f, 121.0f, 122.0f, 123.0f, 124.0f, 125.0f, 126.0f, 127.0f, - 128.0f, 129.0f, 130.0f, 131.0f, 132.0f, 133.0f, 134.0f, 135.0f, - 136.0f, 137.0f, 138.0f, 139.0f, 140.0f, 141.0f, 142.0f, 143.0f, - 144.0f, 145.0f, 146.0f, 147.0f, 148.0f, 149.0f, 150.0f, 151.0f, - 152.0f, 153.0f, 154.0f, 155.0f, 156.0f, 157.0f, 158.0f, 159.0f, - 160.0f, 161.0f, 162.0f, 163.0f, 164.0f, 165.0f, 166.0f, 167.0f, - 168.0f, 169.0f, 170.0f, 171.0f, 172.0f, 173.0f, 174.0f, 175.0f, - 176.0f, 177.0f, 178.0f, 179.0f, 180.0f, 181.0f, 182.0f, 183.0f, - 184.0f, 185.0f, 186.0f, 187.0f, 188.0f, 189.0f, 190.0f, 191.0f, - 192.0f, 193.0f, 194.0f, 195.0f, 196.0f, 197.0f, 198.0f, 199.0f, - 200.0f, 201.0f, 202.0f, 203.0f, 204.0f, 205.0f, 206.0f, 207.0f, - 208.0f, 209.0f, 210.0f, 211.0f, 212.0f, 213.0f, 214.0f, 215.0f, - 216.0f, 217.0f, 218.0f, 219.0f, 220.0f, 221.0f, 222.0f, 223.0f, - 224.0f, 225.0f, 226.0f, 227.0f, 228.0f, 229.0f, 230.0f, 231.0f, - 232.0f, 233.0f, 234.0f, 235.0f, 236.0f, 237.0f, 238.0f, 239.0f, - 240.0f, 241.0f, 242.0f, 243.0f, 244.0f, 245.0f, 246.0f, 247.0f, - 248.0f, 249.0f, 250.0f, 251.0f, 252.0f, 253.0f, 254.0f, 255.0f, - 256.0f -}; - -const mlib_f32 mlib_c_blend_Q8[] = { - 0.00000000f, 0.00390625f, 0.00781250f, 0.01171875f, - 0.01562500f, 0.01953125f, 0.02343750f, 0.02734375f, - 0.03125000f, 0.03515625f, 0.03906250f, 0.04296875f, - 0.04687500f, 0.05078125f, 0.05468750f, 0.05859375f, - 0.06250000f, 0.06640625f, 0.07031250f, 0.07421875f, - 0.07812500f, 0.08203125f, 0.08593750f, 0.08984375f, - 0.09375000f, 0.09765625f, 0.10156250f, 0.10546875f, - 0.10937500f, 0.11328125f, 0.11718750f, 0.12109375f, - 0.12500000f, 0.12890625f, 0.13281250f, 0.13671875f, - 0.14062500f, 0.14453125f, 0.14843750f, 0.15234375f, - 0.15625000f, 0.16015625f, 0.16406250f, 0.16796875f, - 0.17187500f, 0.17578125f, 0.17968750f, 0.18359375f, - 0.18750000f, 0.19140625f, 0.19531250f, 0.19921875f, - 0.20312500f, 0.20703125f, 0.21093750f, 0.21484375f, - 0.21875000f, 0.22265625f, 0.22656250f, 0.23046875f, - 0.23437500f, 0.23828125f, 0.24218750f, 0.24609375f, - 0.25000000f, 0.25390625f, 0.25781250f, 0.26171875f, - 0.26562500f, 0.26953125f, 0.27343750f, 0.27734375f, - 0.28125000f, 0.28515625f, 0.28906250f, 0.29296875f, - 0.29687500f, 0.30078125f, 0.30468750f, 0.30859375f, - 0.31250000f, 0.31640625f, 0.32031250f, 0.32421875f, - 0.32812500f, 0.33203125f, 0.33593750f, 0.33984375f, - 0.34375000f, 0.34765625f, 0.35156250f, 0.35546875f, - 0.35937500f, 0.36328125f, 0.36718750f, 0.37109375f, - 0.37500000f, 0.37890625f, 0.38281250f, 0.38671875f, - 0.39062500f, 0.39453125f, 0.39843750f, 0.40234375f, - 0.40625000f, 0.41015625f, 0.41406250f, 0.41796875f, - 0.42187500f, 0.42578125f, 0.42968750f, 0.43359375f, - 0.43750000f, 0.44140625f, 0.44531250f, 0.44921875f, - 0.45312500f, 0.45703125f, 0.46093750f, 0.46484375f, - 0.46875000f, 0.47265625f, 0.47656250f, 0.48046875f, - 0.48437500f, 0.48828125f, 0.49218750f, 0.49609375f, - 0.50000000f, 0.50390625f, 0.50781250f, 0.51171875f, - 0.51562500f, 0.51953125f, 0.52343750f, 0.52734375f, - 0.53125000f, 0.53515625f, 0.53906250f, 0.54296875f, - 0.54687500f, 0.55078125f, 0.55468750f, 0.55859375f, - 0.56250000f, 0.56640625f, 0.57031250f, 0.57421875f, - 0.57812500f, 0.58203125f, 0.58593750f, 0.58984375f, - 0.59375000f, 0.59765625f, 0.60156250f, 0.60546875f, - 0.60937500f, 0.61328125f, 0.61718750f, 0.62109375f, - 0.62500000f, 0.62890625f, 0.63281250f, 0.63671875f, - 0.64062500f, 0.64453125f, 0.64843750f, 0.65234375f, - 0.65625000f, 0.66015625f, 0.66406250f, 0.66796875f, - 0.67187500f, 0.67578125f, 0.67968750f, 0.68359375f, - 0.68750000f, 0.69140625f, 0.69531250f, 0.69921875f, - 0.70312500f, 0.70703125f, 0.71093750f, 0.71484375f, - 0.71875000f, 0.72265625f, 0.72656250f, 0.73046875f, - 0.73437500f, 0.73828125f, 0.74218750f, 0.74609375f, - 0.75000000f, 0.75390625f, 0.75781250f, 0.76171875f, - 0.76562500f, 0.76953125f, 0.77343750f, 0.77734375f, - 0.78125000f, 0.78515625f, 0.78906250f, 0.79296875f, - 0.79687500f, 0.80078125f, 0.80468750f, 0.80859375f, - 0.81250000f, 0.81640625f, 0.82031250f, 0.82421875f, - 0.82812500f, 0.83203125f, 0.83593750f, 0.83984375f, - 0.84375000f, 0.84765625f, 0.85156250f, 0.85546875f, - 0.85937500f, 0.86328125f, 0.86718750f, 0.87109375f, - 0.87500000f, 0.87890625f, 0.88281250f, 0.88671875f, - 0.89062500f, 0.89453125f, 0.89843750f, 0.90234375f, - 0.90625000f, 0.91015625f, 0.91406250f, 0.91796875f, - 0.92187500f, 0.92578125f, 0.92968750f, 0.93359375f, - 0.93750000f, 0.94140625f, 0.94531250f, 0.94921875f, - 0.95312500f, 0.95703125f, 0.96093750f, 0.96484375f, - 0.96875000f, 0.97265625f, 0.97656250f, 0.98046875f, - 0.98437500f, 0.98828125f, 0.99218750f, 0.99609375f, - 1.00000000f, 1.00390625f, 1.00781250f, 1.01171875f, - 1.01562500f, 1.01953125f, 1.02343750f, 1.02734375f, - 1.03125000f, 1.03515625f, 1.03906250f, 1.04296875f, - 1.04687500f, 1.05078125f, 1.05468750f, 1.05859375f, - 1.06250000f, 1.06640625f, 1.07031250f, 1.07421875f, - 1.07812500f, 1.08203125f, 1.08593750f, 1.08984375f, - 1.09375000f, 1.09765625f, 1.10156250f, 1.10546875f, - 1.10937500f, 1.11328125f, 1.11718750f, 1.12109375f, - 1.12500000f, 1.12890625f, 1.13281250f, 1.13671875f, - 1.14062500f, 1.14453125f, 1.14843750f, 1.15234375f, - 1.15625000f, 1.16015625f, 1.16406250f, 1.16796875f, - 1.17187500f, 1.17578125f, 1.17968750f, 1.18359375f, - 1.18750000f, 1.19140625f, 1.19531250f, 1.19921875f, - 1.20312500f, 1.20703125f, 1.21093750f, 1.21484375f, - 1.21875000f, 1.22265625f, 1.22656250f, 1.23046875f, - 1.23437500f, 1.23828125f, 1.24218750f, 1.24609375f, - 1.25000000f, 1.25390625f, 1.25781250f, 1.26171875f, - 1.26562500f, 1.26953125f, 1.27343750f, 1.27734375f, - 1.28125000f, 1.28515625f, 1.28906250f, 1.29296875f, - 1.29687500f, 1.30078125f, 1.30468750f, 1.30859375f, - 1.31250000f, 1.31640625f, 1.32031250f, 1.32421875f, - 1.32812500f, 1.33203125f, 1.33593750f, 1.33984375f, - 1.34375000f, 1.34765625f, 1.35156250f, 1.35546875f, - 1.35937500f, 1.36328125f, 1.36718750f, 1.37109375f, - 1.37500000f, 1.37890625f, 1.38281250f, 1.38671875f, - 1.39062500f, 1.39453125f, 1.39843750f, 1.40234375f, - 1.40625000f, 1.41015625f, 1.41406250f, 1.41796875f, - 1.42187500f, 1.42578125f, 1.42968750f, 1.43359375f, - 1.43750000f, 1.44140625f, 1.44531250f, 1.44921875f, - 1.45312500f, 1.45703125f, 1.46093750f, 1.46484375f, - 1.46875000f, 1.47265625f, 1.47656250f, 1.48046875f, - 1.48437500f, 1.48828125f, 1.49218750f, 1.49609375f, - 1.50000000f, 1.50390625f, 1.50781250f, 1.51171875f, - 1.51562500f, 1.51953125f, 1.52343750f, 1.52734375f, - 1.53125000f, 1.53515625f, 1.53906250f, 1.54296875f, - 1.54687500f, 1.55078125f, 1.55468750f, 1.55859375f, - 1.56250000f, 1.56640625f, 1.57031250f, 1.57421875f, - 1.57812500f, 1.58203125f, 1.58593750f, 1.58984375f, - 1.59375000f, 1.59765625f, 1.60156250f, 1.60546875f, - 1.60937500f, 1.61328125f, 1.61718750f, 1.62109375f, - 1.62500000f, 1.62890625f, 1.63281250f, 1.63671875f, - 1.64062500f, 1.64453125f, 1.64843750f, 1.65234375f, - 1.65625000f, 1.66015625f, 1.66406250f, 1.66796875f, - 1.67187500f, 1.67578125f, 1.67968750f, 1.68359375f, - 1.68750000f, 1.69140625f, 1.69531250f, 1.69921875f, - 1.70312500f, 1.70703125f, 1.71093750f, 1.71484375f, - 1.71875000f, 1.72265625f, 1.72656250f, 1.73046875f, - 1.73437500f, 1.73828125f, 1.74218750f, 1.74609375f, - 1.75000000f, 1.75390625f, 1.75781250f, 1.76171875f, - 1.76562500f, 1.76953125f, 1.77343750f, 1.77734375f, - 1.78125000f, 1.78515625f, 1.78906250f, 1.79296875f, - 1.79687500f, 1.80078125f, 1.80468750f, 1.80859375f, - 1.81250000f, 1.81640625f, 1.82031250f, 1.82421875f, - 1.82812500f, 1.83203125f, 1.83593750f, 1.83984375f, - 1.84375000f, 1.84765625f, 1.85156250f, 1.85546875f, - 1.85937500f, 1.86328125f, 1.86718750f, 1.87109375f, - 1.87500000f, 1.87890625f, 1.88281250f, 1.88671875f, - 1.89062500f, 1.89453125f, 1.89843750f, 1.90234375f, - 1.90625000f, 1.91015625f, 1.91406250f, 1.91796875f, - 1.92187500f, 1.92578125f, 1.92968750f, 1.93359375f, - 1.93750000f, 1.94140625f, 1.94531250f, 1.94921875f, - 1.95312500f, 1.95703125f, 1.96093750f, 1.96484375f, - 1.96875000f, 1.97265625f, 1.97656250f, 1.98046875f, - 1.98437500f, 1.98828125f, 1.99218750f, 1.99609375f, - 2.00000000f -}; - -const mlib_f32 mlib_c_blend_u8_sat[] = { - 0.0f, 8388608.0f, 16777216.0f, 25165824.0f, - 33554432.0f, 41943040.0f, 50331648.0f, 58720256.0f, - 67108864.0f, 75497472.0f, 83886080.0f, 92274688.0f, - 100663296.0f, 109051904.0f, 117440512.0f, 125829120.0f, - 134217728.0f, 142606336.0f, 150994944.0f, 159383552.0f, - 167772160.0f, 176160768.0f, 184549376.0f, 192937984.0f, - 201326592.0f, 209715200.0f, 218103808.0f, 226492416.0f, - 234881024.0f, 243269632.0f, 251658240.0f, 260046848.0f, - 268435456.0f, 276824064.0f, 285212672.0f, 293601280.0f, - 301989888.0f, 310378496.0f, 318767104.0f, 327155712.0f, - 335544320.0f, 343932928.0f, 352321536.0f, 360710144.0f, - 369098752.0f, 377487360.0f, 385875968.0f, 394264576.0f, - 402653184.0f, 411041792.0f, 419430400.0f, 427819008.0f, - 436207616.0f, 444596224.0f, 452984832.0f, 461373440.0f, - 469762048.0f, 478150656.0f, 486539264.0f, 494927872.0f, - 503316480.0f, 511705088.0f, 520093696.0f, 528482304.0f, - 536870912.0f, 545259520.0f, 553648128.0f, 562036736.0f, - 570425344.0f, 578813952.0f, 587202560.0f, 595591168.0f, - 603979776.0f, 612368384.0f, 620756992.0f, 629145600.0f, - 637534208.0f, 645922816.0f, 654311424.0f, 662700032.0f, - 671088640.0f, 679477248.0f, 687865856.0f, 696254464.0f, - 704643072.0f, 713031680.0f, 721420288.0f, 729808896.0f, - 738197504.0f, 746586112.0f, 754974720.0f, 763363328.0f, - 771751936.0f, 780140544.0f, 788529152.0f, 796917760.0f, - 805306368.0f, 813694976.0f, 822083584.0f, 830472192.0f, - 838860800.0f, 847249408.0f, 855638016.0f, 864026624.0f, - 872415232.0f, 880803840.0f, 889192448.0f, 897581056.0f, - 905969664.0f, 914358272.0f, 922746880.0f, 931135488.0f, - 939524096.0f, 947912704.0f, 956301312.0f, 964689920.0f, - 973078528.0f, 981467136.0f, 989855744.0f, 998244352.0f, - 1006632960.0f, 1015021568.0f, 1023410176.0f, 1031798784.0f, - 1040187392.0f, 1048576000.0f, 1056964608.0f, 1065353216.0f, - 1073741824.0f, 1082130432.0f, 1090519040.0f, 1098907648.0f, - 1107296256.0f, 1115684864.0f, 1124073472.0f, 1132462080.0f, - 1140850688.0f, 1149239296.0f, 1157627904.0f, 1166016512.0f, - 1174405120.0f, 1182793728.0f, 1191182336.0f, 1199570944.0f, - 1207959552.0f, 1216348160.0f, 1224736768.0f, 1233125376.0f, - 1241513984.0f, 1249902592.0f, 1258291200.0f, 1266679808.0f, - 1275068416.0f, 1283457024.0f, 1291845632.0f, 1300234240.0f, - 1308622848.0f, 1317011456.0f, 1325400064.0f, 1333788672.0f, - 1342177280.0f, 1350565888.0f, 1358954496.0f, 1367343104.0f, - 1375731712.0f, 1384120320.0f, 1392508928.0f, 1400897536.0f, - 1409286144.0f, 1417674752.0f, 1426063360.0f, 1434451968.0f, - 1442840576.0f, 1451229184.0f, 1459617792.0f, 1468006400.0f, - 1476395008.0f, 1484783616.0f, 1493172224.0f, 1501560832.0f, - 1509949440.0f, 1518338048.0f, 1526726656.0f, 1535115264.0f, - 1543503872.0f, 1551892480.0f, 1560281088.0f, 1568669696.0f, - 1577058304.0f, 1585446912.0f, 1593835520.0f, 1602224128.0f, - 1610612736.0f, 1619001344.0f, 1627389952.0f, 1635778560.0f, - 1644167168.0f, 1652555776.0f, 1660944384.0f, 1669332992.0f, - 1677721600.0f, 1686110208.0f, 1694498816.0f, 1702887424.0f, - 1711276032.0f, 1719664640.0f, 1728053248.0f, 1736441856.0f, - 1744830464.0f, 1753219072.0f, 1761607680.0f, 1769996288.0f, - 1778384896.0f, 1786773504.0f, 1795162112.0f, 1803550720.0f, - 1811939328.0f, 1820327936.0f, 1828716544.0f, 1837105152.0f, - 1845493760.0f, 1853882368.0f, 1862270976.0f, 1870659584.0f, - 1879048192.0f, 1887436800.0f, 1895825408.0f, 1904214016.0f, - 1912602624.0f, 1920991232.0f, 1929379840.0f, 1937768448.0f, - 1946157056.0f, 1954545664.0f, 1962934272.0f, 1971322880.0f, - 1979711488.0f, 1988100096.0f, 1996488704.0f, 2004877312.0f, - 2013265920.0f, 2021654528.0f, 2030043136.0f, 2038431744.0f, - 2046820352.0f, 2055208960.0f, 2063597568.0f, 2071986176.0f, - 2080374784.0f, 2088763392.0f, 2097152000.0f, 2105540608.0f, - 2113929216.0f, 2122317824.0f, 2130706432.0f, 2139095040.0f, - 2147483648.0f -}; diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConv.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConv.h index 41fb98072b9..8097c7d11ed 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConv.h +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConv.h @@ -41,118 +41,6 @@ return status; \ } #endif /* FREE_AND_RETURN_STATUS */ -mlib_status mlib_c_conv2x2ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv2x2ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv2x2ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv2x2nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv2x2nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv2x2nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv3x3ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv3x3nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv4x4ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv4x4nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv5x5ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv5x5nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv7x7ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_c_conv7x7nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - mlib_status mlib_c_convMxNnw_u8(mlib_image *dst, const mlib_image *src, const mlib_s32 *kernel, @@ -177,102 +65,6 @@ mlib_status mlib_c_convMxNext_u8(mlib_image *dst, #if ! defined ( __sparc ) /* for x86, using integer multiplies is faster */ -mlib_status mlib_i_conv3x3ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv3x3ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv3x3ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv3x3nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv3x3nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv3x3nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv5x5ext_s16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv5x5ext_u16(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv5x5ext_u8(mlib_image *dst, - const mlib_image *src, - mlib_s32 dx_l, - mlib_s32 dx_r, - mlib_s32 dy_t, - mlib_s32 dy_b, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv5x5nw_s16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv5x5nw_u16(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_i_conv5x5nw_u8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - mlib_status mlib_i_convMxNnw_s16(mlib_image *dst, const mlib_image *src, const mlib_s32 *kernel, diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConv_f.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConv_f.c index de4276b9bc3..825f973779e 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConv_f.c +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageConv_f.c @@ -28,34 +28,6 @@ #include "mlib_ImageConv.h" #include "mlib_c_ImageConv.h" -/***************************************************************/ -#define MLIB_PARAMS_CONV_NW \ - mlib_image *dst, \ - const mlib_image *src, \ - const mlib_s32 *kern, \ - mlib_s32 scale, \ - mlib_s32 cmask - -/***************************************************************/ -#define MLIB_CALL_PARAMS_CONV_NW \ - dst, src, kern, scale, cmask - -/***************************************************************/ -#define MLIB_PARAMS_CONV_EXT \ - mlib_image *dst, \ - const mlib_image *src, \ - mlib_s32 dx_l, \ - mlib_s32 dx_r, \ - mlib_s32 dy_t, \ - mlib_s32 dy_b, \ - const mlib_s32 *kern, \ - mlib_s32 scale, \ - mlib_s32 cmask - -/***************************************************************/ -#define MLIB_CALL_PARAMS_CONV_EXT \ - dst, src, dx_l, dx_r, dy_t, dy_b, kern, scale, cmask - /***************************************************************/ #define MLIB_PARAMS_CONV_MN_NW \ mlib_image *dst, \ @@ -91,52 +63,6 @@ dst, src, kern, m, n, dx_l, dx_r, dy_t, dy_b, scale, cmask -/***************************************************************/ -mlib_status mlib_conv2x2nw_u8(MLIB_PARAMS_CONV_NW) -{ - return mlib_c_conv2x2nw_u8(MLIB_CALL_PARAMS_CONV_NW); -} - -/***************************************************************/ -mlib_status mlib_conv3x3nw_u8(MLIB_PARAMS_CONV_NW) -{ -#ifdef __sparc - return mlib_c_conv3x3nw_u8(MLIB_CALL_PARAMS_CONV_NW); -#else - - if (mlib_ImageConvVersion(3, 3, scale, MLIB_BYTE) == 0) - return mlib_c_conv3x3nw_u8(MLIB_CALL_PARAMS_CONV_NW); - else - return mlib_i_conv3x3nw_u8(MLIB_CALL_PARAMS_CONV_NW); -#endif /* __sparc */ -} - -/***************************************************************/ -mlib_status mlib_conv4x4nw_u8(MLIB_PARAMS_CONV_NW) -{ - return mlib_c_conv4x4nw_u8(MLIB_CALL_PARAMS_CONV_NW); -} - -/***************************************************************/ -mlib_status mlib_conv5x5nw_u8(MLIB_PARAMS_CONV_NW) -{ -#ifdef __sparc - return mlib_c_conv5x5nw_u8(MLIB_CALL_PARAMS_CONV_NW); -#else - - if (mlib_ImageConvVersion(5, 5, scale, MLIB_BYTE) == 0) - return mlib_c_conv5x5nw_u8(MLIB_CALL_PARAMS_CONV_NW); - else - return mlib_i_conv5x5nw_u8(MLIB_CALL_PARAMS_CONV_NW); -#endif /* __sparc */ -} - -/***************************************************************/ -mlib_status mlib_conv7x7nw_u8(MLIB_PARAMS_CONV_NW) -{ - return mlib_c_conv7x7nw_u8(MLIB_CALL_PARAMS_CONV_NW); -} - /***************************************************************/ mlib_status mlib_convMxNnw_u8(MLIB_PARAMS_CONV_MN_NW) { @@ -151,52 +77,6 @@ mlib_status mlib_convMxNnw_u8(MLIB_PARAMS_CONV_MN_NW) #endif /* __sparc */ } -/***************************************************************/ -mlib_status mlib_conv2x2ext_u8(MLIB_PARAMS_CONV_EXT) -{ - return mlib_c_conv2x2ext_u8(MLIB_CALL_PARAMS_CONV_EXT); -} - -/***************************************************************/ -mlib_status mlib_conv3x3ext_u8(MLIB_PARAMS_CONV_EXT) -{ -#ifdef __sparc - return mlib_c_conv3x3ext_u8(MLIB_CALL_PARAMS_CONV_EXT); -#else - - if (mlib_ImageConvVersion(3, 3, scale, MLIB_BYTE) == 0) - return mlib_c_conv3x3ext_u8(MLIB_CALL_PARAMS_CONV_EXT); - else - return mlib_i_conv3x3ext_u8(MLIB_CALL_PARAMS_CONV_EXT); -#endif /* __sparc */ -} - -/***************************************************************/ -mlib_status mlib_conv4x4ext_u8(MLIB_PARAMS_CONV_EXT) -{ - return mlib_c_conv4x4ext_u8(MLIB_CALL_PARAMS_CONV_EXT); -} - -/***************************************************************/ -mlib_status mlib_conv5x5ext_u8(MLIB_PARAMS_CONV_EXT) -{ -#ifdef __sparc - return mlib_c_conv5x5ext_u8(MLIB_CALL_PARAMS_CONV_EXT); -#else - - if (mlib_ImageConvVersion(5, 5, scale, MLIB_BYTE) == 0) - return mlib_c_conv5x5ext_u8(MLIB_CALL_PARAMS_CONV_EXT); - else - return mlib_i_conv5x5ext_u8(MLIB_CALL_PARAMS_CONV_EXT); -#endif /* __sparc */ -} - -/***************************************************************/ -mlib_status mlib_conv7x7ext_u8(MLIB_PARAMS_CONV_EXT) -{ - return mlib_c_conv7x7ext_u8(MLIB_CALL_PARAMS_CONV_EXT); -} - /***************************************************************/ mlib_status mlib_convMxNext_u8(MLIB_PARAMS_CONV_MN_EXT) { @@ -212,27 +92,3 @@ mlib_status mlib_convMxNext_u8(MLIB_PARAMS_CONV_MN_EXT) } /***************************************************************/ -mlib_status mlib_conv2x2nw_s16(MLIB_PARAMS_CONV_NW) -{ - return mlib_c_conv2x2nw_s16(MLIB_CALL_PARAMS_CONV_NW); -} - -/***************************************************************/ -mlib_status mlib_conv2x2nw_u16(MLIB_PARAMS_CONV_NW) -{ - return mlib_c_conv2x2nw_u16(MLIB_CALL_PARAMS_CONV_NW); -} - -/***************************************************************/ -mlib_status mlib_conv2x2ext_s16(MLIB_PARAMS_CONV_EXT) -{ - return mlib_c_conv2x2ext_s16(MLIB_CALL_PARAMS_CONV_EXT); -} - -/***************************************************************/ -mlib_status mlib_conv2x2ext_u16(MLIB_PARAMS_CONV_EXT) -{ - return mlib_c_conv2x2ext_u16(MLIB_CALL_PARAMS_CONV_EXT); -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageThresh1.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageThresh1.h deleted file mode 100644 index 54449b45da2..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageThresh1.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -#ifndef __MLIB_C_IMAGETHRESH1_H -#define __MLIB_C_IMAGETHRESH1_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/***************************************************************/ -#define PARAMS \ - void *psrc, \ - void *pdst, \ - mlib_s32 src_stride, \ - mlib_s32 dst_stride, \ - mlib_s32 width, \ - mlib_s32 height, \ - void *__thresh, \ - void *__ghigh, \ - void *__glow - -void mlib_c_ImageThresh1_D641(PARAMS); -void mlib_c_ImageThresh1_D642(PARAMS); -void mlib_c_ImageThresh1_D643(PARAMS); -void mlib_c_ImageThresh1_D644(PARAMS); -void mlib_c_ImageThresh1_D641_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_D642_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_D643_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_D644_1B(PARAMS, mlib_s32 dbit_off); - -void mlib_c_ImageThresh1_F321(PARAMS); -void mlib_c_ImageThresh1_F322(PARAMS); -void mlib_c_ImageThresh1_F323(PARAMS); -void mlib_c_ImageThresh1_F324(PARAMS); -void mlib_c_ImageThresh1_F321_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_F322_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_F323_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_F324_1B(PARAMS, mlib_s32 dbit_off); - -void mlib_c_ImageThresh1_S321(PARAMS); -void mlib_c_ImageThresh1_S322(PARAMS); -void mlib_c_ImageThresh1_S323(PARAMS); -void mlib_c_ImageThresh1_S324(PARAMS); -void mlib_c_ImageThresh1_S321_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_S322_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_S323_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_S324_1B(PARAMS, mlib_s32 dbit_off); - -void mlib_c_ImageThresh1_S161(PARAMS); -void mlib_c_ImageThresh1_S162(PARAMS); -void mlib_c_ImageThresh1_S163(PARAMS); -void mlib_c_ImageThresh1_S164(PARAMS); -void mlib_c_ImageThresh1_S161_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_S162_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_S163_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_S164_1B(PARAMS, mlib_s32 dbit_off); - -void mlib_c_ImageThresh1_U161(PARAMS); -void mlib_c_ImageThresh1_U162(PARAMS); -void mlib_c_ImageThresh1_U163(PARAMS); -void mlib_c_ImageThresh1_U164(PARAMS); -void mlib_c_ImageThresh1_U161_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_U162_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_U163_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_U164_1B(PARAMS, mlib_s32 dbit_off); - -void mlib_c_ImageThresh1_U81(PARAMS); -void mlib_c_ImageThresh1_U82(PARAMS); -void mlib_c_ImageThresh1_U83(PARAMS); -void mlib_c_ImageThresh1_U84(PARAMS); -void mlib_c_ImageThresh1_U81_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_U82_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_U83_1B(PARAMS, mlib_s32 dbit_off); -void mlib_c_ImageThresh1_U84_1B(PARAMS, mlib_s32 dbit_off); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* __MLIB_C_IMAGETHRESH1_H */ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageThresh1_U8.c b/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageThresh1_U8.c deleted file mode 100644 index d16b069109c..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageThresh1_U8.c +++ /dev/null @@ -1,848 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -/* - * FUNCTION - * mlib_ImageThresh1 - thresholding - * - * SYNOPSIS - * mlib_status mlib_ImageThresh1(mlib_image *dst, - * const mlib_image *src, - * const mlib_s32 *thresh, - * const mlib_s32 *ghigh, - * const mlib_s32 *glow); - * - * ARGUMENT - * dst pointer to output image - * src pointer to input image - * thresh array of thresholds - * ghigh array of values above thresholds - * glow array of values below thresholds - * - * RESTRICTION - * The images must have the same size, and the same number - * of channels. - * The images can have 1, 2, 3, or 4 channels. - * The images can be in MLIB_BYTE, MLIB_SHORT or MLIB_INT data type. - * The type of the output image can be MLIB_BIT, or the same as the - * type of the input image. - * - * DESCRIPTION - * If the pixel band value is above the threshold for that channel, - * set the destination to the ghigh value for that channel. - * Otherwise, set the destination to the glow value for that channel. - * - * +- glow[c] src[x][y][c] <= thresh[c] - * dst[x][y][c] = | - * +- ghigh[c] src[x][y][c] > thresh[c] - */ - -#include "mlib_image.h" -#include "mlib_ImageCheck.h" -#include "mlib_c_ImageThresh1.h" - -/***************************************************************/ -#define STYPE mlib_u8 -#define TTYPE mlib_s32 -#define T_SHIFT 31 - -/***************************************************************/ -#define DO_THRESH(s0, th, gl, gh) \ - (((gh) & (((th) - (TTYPE)(s0)) >> T_SHIFT)) | \ - ((gl) &~ (((th) - (TTYPE)(s0)) >> T_SHIFT))) - -/***************************************************************/ -#define THRESH1_CMP_SHIFT(s0, th, sh) \ - ((((th) - (s0)) >> T_SHIFT) & (1 << (sh))) - -/***************************************************************/ -#define STRIP(pd, ps, w, h, ch, th, gh, gl) { \ - STYPE s0; \ - for ( i = 0; i < h; i++ ) { \ - for (j = 0; j < w; j ++) { \ - for (k = 0; k < ch; k++) { \ - s0 = ((STYPE*)ps)[i*src_stride + j*ch + k]; \ - ((STYPE*)pd)[i*dst_stride + j*ch + k] = \ - (s0 <= th[k]) ? gl[k]: gh[k]; \ - } \ - } \ - } \ - } - -/***************************************************************/ -#define INIT_THRESH0(n) \ - thresh0 = thresh[n]; \ - ghigh0 = ghigh[n]; \ - glow0 = glow[n] - -/***************************************************************/ -#define INIT_THRESH1(n) \ - thresh1 = thresh[n]; \ - ghigh1 = ghigh[n]; \ - glow1 = glow[n] - -/***************************************************************/ -#define INIT_THRESH2(n) \ - thresh2 = thresh[n]; \ - ghigh2 = ghigh[n]; \ - glow2 = glow[n] - -/***************************************************************/ -#define INIT_THRESH3(n) \ - thresh3 = thresh[n]; \ - ghigh3 = ghigh[n]; \ - glow3 = glow[n] - -/***************************************************************/ -#define THRESH0(s0) DO_THRESH(s0, thresh0, glow0, ghigh0) -#define THRESH1(s0) DO_THRESH(s0, thresh1, glow1, ghigh1) -#define THRESH2(s0) DO_THRESH(s0, thresh2, glow2, ghigh2) -#define THRESH3(s0) DO_THRESH(s0, thresh3, glow3, ghigh3) - -/***************************************************************/ -void mlib_c_ImageThresh1_U81(PARAMS) -{ - mlib_s32 *thresh = (void *)__thresh; - mlib_s32 *ghigh = (void *)__ghigh; - mlib_s32 *glow = (void *)__glow; - STYPE *psrc_row = psrc; - STYPE *pdst_row = pdst; - TTYPE thresh0; - TTYPE ghigh0; - TTYPE glow0; - mlib_s32 i, j, k; - - if (width < 16) { - STRIP(pdst, psrc, width, height, 1, thresh, ghigh, glow); - return; - } - - INIT_THRESH0(0); - - for (i = 0; i < height; i++) { - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (j = 0; j <= (width - 8); j += 8) { - pdst_row[j] = THRESH0(psrc_row[j]); - pdst_row[j + 1] = THRESH0(psrc_row[j + 1]); - pdst_row[j + 2] = THRESH0(psrc_row[j + 2]); - pdst_row[j + 3] = THRESH0(psrc_row[j + 3]); - pdst_row[j + 4] = THRESH0(psrc_row[j + 4]); - pdst_row[j + 5] = THRESH0(psrc_row[j + 5]); - pdst_row[j + 6] = THRESH0(psrc_row[j + 6]); - pdst_row[j + 7] = THRESH0(psrc_row[j + 7]); - } - - for (; j < width; j++) { - pdst_row[j] = THRESH0(psrc_row[j]); - } - - psrc_row += src_stride; - pdst_row += dst_stride; - } -} - -/***************************************************************/ -void mlib_c_ImageThresh1_U82(PARAMS) -{ - mlib_s32 *thresh = (void *)__thresh; - mlib_s32 *ghigh = (void *)__ghigh; - mlib_s32 *glow = (void *)__glow; - STYPE *psrc_row = psrc; - STYPE *pdst_row = pdst; - TTYPE thresh0, thresh1; - TTYPE ghigh0, ghigh1; - TTYPE glow0, glow1; - mlib_s32 i, j, k; - - if (width < 16) { - STRIP(pdst, psrc, width, height, 2, thresh, ghigh, glow); - return; - } - - INIT_THRESH0(0); - INIT_THRESH1(1); - width <<= 1; - - for (i = 0; i < height; i++) { - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (j = 0; j <= (width - 8); j += 8) { - pdst_row[j] = THRESH0(psrc_row[j]); - pdst_row[j + 1] = THRESH1(psrc_row[j + 1]); - pdst_row[j + 2] = THRESH0(psrc_row[j + 2]); - pdst_row[j + 3] = THRESH1(psrc_row[j + 3]); - pdst_row[j + 4] = THRESH0(psrc_row[j + 4]); - pdst_row[j + 5] = THRESH1(psrc_row[j + 5]); - pdst_row[j + 6] = THRESH0(psrc_row[j + 6]); - pdst_row[j + 7] = THRESH1(psrc_row[j + 7]); - } - - for (; j < width; j += 2) { - pdst_row[j] = THRESH0(psrc_row[j]); - pdst_row[j + 1] = THRESH1(psrc_row[j + 1]); - } - - psrc_row += src_stride; - pdst_row += dst_stride; - } -} - -/***************************************************************/ -void mlib_c_ImageThresh1_U83(PARAMS) -{ - mlib_s32 *thresh = (void *)__thresh; - mlib_s32 *ghigh = (void *)__ghigh; - mlib_s32 *glow = (void *)__glow; - STYPE *psrc_row = psrc; - STYPE *pdst_row = pdst; - TTYPE thresh0, thresh1, thresh2; - TTYPE ghigh0, ghigh1, ghigh2; - TTYPE glow0, glow1, glow2; - mlib_s32 i, j, k; - - if (width < 16) { - STRIP(pdst, psrc, width, height, 3, thresh, ghigh, glow); - return; - } - - width = 3 * width; - INIT_THRESH0(0); - INIT_THRESH1(1); - INIT_THRESH2(2); - - for (i = 0; i < height; i++) { - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (j = 0; j <= (width - 12); j += 12) { - pdst_row[j] = THRESH0(psrc_row[j]); - pdst_row[j + 1] = THRESH1(psrc_row[j + 1]); - pdst_row[j + 2] = THRESH2(psrc_row[j + 2]); - pdst_row[j + 3] = THRESH0(psrc_row[j + 3]); - pdst_row[j + 4] = THRESH1(psrc_row[j + 4]); - pdst_row[j + 5] = THRESH2(psrc_row[j + 5]); - pdst_row[j + 6] = THRESH0(psrc_row[j + 6]); - pdst_row[j + 7] = THRESH1(psrc_row[j + 7]); - pdst_row[j + 8] = THRESH2(psrc_row[j + 8]); - pdst_row[j + 9] = THRESH0(psrc_row[j + 9]); - pdst_row[j + 10] = THRESH1(psrc_row[j + 10]); - pdst_row[j + 11] = THRESH2(psrc_row[j + 11]); - } - - for (; j < width; j += 3) { - pdst_row[j] = THRESH0(psrc_row[j]); - pdst_row[j + 1] = THRESH1(psrc_row[j + 1]); - pdst_row[j + 2] = THRESH2(psrc_row[j + 2]); - } - - psrc_row += src_stride; - pdst_row += dst_stride; - } -} - -/***************************************************************/ -void mlib_c_ImageThresh1_U84(PARAMS) -{ - mlib_s32 *thresh = (void *)__thresh; - mlib_s32 *ghigh = (void *)__ghigh; - mlib_s32 *glow = (void *)__glow; - STYPE *psrc_row = psrc; - STYPE *pdst_row = pdst; - TTYPE thresh0, thresh1, thresh2, thresh3; - TTYPE ghigh0, ghigh1, ghigh2, ghigh3; - TTYPE glow0, glow1, glow2, glow3; - mlib_s32 i, j, k; - - if (width < 16) { - STRIP(pdst, psrc, width, height, 4, thresh, ghigh, glow); - return; - } - - INIT_THRESH0(0); - INIT_THRESH1(1); - INIT_THRESH2(2); - INIT_THRESH3(3); - - width *= 4; - - for (i = 0; i < height; i++) { - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (j = 0; j <= (width - 8); j += 8) { - pdst_row[j] = THRESH0(psrc_row[j]); - pdst_row[j + 1] = THRESH1(psrc_row[j + 1]); - pdst_row[j + 2] = THRESH2(psrc_row[j + 2]); - pdst_row[j + 3] = THRESH3(psrc_row[j + 3]); - pdst_row[j + 4] = THRESH0(psrc_row[j + 4]); - pdst_row[j + 5] = THRESH1(psrc_row[j + 5]); - pdst_row[j + 6] = THRESH2(psrc_row[j + 6]); - pdst_row[j + 7] = THRESH3(psrc_row[j + 7]); - } - - if (j < width) { - pdst_row[j] = THRESH0(psrc_row[j]); - pdst_row[j + 1] = THRESH1(psrc_row[j + 1]); - pdst_row[j + 2] = THRESH2(psrc_row[j + 2]); - pdst_row[j + 3] = THRESH3(psrc_row[j + 3]); - } - - psrc_row += src_stride; - pdst_row += dst_stride; - } -} - -/***************************************************************/ -void mlib_c_ImageThresh1_U81_1B(PARAMS, - mlib_s32 dbit_off) -{ - mlib_s32 *thresh = (void *)__thresh; - mlib_s32 *ghigh = (void *)__ghigh; - mlib_s32 *glow = (void *)__glow; - STYPE *psrc_row = psrc; - mlib_u8 *pdst_row = pdst; - TTYPE thresh0 = thresh[0]; - mlib_s32 mhigh, mlow, emask, dst0; - mlib_s32 i, j, jbit, l; - - mhigh = (ghigh[0] > 0) ? 0xff : 0; - mlow = (glow[0] > 0) ? 0xff : 0; - - for (i = 0; i < height; i++) { - j = 0; - jbit = 0; - - if (dbit_off) { - mlib_s32 nume = 8 - dbit_off; - - if (nume > width) - nume = width; - dst0 = 0; - emask = 0; - - for (; j < nume; j++) { - emask |= (1 << (7 - (dbit_off + j))); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7 - (dbit_off + j)); - } - - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[0] = (dst0 & emask) | (pdst_row[0] & ~emask); - jbit++; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (; j <= (width - 16); j += 16) { - dst0 = THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh0, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh0, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh0, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 4], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 5], thresh0, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 6], thresh0, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 7], thresh0, 0); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - *(pdst_row + jbit) = (mlib_u8) dst0; - jbit++; - dst0 = THRESH1_CMP_SHIFT(psrc_row[j + 8], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 9], thresh0, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 10], thresh0, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 11], thresh0, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 12], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 13], thresh0, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 14], thresh0, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 15], thresh0, 0); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - *(pdst_row + jbit) = (mlib_u8) dst0; - jbit++; - } - - if (width - j >= 8) { - dst0 = THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh0, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh0, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh0, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 4], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 5], thresh0, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 6], thresh0, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 7], thresh0, 0); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - *(pdst_row + jbit) = (mlib_u8) dst0; - jbit++; - j += 8; - } - - if (j < width) { - dst0 = 0; - l = 7; - for (; j < width; j++) { - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, l); - l--; - } - - emask = (0xFF << (l + 1)); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[jbit] = (dst0 & emask) | (pdst_row[jbit] & ~emask); - } - - psrc_row += src_stride; - pdst_row += dst_stride; - } -} - -/***************************************************************/ -void mlib_c_ImageThresh1_U82_1B(PARAMS, - mlib_s32 dbit_off) -{ - mlib_s32 *thresh = (void *)__thresh; - mlib_s32 *ghigh = (void *)__ghigh; - mlib_s32 *glow = (void *)__glow; - STYPE *psrc_row = psrc; - mlib_u8 *pdst_row = pdst; - TTYPE thresh0 = thresh[0], thresh1 = thresh[1]; - mlib_s32 mhigh0, mlow0, mhigh, mlow, emask, dst0; - mlib_s32 i, j, jbit, l; - - mhigh0 = (ghigh[0] > 0) ? 0xaaa : 0; - mhigh0 |= (ghigh[1] > 0) ? 0x555 : 0; - mlow0 = (glow[0] > 0) ? 0xaaa : 0; - mlow0 |= (glow[1] > 0) ? 0x555 : 0; - - width *= 2; - - for (i = 0; i < height; i++) { - thresh0 = thresh[0]; - thresh1 = thresh[1]; - - j = 0; - jbit = 0; - mhigh = mhigh0 >> (dbit_off & 1); - mlow = mlow0 >> (dbit_off & 1); - - if (dbit_off) { - mlib_s32 nume = 8 - dbit_off; - - if (nume > width) - nume = width; - dst0 = 0; - emask = 0; - - for (; j <= (nume - 2); j += 2) { - emask |= (3 << (6 - (dbit_off + j))); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7 - (dbit_off + j)); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6 - (dbit_off + j)); - } - - if (j < nume) { - emask |= (1 << (7 - (dbit_off + j))); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7 - (dbit_off + j)); - /* swap threshes */ - thresh0 = thresh[1]; - thresh1 = thresh[0]; - j++; - } - - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[0] = (dst0 & emask) | (pdst_row[0] & ~emask); - jbit++; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (; j <= (width - 16); j += 16) { - dst0 = THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh0, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh1, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 4], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 5], thresh1, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 6], thresh0, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 7], thresh1, 0); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - *(pdst_row + jbit) = (mlib_u8) dst0; - jbit++; - dst0 = THRESH1_CMP_SHIFT(psrc_row[j + 8], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 9], thresh1, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 10], thresh0, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 11], thresh1, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 12], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 13], thresh1, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 14], thresh0, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 15], thresh1, 0); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - *(pdst_row + jbit) = (mlib_u8) dst0; - jbit++; - } - - if (width - j >= 8) { - dst0 = THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh0, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh1, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 4], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 5], thresh1, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 6], thresh0, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 7], thresh1, 0); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - *(pdst_row + jbit) = (mlib_u8) dst0; - jbit++; - j += 8; - } - - if (j < width) { - dst0 = 0; - l = 7; - for (; j <= (width - 2); j += 2) { - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, l); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, l - 1); - l -= 2; - } - - if (j < width) { - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, l); - l--; - } - - emask = (0xFF << (l + 1)); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[jbit] = (dst0 & emask) | (pdst_row[jbit] & ~emask); - } - - psrc_row += src_stride; - pdst_row += dst_stride; - } -} - -/***************************************************************/ -void mlib_c_ImageThresh1_U83_1B(PARAMS, - mlib_s32 dbit_off) -{ - mlib_s32 *thresh = (void *)__thresh; - mlib_s32 *ghigh = (void *)__ghigh; - mlib_s32 *glow = (void *)__glow; - STYPE *psrc_row = psrc; - mlib_u8 *pdst_row = pdst; - TTYPE thresh0, thresh1, thresh2, threshT; - mlib_s32 mhigh = 0, mlow = 0; - mlib_s32 mhigh0, mlow0, mhigh1, mlow1, mhigh2, mlow2, emask, dst0, dst1; - mlib_s32 i, j, jbit, k, l; - - if (ghigh[0] > 0) - mhigh = 0x492492; - - if (ghigh[1] > 0) - mhigh |= 0x249249; - - if (ghigh[2] > 0) - mhigh |= 0x924924; - - if (glow[0] > 0) - mlow = 0x492492; - - if (glow[1] > 0) - mlow |= 0x249249; - - if (glow[2] > 0) - mlow |= 0x924924; - - width = 3 * width; - - for (i = 0; i < height; i++) { - thresh0 = thresh[0]; - thresh1 = thresh[1]; - thresh2 = thresh[2]; - - j = 0; - jbit = 0; - mhigh0 = mhigh >> (dbit_off & 7); - mlow0 = mlow >> (dbit_off & 7); - mhigh1 = mhigh0 >> 1; - mlow1 = mlow0 >> 1; - mhigh2 = mhigh0 >> 2; - mlow2 = mlow0 >> 2; - - if (dbit_off) { - mlib_s32 nume = 8 - dbit_off; - - if (nume > width) - nume = width; - dst0 = 0; - emask = 0; - - for (; j <= (nume - 3); j += 3) { - emask |= (7 << (5 - (dbit_off + j))); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7 - (dbit_off + j)); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6 - (dbit_off + j)); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh2, 5 - (dbit_off + j)); - } - - for (; j < nume; j++) { - emask |= (1 << (7 - (dbit_off + j))); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7 - (dbit_off + j)); - /* swap threshes */ - threshT = thresh0; - thresh0 = thresh1; - thresh1 = thresh2; - thresh2 = threshT; - } - - dst0 = (mhigh0 & dst0) | (mlow0 & ~dst0); - pdst_row[0] = (dst0 & emask) | (pdst_row[0] & ~emask); - jbit++; - - mhigh0 = mhigh >> (9 - nume); - mlow0 = mlow >> (9 - nume); - mhigh1 = mhigh0 >> 1; - mlow1 = mlow0 >> 1; - mhigh2 = mhigh0 >> 2; - mlow2 = mlow0 >> 2; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (; j <= (width - 24); j += 24) { - dst0 = (THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh2, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh0, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 4], thresh1, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 5], thresh2, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 6], thresh0, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 7], thresh1, 0)); - dst0 = (mhigh0 & dst0) | (mlow0 & ~dst0); - *(pdst_row + jbit) = dst0; - jbit++; - dst0 = (THRESH1_CMP_SHIFT(psrc_row[j + 8], thresh2, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 9], thresh0, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 10], thresh1, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 11], thresh2, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 12], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 13], thresh1, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 14], thresh2, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 15], thresh0, 0)); - dst0 = (mhigh1 & dst0) | (mlow1 & ~dst0); - *(pdst_row + jbit) = dst0; - jbit++; - dst0 = (THRESH1_CMP_SHIFT(psrc_row[j + 16], thresh1, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 17], thresh2, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 18], thresh0, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 19], thresh1, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 20], thresh2, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 21], thresh0, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 22], thresh1, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 23], thresh2, 0)); - dst0 = (mhigh2 & dst0) | (mlow2 & ~dst0); - *(pdst_row + jbit) = dst0; - jbit++; - } - - if (j < width) { - k = width - j; - dst0 = 0; - l = 31; - for (; j < width; j += 3) { - dst0 |= (THRESH1_CMP_SHIFT(psrc_row[j], thresh0, l) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, l - 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh2, l - 2)); - l -= 3; - } - - l = (k + 7) >> 3; - k = (l << 3) - k; - emask = (0xFF << k); - - if (l == 3) { - dst1 = dst0 >> 24; - dst1 = (mhigh0 & dst1) | (mlow0 & ~dst1); - pdst_row[jbit] = dst1; - dst1 = (dst0 >> 16); - dst1 = (mhigh1 & dst1) | (mlow1 & ~dst1); - pdst_row[jbit + 1] = dst1; - dst1 = (dst0 >> 8); - dst1 = (mhigh2 & dst1) | (mlow2 & ~dst1); - pdst_row[jbit + 2] = (dst1 & emask) | (pdst_row[jbit + 2] & ~emask); - } - else if (l == 2) { - dst1 = dst0 >> 24; - dst1 = (mhigh0 & dst1) | (mlow0 & ~dst1); - pdst_row[jbit] = dst1; - dst1 = (dst0 >> 16); - dst1 = (mhigh1 & dst1) | (mlow1 & ~dst1); - pdst_row[jbit + 1] = (dst1 & emask) | (pdst_row[jbit + 1] & ~emask); - } - else { - dst1 = dst0 >> 24; - dst1 = (mhigh0 & dst1) | (mlow0 & ~dst1); - pdst_row[jbit] = (dst1 & emask) | (pdst_row[jbit] & ~emask); - } - } - - psrc_row += src_stride; - pdst_row += dst_stride; - } -} - -/***************************************************************/ -void mlib_c_ImageThresh1_U84_1B(PARAMS, - mlib_s32 dbit_off) -{ - mlib_s32 *thresh = (void *)__thresh; - mlib_s32 *ghigh = (void *)__ghigh; - mlib_s32 *glow = (void *)__glow; - STYPE *psrc_row = psrc; - mlib_u8 *pdst_row = pdst; - TTYPE thresh0, thresh1, thresh2, thresh3, threshT; - mlib_s32 mhigh0, mlow0, mhigh, mlow, emask, dst0; - mlib_s32 i, j, jbit; - - mhigh0 = (ghigh[0] > 0) ? 0x8888 : 0; - mhigh0 |= (ghigh[1] > 0) ? 0x4444 : 0; - mhigh0 |= (ghigh[2] > 0) ? 0x2222 : 0; - mhigh0 |= (ghigh[3] > 0) ? 0x1111 : 0; - - mlow0 = (glow[0] > 0) ? 0x8888 : 0; - mlow0 |= (glow[1] > 0) ? 0x4444 : 0; - mlow0 |= (glow[2] > 0) ? 0x2222 : 0; - mlow0 |= (glow[3] > 0) ? 0x1111 : 0; - - width *= 4; - - for (i = 0; i < height; i++) { - thresh0 = thresh[0]; - thresh1 = thresh[1]; - thresh2 = thresh[2]; - thresh3 = thresh[3]; - - j = 0; - jbit = 0; - mhigh = mhigh0 >> dbit_off; - mlow = mlow0 >> dbit_off; - - if (dbit_off) { - mlib_s32 nume = 8 - dbit_off; - - if (nume > width) - nume = width; - dst0 = 0; - emask = 0; - - for (; j <= (nume - 4); j += 4) { - emask |= (0xf << (4 - (dbit_off + j))); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7 - (dbit_off + j)); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6 - (dbit_off + j)); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh2, 5 - (dbit_off + j)); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh3, 4 - (dbit_off + j)); - } - - for (; j < nume; j++) { - emask |= (1 << (7 - (dbit_off + j))); - dst0 |= THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7 - (dbit_off + j)); - /* swap threshes */ - threshT = thresh0; - thresh0 = thresh1; - thresh1 = thresh2; - thresh2 = thresh3; - thresh3 = threshT; - } - - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[0] = (dst0 & emask) | (pdst_row[0] & ~emask); - jbit++; - } - -#ifdef __SUNPRO_C -#pragma pipeloop(0) -#endif /* __SUNPRO_C */ - for (; j <= (width - 16); j += 16) { - dst0 = (THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh2, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh3, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 4], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 5], thresh1, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 6], thresh2, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 7], thresh3, 0)); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[jbit] = dst0; - jbit++; - dst0 = (THRESH1_CMP_SHIFT(psrc_row[j + 8], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 9], thresh1, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 10], thresh2, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 11], thresh3, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 12], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 13], thresh1, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 14], thresh2, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 15], thresh3, 0)); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[jbit] = dst0; - jbit++; - } - - if (j <= width - 8) { - dst0 = (THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh2, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh3, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 4], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 5], thresh1, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 6], thresh2, 1) | - THRESH1_CMP_SHIFT(psrc_row[j + 7], thresh3, 0)); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[jbit] = dst0; - jbit++; - j += 8; - } - - if (j < width) { - dst0 = (THRESH1_CMP_SHIFT(psrc_row[j], thresh0, 7) | - THRESH1_CMP_SHIFT(psrc_row[j + 1], thresh1, 6) | - THRESH1_CMP_SHIFT(psrc_row[j + 2], thresh2, 5) | - THRESH1_CMP_SHIFT(psrc_row[j + 3], thresh3, 4) | - THRESH1_CMP_SHIFT(psrc_row[j + 4], thresh0, 3) | - THRESH1_CMP_SHIFT(psrc_row[j + 5], thresh1, 2) | - THRESH1_CMP_SHIFT(psrc_row[j + 6], thresh2, 1)); - - emask = (0xFF << (8 - (width - j))); - dst0 = (mhigh & dst0) | (mlow & ~dst0); - pdst_row[jbit] = (dst0 & emask) | (pdst_row[jbit] & ~emask); - } - - psrc_row += src_stride; - pdst_row += dst_stride; - } -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_image.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_image.h index 60d776a8558..ae1d2247fd2 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_image.h +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_image.h @@ -35,7 +35,6 @@ #include #include #include -#include #include #endif /* MLIB_IMAGE_H */ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_image_blend_proto.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_image_blend_proto.h deleted file mode 100644 index 5a7b0017d5f..00000000000 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_image_blend_proto.h +++ /dev/null @@ -1,1448 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -#ifndef __ORIG_MLIB_IMAGE_BLEND_PROTO_H -#define __ORIG_MLIB_IMAGE_BLEND_PROTO_H - -#include -#include -#include -#if defined ( __MEDIALIB_OLD_NAMES_ADDED ) -#include <../include/mlib_image_blend_proto.h> -#endif /* defined ( __MEDIALIB_OLD_NAMES_ADDED ) */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#if defined ( _MSC_VER ) -#if ! defined ( __MEDIALIB_OLD_NAMES ) -#define __MEDIALIB_OLD_NAMES -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -#endif /* defined ( _MSC_VER ) */ - -/*********************************************************************** - - NOTE: f = min(ALPHAsrc2, 1 - ALPHAsrc1) - f = min(ALPHAscr2, 1 - ALPHAsrc1dst) for In-place function - ALPHA = (ALPHA, ALPHA, ALPHA, ALPHA) - -************************************************************************/ - -/* dst = 0 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_ZERO mlib_ImageBlend_ZERO_ZERO -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_ZERO(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = 0 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_ZERO_Inp mlib_ImageBlend_ZERO_ZERO_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_ZERO_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_ONE mlib_ImageBlend_ZERO_ONE -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_ONE(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_ONE_Inp mlib_ImageBlend_ZERO_ONE_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_ONE_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * src1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_DC mlib_ImageBlend_ZERO_DC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_DC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * src1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_DC_Inp mlib_ImageBlend_ZERO_DC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_DC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * (1 - src1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_OMDC mlib_ImageBlend_ZERO_OMDC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_OMDC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * (1 - src1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_OMDC_Inp mlib_ImageBlend_ZERO_OMDC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_OMDC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_SA mlib_ImageBlend_ZERO_SA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_SA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_SA_Inp mlib_ImageBlend_ZERO_SA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_SA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_OMSA mlib_ImageBlend_ZERO_OMSA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_OMSA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_OMSA_Inp mlib_ImageBlend_ZERO_OMSA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_OMSA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * ALPHAsrc1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_DA mlib_ImageBlend_ZERO_DA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_DA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * ALPHAsrc1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_DA_Inp mlib_ImageBlend_ZERO_DA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_DA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * (1 - ALPHAsrc1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_OMDA mlib_ImageBlend_ZERO_OMDA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_OMDA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * (1 - ALPHAsrc1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_OMDA_Inp mlib_ImageBlend_ZERO_OMDA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_OMDA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_SAS mlib_ImageBlend_ZERO_SAS -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_SAS(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ZERO_SAS_Inp mlib_ImageBlend_ZERO_SAS_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ZERO_SAS_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_ZERO mlib_ImageBlend_ONE_ZERO -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_ZERO(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_ZERO_Inp mlib_ImageBlend_ONE_ZERO_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_ZERO_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_ONE mlib_ImageBlend_ONE_ONE -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_ONE(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_ONE_Inp mlib_ImageBlend_ONE_ONE_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_ONE_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_DC mlib_ImageBlend_ONE_DC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_DC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_DC_Inp mlib_ImageBlend_ONE_DC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_DC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 + src1 * (1 - src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_OMDC mlib_ImageBlend_ONE_OMDC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_OMDC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 + src1dst * (1 - src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_OMDC_Inp mlib_ImageBlend_ONE_OMDC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_OMDC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_SA mlib_ImageBlend_ONE_SA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_SA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_SA_Inp mlib_ImageBlend_ONE_SA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_SA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_OMSA mlib_ImageBlend_ONE_OMSA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_OMSA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_OMSA_Inp mlib_ImageBlend_ONE_OMSA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_OMSA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * ALPHAsrc1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_DA mlib_ImageBlend_ONE_DA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_DA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * ALPHAsrc1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_DA_Inp mlib_ImageBlend_ONE_DA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_DA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * (1 - ALPHAsrc1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_OMDA mlib_ImageBlend_ONE_OMDA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_OMDA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * (1 - ALPHAsrc1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_OMDA_Inp mlib_ImageBlend_ONE_OMDA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_OMDA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_SAS mlib_ImageBlend_ONE_SAS -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_SAS(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_ONE_SAS_Inp mlib_ImageBlend_ONE_SAS_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_ONE_SAS_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_ZERO mlib_ImageBlend_SC_ZERO -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_ZERO(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_ZERO_Inp mlib_ImageBlend_SC_ZERO_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_ZERO_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = (src1 + 1) * src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_ONE mlib_ImageBlend_SC_ONE -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_ONE(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = (src1dst + 1) * src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_ONE_Inp mlib_ImageBlend_SC_ONE_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_ONE_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = 2 * src1 * src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_DC mlib_ImageBlend_SC_DC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_DC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = 2 * src1dst * src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_DC_Inp mlib_ImageBlend_SC_DC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_DC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_OMDC mlib_ImageBlend_SC_OMDC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_OMDC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_OMDC_Inp mlib_ImageBlend_SC_OMDC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_OMDC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * (src1 + ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_SA mlib_ImageBlend_SC_SA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_SA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * (src1dst + ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_SA_Inp mlib_ImageBlend_SC_SA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_SA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * (1 - ALPHAsrc2 + src1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_OMSA mlib_ImageBlend_SC_OMSA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_OMSA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * (1 - ALPHAsrc2 + src1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_OMSA_Inp mlib_ImageBlend_SC_OMSA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_OMSA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * (src1 + ALPHAsrc1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_DA mlib_ImageBlend_SC_DA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_DA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * (src1dst + ALPHAsrc1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_DA_Inp mlib_ImageBlend_SC_DA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_DA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * (1 - ALPHAsrc1 + src1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_OMDA mlib_ImageBlend_SC_OMDA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_OMDA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * (1 - ALPHAsrc1dst + src1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_OMDA_Inp mlib_ImageBlend_SC_OMDA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_OMDA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src2 * ((f, f, f, 1) + src1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_SAS mlib_ImageBlend_SC_SAS -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_SAS(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src2 * ((f, f, f, 1) + src1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SC_SAS_Inp mlib_ImageBlend_SC_SAS_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SC_SAS_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_ZERO mlib_ImageBlend_OMSC_ZERO -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_ZERO(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_ZERO_Inp mlib_ImageBlend_OMSC_ZERO_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_ZERO_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * (1 - src1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_ONE mlib_ImageBlend_OMSC_ONE -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_ONE(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * (1 - src1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_ONE_Inp mlib_ImageBlend_OMSC_ONE_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_ONE_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_DC mlib_ImageBlend_OMSC_DC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_DC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_DC_Inp mlib_ImageBlend_OMSC_DC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_DC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 - 2 * src1 * src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_OMDC mlib_ImageBlend_OMSC_OMDC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_OMDC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 - 2 * src1dst * src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_OMDC_Inp mlib_ImageBlend_OMSC_OMDC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_OMDC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * (ALPHAsrc2 - src1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_SA mlib_ImageBlend_OMSC_SA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_SA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * (ALPHAsrc2 - src1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_SA_Inp mlib_ImageBlend_OMSC_SA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_SA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 - src2 * (src1 + ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_OMSA mlib_ImageBlend_OMSC_OMSA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_OMSA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 - src2 * (src1dst + ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_OMSA_Inp mlib_ImageBlend_OMSC_OMSA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_OMSA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * (ALPHAsrc1 - src1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_DA mlib_ImageBlend_OMSC_DA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_DA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * (ALPHAsrc1dst - src1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_DA_Inp mlib_ImageBlend_OMSC_DA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_DA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 - src2 * (src1 + ALPHAsrc1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_OMDA mlib_ImageBlend_OMSC_OMDA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_OMDA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 - src2 * (src1dst + ALPHAsrc1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_OMDA_Inp mlib_ImageBlend_OMSC_OMDA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_OMDA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + src2 * ((f, f, f, 1) - src1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_SAS mlib_ImageBlend_OMSC_SAS -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_SAS(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + src2 * ((f, f, f, 1) - src1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSC_SAS_Inp mlib_ImageBlend_OMSC_SAS_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSC_SAS_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_ZERO mlib_ImageBlend_SA_ZERO -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_ZERO(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_ZERO_Inp mlib_ImageBlend_SA_ZERO_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_ZERO_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc2 + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_ONE mlib_ImageBlend_SA_ONE -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_ONE(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc2 + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_ONE_Inp mlib_ImageBlend_SA_ONE_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_ONE_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (ALPHAsrc2 + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_DC mlib_ImageBlend_SA_DC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_DC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (ALPHAsrc2 + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_DC_Inp mlib_ImageBlend_SA_DC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_DC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (ALPHAsrc2 - src2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_OMDC mlib_ImageBlend_SA_OMDC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_OMDC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (ALPHAsrc2 - src2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_OMDC_Inp mlib_ImageBlend_SA_OMDC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_OMDC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = (src1 + src2) * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_SA mlib_ImageBlend_SA_SA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_SA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = (src1dst + src2) * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_SA_Inp mlib_ImageBlend_SA_SA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_SA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = (src1 - src2) * ALPHAsrc2 + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_OMSA mlib_ImageBlend_SA_OMSA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_OMSA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = (src1dst - src2) * ALPHAsrc2 + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_OMSA_Inp mlib_ImageBlend_SA_OMSA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_OMSA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc2 + src2 * ALPHAsrc1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_DA mlib_ImageBlend_SA_DA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_DA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc2 + src2 * ALPHAsrc1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_DA_Inp mlib_ImageBlend_SA_DA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_DA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc2 + src2 * (1 - ALPHAsrc1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_OMDA mlib_ImageBlend_SA_OMDA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_OMDA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc2 + src2 * (1 - ALPHAsrc1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_OMDA_Inp mlib_ImageBlend_SA_OMDA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_OMDA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc2 + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_SAS mlib_ImageBlend_SA_SAS -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_SAS(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc2 + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_SA_SAS_Inp mlib_ImageBlend_SA_SAS_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_SA_SAS_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_ZERO mlib_ImageBlend_OMSA_ZERO -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_ZERO(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_ZERO_Inp mlib_ImageBlend_OMSA_ZERO_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_ZERO_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_ONE mlib_ImageBlend_OMSA_ONE -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_ONE(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_ONE_Inp mlib_ImageBlend_OMSA_ONE_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_ONE_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc2 + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_DC mlib_ImageBlend_OMSA_DC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_DC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc2 + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_DC_Inp mlib_ImageBlend_OMSA_DC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_DC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc2 - src2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_OMDC mlib_ImageBlend_OMSA_OMDC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_OMDC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc2 - src2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_OMDC_Inp mlib_ImageBlend_OMSA_OMDC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_OMDC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + (src2 - src1) * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_SA mlib_ImageBlend_OMSA_SA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_SA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + (src2 - src1dst) * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_SA_Inp mlib_ImageBlend_OMSA_SA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_SA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = (src1 + src2) * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_OMSA mlib_ImageBlend_OMSA_OMSA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_OMSA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = (src1dst + src2) * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_OMSA_Inp mlib_ImageBlend_OMSA_OMSA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_OMSA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc2) + src2 * ALPHAsrc1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_DA mlib_ImageBlend_OMSA_DA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_DA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc2) + src2 * ALPHAsrc1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_DA_Inp mlib_ImageBlend_OMSA_DA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_DA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc2) + src2 * (1 - ALPHAsrc1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_OMDA mlib_ImageBlend_OMSA_OMDA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_OMDA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc2) + src2 * (1 - ALPHAsrc1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_OMDA_Inp mlib_ImageBlend_OMSA_OMDA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_OMDA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc2) + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_SAS mlib_ImageBlend_OMSA_SAS -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_SAS(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc2) + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMSA_SAS_Inp mlib_ImageBlend_OMSA_SAS_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMSA_SAS_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_ZERO mlib_ImageBlend_DA_ZERO -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_ZERO(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_ZERO_Inp mlib_ImageBlend_DA_ZERO_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_ZERO_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc1 + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_ONE mlib_ImageBlend_DA_ONE -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_ONE(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc1dst + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_ONE_Inp mlib_ImageBlend_DA_ONE_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_ONE_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (ALPHAsrc1 + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_DC mlib_ImageBlend_DA_DC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_DC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (ALPHAsrc1dst + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_DC_Inp mlib_ImageBlend_DA_DC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_DC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (ALPHAsrc1 - src2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_OMDC mlib_ImageBlend_DA_OMDC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_OMDC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (ALPHAsrc1dst - src2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_OMDC_Inp mlib_ImageBlend_DA_OMDC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_OMDC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc1 + src2 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_SA mlib_ImageBlend_DA_SA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_SA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc1dst + src2 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_SA_Inp mlib_ImageBlend_DA_SA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_SA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc1 + src2 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_OMSA mlib_ImageBlend_DA_OMSA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_OMSA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc1dst + src2 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_OMSA_Inp mlib_ImageBlend_DA_OMSA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_OMSA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = (src1 + src2) * ALPHAsrc1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_DA mlib_ImageBlend_DA_DA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_DA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = (src1dst + src2) * ALPHAsrc1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_DA_Inp mlib_ImageBlend_DA_DA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_DA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = (src1 - src2) * ALPHAsrc1 + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_OMDA mlib_ImageBlend_DA_OMDA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_OMDA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = (src1dst - src2) * ALPHAsrc1dst + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_OMDA_Inp mlib_ImageBlend_DA_OMDA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_OMDA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * ALPHAsrc1 + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_SAS mlib_ImageBlend_DA_SAS -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_SAS(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * ALPHAsrc1dst + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_DA_SAS_Inp mlib_ImageBlend_DA_SAS_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_DA_SAS_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_ZERO mlib_ImageBlend_OMDA_ZERO -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_ZERO(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_ZERO_Inp mlib_ImageBlend_OMDA_ZERO_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_ZERO_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc1) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_ONE mlib_ImageBlend_OMDA_ONE -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_ONE(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc1dst) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_ONE_Inp mlib_ImageBlend_OMDA_ONE_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_ONE_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc1 + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_DC mlib_ImageBlend_OMDA_DC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_DC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc1dst + src2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_DC_Inp mlib_ImageBlend_OMDA_DC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_DC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc1 - src2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_OMDC mlib_ImageBlend_OMDA_OMDC -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_OMDC(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc1dst - src2) + src2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_OMDC_Inp mlib_ImageBlend_OMDA_OMDC_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_OMDC_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc1) + src2 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_SA mlib_ImageBlend_OMDA_SA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_SA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc1dst) + src2 * ALPHAsrc2 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_SA_Inp mlib_ImageBlend_OMDA_SA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_SA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc1) + src2 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_OMSA mlib_ImageBlend_OMDA_OMSA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_OMSA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc1dst) + src2 * (1 - ALPHAsrc2) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_OMSA_Inp mlib_ImageBlend_OMDA_OMSA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_OMSA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 + (src2 - src1) * ALPHAsrc1 */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_DA mlib_ImageBlend_OMDA_DA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_DA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst + (src2 - src1dst) * ALPHAsrc1dst */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_DA_Inp mlib_ImageBlend_OMDA_DA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_DA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = (src1 + src2) * (1 - ALPHAsrc1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_OMDA mlib_ImageBlend_OMDA_OMDA -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_OMDA(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = (src1dst + src2) * (1 - ALPHAsrc1dst) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_OMDA_Inp mlib_ImageBlend_OMDA_OMDA_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_OMDA_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - -/* dst = src1 * (1 - ALPHAsrc1) + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_SAS mlib_ImageBlend_OMDA_SAS -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_SAS(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_s32 cmask); - -/* src1dst = src1dst * (1 - ALPHAsrc1dst) + src2 * (f, f, f, 1) */ - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageBlend_OMDA_SAS_Inp mlib_ImageBlend_OMDA_SAS_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageBlend_OMDA_SAS_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_s32 cmask); - - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageComposite mlib_ImageComposite -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageComposite(mlib_image *dst, - const mlib_image *src1, - const mlib_image *src2, - mlib_blend bsrc1, - mlib_blend bsrc2, - mlib_s32 cmask); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageComposite_Inp mlib_ImageComposite_Inp -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageComposite_Inp(mlib_image *src1dst, - const mlib_image *src2, - mlib_blend bsrc1, - mlib_blend bsrc2, - mlib_s32 cmask); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* __ORIG_MLIB_IMAGE_BLEND_PROTO_H */ diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_image_proto.h b/jdk/src/java.desktop/share/native/libmlib_image/mlib_image_proto.h index 3a03e16a207..eabe26828a1 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_image_proto.h +++ b/jdk/src/java.desktop/share/native/libmlib_image/mlib_image_proto.h @@ -1429,17 +1429,6 @@ mlib_status __mlib_ImageAffine(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageAffineIndex mlib_ImageAffineIndex -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageAffineIndex(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *mtx, - mlib_filter filter, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageAffineTable mlib_ImageAffineTable #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -1470,17 +1459,6 @@ mlib_status __mlib_ImageAffineTransform(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageAffineTransformIndex mlib_ImageAffineTransformIndex -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageAffineTransformIndex(mlib_image *dst, - const mlib_image *src, - const mlib_d64 *mtx, - mlib_filter filter, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageAffineTransform_Fp mlib_ImageAffineTransform_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -1824,19 +1802,6 @@ mlib_status __mlib_ImageRotate90_Fp(mlib_image *dst, const mlib_image *src); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageRotateIndex mlib_ImageRotateIndex -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageRotateIndex(mlib_image *dst, - const mlib_image *src, - mlib_d64 angle, - mlib_d64 xcenter, - mlib_d64 ycenter, - mlib_filter filter, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageRotate_Fp mlib_ImageRotate_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -1886,16 +1851,6 @@ mlib_status __mlib_ImageZoomIn2X(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageZoomIn2XIndex mlib_ImageZoomIn2XIndex -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageZoomIn2XIndex(mlib_image *dst, - const mlib_image *src, - mlib_filter filter, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageZoomIn2X_Fp mlib_ImageZoomIn2X_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -1914,16 +1869,6 @@ mlib_status __mlib_ImageZoomOut2X(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageZoomOut2XIndex mlib_ImageZoomOut2XIndex -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageZoomOut2XIndex(mlib_image *dst, - const mlib_image *src, - mlib_filter filter, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageZoomOut2X_Fp mlib_ImageZoomOut2X_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -2011,18 +1956,6 @@ mlib_status __mlib_ImageZoom(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageZoomIndex mlib_ImageZoomIndex -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageZoomIndex(mlib_image *dst, - const mlib_image *src, - mlib_d64 zoomx, - mlib_d64 zoomy, - mlib_filter filter, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageZoom_Fp mlib_ImageZoom_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -2311,98 +2244,6 @@ mlib_status __mlib_ImageXor_Inp(mlib_image *src1dst, /* Radiometric Operations ( radio ) */ -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorTrue2IndexInit mlib_ImageColorTrue2IndexInit -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageColorTrue2IndexInit(void **colormap, - mlib_s32 bits, - mlib_type intype, - mlib_type outtype, - mlib_s32 channels, - mlib_s32 entries, - mlib_s32 offset, - const void **table); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorTrue2Index mlib_ImageColorTrue2Index -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageColorTrue2Index(mlib_image *dst, - const mlib_image *src, - const void *colormap); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorTrue2IndexFree mlib_ImageColorTrue2IndexFree -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -void __mlib_ImageColorTrue2IndexFree(void *colormap); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorDitherInit mlib_ImageColorDitherInit -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageColorDitherInit(void **colormap, - const mlib_s32 *dimensions, - mlib_type intype, - mlib_type outtype, - mlib_s32 channels, - mlib_s32 entries, - mlib_s32 offset, - void **lut); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorDitherFree mlib_ImageColorDitherFree -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -void __mlib_ImageColorDitherFree(void *colormap); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorErrorDiffusion3x3 mlib_ImageColorErrorDiffusion3x3 -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageColorErrorDiffusion3x3(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kernel, - mlib_s32 scale, - const void *colormap); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorErrorDiffusionMxN mlib_ImageColorErrorDiffusionMxN -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageColorErrorDiffusionMxN(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kernel, - mlib_s32 m, - mlib_s32 n, - mlib_s32 dm, - mlib_s32 dn, - mlib_s32 scale, - const void *colormap); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorOrderedDither8x8 mlib_ImageColorOrderedDither8x8 -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageColorOrderedDither8x8(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *dmask, - mlib_s32 scale, - const void *colormap); - - -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageColorOrderedDitherMxN mlib_ImageColorOrderedDitherMxN -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageColorOrderedDitherMxN(mlib_image *dst, - const mlib_image *src, - const mlib_s32 **dmask, - mlib_s32 m, - mlib_s32 n, - mlib_s32 scale, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageColorReplace mlib_ImageColorReplace #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -2693,17 +2534,6 @@ mlib_status __mlib_ImageConv2x2(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageConv2x2Index mlib_ImageConv2x2Index -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageConv2x2Index(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kernel, - mlib_s32 scale, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageConv2x2_Fp mlib_ImageConv2x2_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -2725,17 +2555,6 @@ mlib_status __mlib_ImageConv3x3(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageConv3x3Index mlib_ImageConv3x3Index -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageConv3x3Index(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kernel, - mlib_s32 scale, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageConv3x3_Fp mlib_ImageConv3x3_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -2757,17 +2576,6 @@ mlib_status __mlib_ImageConv4x4(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageConv4x4Index mlib_ImageConv4x4Index -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageConv4x4Index(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kernel, - mlib_s32 scale, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageConv4x4_Fp mlib_ImageConv4x4_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -2789,17 +2597,6 @@ mlib_status __mlib_ImageConv5x5(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageConv5x5Index mlib_ImageConv5x5Index -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageConv5x5Index(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kernel, - mlib_s32 scale, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageConv5x5_Fp mlib_ImageConv5x5_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -2821,17 +2618,6 @@ mlib_status __mlib_ImageConv7x7(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageConv7x7Index mlib_ImageConv7x7Index -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageConv7x7Index(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kernel, - mlib_s32 scale, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageConv7x7_Fp mlib_ImageConv7x7_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ @@ -2870,21 +2656,6 @@ mlib_status __mlib_ImageConvMxN(mlib_image *dst, mlib_edge edge); -#if defined ( __MEDIALIB_OLD_NAMES ) -#define __mlib_ImageConvMxNIndex mlib_ImageConvMxNIndex -#endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ -mlib_status __mlib_ImageConvMxNIndex(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kernel, - mlib_s32 m, - mlib_s32 n, - mlib_s32 dm, - mlib_s32 dn, - mlib_s32 scale, - mlib_edge edge, - const void *colormap); - - #if defined ( __MEDIALIB_OLD_NAMES ) #define __mlib_ImageConvMxN_Fp mlib_ImageConvMxN_Fp #endif /* ! defined ( __MEDIALIB_OLD_NAMES ) */ diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java index 20b7a9d7899..fa1ba5dcf03 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java @@ -464,7 +464,7 @@ public class XTrayIconPeer implements TrayIconPeer, XToolkit.postEvent(XToolkit.targetToAppContext(e.getSource()), e); } public void mouseClicked(MouseEvent e) { - if ((e.getClickCount() > 1 || xtiPeer.balloon.isVisible()) && + if ((e.getClickCount() == 1 || xtiPeer.balloon.isVisible()) && e.getButton() == MouseEvent.BUTTON1) { ActionEvent aev = new ActionEvent(xtiPeer.target, ActionEvent.ACTION_PERFORMED, diff --git a/jdk/src/java.desktop/unix/native/libawt/awt/medialib/mlib_v_ImageCopy.c b/jdk/src/java.desktop/unix/native/libawt/awt/medialib/mlib_v_ImageCopy.c deleted file mode 100644 index ad2bdf4657c..00000000000 --- a/jdk/src/java.desktop/unix/native/libawt/awt/medialib/mlib_v_ImageCopy.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - - -/* - * FUNCTION - * mlib_ImageCopy - Direct copy from one image to another. - * - * SYNOPSIS - * mlib_status mlib_ImageCopy(mlib_image *dst, - * mlib_image *src); - * - * ARGUMENT - * dst pointer to output or destination image - * src pointer to input or source image - * - * RESTRICTION - * src and dst must have the same size, type and number of channels. - * They can have 1, 2, 3 or 4 channels of MLIB_BIT, MLIB_BYTE, - * MLIB_SHORT, MLIB_INT, MLIB_FLOAT or MLIB_DOUBLE data type. - * - * DESCRIPTION - * Direct copy from one image to another. - */ - -#include -#include "mlib_image.h" -#include "mlib_ImageCheck.h" - -/***************************************************************/ - -extern void mlib_v_ImageCopy_blk(mlib_u8 *sa, mlib_u8 *da, mlib_s32 size); -extern void mlib_v_ImageCopy_a1(mlib_d64 *sp, mlib_d64 *dp, mlib_s32 size); -extern void mlib_ImageCopy_na(mlib_u8 *sa, mlib_u8 *da, mlib_s32 size); -extern void mlib_ImageCopy_bit_al(mlib_u8 *sa, mlib_u8 *da, - mlib_s32 size, mlib_s32 offset); -extern void mlib_ImageCopy_bit_na(mlib_u8 *sa, mlib_u8 *da, mlib_s32 size, - mlib_s32 s_offset, mlib_s32 d_offset); - -/***************************************************************/ - -#ifdef MLIB_TEST - -mlib_status mlib_v_ImageCopy(mlib_image *dst, mlib_image *src) - -#else - -mlib_status mlib_ImageCopy(mlib_image *dst, const mlib_image *src) - -#endif -{ - mlib_u8 *sa; /* start point in source */ - mlib_u8 *da; /* start points in destination */ - mlib_s32 width; /* width in bytes of src and dst */ - mlib_s32 height; /* height in lines of src and dst */ - mlib_s32 s_offset; /* bit offset of src */ - mlib_s32 d_offset; /* bit offset of dst */ - mlib_s32 stride; /* stride in bytes in src*/ - mlib_s32 dstride; /* stride in bytes in dst */ - mlib_s32 j; /* indices for x, y */ - mlib_s32 size; - - MLIB_IMAGE_CHECK(src); - MLIB_IMAGE_CHECK(dst); - MLIB_IMAGE_TYPE_EQUAL(src, dst); - MLIB_IMAGE_CHAN_EQUAL(src, dst); - MLIB_IMAGE_SIZE_EQUAL(src, dst); - - width = mlib_ImageGetWidth(dst) * mlib_ImageGetChannels(dst); - height = mlib_ImageGetHeight(dst); - sa = (mlib_u8 *)mlib_ImageGetData(src); - da = (mlib_u8 *)mlib_ImageGetData(dst); - - switch (mlib_ImageGetType(dst)) { - case MLIB_BIT: - - if (!mlib_ImageIsNotOneDvector(src) && - !mlib_ImageIsNotOneDvector(dst)) { - size = height * (width >> 3); - if ((size & 0x3f) == 0 && - !mlib_ImageIsNotAligned64(src) && - !mlib_ImageIsNotAligned64(dst)) { - - mlib_v_ImageCopy_blk(sa, da, size); - return MLIB_SUCCESS; - } - if (((size & 7) == 0) && !mlib_ImageIsNotAligned8(src) && - !mlib_ImageIsNotAligned8(dst)) { - - size >>= 3; /* in octlet */ - mlib_v_ImageCopy_a1((mlib_d64 *)sa, (mlib_d64 *)da, size); - } - else { - - mlib_ImageCopy_na(sa, da, size); - } - } - else { - stride = mlib_ImageGetStride(src); /* in byte */ - dstride = mlib_ImageGetStride(dst); /* in byte */ - s_offset = mlib_ImageGetBitOffset(src); /* in bits */ - d_offset = mlib_ImageGetBitOffset(dst); /* in bits */ - - if (s_offset == d_offset) { - for (j = 0; j < height; j++) { - mlib_ImageCopy_bit_al(sa, da, width, s_offset); - sa += stride; - da += dstride; - } - } else { - for (j = 0; j < height; j++) { - mlib_ImageCopy_bit_na(sa, da, width, s_offset, d_offset); - sa += stride; - da += dstride; - } - } - } - return MLIB_SUCCESS; - case MLIB_BYTE: - break; - case MLIB_SHORT: - width *= 2; - break; - case MLIB_INT: - case MLIB_FLOAT: - width *= 4; - break; - case MLIB_DOUBLE: - width *= 8; - break; - default: - return MLIB_FAILURE; - } - - if (!mlib_ImageIsNotOneDvector(src) && - !mlib_ImageIsNotOneDvector(dst)) { - size = height * width; - if ((size & 0x3f) == 0 && - !mlib_ImageIsNotAligned64(src) && - !mlib_ImageIsNotAligned64(dst)) { - - mlib_v_ImageCopy_blk(sa, da, size); - return MLIB_SUCCESS; - } - if (((size & 7) == 0) && !mlib_ImageIsNotAligned8(src) && - !mlib_ImageIsNotAligned8(dst)) { - - size >>= 3; /* in octlet */ - mlib_v_ImageCopy_a1((mlib_d64 *)sa, (mlib_d64 *)da, size); - } - else { - - mlib_ImageCopy_na(sa, da, size); - } - } - else { - stride = mlib_ImageGetStride(src); /* in byte */ - dstride = mlib_ImageGetStride(dst); /* in byte */ - - /* row loop */ - for (j = 0; j < height; j++) { - mlib_ImageCopy_na(sa, da, width); - sa += stride; - da += dstride; - } - } - return MLIB_SUCCESS; -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libawt/awt/medialib/mlib_v_ImageCopy_blk.s b/jdk/src/java.desktop/unix/native/libawt/awt/medialib/mlib_v_ImageCopy_blk.s deleted file mode 100644 index 8261781c3eb..00000000000 --- a/jdk/src/java.desktop/unix/native/libawt/awt/medialib/mlib_v_ImageCopy_blk.s +++ /dev/null @@ -1,262 +0,0 @@ -! -! -! -! Copyright 2000 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. Oracle designates this -! particular file as subject to the "Classpath" exception as provided -! by Oracle in the LICENSE file that accompanied this code. -! -! This code is distributed in the hope that it will be useful, but WITHOUT -! ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -! FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -! version 2 for more details (a copy is included in the LICENSE file that -! accompanied this code). -! -! You should have received a copy of the GNU General Public License version -! 2 along with this work; if not, write to the Free Software Foundation, -! Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -! -! Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -! or visit www.oracle.com if you need additional information or have any -! questions. -! - - -! FUNCTION -! mlib_v_ImageCopy_blk - Copy an image into another -! (with Block Load/Store) -! -! SYNOPSIS -! void mlib_v_ImageCopy_blk(void *src, -! void *dst, -! int size); -! -! ARGUMENT -! src source image data -! dst destination image data -! size image size in bytes -! -! NOTES -! src and dst must point to 64-byte aligned addresses -! size must be multiple of 64 -! -! DESCRIPTION -! dst = src -! - -#include "vis_asi.h" - -! Minimum size of stack frame according to SPARC ABI -#define MINFRAME 96 - -! ENTRY provides the standard procedure entry code -#define ENTRY(x) \ - .align 4; \ - .global x; \ -x: - -! SET_SIZE trails a function and sets the size for the ELF symbol table -#define SET_SIZE(x) \ - .size x, (.-x) - -! SPARC have four integer register groups. i-registers %i0 to %i7 -! hold input data. o-registers %o0 to %o7 hold output data. l-registers -! %l0 to %l7 hold local data. g-registers %g0 to %g7 hold global data. -! Note that %g0 is alway zero, write to it has no program-visible effect. - -! When calling an assembly function, the first 6 arguments are stored -! in i-registers from %i0 to %i5. The rest arguments are stored in stack. -! Note that %i6 is reserved for stack pointer and %i7 for return address. - -! Only the first 32 f-registers can be used as 32-bit registers. -! The last 32 f-registers can only be used as 16 64-bit registers. - -#define src %i0 -#define dst %i1 -#define sz %i2 - -!frame pointer %i6 -!return addr %i7 - -!stack pointer %o6 -!call link %o7 - -#define sa %l0 -#define da %l1 -#define se %l2 -#define ns %l3 - -#define O0 %f16 -#define O1 %f18 -#define O2 %f20 -#define O3 %f22 -#define O4 %f24 -#define O5 %f26 -#define O6 %f28 -#define O7 %f30 - -#define A0 %f32 -#define A1 %f34 -#define A2 %f36 -#define A3 %f38 -#define A4 %f40 -#define A5 %f42 -#define A6 %f44 -#define A7 %f46 - -#define B0 %f48 -#define B1 %f50 -#define B2 %f52 -#define B3 %f54 -#define B4 %f56 -#define B5 %f58 -#define B6 %f60 -#define B7 %f62 - -#define USE_BLD -#define USE_BST - -#define MEMBAR_BEFORE_BLD membar #StoreLoad -#define MEMBAR_AFTER_BLD membar #StoreLoad - -#ifdef USE_BLD -#define BLD_A0 \ - ldda [sa]ASI_BLK_P,A0; \ - cmp sa,se; \ - blu,pt %icc,1f; \ - inc 64,sa; \ - dec 64,sa; \ -1: -#else -#define BLD_A0 \ - ldd [sa + 0],A0; \ - ldd [sa + 8],A1; \ - ldd [sa + 16],A2; \ - ldd [sa + 24],A3; \ - ldd [sa + 32],A4; \ - ldd [sa + 40],A5; \ - ldd [sa + 48],A6; \ - ldd [sa + 56],A7; \ - cmp sa,se; \ - blu,pt %icc,1f; \ - inc 64,sa; \ - dec 64,sa; \ -1: -#endif - -#ifdef USE_BLD -#define BLD_B0 \ - ldda [sa]ASI_BLK_P,B0; \ - cmp sa,se; \ - blu,pt %icc,1f; \ - inc 64,sa; \ - dec 64,sa; \ -1: -#else -#define BLD_B0 \ - ldd [sa + 0],B0; \ - ldd [sa + 8],B1; \ - ldd [sa + 16],B2; \ - ldd [sa + 24],B3; \ - ldd [sa + 32],B4; \ - ldd [sa + 40],B5; \ - ldd [sa + 48],B6; \ - ldd [sa + 56],B7; \ - cmp sa,se; \ - blu,pt %icc,1f; \ - inc 64,sa; \ - dec 64,sa; \ -1: -#endif - -#ifdef USE_BST -#define BST \ - stda O0,[da]ASI_BLK_P; \ - inc 64,da; \ - deccc ns; \ - ble,pn %icc,mlib_v_ImageCopy_end; \ - nop -#else -#define BST \ - std O0,[da + 0]; \ - std O1,[da + 8]; \ - std O2,[da + 16]; \ - std O3,[da + 24]; \ - std O4,[da + 32]; \ - std O5,[da + 40]; \ - std O6,[da + 48]; \ - std O7,[da + 56]; \ - inc 64,da; \ - deccc ns; \ - ble,pn %icc,mlib_v_ImageCopy_end; \ - nop -#endif - -#define COPY_A0 \ - fmovd A0, O0; \ - fmovd A1, O1; \ - fmovd A2, O2; \ - fmovd A3, O3; \ - fmovd A4, O4; \ - fmovd A5, O5; \ - fmovd A6, O6; \ - fmovd A7, O7; - -#define COPY_B0 \ - fmovd B0, O0; \ - fmovd B1, O1; \ - fmovd B2, O2; \ - fmovd B3, O3; \ - fmovd B4, O4; \ - fmovd B5, O5; \ - fmovd B6, O6; \ - fmovd B7, O7; - - .section ".text",#alloc,#execinstr - - ENTRY(mlib_v_ImageCopy_blk) ! function name - - save %sp,-MINFRAME,%sp ! reserve space for stack - ! and adjust register window -! do some error checking - tst sz ! size > 0 - ble,pn %icc,mlib_v_ImageCopy_ret - -! calculate loop count - sra sz,6,ns ! 64 bytes per loop - - add src,sz,se ! end address of source - mov src,sa - mov dst,da - ! issue memory barrier instruction - MEMBAR_BEFORE_BLD ! to ensure all previous memory load - ! and store has completed - - BLD_A0 - BLD_B0 ! issue the 2nd block load instruction - ! to synchronize with returning data -mlib_v_ImageCopy_bgn: - - COPY_A0 ! process data returned by BLD_A0 - BLD_A0 ! block load and sync data from BLD_B0 - BST ! block store data from BLD_A0 - - COPY_B0 ! process data returned by BLD_B0 - BLD_B0 ! block load and sync data from BLD_A0 - BST ! block store data from BLD_B0 - - bg,pt %icc,mlib_v_ImageCopy_bgn - -mlib_v_ImageCopy_end: - ! issue memory barrier instruction - MEMBAR_AFTER_BLD ! to ensure all previous memory load - ! and store has completed. -mlib_v_ImageCopy_ret: - ret ! return - restore ! restore register window - - SET_SIZE(mlib_v_ImageCopy_blk) diff --git a/jdk/src/java.desktop/unix/native/libawt/awt/medialib/vis_asi.h b/jdk/src/java.desktop/unix/native/libawt/awt/medialib/vis_asi.h deleted file mode 100644 index d0a75d3b6a2..00000000000 --- a/jdk/src/java.desktop/unix/native/libawt/awt/medialib/vis_asi.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -#ifndef VIS_ASI_H -#define VIS_ASI_H - -/* evolved from asm_asi.h in VSDK 1.0 */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* ASI definitions for VIS */ - -#define ASI_N 0x04 -#define ASI_NL 0x0C -#define ASI_AIUP 0x10 -#define ASI_AIUS 0x11 -#define ASI_AIUPL 0x18 -#define ASI_AIUSL 0x19 -#define ASI_PHYS_USE_EC_L 0x1C -#define ASI_PHYS_BYPASS_EC_WITH_EBIT_L 0x1D -#define ASI_DC_DATA 0x46 -#define ASI_DC_TAG 0x47 -#define ASI_UPA_CONTROL 0x4A -#define ASI_MONDO_SEND_CTRL 0x48 -#define ASI_MONDO_RECEIVE_CTRL 0x49 -#define ASI_AFSR 0x4C -#define ASI_AFAR 0x4D -#define ASI_EC_TAG_DATA 0x4E -#define ASI_ICACHE_DATA 0x66 -#define ASI_IC_INSTR 0x66 -#define ASI_IC_TAG 0x67 -#define ASI_IC_PRE_DECODE 0x6E -#define ASI_IC_NEXT_FIELD 0x6F -#define ASI_BLK_AIUP 0x70 -#define ASI_BLK_AIUS 0x71 -#define ASI_EC 0x76 -#define ASI_BLK_AIUPL 0x78 -#define ASI_BLK_AIUSL 0x79 -#define ASI_P 0x80 -#define ASI_S 0x81 -#define ASI_PNF 0x82 -#define ASI_SNF 0x83 -#define ASI_PL 0x88 -#define ASI_SL 0x89 -#define ASI_PNFL 0x8A -#define ASI_SNFL 0x8B -#define ASI_PST8_P 0xC0 -#define ASI_PST8_S 0xC1 -#define ASI_PST16_P 0xC2 -#define ASI_PST16_S 0xC3 -#define ASI_PST32_P 0xC4 -#define ASI_PST32_S 0xC5 -#define ASI_PST8_PL 0xC8 -#define ASI_PST8_SL 0xC9 -#define ASI_PST16_PL 0xCA -#define ASI_PST16_SL 0xCB -#define ASI_PST32_PL 0xCC -#define ASI_PST32_SL 0xCD -#define ASI_FL8_P 0xD0 -#define ASI_FL8_S 0xD1 -#define ASI_FL16_P 0xD2 -#define ASI_FL16_S 0xD3 -#define ASI_FL8_PL 0xD8 -#define ASI_FL8_SL 0xD9 -#define ASI_FL16_PL 0xDA -#define ASI_FL16_SL 0xDB -#define ASI_COMMIT_P 0xE0 -#define ASI_COMMIT_S 0xE1 -#define ASI_BLK_P 0xF0 -#define ASI_BLK_S 0xF1 -#define ASI_BLK_PL 0xF8 -#define ASI_BLK_SL 0xF9 - -#define ASI_NUCLEUS 0x04 -#define ASI_NUCLEUS_LITTLE 0x0C -#define ASI_AS_IF_USER_PRIMARY 0x10 -#define ASI_AS_IF_USER_SECONDARY 0x11 -#define ASI_PHYS_USE_EC 0x14 -#define ASI_PHYS_BYPASS_EC_WITH_EBIT 0x15 -#define ASI_AS_IF_USER_PRIMARY_LITTLE 0x18 -#define ASI_AS_IF_USER_SECONDARY_LITTLE 0x19 -#define ASI_PHYS_USE_EC_LITTLE 0x1C -#define ASI_PHYS_BYPASS_EC_WITH_EBIT_LITTLE 0x1D -#define ASI_LSU_CONTROL_REG 0x45 -#define ASI_DCACHE_DATA 0x46 -#define ASI_DCACHE_TAG 0x47 -#define ASI_INTR_DISPATCH_STATUS 0x48 -#define ASI_INTR_RECEIVE 0x49 -#define ASI_UPA_CONFIG_REG 0x4A -#define ASI_ESTATE_ERROR_EN_REG 0x4B -#define ASI_ASYNC_FAULT_STATUS 0x4C -#define ASI_ASYNC_FAULT_ADDR 0x4D -#define ASI_ECACHE_TAG_DATA 0x4E -#define ASI_OBSERVABILITY_REG 0x4F -#define ASI_IMMU 0x50 -#define ASI_IMU_TSB_BASE 0x50 -#define ASI_IMU_TAG_ACCESS 0x50 -#define ASI_IMU_SFSR 0x50 -#define ASI_IMU_TAG_TARGET 0x50 -#define ASI_IMU_TSB_POINTER_8K 0x51 -#define ASI_IMU_TSB_POINTER_64K 0x52 -#define ASI_IMU_DATAIN 0x54 -#define ASI_IMMU_DATA_IN 0x54 -#define ASI_IMU_DATA_ACCESS 0x55 -#define ASI_IMU_TAG_READ 0x56 -#define ASI_IMU_DEMAP 0x57 -#define ASI_DMMU 0x58 -#define ASI_PRIMARY_CONTEXT 0x58 -#define ASI_SECONDARY_CONTEXT 0x58 -#define ASI_DMU_TSB_BASE 0x58 -#define ASI_DMU_TAG_ACCESS 0x58 -#define ASI_DMU_TAG_TARGET 0x58 -#define ASI_DMU_SFSR 0x58 -#define ASI_DMU_SFAR 0x58 -#define ASI_DMU_VA_WATCHPOINT 0x58 -#define ASI_DMU_PA_WATCHPOINT 0x58 -#define ASI_DMU_TSB_POINTER_8K 0x59 -#define ASI_DMU_TSB_POINTER_64K 0x5A -#define ASI_DMU_TSB_POINTER_DIRECT 0x5B -#define ASI_DMU_DATAIN 0x5C -#define ASI_DMMU_DATA_IN 0x5C -#define ASI_DMU_DATA_ACCESS 0x5D -#define ASI_DMU_TAG_READ 0x5E -#define ASI_DMU_DEMAP 0x5F -#define ASI_ICACHE_INSTR 0x66 -#define ASI_ICACHE_TAG 0x67 -#define ASI_ICACHE_PRE_DECODE 0x6E -#define ASI_ICACHE_NEXT_FIELD 0x6F -#define ASI_BLOCK_AS_IF_USER_PRIMARY 0x70 -#define ASI_BLOCK_AS_IF_USER_SECONDARY 0x71 -#define ASI_EXT 0x76 -#define ASI_ECACHE 0x76 -#define ASI_ECACHE_DATA 0x76 -#define ASI_ECACHE_TAG 0x76 -#define ASI_SDB_INTR 0x77 -#define ASI_SDBH_ERR_REG 0x77 -#define ASI_SDBL_ERR_REG 0x77 -#define ASI_SDBH_CONTROL_REG 0x77 -#define ASI_SDBL_CONTROL_REG 0x77 -#define ASI_INTR_DISPATCH 0x77 -#define ASI_INTR_DATA0 0x77 -#define ASI_INTR_DATA1 0x77 -#define ASI_INTR_DATA2 0x77 -#define ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE 0x78 -#define ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE 0x79 -#define ASI_PRIMARY 0x80 -#define ASI_SECONDARY 0x81 -#define ASI_PRIMARY_NO_FAULT 0x82 -#define ASI_SECONDARY_NO_FAULT 0x83 -#define ASI_PRIMARY_LITTLE 0x88 -#define ASI_SECONDARY_LITTLE 0x89 -#define ASI_PRIMARY_NO_FAULT_LITTLE 0x8A -#define ASI_SECONDARY_NO_FAULT_LITTLE 0x8B -#define ASI_PST8_PRIMARY 0xC0 -#define ASI_PST8_SECONDARY 0xC1 -#define ASI_PST16_PRIMARY 0xC2 -#define ASI_PST16_SECONDARY 0xC3 -#define ASI_PST32_PRIMARY 0xC4 -#define ASI_PST32_SECONDARY 0xC5 -#define ASI_PST8_PRIMARY_LITTLE 0xC8 -#define ASI_PST8_SECONDARY_LITTLE 0xC9 -#define ASI_PST16_PRIMARY_LITTLE 0xCA -#define ASI_PST16_SECONDARY_LITTLE 0xCB -#define ASI_PST32_PRIMARY_LITTLE 0xCC -#define ASI_PST32_SECONDARY_LITTLE 0xCD -#define ASI_FL8_PRIMARY 0xD0 -#define ASI_FL8_SECONDARY 0xD1 -#define ASI_FL16_PRIMARY 0xD2 -#define ASI_FL16_SECONDARY 0xD3 -#define ASI_FL8_PRIMARY_LITTLE 0xD8 -#define ASI_FL8_SECONDARY_LITTLE 0xD9 -#define ASI_FL16_PRIMARY_LITTLE 0xDA -#define ASI_FL16_SECONDARY_LITTLE 0xDB -#define ASI_COMMIT_PRIMARY 0xE0 -#define ASI_COMMIT_SECONDARY 0xE1 -#define ASI_BLOCK_PRIMARY 0xF0 -#define ASI_BLOCK_SECONDARY 0xF1 -#define ASI_BLOCK_PRIMARY_LITTLE 0xF8 -#define ASI_BLOCK_SECONDARY_LITTLE 0xF9 - -#ifdef __cplusplus -} -#endif - -#endif /* VIS_ASI_H */ diff --git a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c index ef8caa94382..7ce7fae60d5 100644 --- a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c +++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c @@ -817,52 +817,22 @@ GtkApi* gtk2_load(JNIEnv *env, const char* lib_name) io_handler = XSetIOErrorHandler(NULL); if (fp_gtk_check_version(2, 2, 0) == NULL) { - jclass clazz = (*env)->FindClass(env, "sun/misc/GThreadHelper"); - jmethodID mid_getAndSetInitializationNeededFlag = - (*env)->GetStaticMethodID(env, clazz, "getAndSetInitializationNeededFlag", "()Z"); - jmethodID mid_lock = (*env)->GetStaticMethodID(env, clazz, "lock", "()V"); - jmethodID mid_unlock = (*env)->GetStaticMethodID(env, clazz, "unlock", "()V"); - - // Init the thread system to use GLib in a thread-safe mode - (*env)->CallStaticVoidMethod(env, clazz, mid_lock); - if ((*env)->ExceptionCheck(env)) { - AWT_UNLOCK(); - return FALSE; - } // Calling g_thread_init() multiple times leads to crash on GLib < 2.24 // We can use g_thread_get_initialized () but it is available only for - // GLib >= 2.20. We rely on GThreadHelper for GLib < 2.20. + // GLib >= 2.20. gboolean is_g_thread_get_initialized = FALSE; if (GLIB_CHECK_VERSION(2, 20, 0)) { is_g_thread_get_initialized = fp_g_thread_get_initialized(); } - if (!(*env)->CallStaticBooleanMethod(env, clazz, mid_getAndSetInitializationNeededFlag)) { - if (!is_g_thread_get_initialized) { - fp_g_thread_init(NULL); - } + if (!is_g_thread_get_initialized) { + fp_g_thread_init(NULL); + } - //According the GTK documentation, gdk_threads_init() should be - //called before gtk_init() or gtk_init_check() - fp_gdk_threads_init(); - } - jthrowable pendExcpn = NULL; - // Exception raised during mid_getAndSetInitializationNeededFlag - // call is saved and error handling is done - // after unlock method is called - if ((pendExcpn = (*env)->ExceptionOccurred(env)) != NULL) { - (*env)->ExceptionClear(env); - } - (*env)->CallStaticVoidMethod(env, clazz, mid_unlock); - if (pendExcpn != NULL) { - (*env)->Throw(env, pendExcpn); - } - // check if any exception occured during mid_unlock call - if ((*env)->ExceptionCheck(env)) { - AWT_UNLOCK(); - return FALSE; - } + //According the GTK documentation, gdk_threads_init() should be + //called before gtk_init() or gtk_init_check() + fp_gdk_threads_init(); } result = (*fp_gtk_init_check)(NULL, NULL); diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffineIndex_BC.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffineIndex_BC.c deleted file mode 100644 index d87fa01926d..00000000000 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffineIndex_BC.c +++ /dev/null @@ -1,1443 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - - -#include "vis_proto.h" -#include "mlib_image.h" -#include "mlib_ImageColormap.h" -#include "mlib_ImageAffine.h" -#include "mlib_v_ImageFilters.h" - -/***************************************************************/ -#define MLIB_LIMIT 512 -#define MLIB_SHIFT 16 - -/***************************************************************/ -#undef DECLAREVAR -#define DECLAREVAR() \ - DECLAREVAR0(); \ - mlib_s32 *warp_tbl = param -> warp_tbl; \ - mlib_s32 xSrc, ySrc; \ - mlib_s32 srcYStride = param -> srcYStride; \ - mlib_s32 filter = param -> filter; \ - mlib_s32 max_xsize = param -> max_xsize; \ - MLIB_TYPE *srcIndexPtr; \ - MLIB_TYPE *dstIndexPtr; \ - mlib_d64 *dstPixelPtr; \ - mlib_s32 i - -/***************************************************************/ -#define DECLAREVAR_U8() \ - mlib_s32 filterposx, filterposy; \ - mlib_d64 sum0, sum1, sum2, sum3; \ - mlib_f32 hi_row00, hi_row10, hi_row20, hi_row30; \ - mlib_f32 hi_row01, hi_row11, hi_row21, hi_row31; \ - mlib_f32 lo_row00, lo_row10, lo_row20, lo_row30; \ - mlib_f32 lo_row01, lo_row11, lo_row21, lo_row31; \ - mlib_d64 xFilter0, xFilter1, xFilter2, xFilter3, yFilter; \ - mlib_d64 v00, v10, v20, v30; \ - mlib_d64 v01, v11, v21, v31; \ - mlib_d64 v02, v12, v22, v32; \ - mlib_d64 v03, v13, v23, v33; \ - mlib_d64 d0, d1, d2, d3; \ - mlib_d64 d00, d10, d20, d30; \ - mlib_d64 d01, d11, d21, d31; \ - mlib_s32 cols; \ - mlib_d64 res, *xPtr - -/***************************************************************/ -#define DECLAREVAR_S16() \ - mlib_s32 filterposx, filterposy; \ - mlib_d64 sum0, sum1, sum2, sum3; \ - mlib_d64 row00, row10, row20, row30; \ - mlib_d64 row01, row11, row21, row31; \ - mlib_d64 row02, row12, row22, row32; \ - mlib_d64 row03, row13, row23, row33; \ - mlib_d64 xFilter0, xFilter1, xFilter2, xFilter3; \ - mlib_d64 yFilter0, yFilter1, yFilter2, yFilter3; \ - mlib_d64 v00, v01, v02, v03, v10, v11, v12, v13; \ - mlib_d64 v20, v21, v22, v23, v30, v31, v32, v33; \ - mlib_d64 u00, u01, u10, u11, u20, u21, u30, u31; \ - mlib_d64 d0, d1, d2, d3; \ - mlib_d64 *yPtr, *xPtr; \ - mlib_s32 cols; \ - mlib_d64 res; \ - mlib_f32 f_x01000100 = vis_to_float(0x01000100) - -/***************************************************************/ -#undef CLIP -#define CLIP() \ - dstData += dstYStride; \ - xLeft = leftEdges[j]; \ - xRight = rightEdges[j]; \ - X = xStarts[j]; \ - Y = yStarts[j]; \ - PREPARE_DELTAS \ - if (xLeft > xRight) \ - continue; \ - dstIndexPtr = (MLIB_TYPE *)dstData + xLeft; \ - dstPixelPtr = dstRowPtr - -/***************************************************************/ -#define FADD_4BC_U8() \ - d0 = vis_fpadd16(d00, d10); \ - d1 = vis_fpadd16(d20, d30); \ - d0 = vis_fpadd16(d0, d1); \ - d2 = vis_fpadd16(d01, d11); \ - d3 = vis_fpadd16(d21, d31); \ - d2 = vis_fpadd16(d2, d3); \ - res = vis_fpack16_pair(d0, d2) - -/***************************************************************/ -#define LOAD_BC_U8_4CH_1PIXEL(mlib_filters_u8, mlib_filters_u8_4) \ - filterposy = (Y >> FILTER_SHIFT) & FILTER_MASK; \ - yFilter = *((mlib_d64 *) ((mlib_u8 *)mlib_filters_u8 + filterposy)); \ - filterposx = (X >> FILTER_SHIFT) & FILTER_MASK; \ - xPtr = ((mlib_d64 *)((mlib_u8 *)mlib_filters_u8_4+4*filterposx)); \ - xFilter0 = xPtr[0]; \ - xFilter1 = xPtr[1]; \ - xFilter2 = xPtr[2]; \ - xFilter3 = xPtr[3]; \ - X += dX; \ - Y += dY; \ - hi_row00 = flut[srcIndexPtr[0]]; \ - lo_row00 = flut[srcIndexPtr[1]]; \ - hi_row01 = flut[srcIndexPtr[2]]; \ - lo_row01 = flut[srcIndexPtr[3]]; \ - srcIndexPtr += srcYStride; \ - hi_row10 = flut[srcIndexPtr[0]]; \ - lo_row10 = flut[srcIndexPtr[1]]; \ - hi_row11 = flut[srcIndexPtr[2]]; \ - lo_row11 = flut[srcIndexPtr[3]]; \ - srcIndexPtr += srcYStride; \ - hi_row20 = flut[srcIndexPtr[0]]; \ - lo_row20 = flut[srcIndexPtr[1]]; \ - hi_row21 = flut[srcIndexPtr[2]]; \ - lo_row21 = flut[srcIndexPtr[3]]; \ - srcIndexPtr += srcYStride; \ - hi_row30 = flut[srcIndexPtr[0]]; \ - lo_row30 = flut[srcIndexPtr[1]]; \ - hi_row31 = flut[srcIndexPtr[2]]; \ - lo_row31 = flut[srcIndexPtr[3]] - -/***************************************************************/ -#define NEXT_PIXEL_4BC() \ - xSrc = (X >> MLIB_SHIFT)-1; \ - ySrc = (Y >> MLIB_SHIFT)-1; \ - srcIndexPtr = (MLIB_TYPE *)lineAddr[ySrc] + xSrc - -/***************************************************************/ -#define RESULT_4BC_U8_1PIXEL(ind) \ - v00 = vis_fmul8x16au(hi_row00, vis_read_hi(yFilter)); \ - v01 = vis_fmul8x16au(lo_row00, vis_read_hi(yFilter)); \ - v02 = vis_fmul8x16au(hi_row01, vis_read_hi(yFilter)); \ - v03 = vis_fmul8x16au(lo_row01, vis_read_hi(yFilter)); \ - v10 = vis_fmul8x16al(hi_row10, vis_read_hi(yFilter)); \ - v11 = vis_fmul8x16al(lo_row10, vis_read_hi(yFilter)); \ - sum0 = vis_fpadd16(v00, v10); \ - v12 = vis_fmul8x16al(hi_row11, vis_read_hi(yFilter)); \ - sum1 = vis_fpadd16(v01, v11); \ - v13 = vis_fmul8x16al(lo_row11, vis_read_hi(yFilter)); \ - sum2 = vis_fpadd16(v02, v12); \ - v20 = vis_fmul8x16au(hi_row20, vis_read_lo(yFilter)); \ - sum3 = vis_fpadd16(v03, v13); \ - v21 = vis_fmul8x16au(lo_row20, vis_read_lo(yFilter)); \ - sum0 = vis_fpadd16(sum0, v20); \ - v22 = vis_fmul8x16au(hi_row21, vis_read_lo(yFilter)); \ - sum1 = vis_fpadd16(sum1, v21); \ - v23 = vis_fmul8x16au(lo_row21, vis_read_lo(yFilter)); \ - sum2 = vis_fpadd16(sum2, v22); \ - v30 = vis_fmul8x16al(hi_row30, vis_read_lo(yFilter)); \ - sum3 = vis_fpadd16(sum3, v23); \ - v31 = vis_fmul8x16al(lo_row30, vis_read_lo(yFilter)); \ - sum0 = vis_fpadd16(sum0, v30); \ - v32 = vis_fmul8x16al(hi_row31, vis_read_lo(yFilter)); \ - sum1 = vis_fpadd16(sum1, v31); \ - v33 = vis_fmul8x16al(lo_row31, vis_read_lo(yFilter)); \ - sum2 = vis_fpadd16(sum2, v32); \ - v00 = vis_fmul8sux16(sum0, xFilter0); \ - sum3 = vis_fpadd16(sum3, v33); \ - v01 = vis_fmul8ulx16(sum0, xFilter0); \ - v10 = vis_fmul8sux16(sum1, xFilter1); \ - d0##ind = vis_fpadd16(v00, v01); \ - v11 = vis_fmul8ulx16(sum1, xFilter1); \ - v20 = vis_fmul8sux16(sum2, xFilter2); \ - d1##ind = vis_fpadd16(v10, v11); \ - v21 = vis_fmul8ulx16(sum2, xFilter2); \ - v30 = vis_fmul8sux16(sum3, xFilter3); \ - d2##ind = vis_fpadd16(v20, v21); \ - v31 = vis_fmul8ulx16(sum3, xFilter3); \ - d3##ind = vis_fpadd16(v30, v31) - -/***************************************************************/ -#define BC_U8_4CH(ind, mlib_filters_u8, mlib_filters_u8_4) \ - v00 = vis_fmul8x16au(hi_row00, vis_read_hi(yFilter)); \ - v01 = vis_fmul8x16au(lo_row00, vis_read_hi(yFilter)); \ - v02 = vis_fmul8x16au(hi_row01, vis_read_hi(yFilter)); \ - v03 = vis_fmul8x16au(lo_row01, vis_read_hi(yFilter)); \ - hi_row00 = flut[srcIndexPtr[0]]; \ - filterposy = (Y >> FILTER_SHIFT); \ - v10 = vis_fmul8x16al(hi_row10, vis_read_hi(yFilter)); \ - lo_row00 = flut[srcIndexPtr[1]]; \ - v11 = vis_fmul8x16al(lo_row10, vis_read_hi(yFilter)); \ - sum0 = vis_fpadd16(v00, v10); \ - hi_row01 = flut[srcIndexPtr[2]]; \ - v12 = vis_fmul8x16al(hi_row11, vis_read_hi(yFilter)); \ - lo_row01 = flut[srcIndexPtr[3]]; \ - filterposx = (X >> FILTER_SHIFT); \ - v13 = vis_fmul8x16al(lo_row11, vis_read_hi(yFilter)); \ - srcIndexPtr += srcYStride; \ - hi_row10 = flut[srcIndexPtr[0]]; \ - v20 = vis_fmul8x16au(hi_row20, vis_read_lo(yFilter)); \ - sum1 = vis_fpadd16(v01, v11); \ - lo_row10 = flut[srcIndexPtr[1]]; \ - X += dX; \ - hi_row11 = flut[srcIndexPtr[2]]; \ - v21 = vis_fmul8x16au(lo_row20, vis_read_lo(yFilter)); \ - sum2 = vis_fpadd16(v02, v12); \ - lo_row11 = flut[srcIndexPtr[3]]; \ - v22 = vis_fmul8x16au(hi_row21, vis_read_lo(yFilter)); \ - srcIndexPtr += srcYStride; \ - hi_row20 = flut[srcIndexPtr[0]]; \ - v23 = vis_fmul8x16au(lo_row21, vis_read_lo(yFilter)); \ - sum3 = vis_fpadd16(v03, v13); \ - Y += dY; \ - xSrc = (X >> MLIB_SHIFT)-1; \ - v30 = vis_fmul8x16al(hi_row30, vis_read_lo(yFilter)); \ - sum0 = vis_fpadd16(sum0, v20); \ - lo_row20 = flut[srcIndexPtr[1]]; \ - ySrc = (Y >> MLIB_SHIFT)-1; \ - hi_row21 = flut[srcIndexPtr[2]]; \ - v31 = vis_fmul8x16al(lo_row30, vis_read_lo(yFilter)); \ - sum1 = vis_fpadd16(sum1, v21); \ - filterposy &= FILTER_MASK; \ - lo_row21 = flut[srcIndexPtr[3]]; \ - v32 = vis_fmul8x16al(hi_row31, vis_read_lo(yFilter)); \ - srcIndexPtr += srcYStride; \ - filterposx &= FILTER_MASK; \ - v33 = vis_fmul8x16al(lo_row31, vis_read_lo(yFilter)); \ - sum2 = vis_fpadd16(sum2, v22); \ - hi_row30 = flut[srcIndexPtr[0]]; \ - sum3 = vis_fpadd16(sum3, v23); \ - sum0 = vis_fpadd16(sum0, v30); \ - lo_row30 = flut[srcIndexPtr[1]]; \ - sum1 = vis_fpadd16(sum1, v31); \ - v00 = vis_fmul8sux16(sum0, xFilter0); \ - hi_row31 = flut[srcIndexPtr[2]]; \ - sum2 = vis_fpadd16(sum2, v32); \ - v01 = vis_fmul8ulx16(sum0, xFilter0); \ - sum3 = vis_fpadd16(sum3, v33); \ - lo_row31 = flut[srcIndexPtr[3]]; \ - v10 = vis_fmul8sux16(sum1, xFilter1); \ - d0##ind = vis_fpadd16(v00, v01); \ - yFilter = *((mlib_d64 *)((mlib_u8 *)mlib_filters_u8 + filterposy)); \ - v11 = vis_fmul8ulx16(sum1, xFilter1); \ - xPtr = ((mlib_d64 *)((mlib_u8 *)mlib_filters_u8_4+4*filterposx)); \ - xFilter0 = xPtr[0]; \ - v20 = vis_fmul8sux16(sum2, xFilter2); \ - d1##ind = vis_fpadd16(v10, v11); \ - xFilter1 = xPtr[1]; \ - v21 = vis_fmul8ulx16(sum2, xFilter2); \ - xFilter2 = xPtr[2]; \ - v30 = vis_fmul8sux16(sum3, xFilter3); \ - d2##ind = vis_fpadd16(v20, v21); \ - xFilter3 = xPtr[3]; \ - v31 = vis_fmul8ulx16(sum3, xFilter3); \ - srcIndexPtr = (MLIB_TYPE *)lineAddr[ySrc] + xSrc; \ - d3##ind = vis_fpadd16(v30, v31) - -/***************************************************************/ -#define LOAD_BC_S16_4CH_1PIXEL(mlib_filters_s16_4) \ - row00 = flut[srcIndexPtr[0]]; \ - row01 = flut[srcIndexPtr[1]]; \ - row02 = flut[srcIndexPtr[2]]; \ - row03 = flut[srcIndexPtr[3]]; \ - srcIndexPtr += srcYStride; \ - row10 = flut[srcIndexPtr[0]]; \ - row11 = flut[srcIndexPtr[1]]; \ - row12 = flut[srcIndexPtr[2]]; \ - row13 = flut[srcIndexPtr[3]]; \ - srcIndexPtr += srcYStride; \ - row20 = flut[srcIndexPtr[0]]; \ - row21 = flut[srcIndexPtr[1]]; \ - row22 = flut[srcIndexPtr[2]]; \ - row23 = flut[srcIndexPtr[3]]; \ - srcIndexPtr += srcYStride; \ - row30 = flut[srcIndexPtr[0]]; \ - row31 = flut[srcIndexPtr[1]]; \ - row32 = flut[srcIndexPtr[2]]; \ - row33 = flut[srcIndexPtr[3]]; \ - filterposy = (Y >> FILTER_SHIFT) & FILTER_MASK; \ - yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \ - yFilter0 = yPtr[0]; \ - yFilter1 = yPtr[1]; \ - yFilter2 = yPtr[2]; \ - yFilter3 = yPtr[3]; \ - filterposx = (X >> FILTER_SHIFT) & FILTER_MASK; \ - xPtr = ((mlib_d64 *)((mlib_u8 *)mlib_filters_s16_4 + filterposx*4)); \ - xFilter0 = xPtr[0]; \ - xFilter1 = xPtr[1]; \ - xFilter2 = xPtr[2]; \ - xFilter3 = xPtr[3]; \ - X += dX; \ - Y += dY - -/***************************************************************/ -#define RESULT_4BC_S16_1PIXEL() \ - u00 = vis_fmul8sux16(row00, yFilter0); \ - u01 = vis_fmul8ulx16(row00, yFilter0); \ - u10 = vis_fmul8sux16(row01, yFilter0); \ - u11 = vis_fmul8ulx16(row01, yFilter0); \ - v00 = vis_fpadd16(u00, u01); \ - u20 = vis_fmul8sux16(row02, yFilter0); \ - v01 = vis_fpadd16(u10, u11); \ - u21 = vis_fmul8ulx16(row02, yFilter0); \ - u30 = vis_fmul8sux16(row03, yFilter0); \ - u31 = vis_fmul8ulx16(row03, yFilter0); \ - v02 = vis_fpadd16(u20, u21); \ - u00 = vis_fmul8sux16(row10, yFilter1); \ - u01 = vis_fmul8ulx16(row10, yFilter1); \ - v03 = vis_fpadd16(u30, u31); \ - u10 = vis_fmul8sux16(row11, yFilter1); \ - u11 = vis_fmul8ulx16(row11, yFilter1); \ - v10 = vis_fpadd16(u00, u01); \ - u20 = vis_fmul8sux16(row12, yFilter1); \ - v11 = vis_fpadd16(u10, u11); \ - u21 = vis_fmul8ulx16(row12, yFilter1); \ - u30 = vis_fmul8sux16(row13, yFilter1); \ - u31 = vis_fmul8ulx16(row13, yFilter1); \ - u00 = vis_fmul8sux16(row20, yFilter2); \ - v12 = vis_fpadd16(u20, u21); \ - u01 = vis_fmul8ulx16(row20, yFilter2); \ - v13 = vis_fpadd16(u30, u31); \ - u10 = vis_fmul8sux16(row21, yFilter2); \ - u11 = vis_fmul8ulx16(row21, yFilter2); \ - v20 = vis_fpadd16(u00, u01); \ - u20 = vis_fmul8sux16(row22, yFilter2); \ - sum0 = vis_fpadd16(v00, v10); \ - u21 = vis_fmul8ulx16(row22, yFilter2); \ - u30 = vis_fmul8sux16(row23, yFilter2); \ - u31 = vis_fmul8ulx16(row23, yFilter2); \ - u00 = vis_fmul8sux16(row30, yFilter3); \ - u01 = vis_fmul8ulx16(row30, yFilter3); \ - v21 = vis_fpadd16(u10, u11); \ - sum1 = vis_fpadd16(v01, v11); \ - u10 = vis_fmul8sux16(row31, yFilter3); \ - sum2 = vis_fpadd16(v02, v12); \ - sum3 = vis_fpadd16(v03, v13); \ - v22 = vis_fpadd16(u20, u21); \ - u11 = vis_fmul8ulx16(row31, yFilter3); \ - sum0 = vis_fpadd16(sum0, v20); \ - u20 = vis_fmul8sux16(row32, yFilter3); \ - u21 = vis_fmul8ulx16(row32, yFilter3); \ - v23 = vis_fpadd16(u30, u31); \ - v30 = vis_fpadd16(u00, u01); \ - sum1 = vis_fpadd16(sum1, v21); \ - u30 = vis_fmul8sux16(row33, yFilter3); \ - u31 = vis_fmul8ulx16(row33, yFilter3); \ - v31 = vis_fpadd16(u10, u11); \ - sum2 = vis_fpadd16(sum2, v22); \ - sum3 = vis_fpadd16(sum3, v23); \ - v32 = vis_fpadd16(u20, u21); \ - sum0 = vis_fpadd16(sum0, v30); \ - v33 = vis_fpadd16(u30, u31); \ - v00 = vis_fmul8sux16(sum0, xFilter0); \ - sum1 = vis_fpadd16(sum1, v31); \ - sum2 = vis_fpadd16(sum2, v32); \ - v01 = vis_fmul8ulx16(sum0, xFilter0); \ - v10 = vis_fmul8sux16(sum1, xFilter1); \ - sum3 = vis_fpadd16(sum3, v33); \ - v11 = vis_fmul8ulx16(sum1, xFilter1); \ - d0 = vis_fpadd16(v00, v01); \ - v20 = vis_fmul8sux16(sum2, xFilter2); \ - v21 = vis_fmul8ulx16(sum2, xFilter2); \ - d1 = vis_fpadd16(v10, v11); \ - v30 = vis_fmul8sux16(sum3, xFilter3); \ - v31 = vis_fmul8ulx16(sum3, xFilter3); \ - d2 = vis_fpadd16(v20, v21); \ - d3 = vis_fpadd16(v30, v31); \ - d0 = vis_fpadd16(d0, d1); \ - d2 = vis_fpadd16(d2, d3); \ - d0 = vis_fpadd16(d0, d2); \ - d2 = vis_fmuld8sux16(f_x01000100, vis_read_hi(d0)); \ - d3 = vis_fmuld8sux16(f_x01000100, vis_read_lo(d0)); \ - res = vis_fpackfix_pair(d2, d3) - -/***************************************************************/ -#define BC_S16_4CH(mlib_filters_s16_4) \ - u00 = vis_fmul8sux16(row00, yFilter0); \ - u01 = vis_fmul8ulx16(row00, yFilter0); \ - u10 = vis_fmul8sux16(row01, yFilter0); \ - u11 = vis_fmul8ulx16(row01, yFilter0); \ - v00 = vis_fpadd16(u00, u01); \ - u20 = vis_fmul8sux16(row02, yFilter0); \ - v01 = vis_fpadd16(u10, u11); \ - u21 = vis_fmul8ulx16(row02, yFilter0); \ - u30 = vis_fmul8sux16(row03, yFilter0); \ - u31 = vis_fmul8ulx16(row03, yFilter0); \ - v02 = vis_fpadd16(u20, u21); \ - row00 = flut[srcIndexPtr[0]]; \ - u00 = vis_fmul8sux16(row10, yFilter1); \ - u01 = vis_fmul8ulx16(row10, yFilter1); \ - filterposy = (Y >> FILTER_SHIFT); \ - v03 = vis_fpadd16(u30, u31); \ - row01 = flut[srcIndexPtr[1]]; \ - u10 = vis_fmul8sux16(row11, yFilter1); \ - u11 = vis_fmul8ulx16(row11, yFilter1); \ - v10 = vis_fpadd16(u00, u01); \ - row02 = flut[srcIndexPtr[2]]; \ - u20 = vis_fmul8sux16(row12, yFilter1); \ - v11 = vis_fpadd16(u10, u11); \ - u21 = vis_fmul8ulx16(row12, yFilter1); \ - u30 = vis_fmul8sux16(row13, yFilter1); \ - row03 = flut[srcIndexPtr[3]]; \ - u31 = vis_fmul8ulx16(row13, yFilter1); \ - u00 = vis_fmul8sux16(row20, yFilter2); \ - filterposx = (X >> FILTER_SHIFT); \ - srcIndexPtr += srcYStride; \ - v12 = vis_fpadd16(u20, u21); \ - u01 = vis_fmul8ulx16(row20, yFilter2); \ - v13 = vis_fpadd16(u30, u31); \ - row10 = flut[srcIndexPtr[0]]; \ - u10 = vis_fmul8sux16(row21, yFilter2); \ - X += dX; \ - u11 = vis_fmul8ulx16(row21, yFilter2); \ - v20 = vis_fpadd16(u00, u01); \ - row11 = flut[srcIndexPtr[1]]; \ - u20 = vis_fmul8sux16(row22, yFilter2); \ - sum0 = vis_fpadd16(v00, v10); \ - u21 = vis_fmul8ulx16(row22, yFilter2); \ - row12 = flut[srcIndexPtr[2]]; \ - u30 = vis_fmul8sux16(row23, yFilter2); \ - u31 = vis_fmul8ulx16(row23, yFilter2); \ - row13 = flut[srcIndexPtr[3]]; \ - u00 = vis_fmul8sux16(row30, yFilter3); \ - srcIndexPtr += srcYStride; \ - u01 = vis_fmul8ulx16(row30, yFilter3); \ - v21 = vis_fpadd16(u10, u11); \ - Y += dY; \ - xSrc = (X >> MLIB_SHIFT)-1; \ - sum1 = vis_fpadd16(v01, v11); \ - row20 = flut[srcIndexPtr[0]]; \ - u10 = vis_fmul8sux16(row31, yFilter3); \ - sum2 = vis_fpadd16(v02, v12); \ - sum3 = vis_fpadd16(v03, v13); \ - ySrc = (Y >> MLIB_SHIFT)-1; \ - row21 = flut[srcIndexPtr[1]]; \ - v22 = vis_fpadd16(u20, u21); \ - u11 = vis_fmul8ulx16(row31, yFilter3); \ - sum0 = vis_fpadd16(sum0, v20); \ - u20 = vis_fmul8sux16(row32, yFilter3); \ - row22 = flut[srcIndexPtr[2]]; \ - u21 = vis_fmul8ulx16(row32, yFilter3); \ - v23 = vis_fpadd16(u30, u31); \ - v30 = vis_fpadd16(u00, u01); \ - filterposy &= FILTER_MASK; \ - sum1 = vis_fpadd16(sum1, v21); \ - u30 = vis_fmul8sux16(row33, yFilter3); \ - row23 = flut[srcIndexPtr[3]]; \ - u31 = vis_fmul8ulx16(row33, yFilter3); \ - srcIndexPtr += srcYStride; \ - filterposx &= FILTER_MASK; \ - v31 = vis_fpadd16(u10, u11); \ - row30 = flut[srcIndexPtr[0]]; \ - sum2 = vis_fpadd16(sum2, v22); \ - sum3 = vis_fpadd16(sum3, v23); \ - row31 = flut[srcIndexPtr[1]]; \ - v32 = vis_fpadd16(u20, u21); \ - sum0 = vis_fpadd16(sum0, v30); \ - row32 = flut[srcIndexPtr[2]]; \ - v33 = vis_fpadd16(u30, u31); \ - row33 = flut[srcIndexPtr[3]]; \ - v00 = vis_fmul8sux16(sum0, xFilter0); \ - yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \ - sum1 = vis_fpadd16(sum1, v31); \ - yFilter0 = yPtr[0]; \ - sum2 = vis_fpadd16(sum2, v32); \ - v01 = vis_fmul8ulx16(sum0, xFilter0); \ - yFilter1 = yPtr[1]; \ - v10 = vis_fmul8sux16(sum1, xFilter1); \ - sum3 = vis_fpadd16(sum3, v33); \ - yFilter2 = yPtr[2]; \ - v11 = vis_fmul8ulx16(sum1, xFilter1); \ - d0 = vis_fpadd16(v00, v01); \ - yFilter3 = yPtr[3]; \ - xPtr = ((mlib_d64 *)((mlib_u8 *)mlib_filters_s16_4 + filterposx*4)); \ - v20 = vis_fmul8sux16(sum2, xFilter2); \ - xFilter0 = xPtr[0]; \ - v21 = vis_fmul8ulx16(sum2, xFilter2); \ - d1 = vis_fpadd16(v10, v11); \ - xFilter1 = xPtr[1]; \ - v30 = vis_fmul8sux16(sum3, xFilter3); \ - v31 = vis_fmul8ulx16(sum3, xFilter3); \ - d2 = vis_fpadd16(v20, v21); \ - xFilter2 = xPtr[2]; \ - d3 = vis_fpadd16(v30, v31); \ - xFilter3 = xPtr[3]; \ - srcIndexPtr = (MLIB_TYPE *)lineAddr[ySrc] + xSrc - -/***************************************************************/ -#define FADD_4BC_S16() \ - d0 = vis_fpadd16(d0, d1); \ - d2 = vis_fpadd16(d2, d3); \ - d0 = vis_fpadd16(d0, d2); \ - d2 = vis_fmuld8sux16(f_x01000100, vis_read_hi(d0)); \ - d3 = vis_fmuld8sux16(f_x01000100, vis_read_lo(d0)); \ - res = vis_fpackfix_pair(d2, d3) - -/***************************************************************/ -#undef MLIB_TYPE -#define MLIB_TYPE mlib_u8 - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 5 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 8) - 1) << 3) - -/***************************************************************/ -mlib_status mlib_ImageAffineIndex_U8_U8_3CH_BC(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - DECLAREVAR_U8(); - mlib_f32 *flut = (mlib_f32 *)mlib_ImageGetLutNormalTable(colormap) - - mlib_ImageGetLutOffset(colormap); - mlib_d64 dstRowData[MLIB_LIMIT/2]; - mlib_d64 *dstRowPtr = dstRowData; - const mlib_s16 *mlib_filters_table_u8, *mlib_filters_table_u8_4; - - if (filter == MLIB_BICUBIC) { - mlib_filters_table_u8 = mlib_filters_u8_bc; - mlib_filters_table_u8_4 = mlib_filters_u8_bc_4; - } else { - mlib_filters_table_u8 = mlib_filters_u8_bc2; - mlib_filters_table_u8_4 = mlib_filters_u8_bc2_4; - } - - if (max_xsize > MLIB_LIMIT) { - dstRowPtr = mlib_malloc(sizeof(mlib_d64) * ((max_xsize + 1) >> 1)); - - if (dstRowPtr == NULL) return MLIB_FAILURE; - } - - vis_write_gsr(3 << 3); - - for (j = yStart; j <= yFinish; j++) { - - CLIP(); - - cols = xRight - xLeft + 1; - - i = 0; - - if (i <= cols - 6) { - - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - - NEXT_PIXEL_4BC(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - FADD_4BC_U8(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - -#pragma pipeloop(0) - for (; i <= cols-8; i += 2) { - *dstPixelPtr++ = res; - - FADD_4BC_U8(); - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - } - - *dstPixelPtr++ = res; - - FADD_4BC_U8(); - *dstPixelPtr++ = res; - - RESULT_4BC_U8_1PIXEL(0); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 6; - } - - if (i <= cols-4) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - - NEXT_PIXEL_4BC(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - FADD_4BC_U8(); - *dstPixelPtr++ = res; - - RESULT_4BC_U8_1PIXEL(0); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 4; - } - - if (i <= cols-2) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(0); - - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 2; - } - - if (i < cols) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(0); - - d0 = vis_fpadd16(d00, d10); - d1 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d1); - res = vis_fpack16_pair(d0, d0); - *dstPixelPtr++ = res; - } - - mlib_ImageColorTrue2IndexLine_U8_U8_3_in_4((mlib_u8 *)dstRowPtr, - dstIndexPtr, - xRight - xLeft + 1, - colormap); - } - - if (dstRowPtr != dstRowData) mlib_free(dstRowPtr); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 4 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 9) - 1) << 3) - -/***************************************************************/ -mlib_status mlib_ImageAffineIndex_U8_S16_3CH_BC(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - DECLAREVAR_S16(); - mlib_d64 *flut = (mlib_d64 *)mlib_ImageGetLutNormalTable(colormap) - - mlib_ImageGetLutOffset(colormap); - mlib_d64 dstRowData[MLIB_LIMIT]; - mlib_d64 *dstRowPtr = dstRowData; - const mlib_s16 *mlib_filters_table_s16_4; - - if (filter == MLIB_BICUBIC) { - mlib_filters_table_s16_4 = mlib_filters_s16_bc_4; - } else { - mlib_filters_table_s16_4 = mlib_filters_s16_bc2_4; - } - - if (max_xsize > MLIB_LIMIT) { - dstRowPtr = mlib_malloc(sizeof(mlib_d64) * max_xsize); - - if (dstRowPtr == NULL) return MLIB_FAILURE; - } - - for (j = yStart; j <= yFinish; j++) { - - CLIP(); - - vis_write_gsr(10 << 3); - - cols = xRight - xLeft + 1; - i = 0; - - if (i <= cols - 4) { - - NEXT_PIXEL_4BC(); - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - - NEXT_PIXEL_4BC(); - - BC_S16_4CH(mlib_filters_table_s16_4); - FADD_4BC_S16(); - - BC_S16_4CH(mlib_filters_table_s16_4); - -#pragma pipeloop(0) - - for (; i < cols-4; i++) { - *dstPixelPtr++ = res; - - FADD_4BC_S16(); - BC_S16_4CH(mlib_filters_table_s16_4); - } - - *dstPixelPtr++ = res; - - FADD_4BC_S16(); - *dstPixelPtr++ = res; - - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - i += 4; - } - -#pragma pipeloop(0) - for (; i < cols; i++) { - NEXT_PIXEL_4BC(); - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - } - - mlib_ImageColorTrue2IndexLine_S16_U8_3_in_4((mlib_s16 *)dstRowPtr, - dstIndexPtr, - xRight - xLeft + 1, - colormap); - } - - if (dstRowPtr != dstRowData) mlib_free(dstRowPtr); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 5 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 8) - 1) << 3) - -/***************************************************************/ -mlib_status mlib_ImageAffineIndex_U8_U8_4CH_BC(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - DECLAREVAR_U8(); - mlib_f32 *flut = (mlib_f32 *)mlib_ImageGetLutNormalTable(colormap) - - mlib_ImageGetLutOffset(colormap); - mlib_d64 dstRowData[MLIB_LIMIT/2]; - mlib_d64 *dstRowPtr = dstRowData; - const mlib_s16 *mlib_filters_table_u8, *mlib_filters_table_u8_4; - - if (filter == MLIB_BICUBIC) { - mlib_filters_table_u8 = mlib_filters_u8_bc; - mlib_filters_table_u8_4 = mlib_filters_u8_bc_4; - } else { - mlib_filters_table_u8 = mlib_filters_u8_bc2; - mlib_filters_table_u8_4 = mlib_filters_u8_bc2_4; - } - - if (max_xsize > MLIB_LIMIT) { - dstRowPtr = mlib_malloc(sizeof(mlib_d64) * ((max_xsize + 1) >> 1)); - - if (dstRowPtr == NULL) return MLIB_FAILURE; - } - - vis_write_gsr(3 << 3); - - for (j = yStart; j <= yFinish; j++) { - - CLIP(); - - cols = xRight - xLeft + 1; - - i = 0; - - if (i <= cols - 6) { - - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - - NEXT_PIXEL_4BC(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - FADD_4BC_U8(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - -#pragma pipeloop(0) - for (; i <= cols-8; i += 2) { - *dstPixelPtr++ = res; - - FADD_4BC_U8(); - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - } - - *dstPixelPtr++ = res; - - FADD_4BC_U8(); - *dstPixelPtr++ = res; - - RESULT_4BC_U8_1PIXEL(0); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 6; - } - - if (i <= cols-4) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - - NEXT_PIXEL_4BC(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - FADD_4BC_U8(); - *dstPixelPtr++ = res; - - RESULT_4BC_U8_1PIXEL(0); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 4; - } - - if (i <= cols-2) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(0); - - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 2; - } - - if (i < cols) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(0); - - d0 = vis_fpadd16(d00, d10); - d1 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d1); - res = vis_fpack16_pair(d0, d0); - *dstPixelPtr++ = res; - } - - mlib_ImageColorTrue2IndexLine_U8_U8_4((mlib_u8 *)dstRowPtr, - dstIndexPtr, - xRight - xLeft + 1, - colormap); - } - - if (dstRowPtr != dstRowData) mlib_free(dstRowPtr); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 4 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 9) - 1) << 3) - -/***************************************************************/ -mlib_status mlib_ImageAffineIndex_U8_S16_4CH_BC(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - DECLAREVAR_S16(); - mlib_d64 *flut = (mlib_d64 *)mlib_ImageGetLutNormalTable(colormap) - - mlib_ImageGetLutOffset(colormap); - mlib_d64 dstRowData[MLIB_LIMIT]; - mlib_d64 *dstRowPtr = dstRowData; - const mlib_s16 *mlib_filters_table_s16_4; - - if (filter == MLIB_BICUBIC) { - mlib_filters_table_s16_4 = mlib_filters_s16_bc_4; - } else { - mlib_filters_table_s16_4 = mlib_filters_s16_bc2_4; - } - - if (max_xsize > MLIB_LIMIT) { - dstRowPtr = mlib_malloc(sizeof(mlib_d64) * max_xsize); - - if (dstRowPtr == NULL) return MLIB_FAILURE; - } - - for (j = yStart; j <= yFinish; j++) { - - CLIP(); - - vis_write_gsr(10 << 3); - - cols = xRight - xLeft + 1; - i = 0; - - if (i <= cols - 4) { - - NEXT_PIXEL_4BC(); - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - - NEXT_PIXEL_4BC(); - - BC_S16_4CH(mlib_filters_table_s16_4); - FADD_4BC_S16(); - - BC_S16_4CH(mlib_filters_table_s16_4); - -#pragma pipeloop(0) - - for (; i < cols-4; i++) { - *dstPixelPtr++ = res; - - FADD_4BC_S16(); - BC_S16_4CH(mlib_filters_table_s16_4); - } - - *dstPixelPtr++ = res; - - FADD_4BC_S16(); - *dstPixelPtr++ = res; - - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - i += 4; - } - -#pragma pipeloop(0) - for (; i < cols; i++) { - NEXT_PIXEL_4BC(); - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - } - - mlib_ImageColorTrue2IndexLine_S16_U8_4((mlib_s16 *)dstRowPtr, - dstIndexPtr, - xRight - xLeft + 1, - colormap); - } - - if (dstRowPtr != dstRowData) mlib_free(dstRowPtr); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef MLIB_TYPE -#define MLIB_TYPE mlib_s16 - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 5 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 8) - 1) << 3) - -/***************************************************************/ -mlib_status mlib_ImageAffineIndex_S16_U8_3CH_BC(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - DECLAREVAR_U8(); - mlib_f32 *flut = (mlib_f32 *)mlib_ImageGetLutNormalTable(colormap) - - mlib_ImageGetLutOffset(colormap); - mlib_d64 dstRowData[MLIB_LIMIT/2]; - mlib_d64 *dstRowPtr = dstRowData; - const mlib_s16 *mlib_filters_table_u8, *mlib_filters_table_u8_4; - - if (filter == MLIB_BICUBIC) { - mlib_filters_table_u8 = mlib_filters_u8_bc; - mlib_filters_table_u8_4 = mlib_filters_u8_bc_4; - } else { - mlib_filters_table_u8 = mlib_filters_u8_bc2; - mlib_filters_table_u8_4 = mlib_filters_u8_bc2_4; - } - - srcYStride >>= 1; - - if (max_xsize > MLIB_LIMIT) { - dstRowPtr = mlib_malloc(sizeof(mlib_d64) * ((max_xsize + 1) >> 1)); - - if (dstRowPtr == NULL) return MLIB_FAILURE; - } - - vis_write_gsr(3 << 3); - - for (j = yStart; j <= yFinish; j++) { - - CLIP(); - - cols = xRight - xLeft + 1; - - i = 0; - - if (i <= cols - 6) { - - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - - NEXT_PIXEL_4BC(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - FADD_4BC_U8(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - -#pragma pipeloop(0) - for (; i <= cols-8; i += 2) { - *dstPixelPtr++ = res; - - FADD_4BC_U8(); - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - } - - *dstPixelPtr++ = res; - - FADD_4BC_U8(); - *dstPixelPtr++ = res; - - RESULT_4BC_U8_1PIXEL(0); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 6; - } - - if (i <= cols-4) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - - NEXT_PIXEL_4BC(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - FADD_4BC_U8(); - *dstPixelPtr++ = res; - - RESULT_4BC_U8_1PIXEL(0); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 4; - } - - if (i <= cols-2) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(0); - - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 2; - } - - if (i < cols) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(0); - - d0 = vis_fpadd16(d00, d10); - d1 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d1); - res = vis_fpack16_pair(d0, d0); - *dstPixelPtr++ = res; - } - - mlib_ImageColorTrue2IndexLine_U8_S16_3_in_4((mlib_u8 *)dstRowPtr, - dstIndexPtr, - xRight - xLeft + 1, - colormap); - } - - if (dstRowPtr != dstRowData) mlib_free(dstRowPtr); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 4 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 9) - 1) << 3) - -/***************************************************************/ -mlib_status mlib_ImageAffineIndex_S16_S16_3CH_BC(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - DECLAREVAR_S16(); - mlib_d64 *flut = (mlib_d64 *)mlib_ImageGetLutNormalTable(colormap) - - mlib_ImageGetLutOffset(colormap); - mlib_d64 dstRowData[MLIB_LIMIT]; - mlib_d64 *dstRowPtr = dstRowData; - const mlib_s16 *mlib_filters_table_s16_4; - - if (filter == MLIB_BICUBIC) { - mlib_filters_table_s16_4 = mlib_filters_s16_bc_4; - } else { - mlib_filters_table_s16_4 = mlib_filters_s16_bc2_4; - } - - srcYStride >>= 1; - - if (max_xsize > MLIB_LIMIT) { - dstRowPtr = mlib_malloc(sizeof(mlib_d64) * max_xsize); - - if (dstRowPtr == NULL) return MLIB_FAILURE; - } - - for (j = yStart; j <= yFinish; j++) { - - CLIP(); - - vis_write_gsr(10 << 3); - - cols = xRight - xLeft + 1; - i = 0; - - if (i <= cols - 4) { - - NEXT_PIXEL_4BC(); - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - - NEXT_PIXEL_4BC(); - - BC_S16_4CH(mlib_filters_table_s16_4); - FADD_4BC_S16(); - - BC_S16_4CH(mlib_filters_table_s16_4); - -#pragma pipeloop(0) - - for (; i < cols-4; i++) { - *dstPixelPtr++ = res; - - FADD_4BC_S16(); - BC_S16_4CH(mlib_filters_table_s16_4); - } - - *dstPixelPtr++ = res; - - FADD_4BC_S16(); - *dstPixelPtr++ = res; - - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - i += 4; - } - -#pragma pipeloop(0) - for (; i < cols; i++) { - NEXT_PIXEL_4BC(); - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - } - - mlib_ImageColorTrue2IndexLine_S16_S16_3_in_4((mlib_s16 *)dstRowPtr, - dstIndexPtr, - xRight - xLeft + 1, - colormap); - } - - if (dstRowPtr != dstRowData) mlib_free(dstRowPtr); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 5 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 8) - 1) << 3) - -/***************************************************************/ -mlib_status mlib_ImageAffineIndex_S16_U8_4CH_BC(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - DECLAREVAR_U8(); - mlib_f32 *flut = (mlib_f32 *)mlib_ImageGetLutNormalTable(colormap) - - mlib_ImageGetLutOffset(colormap); - mlib_d64 dstRowData[MLIB_LIMIT/2]; - mlib_d64 *dstRowPtr = dstRowData; - const mlib_s16 *mlib_filters_table_u8, *mlib_filters_table_u8_4; - - if (filter == MLIB_BICUBIC) { - mlib_filters_table_u8 = mlib_filters_u8_bc; - mlib_filters_table_u8_4 = mlib_filters_u8_bc_4; - } else { - mlib_filters_table_u8 = mlib_filters_u8_bc2; - mlib_filters_table_u8_4 = mlib_filters_u8_bc2_4; - } - - srcYStride >>= 1; - - if (max_xsize > MLIB_LIMIT) { - dstRowPtr = mlib_malloc(sizeof(mlib_d64) * ((max_xsize + 1) >> 1)); - - if (dstRowPtr == NULL) return MLIB_FAILURE; - } - - vis_write_gsr(3 << 3); - - for (j = yStart; j <= yFinish; j++) { - - CLIP(); - - cols = xRight - xLeft + 1; - - i = 0; - - if (i <= cols - 6) { - - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - - NEXT_PIXEL_4BC(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - FADD_4BC_U8(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - -#pragma pipeloop(0) - for (; i <= cols-8; i += 2) { - *dstPixelPtr++ = res; - - FADD_4BC_U8(); - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - } - - *dstPixelPtr++ = res; - - FADD_4BC_U8(); - *dstPixelPtr++ = res; - - RESULT_4BC_U8_1PIXEL(0); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 6; - } - - if (i <= cols-4) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - - NEXT_PIXEL_4BC(); - - BC_U8_4CH(0, mlib_filters_table_u8, mlib_filters_table_u8_4); - BC_U8_4CH(1, mlib_filters_table_u8, mlib_filters_table_u8_4); - FADD_4BC_U8(); - *dstPixelPtr++ = res; - - RESULT_4BC_U8_1PIXEL(0); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 4; - } - - if (i <= cols-2) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(0); - - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(1); - FADD_4BC_U8(); - - *dstPixelPtr++ = res; - i += 2; - } - - if (i < cols) { - NEXT_PIXEL_4BC(); - LOAD_BC_U8_4CH_1PIXEL(mlib_filters_table_u8, mlib_filters_table_u8_4); - RESULT_4BC_U8_1PIXEL(0); - - d0 = vis_fpadd16(d00, d10); - d1 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d1); - res = vis_fpack16_pair(d0, d0); - *dstPixelPtr++ = res; - } - - mlib_ImageColorTrue2IndexLine_U8_S16_4((mlib_u8 *)dstRowPtr, - dstIndexPtr, - xRight - xLeft + 1, - colormap); - } - - if (dstRowPtr != dstRowData) mlib_free(dstRowPtr); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef FILTER_SHIFT -#define FILTER_SHIFT 4 -#undef FILTER_MASK -#define FILTER_MASK (((1 << 9) - 1) << 3) - -/***************************************************************/ -mlib_status mlib_ImageAffineIndex_S16_S16_4CH_BC(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - DECLAREVAR_S16(); - mlib_d64 *flut = (mlib_d64 *)mlib_ImageGetLutNormalTable(colormap) - - mlib_ImageGetLutOffset(colormap); - mlib_d64 dstRowData[MLIB_LIMIT]; - mlib_d64 *dstRowPtr = dstRowData; - const mlib_s16 *mlib_filters_table_s16_4; - - if (filter == MLIB_BICUBIC) { - mlib_filters_table_s16_4 = mlib_filters_s16_bc_4; - } else { - mlib_filters_table_s16_4 = mlib_filters_s16_bc2_4; - } - - srcYStride >>= 1; - - if (max_xsize > MLIB_LIMIT) { - dstRowPtr = mlib_malloc(sizeof(mlib_d64) * max_xsize); - - if (dstRowPtr == NULL) return MLIB_FAILURE; - } - - for (j = yStart; j <= yFinish; j++) { - - CLIP(); - - vis_write_gsr(10 << 3); - - cols = xRight - xLeft + 1; - i = 0; - - if (i <= cols - 4) { - - NEXT_PIXEL_4BC(); - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - - NEXT_PIXEL_4BC(); - - BC_S16_4CH(mlib_filters_table_s16_4); - FADD_4BC_S16(); - - BC_S16_4CH(mlib_filters_table_s16_4); - -#pragma pipeloop(0) - - for (; i < cols-4; i++) { - *dstPixelPtr++ = res; - - FADD_4BC_S16(); - BC_S16_4CH(mlib_filters_table_s16_4); - } - - *dstPixelPtr++ = res; - - FADD_4BC_S16(); - *dstPixelPtr++ = res; - - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - i += 4; - } - -#pragma pipeloop(0) - for (; i < cols; i++) { - NEXT_PIXEL_4BC(); - LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_s16_4); - RESULT_4BC_S16_1PIXEL(); - *dstPixelPtr++ = res; - } - - mlib_ImageColorTrue2IndexLine_S16_S16_4((mlib_s16 *)dstRowPtr, - dstIndexPtr, - xRight - xLeft + 1, - colormap); - } - - if (dstRowPtr != dstRowData) mlib_free(dstRowPtr); - - return MLIB_SUCCESS; -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL.c index 6d73ae05c36..f0abee6fa6c 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL.c +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL.c @@ -33,7 +33,6 @@ #include "vis_proto.h" #include "mlib_image.h" -#include "mlib_ImageColormap.h" #include "mlib_ImageCopy.h" #include "mlib_ImageAffine.h" #include "mlib_v_ImageFilters.h" @@ -719,134 +718,3 @@ mlib_status FUN_NAME(4ch_na)(mlib_affine_param *param) } /***************************************************************/ -#define LUT(x) plut[x] - -mlib_status FUN_NAME(u8_i)(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - mlib_s32 nchan = mlib_ImageGetLutChannels(colormap); - mlib_s32 lut_off = mlib_ImageGetLutOffset(colormap); - mlib_f32 *plut = (mlib_f32*)mlib_ImageGetLutNormalTable(colormap) - lut_off; - mlib_s32 max_xsize = param -> max_xsize; - mlib_f32 buff[BUF_SIZE], *pbuff = buff; - - if (max_xsize > BUF_SIZE) { - pbuff = mlib_malloc(max_xsize*sizeof(mlib_f32)); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - vis_write_gsr(3 << 3); - - for (j = yStart; j <= yFinish; j++) { - mlib_f32 s0, s1, s2, s3; - DTYPE *sp; - - NEW_LINE(1); - -#pragma pipeloop(0) - for (i = 0; i < size; i++) { - GET_FILTER_XY(); - - sp = *(DTYPE**)((mlib_u8*)lineAddr + PTR_SHIFT(Y)) + (X >> MLIB_SHIFT); - s0 = LUT(sp[0]); - s1 = LUT(sp[1]); - s2 = LUT(sp[srcYStride]); - s3 = LUT(sp[srcYStride + 1]); - - PROCESS_4CH(s0, s1, s2, s3); - - pbuff[i] = vis_fpack16(dd); - X += dX; - Y += dY; - } - - if (nchan == 3) { - mlib_ImageColorTrue2IndexLine_U8_U8_3_in_4((void*)pbuff, (void*)dl, size, colormap); - } else { - mlib_ImageColorTrue2IndexLine_U8_U8_4((void*)pbuff, (void*)dl, size, colormap); - } - } - - if (pbuff != buff) { - mlib_free(pbuff); - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef DTYPE -#define DTYPE mlib_s16 - -mlib_status FUN_NAME(s16_i)(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - mlib_s32 nchan = mlib_ImageGetLutChannels(colormap); - mlib_s32 lut_off = mlib_ImageGetLutOffset(colormap); - mlib_f32 *plut = (mlib_f32*)mlib_ImageGetLutNormalTable(colormap) - lut_off; - mlib_s32 max_xsize = param -> max_xsize; - mlib_f32 buff[BUF_SIZE], *pbuff = buff; - - srcYStride /= sizeof(DTYPE); - - if (max_xsize > BUF_SIZE) { - pbuff = mlib_malloc(max_xsize*sizeof(mlib_f32)); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - vis_write_gsr(3 << 3); - - for (j = yStart; j <= yFinish; j++) { - mlib_f32 s0, s1, s2, s3; - DTYPE *sp; - - NEW_LINE(1); - -#pragma pipeloop(0) - for (i = 0; i < size; i++) { - GET_FILTER_XY(); - - sp = *(DTYPE**)((mlib_u8*)lineAddr + PTR_SHIFT(Y)) + (X >> MLIB_SHIFT); - s0 = LUT(sp[0]); - s1 = LUT(sp[1]); - s2 = LUT(sp[srcYStride]); - s3 = LUT(sp[srcYStride + 1]); - - PROCESS_4CH(s0, s1, s2, s3); - - pbuff[i] = vis_fpack16(dd); - X += dX; - Y += dY; - } - - if (nchan == 3) { - mlib_ImageColorTrue2IndexLine_U8_S16_3_in_4((void*)pbuff, (void*)dl, size, colormap); - } else { - mlib_ImageColorTrue2IndexLine_U8_S16_4((void*)pbuff, (void*)dl, size, colormap); - } - } - - if (pbuff != buff) { - mlib_free(pbuff); - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -const type_affine_i_fun mlib_AffineFunArr_bl_i[] = { - mlib_ImageAffine_u8_u8_i_bl, - mlib_ImageAffine_u8_u8_i_bl, - mlib_ImageAffine_u8_s16_i_bl, - mlib_ImageAffine_u8_s16_i_bl, - mlib_ImageAffine_s16_u8_i_bl, - mlib_ImageAffine_s16_u8_i_bl, - mlib_ImageAffine_s16_s16_i_bl, - mlib_ImageAffine_s16_s16_i_bl -}; - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL_S16.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL_S16.c index 05e9c6f36a5..c51c3519c43 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL_S16.c +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL_S16.c @@ -33,7 +33,6 @@ #include "vis_proto.h" #include "mlib_image.h" -#include "mlib_ImageColormap.h" #include "mlib_ImageCopy.h" #include "mlib_ImageAffine.h" #include "mlib_v_ImageFilters.h" @@ -716,128 +715,3 @@ mlib_status FUN_NAME(4ch_na)(mlib_affine_param *param) } /***************************************************************/ -#define LUT(x) plut[x] - -mlib_status FUN_NAME(s16_i)(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - mlib_s32 nchan = mlib_ImageGetLutChannels(colormap); - mlib_s32 lut_off = mlib_ImageGetLutOffset(colormap); - mlib_d64 *plut = (mlib_d64*)mlib_ImageGetLutNormalTable(colormap) - lut_off; - mlib_s32 max_xsize = param -> max_xsize; - mlib_d64 buff[BUF_SIZE], *pbuff = buff; - - srcYStride /= sizeof(DTYPE); - - if (max_xsize > BUF_SIZE) { - pbuff = mlib_malloc(max_xsize*sizeof(mlib_d64)); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - dX = (dX - (dX >> 31)) &~ 1; /* rounding towards ZERO */ - dY = (dY - (dY >> 31)) &~ 1; /* rounding towards ZERO */ - dx64 = vis_to_double_dup((((dX >> 1) & 0xFFFF) << 16) | ((dX >> 1) & 0xFFFF)); - dy64 = vis_to_double_dup((((dY >> 1) & 0xFFFF) << 16) | ((dY >> 1) & 0xFFFF)); - - for (j = yStart; j <= yFinish; j++) { - DTYPE *sp; - - NEW_LINE(1); - - deltax = DOUBLE_4U16(X, X, X, X); - deltay = DOUBLE_4U16(Y, Y, Y, Y); - -#pragma pipeloop(0) - for (i = 0; i < size; i++) { - sp = *(DTYPE**)((mlib_u8*)lineAddr + PTR_SHIFT(Y)) + (X >> MLIB_SHIFT); - s0 = LUT(sp[0]); - s1 = LUT(sp[1]); - s2 = LUT(sp[srcYStride]); - s3 = LUT(sp[srcYStride + 1]); - - BL_SUM(); - - pbuff[i] = dd; - X += dX; - Y += dY; - } - - if (nchan == 3) { - mlib_ImageColorTrue2IndexLine_S16_S16_3_in_4((void*)pbuff, (void*)dl, size, colormap); - } else { - mlib_ImageColorTrue2IndexLine_S16_S16_4((void*)pbuff, (void*)dl, size, colormap); - } - } - - if (pbuff != buff) { - mlib_free(pbuff); - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef DTYPE -#define DTYPE mlib_u8 - -mlib_status FUN_NAME(u8_i)(mlib_affine_param *param, - const void *colormap) -{ - DECLAREVAR(); - mlib_s32 nchan = mlib_ImageGetLutChannels(colormap); - mlib_s32 lut_off = mlib_ImageGetLutOffset(colormap); - mlib_d64 *plut = (mlib_d64*)mlib_ImageGetLutNormalTable(colormap) - lut_off; - mlib_s32 max_xsize = param -> max_xsize; - mlib_d64 buff[BUF_SIZE], *pbuff = buff; - - if (max_xsize > BUF_SIZE) { - pbuff = mlib_malloc(max_xsize*sizeof(mlib_d64)); - - if (pbuff == NULL) return MLIB_FAILURE; - } - - dX = (dX - (dX >> 31)) &~ 1; /* rounding towards ZERO */ - dY = (dY - (dY >> 31)) &~ 1; /* rounding towards ZERO */ - dx64 = vis_to_double_dup((((dX >> 1) & 0xFFFF) << 16) | ((dX >> 1) & 0xFFFF)); - dy64 = vis_to_double_dup((((dY >> 1) & 0xFFFF) << 16) | ((dY >> 1) & 0xFFFF)); - - for (j = yStart; j <= yFinish; j++) { - DTYPE *sp; - - NEW_LINE(1); - - deltax = DOUBLE_4U16(X, X, X, X); - deltay = DOUBLE_4U16(Y, Y, Y, Y); - -#pragma pipeloop(0) - for (i = 0; i < size; i++) { - sp = *(DTYPE**)((mlib_u8*)lineAddr + PTR_SHIFT(Y)) + (X >> MLIB_SHIFT); - s0 = LUT(sp[0]); - s1 = LUT(sp[1]); - s2 = LUT(sp[srcYStride]); - s3 = LUT(sp[srcYStride + 1]); - - BL_SUM(); - - pbuff[i] = dd; - X += dX; - Y += dY; - } - - if (nchan == 3) { - mlib_ImageColorTrue2IndexLine_S16_U8_3_in_4((void*)pbuff, (void*)dl, size, colormap); - } else { - mlib_ImageColorTrue2IndexLine_S16_U8_4((void*)pbuff, (void*)dl, size, colormap); - } - } - - if (pbuff != buff) { - mlib_free(pbuff); - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL_U16.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL_U16.c index b9de874c46c..bc2b7e9e087 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL_U16.c +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageAffine_BL_U16.c @@ -33,7 +33,6 @@ #include "vis_proto.h" #include "mlib_image.h" -#include "mlib_ImageColormap.h" #include "mlib_ImageCopy.h" #include "mlib_ImageAffine.h" #include "mlib_v_ImageFilters.h" diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract.c deleted file mode 100644 index 6d3d92b1f45..00000000000 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract.c +++ /dev/null @@ -1,825 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -/* - * FUNCTIONS - * mlib_ImageChannelExtract - Copy the selected channels of the source - * image into the destination image - * - * SYNOPSIS - * mlib_status mlib_ImageChannelExtract(mlib_image *dst, - * mlib_image *src, - * mlib_s32 cmask); - * ARGUMENT - * dst Pointer to destination image. - * src Pointer to source image. - * cmask Source channel selection mask. - * The least significant bit (LSB) is corresponding to the - * last channel in the source image data. - * The bits with value 1 stand for the channels selected. - * If more than N channels are selected, the leftmost N - * channels are extracted, where N is the number of channels - * in the destination image. - * - * RESTRICTION - * The src and dst must have the same width, height and data type. - * The src and dst can have 1, 2, 3 or 4 channels. - * The src and dst can be either MLIB_BYTE, MLIB_SHORT, MLIB_INT, - * MLIB_FLOAT or MLIB_DOUBLE. - * - * DESCRIPTION - * Copy the selected channels of the source image into the - * destination image - */ - -#include -#include "mlib_image.h" -#include "mlib_ImageCheck.h" - -/***************************************************************/ -/* functions defined in mlib_ImageChannelExtract_1.c */ - -void -mlib_v_ImageChannelExtract_U8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 channels, mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16(mlib_u16 *src, mlib_s32 slb, - mlib_u16 *dst, mlib_s32 dlb, - mlib_s32 channels, mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S32(mlib_s32 *src, mlib_s32 slb, - mlib_s32 *dst, mlib_s32 dlb, - mlib_s32 channels, mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_D64(mlib_d64 *src, mlib_s32 slb, - mlib_d64 *dst, mlib_s32 dlb, - mlib_s32 channels, mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask); - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_U8_2_1(mlib_u8 *sl, mlib_s32 slb, - mlib_u8 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height); - -void mlib_v_ImageChannelExtract_U8_3_2(mlib_u8 *sl, mlib_s32 slb, - mlib_u8 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 count1); - -void mlib_v_ImageChannelExtract_U8_4_2(mlib_u8 *sl, mlib_s32 slb, - mlib_u8 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 count1); - -void mlib_v_ImageChannelExtract_32_2_1(mlib_f32 *sl, mlib_s32 slb, - mlib_f32 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height); - -void mlib_v_ImageChannelExtract_32_3_1(mlib_f32 *sl, mlib_s32 slb, - mlib_f32 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height); - -void mlib_v_ImageChannelExtract_32_3_2(mlib_f32 *sp, mlib_s32 slb, - mlib_f32 *dp, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 deltac1); - -void mlib_v_ImageChannelExtract_32_4_1(mlib_f32 *sl, mlib_s32 slb, - mlib_f32 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height); - -void mlib_v_ImageChannelExtract_32_4_2(mlib_f32 *sp, mlib_s32 slb, - mlib_f32 *dp, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 deltac1); - -void mlib_v_ImageChannelExtract_32_4_3(mlib_f32 *sl, mlib_s32 slb, - mlib_f32 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 mask_off); - -/***************************************************************/ - -void -mlib_v_ImageChannelExtract_U8_21_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_21_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_21_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_21(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_31_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_31_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_31_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_31(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_41_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_41_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_41_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_U8_41(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_11_A8D1X4(mlib_s16 *src, mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_S16_21_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_21_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_21_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_21(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_31_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_31_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_31_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_31(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_41_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_41_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_41_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelExtract_S16_41(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); - -/***************************************************************/ -/* functions defined in mlib_ImageChannelExtract_43.c */ - -void -mlib_v_ImageChannelExtract_U8_43R_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_U8_43R_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelExtract_U8_43R_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_U8_43R(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelExtract_S16_43R_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_S16_43R_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelExtract_S16_43R_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_S16_43R(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelExtract_U8_43L_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_U8_43L_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelExtract_U8_43L_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_U8_43L(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelExtract_S16_43L_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_S16_43L_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelExtract_S16_43L_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelExtract_S16_43L(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); - -/***************************************************************/ - -#ifdef MLIB_TEST -mlib_status -mlib_v_ImageChannelExtract(mlib_image *dst, - mlib_image *src, - mlib_s32 cmask) -#else -mlib_status -mlib_ImageChannelExtract(mlib_image *dst, - mlib_image *src, - mlib_s32 cmask) -#endif -{ - const mlib_s32 X8 = 0x7; - const mlib_s32 X4 = 0x3; - const mlib_s32 X2 = 0x1; - const mlib_s32 A8D1 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_ONEDVECTOR; - const mlib_s32 A8D2X8 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH8X; - const mlib_s32 A8D2X4 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH4X; - const mlib_s32 A8D2X2 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH2X; - void *sp; /* pointer for pixel in src */ - void *dp; /* pointer for pixel in dst */ - mlib_s32 ncmask = 0; /* normalized channel mask */ - mlib_s32 channels; /* number of channels for src */ - mlib_s32 channeld; /* number of channels for dst */ - mlib_s32 width, height; /* for src and dst */ - mlib_s32 strides; /* strides in bytes for src */ - mlib_s32 strided; /* strides in bytes for dst */ - mlib_s32 flags; - mlib_s32 flagd; - mlib_s32 dsize; - int delta0 = 0; /* offset of first selected channel */ - int count1 = 0; /* number of channels in first group */ - int i, bit1count = 0; - - MLIB_IMAGE_CHECK(src); - MLIB_IMAGE_CHECK(dst); - MLIB_IMAGE_TYPE_EQUAL(src, dst); - MLIB_IMAGE_SIZE_EQUAL(src, dst); - - channels = mlib_ImageGetChannels(src); - channeld = mlib_ImageGetChannels(dst); - width = mlib_ImageGetWidth(src); - height = mlib_ImageGetHeight(src); - strides = mlib_ImageGetStride(src); - strided = mlib_ImageGetStride(dst); - sp = mlib_ImageGetData(src); - dp = mlib_ImageGetData(dst); - flags = mlib_ImageGetFlags(src); - flagd = mlib_ImageGetFlags(dst); - dsize = width * height; - - /* normalize the cmask, and count the number of bit with value 1 */ - for (i = (channels - 1); i >= 0; i--) { - if (((cmask & (1 << i)) != 0) && (bit1count < channeld)) { - ncmask += (1 << i); - bit1count++; - } - } - - /* do not support the cases in which the number of selected channels is - * less than the nubmber of channels in the destination image */ - if (bit1count < channeld) { - return MLIB_FAILURE; - } - - if (channels == channeld) { -#ifdef MLIB_TEST - mlib_v_ImageCopy(dst, src); -#else - mlib_ImageCopy(dst, src); -#endif - return MLIB_SUCCESS; - } - - switch (mlib_ImageGetType(src)) { - case MLIB_BYTE: - if (channeld == 1) { - switch (channels) { - case 2: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelExtract_U8_21_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelExtract_U8_21_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_U8_21_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelExtract_U8_21((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - return MLIB_SUCCESS; - - case 3: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelExtract_U8_31_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelExtract_U8_31_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_U8_31_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelExtract_U8_31((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - return MLIB_SUCCESS; - - case 4: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelExtract_U8_41_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelExtract_U8_41_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_U8_41_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelExtract_U8_41((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - return MLIB_SUCCESS; - - default: - return MLIB_FAILURE; - } - } - else if ((channels == 4) && (channeld == 3) && (ncmask == 7)) { - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelExtract_U8_43R_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelExtract_U8_43R_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_U8_43R_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize); - } - else { - mlib_v_ImageChannelExtract_U8_43R((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height); - } - return MLIB_SUCCESS; - } - else if ((channels == 4) && (channeld == 3) && (ncmask == 14)) { - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelExtract_U8_43L_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelExtract_U8_43L_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_U8_43L_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize); - } - else { - mlib_v_ImageChannelExtract_U8_43L((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height); - } - return MLIB_SUCCESS; - } - break; - - case MLIB_SHORT: - if (channeld == 1) { - switch (channels) { - case 2: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelExtract_S16_21_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelExtract_S16_21_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_S16_21_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelExtract_S16_21((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - return MLIB_SUCCESS; - - case 3: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelExtract_S16_31_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelExtract_S16_31_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_S16_31_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelExtract_S16_31((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - return MLIB_SUCCESS; - - case 4: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelExtract_S16_41_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelExtract_S16_41_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_S16_41_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelExtract_S16_41((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - return MLIB_SUCCESS; - default: - return MLIB_FAILURE; - } - } - else if ((channels == 4) && (channeld == 3) && (ncmask == 7)) { - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelExtract_S16_43R_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelExtract_S16_43R_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_S16_43R_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize); - } - else { - mlib_v_ImageChannelExtract_S16_43R((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height); - } - return MLIB_SUCCESS; - } - else if ((channels == 4) && (channeld == 3) && (ncmask == 14)) { - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelExtract_S16_43L_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelExtract_S16_43L_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelExtract_S16_43L_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize); - } - else { - mlib_v_ImageChannelExtract_S16_43L((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height); - } - return MLIB_SUCCESS; - } - break; - - } - -/***************************************************************/ - /* From C version */ - - for (i = (channels - 1); i >= 0; i--) { - if (!(ncmask & (1 << i))) delta0++; - else break; - } - for (; i >= 0; i--) { - if (ncmask & (1 << i)) count1++; - else break; - } - - switch (mlib_ImageGetType(src)) { - case MLIB_BYTE: - { - mlib_u8 *sl = (mlib_u8 *)sp + delta0; - mlib_u8 *dl = (mlib_u8 *)dp; - - switch (channels*10 + channeld) { - case 32: - mlib_v_ImageChannelExtract_U8_3_2(sl, strides, dl, strided, width, height, count1); - return MLIB_SUCCESS; - - case 42: - if (ncmask == 0xA || ncmask == 0x5) { /* mask 1010 or 0101 */ - mlib_v_ImageChannelExtract_U8_2_1(sl, strides, dl, strided, 2*width, height); - return MLIB_SUCCESS; - } - mlib_v_ImageChannelExtract_U8_4_2(sl, strides, dl, strided, width, height, count1); - return MLIB_SUCCESS; - - case 43: - mlib_v_ImageChannelExtract_U8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - channels, channeld, - width, height, - ncmask); - return MLIB_SUCCESS; - - default: return MLIB_FAILURE; - } - } - - case MLIB_SHORT: - mlib_v_ImageChannelExtract_S16((mlib_u16 *)sp, strides, - (mlib_u16 *)dp, strided, - channels, channeld, - width, height, - ncmask); - break; - - case MLIB_INT: - case MLIB_FLOAT: - { - mlib_f32 *sl = (mlib_f32 *)sp + delta0; - mlib_f32 *dl = (mlib_f32 *)dp; - strides /= 4; - strided /= 4; - - switch (channels*10 + channeld) { - case 21: - mlib_v_ImageChannelExtract_32_2_1(sl, strides, dl, strided, width, height); - return MLIB_SUCCESS; - - case 31: - mlib_v_ImageChannelExtract_32_3_1(sl, strides, dl, strided, width, height); - return MLIB_SUCCESS; - - case 32: - mlib_v_ImageChannelExtract_32_3_2(sl, strides, dl, strided, width, height, count1); - return MLIB_SUCCESS; - - case 41: - mlib_v_ImageChannelExtract_32_4_1(sl, strides, dl, strided, width, height); - return MLIB_SUCCESS; - - case 42: - if (ncmask == 0xA || ncmask == 0x5) { /* mask 1010 or 0101 */ - mlib_v_ImageChannelExtract_32_2_1(sl, strides, dl, strided, 2*width, height); - } else { - mlib_v_ImageChannelExtract_32_4_2(sl, strides, dl, strided, width, height, count1); - } - return MLIB_SUCCESS; - - case 43: - mlib_v_ImageChannelExtract_32_4_3(sl, strides, dl, strided, width, height, count1); - return MLIB_SUCCESS; - - default: - return MLIB_FAILURE; - } - } - case MLIB_DOUBLE: - mlib_v_ImageChannelExtract_D64((mlib_d64 *)sp, strides, - (mlib_d64 *)dp, strided, - channels, channeld, - width, height, - ncmask); - break; - - case MLIB_BIT: - default: - return MLIB_FAILURE; /* MLIB_BIT is not supported here */ - } - - return MLIB_SUCCESS; -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract.h b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract.h index 6193ec130e3..7c5946423d9 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract.h +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract.h @@ -32,348 +32,29 @@ extern "C" { #endif /* __cplusplus */ -void mlib_v_ImageChannelExtract_U8_21_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_U8_21_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - void mlib_v_ImageChannelExtract_U8_21_D1(const mlib_u8 *src, mlib_u8 *dst, mlib_s32 dsize, mlib_s32 cmask); -void mlib_v_ImageChannelExtract_U8_21(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_U8_31_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_U8_31_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - void mlib_v_ImageChannelExtract_U8_31_D1(const mlib_u8 *src, mlib_u8 *dst, mlib_s32 dsize, mlib_s32 cmask); -void mlib_v_ImageChannelExtract_U8_31(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_U8_41_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_U8_41_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - void mlib_v_ImageChannelExtract_U8_41_D1(const mlib_u8 *src, mlib_u8 *dst, mlib_s32 dsize, mlib_s32 cmask); -void mlib_v_ImageChannelExtract_U8_41(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_21_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_21_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_21_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_21(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_31_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_31_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_31_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_31(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_41_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_41_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_41_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16_41(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_U8_43R_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelExtract_U8_43R_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelExtract_U8_43R_D1(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelExtract_U8_43R(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelExtract_S16_43R_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelExtract_S16_43R_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelExtract_S16_43R_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelExtract_S16_43R(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelExtract_U8_43L_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelExtract_U8_43L_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - void mlib_v_ImageChannelExtract_U8_43L_D1(const mlib_u8 *src, mlib_u8 *dst, mlib_s32 dsize); -void mlib_v_ImageChannelExtract_U8_43L(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelExtract_S16_43L_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelExtract_S16_43L_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - void mlib_v_ImageChannelExtract_S16_43L_D1(const mlib_s16 *src, mlib_s16 *dst, mlib_s32 dsize); -void mlib_v_ImageChannelExtract_S16_43L(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelExtract_U8_2_1(const mlib_u8 *sl, - mlib_s32 slb, - mlib_u8 *dl, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height); - -void mlib_v_ImageChannelExtract_U8_3_2(const mlib_u8 *sl, - mlib_s32 slb, - mlib_u8 *dl, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height, - mlib_s32 count1); - -void mlib_v_ImageChannelExtract_U8_4_2(const mlib_u8 *sl, - mlib_s32 slb, - mlib_u8 *dl, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height, - mlib_s32 count1); - -void mlib_v_ImageChannelExtract_32_2_1(const mlib_f32 *sp, - mlib_s32 slb, - mlib_f32 *dp, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height); - -void mlib_v_ImageChannelExtract_32_3_1(const mlib_f32 *sl, - mlib_s32 slb, - mlib_f32 *dl, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height); - -void mlib_v_ImageChannelExtract_32_3_2(const mlib_f32 *sl, - mlib_s32 slb, - mlib_f32 *dl, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height, - mlib_s32 count1); - -void mlib_v_ImageChannelExtract_32_4_1(const mlib_f32 *sp, - mlib_s32 slb, - mlib_f32 *dp, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height); - -void mlib_v_ImageChannelExtract_32_4_2(const mlib_f32 *sl, - mlib_s32 slb, - mlib_f32 *dl, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height, - mlib_s32 count1); - -void mlib_v_ImageChannelExtract_32_4_3(const mlib_f32 *sl, - mlib_s32 slb, - mlib_f32 *dl, - mlib_s32 dlb, - mlib_s32 width, - mlib_s32 height, - mlib_s32 count1); - -void mlib_v_ImageChannelExtract_U8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_S16(const mlib_u16 *src, - mlib_s32 slb, - mlib_u16 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask); - -void mlib_v_ImageChannelExtract_D64(const mlib_d64 *src, - mlib_s32 slb, - mlib_d64 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask); - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_1.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_1.c index 69ae7231737..54f26d5eb77 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_1.c +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_1.c @@ -29,30 +29,9 @@ * FILENAME: mlib_ImageChannelExtract_1.c * * FUNCTIONS - * mlib_v_ImageChannelExtract_U8_21_A8D1X8 - * mlib_v_ImageChannelExtract_U8_21_A8D2X8 * mlib_v_ImageChannelExtract_U8_21_D1 - * mlib_v_ImageChannelExtract_U8_21 - * mlib_v_ImageChannelExtract_U8_31_A8D1X8 - * mlib_v_ImageChannelExtract_U8_31_A8D2X8 * mlib_v_ImageChannelExtract_U8_31_D1 - * mlib_v_ImageChannelExtract_U8_31 - * mlib_v_ImageChannelExtract_U8_41_A8D1X8 - * mlib_v_ImageChannelExtract_U8_41_A8D2X8 * mlib_v_ImageChannelExtract_U8_41_D1 - * mlib_v_ImageChannelExtract_U8_41 - * mlib_v_ImageChannelExtract_S16_21_A8D1X4 - * mlib_v_ImageChannelExtract_S16_21_A8D2X4 - * mlib_v_ImageChannelExtract_S16_21_D1 - * mlib_v_ImageChannelExtract_S16_21 - * mlib_v_ImageChannelExtract_S16_31_A8D1X4 - * mlib_v_ImageChannelExtract_S16_31_A8D2X4 - * mlib_v_ImageChannelExtract_S16_31_D1 - * mlib_v_ImageChannelExtract_S16_31 - * mlib_v_ImageChannelExtract_S16_41_A8D1X4 - * mlib_v_ImageChannelExtract_S16_41_A8D2X4 - * mlib_v_ImageChannelExtract_S16_41_D1 - * mlib_v_ImageChannelExtract_S16_41 * * ARGUMENT * src pointer to source image data @@ -93,100 +72,6 @@ sdd = vis_fpmerge(vis_read_lo(sda), vis_read_lo(sdb)); \ dd = vis_fpmerge(vis_read_lo(sdc), vis_read_lo(sdd)) -/***************************************************************/ -/* extract one channel from a 2-channel image. - * both source and destination image data are 8-byte aligned. - * xsize is multiple of 8. - */ - -void mlib_v_ImageChannelExtract_U8_21_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1; - mlib_d64 sda, sdb, sdc, sdd; - mlib_d64 dd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - if (cmask == 2) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_U8_21L(sd0, sd1, dd); - *dp++ = dd; - } - } - else { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_U8_21R(sd0, sd1, dd); - *dp++ = dd; - } - } -} - -/***************************************************************/ -/* extract one channel from a 2-channel image. - * both source and destination image data are 8-byte aligned. - * xsize is multiple of 8. - */ - -void mlib_v_ImageChannelExtract_U8_21_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 *sl, *dl; - mlib_d64 sd0, sd1; - mlib_d64 sda, sdb, sdc, sdd; - mlib_d64 dd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - if (cmask == 2) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_U8_21L(sd0, sd1, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_U8_21R(sd0, sd1, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } -} - /***************************************************************/ /* extract one channel from a 2-channel image. */ @@ -414,32 +299,6 @@ void mlib_v_ImageChannelExtract_U8_21_D1(const mlib_u8 *src, } } -/***************************************************************/ -/* extract one channel from a 2-channel image. - */ - -void mlib_v_ImageChannelExtract_U8_21(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_U8_21_D1(sa, da, xsize, cmask); - sa = sl += slb; - da = dl += dlb; - } -} - /***************************************************************/ #define CHANNELEXTRACT_U8_31L(sd0, sd1, sd2, dd) \ sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd1)); \ @@ -467,119 +326,6 @@ void mlib_v_ImageChannelExtract_U8_21(const mlib_u8 *src, sde = vis_fpmerge(vis_read_hi(sdb), vis_read_lo(sdc)); \ dd = vis_fpmerge(vis_read_hi(sdd), vis_read_lo(sde)) -/***************************************************************/ -void mlib_v_ImageChannelExtract_U8_31_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1, sd2; - mlib_d64 sda, sdb, sdc, sdd, sde; - mlib_d64 dd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - if (cmask == 4) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_U8_31L(sd0, sd1, sd2, dd); - *dp++ = dd; - } - } - else if (cmask == 2) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_U8_31M(sd0, sd1, sd2, dd); - *dp++ = dd; - } - } - else { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_U8_31R(sd0, sd1, sd2, dd); - *dp++ = dd; - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_U8_31_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 *sl, *dl; - mlib_d64 sd0, sd1, sd2; - mlib_d64 sda, sdb, sdc, sdd, sde; - mlib_d64 dd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - if (cmask == 4) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_U8_31L(sd0, sd1, sd2, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else if (cmask == 2) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_U8_31M(sd0, sd1, sd2, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_U8_31R(sd0, sd1, sd2, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } -} - /***************************************************************/ void mlib_v_ImageChannelExtract_U8_31_D1(const mlib_u8 *src, mlib_u8 *dst, @@ -931,29 +677,6 @@ void mlib_v_ImageChannelExtract_U8_31_D1(const mlib_u8 *src, } } -/***************************************************************/ -void mlib_v_ImageChannelExtract_U8_31(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_U8_31_D1(sa, da, xsize, cmask); - sa = sl += slb; - da = dl += dlb; - } -} - /***************************************************************/ #define CHANNELEXTRACT_U8_41L(sd0, sd1, sd2, sd3, dd) \ sda = vis_fpmerge(vis_read_hi(sd0), vis_read_hi(sd2)); \ @@ -994,152 +717,6 @@ void mlib_v_ImageChannelExtract_U8_31(const mlib_u8 *src, sdf = vis_fpmerge(vis_read_lo(sdb), vis_read_lo(sdd)); \ dd = vis_fpmerge(vis_read_lo(sde), vis_read_lo(sdf)) -/***************************************************************/ -void mlib_v_ImageChannelExtract_U8_41_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1, sd2, sd3; - mlib_d64 sda, sdb, sdc, sdd, sde, sdf; - mlib_d64 dd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - if (cmask == 8) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_U8_41L(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - } - else if (cmask == 4) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_U8_41ML(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - } - else if (cmask == 2) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_U8_41MR(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - } - else { -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_U8_41R(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_U8_41_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 *sl, *dl; - mlib_d64 sd0, sd1, sd2, sd3; - mlib_d64 sda, sdb, sdc, sdd, sde, sdf; - mlib_d64 dd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - if (cmask == 8) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_U8_41L(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else if (cmask == 4) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_U8_41ML(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else if (cmask == 2) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_U8_41MR(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_U8_41R(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } -} - /***************************************************************/ void mlib_v_ImageChannelExtract_U8_41_D1(const mlib_u8 *src, mlib_u8 *dst, @@ -1632,1560 +1209,3 @@ void mlib_v_ImageChannelExtract_U8_41_D1(const mlib_u8 *src, } /***************************************************************/ -void mlib_v_ImageChannelExtract_U8_41(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_U8_41_D1(sa, da, xsize, cmask); - sa = sl += slb; - da = dl += dlb; - } -} - -/***************************************************************/ -#define CHANNELEXTRACT_S16_21L(sd0, sd1, dd) \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_hi(sd1)); \ - sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_lo(sd1)); \ - sdc = vis_fpmerge(vis_read_hi(sda), vis_read_hi(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -#define CHANNELEXTRACT_S16_21R(sd0, sd1, dd) \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_hi(sd1)); \ - sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_lo(sd1)); \ - sdc = vis_fpmerge(vis_read_lo(sda), vis_read_lo(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -/* extract one channel from a 2-channel image. - * both source and destination image data are 8-byte aligned. - * dsize is multiple of 4. - */ - -void mlib_v_ImageChannelExtract_S16_21_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1; - mlib_d64 sda, sdb, sdc; - mlib_d64 dd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - if (cmask == 2) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_S16_21L(sd0, sd1, dd); - *dp++ = dd; - } - } - else { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_S16_21R(sd0, sd1, dd); - *dp++ = dd; - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_21_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 *sl, *dl; - mlib_d64 sd0, sd1; - mlib_d64 sda, sdb, sdc; - mlib_d64 dd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - if (cmask == 2) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_S16_21L(sd0, sd1, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_S16_21R(sd0, sd1, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_21_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 sd0, sd1, sd2, sd3; /* 8-byte source data */ - mlib_d64 sda, sdb, sdc; - mlib_d64 dd0, dd1; - mlib_s32 soff; /* offset of address in src */ - mlib_s32 doff; /* offset of address in dst */ - mlib_s32 off; /* offset of dst over src */ - mlib_s32 emask; /* edge mask */ - mlib_s32 i, n; - - sa = (void *)src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *) ((mlib_addr) da & (~7)); - doff = ((mlib_addr) da & 7); - dend = da + dsize - 1; - dend2 = dend - 3; - - /* calculate the src's offset over dst */ - if (cmask == 2) { - off = (soff / 4) * 2 - doff; - } - else { - off = ((soff + 3) / 4) * 2 - doff; - } - - if (((cmask == 2) && (soff % 4 == 0)) || ((cmask == 1) && (soff % 4 != 0))) { /* extract even words */ - - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes */ - sd0 = *sp++; - sd1 = *sp++; - - /* extract, including some garbage at the start point */ - CHANNELEXTRACT_S16_21L(sd0, sd1, dd0); - - /* store 8 bytes result */ - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_S16_21L(sd0, sd1, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_S16_21L(sd0, sd1, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 16 bytes */ - sd2 = *sp++; - sd3 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_21L(sd2, sd3, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - else { - /* load 32 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_21L(sd0, sd1, dd0); - CHANNELEXTRACT_S16_21L(sd2, sd3, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_21L(sd2, sd3, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_21L(sd2, sd3, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } - else { /* extract odd words */ - - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes, don't care the garbage at the start point */ - sd0 = *sp++; - sd1 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_21R(sd0, sd1, dd0); - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_S16_21R(sd0, sd1, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - CHANNELEXTRACT_S16_21R(sd0, sd1, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 16 bytes */ - sd2 = *sp++; - sd3 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_21R(sd2, sd3, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - else { - /* load 32 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_21R(sd0, sd1, dd0); - CHANNELEXTRACT_S16_21R(sd2, sd3, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_21R(sd2, sd3, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_21R(sd2, sd3, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_21(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_S16_21_D1(sa, da, xsize, cmask); - sa = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -#define CHANNELEXTRACT_S16_31L(sd0, sd1, sd2, dd) \ - /* extract the left channel */ \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd1)); \ - sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_hi(sd2)); \ - sdc = vis_fpmerge(vis_read_hi(sda), vis_read_lo(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -#define CHANNELEXTRACT_S16_31M(sd0, sd1, sd2, dd) \ - /* extract the middle channel */ \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd1)); \ - sdb = vis_fpmerge(vis_read_hi(sd1), vis_read_lo(sd2)); \ - sdc = vis_fpmerge(vis_read_lo(sda), vis_read_hi(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -#define CHANNELEXTRACT_S16_31R(sd0, sd1, sd2, dd) \ - /* extract the right channel */ \ - sda = vis_fpmerge(vis_read_lo(sd0), vis_read_hi(sd2)); \ - sdb = vis_fpmerge(vis_read_hi(sd1), vis_read_lo(sd2)); \ - sdc = vis_fpmerge(vis_read_hi(sda), vis_read_lo(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_31_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1, sd2; - mlib_d64 sda, sdb, sdc; - mlib_d64 dd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - if (cmask == 4) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31L(sd0, sd1, sd2, dd); - *dp++ = dd; - } - } - else if (cmask == 2) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31M(sd0, sd1, sd2, dd); - *dp++ = dd; - } - } - else { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31R(sd0, sd1, sd2, dd); - *dp++ = dd; - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_31_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 *sl, *dl; - mlib_d64 sd0, sd1, sd2; - mlib_d64 sda, sdb, sdc; - mlib_d64 dd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - if (cmask == 4) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31L(sd0, sd1, sd2, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else if (cmask == 2) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31M(sd0, sd1, sd2, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31R(sd0, sd1, sd2, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_31_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 sd0, sd1, sd2; /* 8-byte source data */ - mlib_d64 sd3, sd4, sd5; - mlib_d64 sda, sdb, sdc; - mlib_d64 dd0, dd1; - mlib_s32 soff; /* offset of address in src */ - mlib_s32 doff; /* offset of address in dst */ - mlib_s32 off; /* offset of src over dst */ - mlib_s32 emask; /* edge mask */ - mlib_s32 i, n; - - sa = (void *)src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *) ((mlib_addr) da & (~7)); - doff = ((mlib_addr) da & 7); - dend = da + dsize - 1; - dend2 = dend - 3; - - /* calculate the src's offset over dst */ - if (cmask == 4) { - off = (soff / 6) * 2 - doff; - } - else if (cmask == 2) { - off = ((soff + 2) / 6) * 2 - doff; - } - else { - off = ((soff + 4) / 6) * 2 - doff; - } - - if (((cmask == 4) && (soff % 6 == 0)) || - ((cmask == 2) && (soff % 6 == 4)) || - ((cmask == 1) && (soff % 6 == 2))) { /* extract left channel */ - - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - - /* extract, including some garbage at the start point */ - CHANNELEXTRACT_S16_31L(sd0, sd1, sd2, dd0); - - /* store 8 bytes result */ - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31L(sd0, sd1, sd2, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31L(sd0, sd1, sd2, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 24 bytes */ - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_31L(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - else { - /* load 48 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_31L(sd0, sd1, sd2, dd0); - CHANNELEXTRACT_S16_31L(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - CHANNELEXTRACT_S16_31L(sd3, sd4, sd5, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - CHANNELEXTRACT_S16_31L(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } - else if (((cmask == 4) && (soff % 6 == 2)) || - ((cmask == 2) && (soff % 6 == 0)) || - ((cmask == 1) && (soff % 6 == 4))) { - /* extract middle channel */ - - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - - /* extract, including some garbage at the start point */ - CHANNELEXTRACT_S16_31M(sd0, sd1, sd2, dd0); - - /* store 8 bytes result */ - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31M(sd0, sd1, sd2, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31M(sd0, sd1, sd2, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 24 bytes */ - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_31M(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - else { - /* load 48 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_31M(sd0, sd1, sd2, dd0); - CHANNELEXTRACT_S16_31M(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - CHANNELEXTRACT_S16_31M(sd3, sd4, sd5, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - CHANNELEXTRACT_S16_31M(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } - else { /* extract right channel */ - - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - - /* extract, including some garbage at the start point */ - CHANNELEXTRACT_S16_31R(sd0, sd1, sd2, dd0); - - /* store 8 bytes result */ - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31R(sd0, sd1, sd2, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - CHANNELEXTRACT_S16_31R(sd0, sd1, sd2, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 24 bytes */ - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_31R(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - else { - /* load 48 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_31R(sd0, sd1, sd2, dd0); - CHANNELEXTRACT_S16_31R(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - CHANNELEXTRACT_S16_31R(sd3, sd4, sd5, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - CHANNELEXTRACT_S16_31R(sd3, sd4, sd5, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_31(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_S16_31_D1(sa, da, xsize, cmask); - sa = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -#define CHANNELEXTRACT_S16_41L(sd0, sd1, sd2, sd3, dd) \ - /* extract the left channel */ \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_hi(sd2)); \ - sdb = vis_fpmerge(vis_read_hi(sd1), vis_read_hi(sd3)); \ - sdc = vis_fpmerge(vis_read_hi(sda), vis_read_hi(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -#define CHANNELEXTRACT_S16_41ML(sd0, sd1, sd2, sd3, dd) \ - /* extract the middle left channel */ \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_hi(sd2)); \ - sdb = vis_fpmerge(vis_read_hi(sd1), vis_read_hi(sd3)); \ - sdc = vis_fpmerge(vis_read_lo(sda), vis_read_lo(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -#define CHANNELEXTRACT_S16_41MR(sd0, sd1, sd2, sd3, dd) \ - /* extract the middle right channel */ \ - sda = vis_fpmerge(vis_read_lo(sd0), vis_read_lo(sd2)); \ - sdb = vis_fpmerge(vis_read_lo(sd1), vis_read_lo(sd3)); \ - sdc = vis_fpmerge(vis_read_hi(sda), vis_read_hi(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -#define CHANNELEXTRACT_S16_41R(sd0, sd1, sd2, sd3, dd) \ - /* extract the right channel */ \ - sda = vis_fpmerge(vis_read_lo(sd0), vis_read_lo(sd2)); \ - sdb = vis_fpmerge(vis_read_lo(sd1), vis_read_lo(sd3)); \ - sdc = vis_fpmerge(vis_read_lo(sda), vis_read_lo(sdb)); \ - dd = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)) - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_41_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1, sd2, sd3; - mlib_d64 sda, sdb, sdc; - mlib_d64 dd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - if (cmask == 8) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41L(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - } - else if (cmask == 4) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41ML(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - } - else if (cmask == 2) { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41MR(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - } - else { -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41R(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_41_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 *sl, *dl; - mlib_d64 sd0, sd1, sd2, sd3; - mlib_d64 sda, sdb, sdc; - mlib_d64 dd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - if (cmask == 8) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41L(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else if (cmask == 4) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41ML(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else if (cmask == 2) { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41MR(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else { - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41R(sd0, sd1, sd2, sd3, dd); - *dp++ = dd; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_41_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 sd0, sd1, sd2, sd3; /* 8-byte source data */ - mlib_d64 sd4, sd5, sd6, sd7; - mlib_d64 sda, sdb, sdc; - mlib_d64 dd0, dd1; - mlib_s32 soff; /* offset of address in src */ - mlib_s32 doff; /* offset of address in dst */ - mlib_s32 off; /* offset of src over dst */ - mlib_s32 emask; /* edge mask */ - mlib_s32 i, n; - - sa = (void *)src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *) ((mlib_addr) da & (~7)); - doff = ((mlib_addr) da & 7); - dend = da + dsize - 1; - dend2 = dend - 3; - - /* calculate the src's offset over dst */ - if (cmask == 8) { - off = (soff / 8) * 2 - doff; - } - else if (cmask == 4) { - off = ((soff + 2) / 8) * 2 - doff; - } - else if (cmask == 2) { - off = ((soff + 4) / 8) * 2 - doff; - } - else { - off = ((soff + 6) / 8) * 2 - doff; - } - - if (((cmask == 8) && (soff == 0)) || - ((cmask == 4) && (soff == 6)) || - ((cmask == 2) && (soff == 4)) || - ((cmask == 1) && (soff == 2))) { /* extract left channel */ - - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - - /* extract, including some garbage at the start point */ - CHANNELEXTRACT_S16_41L(sd0, sd1, sd2, sd3, dd0); - - /* store 8 bytes result */ - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41L(sd0, sd1, sd2, sd3, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41L(sd0, sd1, sd2, sd3, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 24 bytes */ - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_41L(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - else { - /* load 48 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_41L(sd0, sd1, sd2, sd3, dd0); - CHANNELEXTRACT_S16_41L(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - CHANNELEXTRACT_S16_41L(sd4, sd5, sd6, sd7, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - CHANNELEXTRACT_S16_41L(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } - else if (((cmask == 8) && (soff == 2)) || - ((cmask == 4) && (soff == 0)) || - ((cmask == 2) && (soff == 6)) || - ((cmask == 1) && (soff == 4))) { /* extract middle left channel */ - - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - - /* extract, including some garbage at the start point */ - CHANNELEXTRACT_S16_41ML(sd0, sd1, sd2, sd3, dd0); - - /* store 8 bytes result */ - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41ML(sd0, sd1, sd2, sd3, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41ML(sd0, sd1, sd2, sd3, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 24 bytes */ - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_41ML(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - else { - /* load 48 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_41ML(sd0, sd1, sd2, sd3, dd0); - CHANNELEXTRACT_S16_41ML(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - CHANNELEXTRACT_S16_41ML(sd4, sd5, sd6, sd7, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - CHANNELEXTRACT_S16_41ML(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } - else if (((cmask == 8) && (soff == 4)) || - ((cmask == 4) && (soff == 2)) || - ((cmask == 2) && (soff == 0)) || - ((cmask == 1) && (soff == 6))) { /* extract middle right channel */ - - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - - /* extract, including some garbage at the start point */ - CHANNELEXTRACT_S16_41MR(sd0, sd1, sd2, sd3, dd0); - - /* store 8 bytes result */ - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41MR(sd0, sd1, sd2, sd3, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41MR(sd0, sd1, sd2, sd3, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 24 bytes */ - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_41MR(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - else { - /* load 48 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_41MR(sd0, sd1, sd2, sd3, dd0); - CHANNELEXTRACT_S16_41MR(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - CHANNELEXTRACT_S16_41MR(sd4, sd5, sd6, sd7, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - CHANNELEXTRACT_S16_41MR(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } - else { /* extract right channel */ - if (off == 0) { /* src and dst have same alignment */ - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 16 bytes */ - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - - /* extract, including some garbage at the start point */ - CHANNELEXTRACT_S16_41R(sd0, sd1, sd2, sd3, dd0); - - /* store 8 bytes result */ - vis_pst_16(dd0, dp++, emask); - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41R(sd0, sd1, sd2, sd3, dd0); - *dp++ = dd0; - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - sd0 = *sp++; - sd1 = *sp++; - sd2 = *sp++; - sd3 = *sp++; - CHANNELEXTRACT_S16_41R(sd0, sd1, sd2, sd3, dd0); - vis_pst_16(dd0, dp++, emask); - } - } - else { - vis_alignaddr((void *)0, off); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - if (off < 0) { - /* load 24 bytes */ - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - - /* extract and store 8 bytes */ - CHANNELEXTRACT_S16_41R(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd1, dd1), dp++, emask); - } - - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 8 + 1; - - /* 8-pixel column loop, emask not needed */ -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - dd0 = dd1; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - CHANNELEXTRACT_S16_41R(sd4, sd5, sd6, sd7, dd1); - *dp++ = vis_faligndata(dd0, dd1); - } - } - - /* end point handling */ - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - dd0 = dd1; - sd4 = *sp++; - sd5 = *sp++; - sd6 = *sp++; - sd7 = *sp++; - CHANNELEXTRACT_S16_41R(sd4, sd5, sd6, sd7, dd1); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - } - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_41(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_S16_41_D1(sa, da, xsize, cmask); - sa = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_43.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_43.c index cf6ec42372e..9924a29c73c 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_43.c +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_43.c @@ -29,22 +29,8 @@ * FILENAME: mlib_v_ImageChannelExtract_43.c * * FUNCTIONS - * mlib_v_ImageChannelExtract_U8_43R_A8D1X8 - * mlib_v_ImageChannelExtract_U8_43R_A8D2X8 - * mlib_v_ImageChannelExtract_U8_43R_D1 - * mlib_v_ImageChannelExtract_U8_43R - * mlib_v_ImageChannelExtract_S16_43R_A8D1X4 - * mlib_v_ImageChannelExtract_S16_43R_A8D2X4 - * mlib_v_ImageChannelExtract_S16_43R_D1 - * mlib_v_ImageChannelExtract_S16_43R - * mlib_v_ImageChannelExtract_U8_43L_A8D1X8 - * mlib_v_ImageChannelExtract_U8_43L_A8D2X8 * mlib_v_ImageChannelExtract_U8_43L_D1 - * mlib_v_ImageChannelExtract_U8_43L - * mlib_v_ImageChannelExtract_S16_43L_A8D1X4 - * mlib_v_ImageChannelExtract_S16_43L_A8D2X4 * mlib_v_ImageChannelExtract_S16_43L_D1 - * mlib_v_ImageChannelExtract_S16_43L * * SYNOPSIS * @@ -73,705 +59,6 @@ #include "mlib_image.h" #include "mlib_v_ImageChannelExtract.h" -/***************************************************************/ -#define EXTRACT_U8_43R_old /* shift right */ \ - dd2 = vis_faligndata(sd3, dd2); /* r7-------------- */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(sd3, dd2); /* g7r7------------ */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(sd3, dd2); /* b7g7r7---------- */ \ - sd3 = vis_faligndata(sd3, sd3); \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(sd3, dd2); /* r6b7g7r7-------- */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(sd3, dd2); /* g6r6b7g7r7------ */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(sd3, dd2); /* b6g6r6b7g7r7---- */ \ - \ - dd2 = vis_faligndata(sd2, dd2); /* r5b6g6r6b7g7r7-- */ \ - sd2 = vis_faligndata(sd2, sd2); \ - dd2 = vis_faligndata(sd2, dd2); /* g5r5b6g6r6b7g7r7 */ \ - \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(sd2, dd1); /* b5-------------- */ \ - sd2 = vis_faligndata(sd2, sd2); \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(sd2, dd1); /* r4b5------------ */ \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(sd2, dd1); /* g4r4b5---------- */ \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(sd2, dd1); /* b4g4r4b5-------- */ \ - \ - dd1 = vis_faligndata(sd1, dd1); /* r3b4g4r4b5------ */ \ - sd1 = vis_faligndata(sd1, sd1); \ - dd1 = vis_faligndata(sd1, dd1); /* g3r3b4g4r4b5---- */ \ - sd1 = vis_faligndata(sd1, sd1); \ - dd1 = vis_faligndata(sd1, dd1); /* b3g3r3b4g4r4b5-- */ \ - sd1 = vis_faligndata(sd1, sd1); \ - sd1 = vis_faligndata(sd1, sd1); \ - dd1 = vis_faligndata(sd1, dd1); /* r2b3g3r3b4g4r4b5 */ \ - \ - sd1 = vis_faligndata(sd1, sd1); \ - dd0 = vis_faligndata(sd1, dd0); /* g2-------------- */ \ - sd1 = vis_faligndata(sd1, sd1); \ - dd0 = vis_faligndata(sd1, dd0); /* b2g2------------ */ \ - \ - dd0 = vis_faligndata(sd0, dd0); /* r1b2g2---------- */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(sd0, dd0); /* g1r1b2g2-------- */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(sd0, dd0); /* b1g1r1b2g2------ */ \ - sd0 = vis_faligndata(sd0, sd0); \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(sd0, dd0); /* r0b1g1r1b2g2---- */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(sd0, dd0); /* g0r0b1g1r1b2g2-- */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(sd0, dd0); /* b0g0r0b1g1r1b2g2 */ - -/***************************************************************/ -#define EXTRACT_U8_43R /* shift right */ \ - vis_alignaddr((void *)0, 5); \ - dd2 = vis_faligndata(sd3, dd2); /* b7g7r7---------- */ \ - sda = vis_freg_pair(vis_read_hi(sd3), vis_read_hi(sd3)); \ - dd2 = vis_faligndata(sda, dd2); /* b6g6r6b7g7r7---- */ \ - \ - vis_alignaddr((void *)0, 6); \ - dd2 = vis_faligndata(sd2, dd2); /* g5r5b6g6r6b7g7r7 */ \ - \ - vis_alignaddr((void *)0, 5); \ - dd1 = vis_faligndata(sd2, dd1); /* b5g5r5---------- */ \ - sda = vis_freg_pair(vis_read_hi(sd2), vis_read_hi(sd2)); \ - dd1 = vis_faligndata(sda, dd1); /* b4g4r4b5g5r5---- */ \ - dd1 = vis_faligndata(sd1, dd1); /* b3g3r3b4g4r4b5g5 */ \ - sda = vis_freg_pair(vis_read_hi(sd1), vis_read_hi(sd1)); \ - vis_alignaddr((void *)0, 7); \ - dd1 = vis_faligndata(sda, dd1); /* r2b3g3r3b4g4r4b5 */ \ - \ - vis_alignaddr((void *)0, 5); \ - dd0 = vis_faligndata(sda, dd0); /* b2g2r2---------- */ \ - dd0 = vis_faligndata(sd0, dd0); /* b1g1r1b2g2r2---- */ \ - sda = vis_freg_pair(vis_read_hi(sd0), vis_read_hi(sd0)); \ - dd0 = vis_faligndata(sda, dd0); /* b0g0r0b1g1r1b2g2 */ - -/***************************************************************/ -#define LOAD_EXTRACT_U8_43R_STORE \ - sd0 = *sp++; /* --b0g0r0--b1g1r1 */ \ - sd1 = *sp++; /* --b2g2r2--b3g3r3 */ \ - sd2 = *sp++; /* --b4g4r4--b5g5r5 */ \ - sd3 = *sp++; /* --b6g6r6--b7g7r7 */ \ - EXTRACT_U8_43R; \ - *dp++ = dd0; /* b0g0r0b1g1r1b2g2 */ \ - *dp++ = dd1; /* r2b3g3r3b4g4r4b5 */ \ - *dp++ = dd2; /* g5r5b6g6r6b7g7r7 */ - -/***************************************************************/ -#define LOAD_EXTRACT_U8_43R \ - vis_alignaddr((void *)soff, 0); \ - s0 = s4; \ - s1 = sp[1]; \ - s2 = sp[2]; \ - s3 = sp[3]; \ - s4 = sp[4]; \ - sd0 = vis_faligndata(s0, s1); \ - sd1 = vis_faligndata(s1, s2); \ - sd2 = vis_faligndata(s2, s3); \ - sd3 = vis_faligndata(s3, s4); \ - sp += 4; \ - dd2old = dd2; \ - EXTRACT_U8_43R - -/***************************************************************/ -/* - * Both source and destination image data are 1-d vectors and - * 8-byte aligned. And dsize is multiple of 8. - */ - -void mlib_v_ImageChannelExtract_U8_43R_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1, sd2, sd3; /* source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_d64 sda; - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - /* set GSR.offset for vis_faligndata() */ -/* vis_alignaddr((void *)0, 7); *//* only for _old */ - -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - LOAD_EXTRACT_U8_43R_STORE; - } -} - -/***************************************************************/ -/* - * Either source or destination image data are not 1-d vectors, but - * they are 8-byte aligned. And slb and dlb are multiple of 8. - * The xsize is multiple of 8. - */ - -void mlib_v_ImageChannelExtract_U8_43R_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 *sl, *dl; /* 8-byte aligned pointer for line */ - mlib_d64 sd0, sd1, sd2, sd3; /* source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_d64 sda; - mlib_s32 i, j; /* indices for x, y */ - - /* set GSR.offset for vis_faligndata() */ -/* vis_alignaddr((void *)0, 7); *//* only for _old */ - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - /* row loop */ - for (j = 0; j < ysize; j++) { - /* 8-byte column loop */ -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - LOAD_EXTRACT_U8_43R_STORE; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -/* - * Either source or destination data are not 8-byte aligned. - * And dsize is in pixels. - */ - -void mlib_v_ImageChannelExtract_U8_43R_D1(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize) -{ - mlib_u8 *sa, *da; - mlib_u8 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 s0, s1, s2, s3, s4; /* 8-byte source row data */ - mlib_d64 sd0, sd1, sd2, sd3; /* 8-byte source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_d64 dd2old; /* the last datum of the last step */ - mlib_d64 sda; - mlib_s32 soff; /* offset of address in src */ - mlib_s32 doff; /* offset of address in dst */ - mlib_s32 emask; /* edge mask */ - mlib_s32 i, n; - - sa = (void *)src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *) ((mlib_addr) da & (~7)); - dend = da + dsize * 3 - 1; - dend2 = dend - 23; - doff = 8 - ((mlib_addr) da & 7); - - /* generate edge mask for the start point */ - emask = vis_edge8(da, dend); - - /* load 32 byte, convert, store 24 bytes */ - s4 = sp[0]; /* initial value */ - LOAD_EXTRACT_U8_43R; - - if (dsize >= 8) { - if (doff == 8) { - vis_pst_8(dd0, dp++, emask); - *dp++ = dd1; - *dp++ = dd2; - } - else { - vis_alignaddr((void *)doff, 0); - vis_pst_8(vis_faligndata(dd0, dd0), dp++, emask); - *dp++ = vis_faligndata(dd0, dd1); - *dp++ = vis_faligndata(dd1, dd2); - } - } - else { /* for very small size */ - if (doff == 8) { - vis_pst_8(dd0, dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd1, dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd2, dp++, emask); - } - } - } - else { - vis_alignaddr((void *)doff, 0); - vis_pst_8(vis_faligndata(dd0, dd0), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd2, dd2), dp++, emask); - } - } - } - } - } - - /* no edge handling is needed in the loop */ - if (doff == 8) { - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 24 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_EXTRACT_U8_43R; - *dp++ = dd0; - *dp++ = dd1; - *dp++ = dd2; - } - } - } - else { - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 24 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_EXTRACT_U8_43R; - vis_alignaddr((void *)doff, 0); - *dp++ = vis_faligndata(dd2old, dd0); - *dp++ = vis_faligndata(dd0, dd1); - *dp++ = vis_faligndata(dd1, dd2); - } - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_EXTRACT_U8_43R; - emask = vis_edge8(dp, dend); - if (doff == 8) { - vis_pst_8(dd0, dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd1, dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd2, dp++, emask); - } - } - } - else { - vis_alignaddr((void *)doff, 0); - vis_pst_8(vis_faligndata(dd2old, dd0), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, emask); - } - } - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_U8_43R(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_U8_43R_D1(sa, da, xsize); - sa = sl += slb; - da = dl += dlb; - } -} - -/***************************************************************/ -#define EXTRACT_S16_43R_old /* shift right */ \ - \ - dd2 = vis_faligndata(sd3, dd2); /* r3------ */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(sd3, dd2); /* g3r3---- */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(sd3, dd2); /* b3g3r3-- */ \ - \ - dd2 = vis_faligndata(sd2, dd2); /* r2b3g3r3 */ \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(sd2, dd1); /* g2------ */ \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(sd2, dd1); /* b2g2---- */ \ - \ - dd1 = vis_faligndata(sd1, dd1); /* r1b2g2-- */ \ - sd1 = vis_faligndata(sd1, sd1); \ - dd1 = vis_faligndata(sd1, dd1); /* g1r1b2g2 */ \ - sd1 = vis_faligndata(sd1, sd1); \ - dd0 = vis_faligndata(sd1, dd0); /* b1------ */ \ - \ - dd0 = vis_faligndata(sd0, dd0); /* r0b1---- */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(sd0, dd0); /* g0r0b1-- */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(sd0, dd0); /* b0g0r0b1 */ - -/***************************************************************/ -#define EXTRACT_S16_43R /* shift right */ \ - \ - vis_alignaddr((void *)0, 2); \ - dd2 = vis_faligndata(sd3, dd2); /* b3g3r3-- */ \ - \ - vis_alignaddr((void *)0, 6); \ - dd2 = vis_faligndata(sd2, dd2); /* r2b3g3r3 */ \ - vis_alignaddr((void *)0, 2); \ - dd1 = vis_faligndata(sd2, dd1); /* b2g2r2-- */ \ - \ - vis_alignaddr((void *)0, 4); \ - dd1 = vis_faligndata(sd1, dd1); /* g1r1b2g2 */ \ - vis_alignaddr((void *)0, 2); \ - dd0 = vis_faligndata(sd1, dd0); /* b1g1r1-- */ \ - dd0 = vis_faligndata(sd0, dd0); /* b0g0r0b1 */ - -/***************************************************************/ -#define LOAD_EXTRACT_S16_43R_STORE \ - \ - sd0 = *sp++; /* --b0g0r0 */ \ - sd1 = *sp++; /* --b1g1r1 */ \ - sd2 = *sp++; /* --b2g2r2 */ \ - sd3 = *sp++; /* --b3g3r3 */ \ - \ - EXTRACT_S16_43R; \ - \ - *dp++ = dd0; /* b0g0r0b1 */ \ - *dp++ = dd1; /* g1r1b2g2 */ \ - *dp++ = dd2; /* r2b3g3r3 */ - -/***************************************************************/ -#define LOAD_EXTRACT_S16_43R \ - \ - vis_alignaddr((void *)soff, 0); \ - s0 = s4; \ - s1 = sp[1]; \ - s2 = sp[2]; \ - s3 = sp[3]; \ - s4 = sp[4]; \ - sd0 = vis_faligndata(s0, s1); \ - sd1 = vis_faligndata(s1, s2); \ - sd2 = vis_faligndata(s2, s3); \ - sd3 = vis_faligndata(s3, s4); \ - sp += 4; \ - dd2old = dd2; \ - EXTRACT_S16_43R - -/***************************************************************/ -/* - * Both source and destination image data are 1-d vectors and - * 8-byte aligned. And size is in 4-pixels. - */ - -void mlib_v_ImageChannelExtract_S16_43R_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 sd0, sd1, sd2, sd3; /* source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - /* set GSR.offset for vis_faligndata() */ -/* vis_alignaddr((void *)0, 6); *//* only for _old */ - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_EXTRACT_S16_43R_STORE; - } -} - -/***************************************************************/ -/* - * Either source or destination image data are not 1-d vectors, but - * they are 8-byte aligned. The xsize is multiple of 8. - * slb and dlb are multiple of 8. - */ - -void mlib_v_ImageChannelExtract_S16_43R_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 *sl, *dl; /* 8-byte aligned pointer for line */ - mlib_d64 sd0, sd1, sd2, sd3; /* source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_s32 i, j; /* indices for x, y */ - - /* set GSR.offset for vis_faligndata() */ -/* vis_alignaddr((void *)0, 6); *//* only for _old */ - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - /* row loop */ - for (j = 0; j < ysize; j++) { - /* 4-pixel column loop */ -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - LOAD_EXTRACT_S16_43R_STORE; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -/* - * Either source or destination data are not 8-byte aligned. - * And dsize is multiple of 8. - */ - -void mlib_v_ImageChannelExtract_S16_43R_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize) -{ - mlib_s16 *sa, *da; /* pointer for pixel */ - mlib_s16 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 s0, s1, s2, s3, s4; /* 8-byte source row data */ - mlib_d64 sd0, sd1, sd2, sd3; /* 8-byte source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_d64 dd2old; /* the last datum of the last step */ - mlib_s32 soff; /* offset of address in src */ - mlib_s32 doff; /* offset of address in dst */ - mlib_s32 emask; /* edge mask */ - mlib_s32 i, n; - - sa = (void *)src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *) ((mlib_addr) da & (~7)); - dend = da + dsize * 3 - 1; - dend2 = dend - 11; - doff = 8 - ((mlib_addr) da & 7); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 32 byte, convert, store 24 bytes */ - s4 = sp[0]; /* initial value */ - LOAD_EXTRACT_S16_43R; - - if (dsize >= 4) { - if (doff == 8) { - vis_pst_16(dd0, dp++, emask); - *dp++ = dd1; - *dp++ = dd2; - } - else { - vis_alignaddr((void *)doff, 0); - vis_pst_16(vis_faligndata(dd0, dd0), dp++, emask); - *dp++ = vis_faligndata(dd0, dd1); - *dp++ = vis_faligndata(dd1, dd2); - } - } - else { /* for very small size */ - if (doff == 8) { - vis_pst_16(dd0, dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd1, dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd2, dp++, emask); - } - } - } - else { - vis_alignaddr((void *)doff, 0); - vis_pst_16(vis_faligndata(dd0, dd0), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, emask); - } - } - } - } - - /* no edge handling is needed in the loop */ - if (doff == 8) { - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 24 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_EXTRACT_S16_43R; - *dp++ = dd0; - *dp++ = dd1; - *dp++ = dd2; - } - } - } - else { - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *) dend2 - (mlib_u8 *) dp) / 24 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_EXTRACT_S16_43R; - vis_alignaddr((void *)doff, 0); - *dp++ = vis_faligndata(dd2old, dd0); - *dp++ = vis_faligndata(dd0, dd1); - *dp++ = vis_faligndata(dd1, dd2); - } - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_EXTRACT_S16_43R; - emask = vis_edge16(dp, dend); - if (doff == 8) { - vis_pst_16(dd0, dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd1, dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd2, dp++, emask); - } - } - } - else { - vis_alignaddr((void *)doff, 0); - vis_pst_16(vis_faligndata(dd2old, dd0), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, emask); - } - } - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelExtract_S16_43R(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_S16_43R_D1(sa, da, xsize); - sa = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -#define EXTRACT_U8_43L_old /* shift left */ \ - \ - dd0 = vis_faligndata(dd0, sd0); /* --------------r0 */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(dd0, sd0); /* ------------r0g0 */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(dd0, sd0); /* ----------r0g0b0 */ \ - sd0 = vis_faligndata(sd0, sd0); \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(dd0, sd0); /* --------r0g0b0r1 */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(dd0, sd0); /* ------r0g0b0r1g1 */ \ - sd0 = vis_faligndata(sd0, sd0); \ - dd0 = vis_faligndata(dd0, sd0); /* ----r0g0b0r1g1b1 */ \ - \ - dd0 = vis_faligndata(dd0, sd1); /* --r0g0b0r1g1b1r2 */ \ - sd1 = vis_faligndata(sd1, sd1); \ - dd0 = vis_faligndata(dd0, sd1); /* r0g0b0r1g1b1r2g2 */ \ - \ - sd1 = vis_faligndata(sd1, sd1); \ - dd1 = vis_faligndata(dd1, sd1); /* --------------b2 */ \ - sd1 = vis_faligndata(sd1, sd1); \ - sd1 = vis_faligndata(sd1, sd1); \ - dd1 = vis_faligndata(dd1, sd1); /* ------------b2r3 */ \ - sd1 = vis_faligndata(sd1, sd1); \ - dd1 = vis_faligndata(dd1, sd1); /* ----------b2r3g3 */ \ - sd1 = vis_faligndata(sd1, sd1); \ - dd1 = vis_faligndata(dd1, sd1); /* --------b2r3g3b3 */ \ - \ - dd1 = vis_faligndata(dd1, sd2); /* ------b2r3g3b3r4 */ \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(dd1, sd2); /* ----b2r3g3b3r4g4 */ \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(dd1, sd2); /* --b2r3g3b3r4g4b4 */ \ - sd2 = vis_faligndata(sd2, sd2); \ - sd2 = vis_faligndata(sd2, sd2); \ - dd1 = vis_faligndata(dd1, sd2); /* b2r3g3b3r4g4b4r5 */ \ - \ - sd2 = vis_faligndata(sd2, sd2); \ - dd2 = vis_faligndata(dd2, sd2); /* --------------g5 */ \ - sd2 = vis_faligndata(sd2, sd2); \ - dd2 = vis_faligndata(dd2, sd2); /* ------------g5b5 */ \ - \ - dd2 = vis_faligndata(dd2, sd3); /* ----------g5b5r6 */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(dd2, sd3); /* --------g5b5r6g6 */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(dd2, sd3); /* ------g5b5r6g6b6 */ \ - sd3 = vis_faligndata(sd3, sd3); \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(dd2, sd3); /* ----g5b5r6g6b6r7 */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(dd2, sd3); /* --g5b5r6g6b6r7g7 */ \ - sd3 = vis_faligndata(sd3, sd3); \ - dd2 = vis_faligndata(dd2, sd3); /* g5b5r6g6b6r7g7b7 */ - /***************************************************************/ #define EXTRACT_U8_43L /* shift left */ \ \ @@ -800,20 +87,6 @@ void mlib_v_ImageChannelExtract_S16_43R(const mlib_s16 *src, sda = vis_freg_pair(vis_read_lo(sd3), vis_read_hi(sd3)); \ dd2 = vis_faligndata(dd2, sda); /* g5b5r6g6b6r7g7b7 */ -/***************************************************************/ -#define LOAD_EXTRACT_U8_43L_STORE \ - \ - sd0 = *sp++; /* r0g0b0--r1g1b1-- */ \ - sd1 = *sp++; /* r2g2b2--r3g3b3-- */ \ - sd2 = *sp++; /* r4g4b4--r5g5b5-- */ \ - sd3 = *sp++; /* r6g6b6--r7g7b7-- */ \ - \ - EXTRACT_U8_43L; \ - \ - *dp++ = dd0; /* r0g0b0r1g1b1r2g2 */ \ - *dp++ = dd1; /* b2r3g3b3r4g4b4r5 */ \ - *dp++ = dd2; /* g5b5r6g6b6r7g7b7 */ - /***************************************************************/ #define LOAD_EXTRACT_U8_43L \ \ @@ -833,74 +106,6 @@ void mlib_v_ImageChannelExtract_S16_43R(const mlib_s16 *src, dd2old = dd2; \ EXTRACT_U8_43L -/***************************************************************/ -/* - * Both source and destination image data are 1-d vectors and - * 8-byte aligned. And dsize is multiple of 8. - */ - -void mlib_v_ImageChannelExtract_U8_43L_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1, sd2, sd3; /* source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_d64 sda; - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - /* set GSR.offset for vis_faligndata() */ -/* vis_alignaddr((void *)0, 1); *//* for _old only */ - -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - LOAD_EXTRACT_U8_43L_STORE; - } -} - -/***************************************************************/ -/* - * Either source or destination image data are not 1-d vectors, but - * they are 8-byte aligned. And slb and dlb are multiple of 8. - * The xsize is multiple of 8. - */ - -void mlib_v_ImageChannelExtract_U8_43L_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 *sl, *dl; /* 8-byte aligned pointer for line */ - mlib_d64 sd0, sd1, sd2, sd3; /* source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_d64 sda; - mlib_s32 i, j; /* indices for x, y */ - - /* set GSR.offset for vis_faligndata() */ -/* vis_alignaddr((void *)0, 1); *//* for _old only */ - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - /* row loop */ - for (j = 0; j < ysize; j++) { - /* 8-byte column loop */ -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - LOAD_EXTRACT_U8_43L_STORE; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } -} - /***************************************************************/ /* * Either source or destination data are not 8-byte aligned. @@ -1044,28 +249,6 @@ void mlib_v_ImageChannelExtract_U8_43L_D1(const mlib_u8 *src, } } -/***************************************************************/ -void mlib_v_ImageChannelExtract_U8_43L(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_U8_43L_D1(sa, da, xsize); - sa = sl += slb; - da = dl += dlb; - } -} - /***************************************************************/ #define EXTRACT_S16_43L /* shift left */ \ vis_alignaddr((void *)0, 6); \ @@ -1082,20 +265,6 @@ void mlib_v_ImageChannelExtract_U8_43L(const mlib_u8 *src, dd2 = vis_faligndata(dd2, sd2); /* --r2g2b2 */ \ dd2 = vis_faligndata(dd2, sd3); /* b2r3g3b3 */ -/***************************************************************/ -#define LOAD_EXTRACT_S16_43L_STORE \ - \ - sd0 = *sp++; /* r0g0b0-- */ \ - sd1 = *sp++; /* r1g1b1-- */ \ - sd2 = *sp++; /* r2g2b2-- */ \ - sd3 = *sp++; /* r3g3b3-- */ \ - \ - EXTRACT_S16_43L; \ - \ - *dp++ = dd0; /* r0g0b0r1 */ \ - *dp++ = dd1; /* g1b1r2g2 */ \ - *dp++ = dd2; /* b2r3g3b3 */ - /***************************************************************/ #define LOAD_EXTRACT_S16_43L \ \ @@ -1113,72 +282,6 @@ void mlib_v_ImageChannelExtract_U8_43L(const mlib_u8 *src, dd2old = dd2; \ EXTRACT_S16_43L -/***************************************************************/ -/* - * Both source and destination image data are 1-d vectors and - * 8-byte aligned. And dsize is multiple of 4. - */ - -void mlib_v_ImageChannelExtract_S16_43L_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 sd0, sd1, sd2, sd3; /* source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_s32 i; - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - - /* set GSR.offset for vis_faligndata() */ -/* vis_alignaddr((void *)0, 2); *//* only for _old */ - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_EXTRACT_S16_43L_STORE; - } -} - -/***************************************************************/ -/* - * Either source or destination image data are not 1-d vectors, but - * they are 8-byte aligned. The xsize is multiple of 4. - * And slb and dlb are multiple of 8. - */ - -void mlib_v_ImageChannelExtract_S16_43L_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 *sl, *dl; /* 8-byte aligned pointer for line */ - mlib_d64 sd0, sd1, sd2, sd3; /* source data */ - mlib_d64 dd0, dd1, dd2; /* dst data */ - mlib_s32 i, j; /* indices for x, y */ - - /* set GSR.offset for vis_faligndata() */ -/* vis_alignaddr((void *)0, 2); *//* only for _old */ - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - /* row loop */ - for (j = 0; j < ysize; j++) { - /* 4-pixel column loop */ -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - LOAD_EXTRACT_S16_43L_STORE; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } -} - /***************************************************************/ /* * Either source or destination data are not 8-byte aligned. @@ -1318,25 +421,3 @@ void mlib_v_ImageChannelExtract_S16_43L_D1(const mlib_s16 *src, } /***************************************************************/ -void mlib_v_ImageChannelExtract_S16_43L(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelExtract_S16_43L_D1(sa, da, xsize); - sa = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_f.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_f.c deleted file mode 100644 index da12ebaace7..00000000000 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelExtract_f.c +++ /dev/null @@ -1,784 +0,0 @@ -/* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - - -#include -#include "mlib_image.h" -#include "mlib_ImageCheck.h" - -typedef union { - double d64; - struct { - float f0; - float f1; - } f32s; -} d64_2_f32; - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_U8_2_1(mlib_u8 *sl, mlib_s32 slb, - mlib_u8 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height) -{ - mlib_u8 *sp = sl; - mlib_u8 *dp = dl; - int i, j; - - for (j = 0; j < height; j++) { - mlib_u8 *dend = dl + width; - mlib_u32 *sp2; - while (((mlib_addr)sp & 7) > 1) { - *dp++ = *sp; - sp += 2; - if (dp >= dend) break; - } - if ((mlib_addr)sp & 7) { - sp2 = (mlib_u32 *)(sp - 1); -#pragma pipeloop(0) - for (; dp <= (dend-2); dp += 2) { - mlib_u32 s0; - s0 = *sp2++; - dp[0] = s0 >> 16; - dp[1] = s0; - } - if (dp < dend) { - dp[0] = sp2[0] >> 16; - } - } else { - sp2 = (mlib_u32 *)sp; -#pragma pipeloop(0) - for (; dp <= (dend-2); dp += 2) { - mlib_u32 s0; - s0 = *sp2++; - dp[0] = s0 >> 24; - dp[1] = s0 >> 8; - } - if (dp < dend) { - dp[0] = sp2[0] >> 24; - } - } - sp = sl += slb; - dp = dl += dlb; - } -} - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_U8_3_2(mlib_u8 *sl, mlib_s32 slb, - mlib_u8 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 count1) -{ - mlib_u8 *sp = sl; - mlib_u8 *dp = dl; - mlib_u32 *sp2; - mlib_u16 *dp2; - mlib_u16 *d2end; - mlib_u32 s0, s1, s2, s3; - int i, j, off, count_off; - - for (j = 0; j < height; j++) { - mlib_u8 *dend = dl + 2*width; - - if (count1 == 1) { - if (dp < dend) *dp++ = sp[0]; - sp += 2; - } - - if ((mlib_addr)dp & 1) { -#pragma pipeloop(0) - for (; dp <= (dend-2); dp += 2) { - dp[0] = sp[0]; - dp[1] = sp[1]; - sp += 3; - } - if (dp < dend) { - dp[0] = sp[0]; - } - sp = sl += slb; - dp = dl += dlb; - continue; - } - - dp2 = (mlib_u16*)dp; - d2end = (mlib_u16*)((mlib_addr)dend &~ 1); - off = (mlib_addr)sp & 3; - sp2 = (mlib_u32 *)(sp - off); - - switch (off) { - - case 0: -#pragma pipeloop(0) - for (; dp2 <= (d2end-4); dp2 += 4) { - s0 = sp2[0]; - s1 = sp2[1]; - s2 = sp2[2]; - dp2[0] = s0 >> 16; - dp2[1] = (s0 << 8) | (s1 >> 24); - dp2[2] = s1; - dp2[3] = s2 >> 8; - sp2 += 3; - } - break; - - case 1: -#pragma pipeloop(0) - for (; dp2 <= (d2end-4); dp2 += 4) { - s0 = sp2[0]; - s1 = sp2[1]; - s2 = sp2[2]; - dp2[0] = s0 >> 8; - dp2[1] = s1 >> 16; - dp2[2] = (s1 << 8) | (s2 >> 24); - dp2[3] = s2; - sp2 += 3; - } - break; - - case 2: -#pragma pipeloop(0) - s3 = sp2[0]; - for (; dp2 <= (d2end-4); dp2 += 4) { - s0 = s3; - s1 = sp2[1]; - s2 = sp2[2]; - s3 = sp2[3]; - dp2[0] = s0; - dp2[1] = s1 >> 8; - dp2[2] = s2 >> 16; - dp2[3] = (s2 << 8) | (s3 >> 24); - sp2 += 3; - } - break; - - case 3: -#pragma pipeloop(0) - s3 = sp2[0]; - for (; dp2 <= (d2end-4); dp2 += 4) { - s0 = s3; - s1 = sp2[1]; - s2 = sp2[2]; - s3 = sp2[3]; - dp2[0] = (s0 << 8) | (s1 >> 24); - dp2[1] = s1; - dp2[2] = s2 >> 8; - dp2[3] = s3 >> 16; - sp2 += 3; - } - } - - sp = (mlib_u8 *)sp2 + off; - dp = (mlib_u8 *)dp2; - while (dp < dend) { - *dp++ = sp[0]; - if (dp < dend) *dp++ = sp[1]; - sp += 3; - } - - sp = sl += slb; - dp = dl += dlb; - } -} - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_U8_4_2(mlib_u8 *sl, mlib_s32 slb, - mlib_u8 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 count1) -{ - mlib_u8 *sp = sl; - mlib_u8 *dp = dl; - mlib_u32 *sp2; - mlib_u16 *dp2; - mlib_u16 *d2end; - mlib_u32 s0, s1, s2, s3; - int i, j, off, count_off; - - for (j = 0; j < height; j++) { - mlib_u8 *dend = dl + 2*width; - - if (count1 == 1) { - if (dp < dend) *dp++ = sp[0]; - sp += 3; - } - - off = (mlib_addr)sp & 3; - - if (((mlib_addr)dp & 1) || (off == 3)) { -#pragma pipeloop(0) - for (; dp <= (dend-2); dp += 2) { - dp[0] = sp[0]; - dp[1] = sp[1]; - sp += 4; - } - if (dp < dend) { - dp[0] = sp[0]; - } - sp = sl += slb; - dp = dl += dlb; - continue; - } - - dp2 = (mlib_u16*)dp; - d2end = (mlib_u16*)((mlib_addr)dend &~ 1); - sp2 = (mlib_u32 *)(sp - off); - - switch (off) { - - case 0: -#pragma pipeloop(0) - for (; dp2 < d2end; dp2++) { - s0 = sp2[0]; - dp2[0] = s0 >> 16; - sp2++; - } - break; - - case 1: -#pragma pipeloop(0) - for (; dp2 < d2end; dp2++) { - s0 = sp2[0]; - dp2[0] = s0 >> 8; - sp2++; - } - break; - - case 2: -#pragma pipeloop(0) - for (; dp2 < d2end; dp2++) { - s0 = sp2[0]; - dp2[0] = s0; - sp2++; - } - break; - } - - sp = (mlib_u8 *)sp2 + off; - dp = (mlib_u8 *)dp2; - if (dp < dend) { - *dp++ = sp[0]; - } - - sp = sl += slb; - dp = dl += dlb; - } -} - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_32_2_1(mlib_f32 *sp, mlib_s32 slb, - mlib_f32 *dp, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height) -{ - mlib_d64 *sp2; - int i, j, off; - - for (j = 0; j < height; j++) { - - if (((mlib_addr)sp & 7) == 0) { - sp2 = (mlib_d64 *)sp; -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - d64_2_f32 d; - d.d64 = sp2[i]; - dp[i] = d.f32s.f0; - } - } else { - sp2 = (mlib_d64 *)(sp - 1); -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - d64_2_f32 d; - d.d64 = sp2[i]; - dp[i] = d.f32s.f1; - } - } - - sp += slb; - dp += dlb; - } -} - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_32_3_1(mlib_f32 *sl, mlib_s32 slb, - mlib_f32 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height) -{ - mlib_f32 *sp = sl; - mlib_f32 *dp = dl; - mlib_d64 *sp2; - d64_2_f32 d0; - int i, j, off; - - for (j = 0; j < height; j++) { - mlib_f32 *dend = dl + width; - - if ((mlib_addr)sp & 7) { - dp[0] = sp[0]; - sp += 3; - dp ++; - } - - sp2 = (mlib_d64 *)sp; -#pragma pipeloop(0) - for (; dp <= (dend-2); dp += 2) { - d64_2_f32 d0, d1; - d0.d64 = sp2[0]; - d1.d64 = sp2[1]; - dp[0] = d0.f32s.f0; - dp[1] = d1.f32s.f1; - sp2 += 3; - } - - if (dp < dend) { - d0.d64 = sp2[0]; - dp[0] = d0.f32s.f0; - } - - sp = sl += slb; - dp = dl += dlb; - } -} - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_32_3_2(mlib_f32 *sl, mlib_s32 slb, - mlib_f32 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 count1) -{ - mlib_f32 *sp = sl; - mlib_f32 *dp = dl; - mlib_d64 *sp2; - d64_2_f32 d0; - int i, j, off; - - for (j = 0; j < height; j++) { - mlib_f32 *dend = dl + 2*width; - - if (count1 == 1) { - if (dp < dend) *dp++ = sp[0]; - sp += 2; - } - - if ((mlib_addr)sp & 7) { - if (dp < dend) *dp++ = sp[0]; - if (dp < dend) *dp++ = sp[1]; - sp += 3; - } - - sp2 = (mlib_d64 *)sp; -#pragma pipeloop(0) - for (; dp <= (dend-4); dp += 4) { - d64_2_f32 d0, d1, d2; - d0.d64 = sp2[0]; - d1.d64 = sp2[1]; - d2.d64 = sp2[2]; - dp[0] = d0.f32s.f0; - dp[1] = d0.f32s.f1; - dp[2] = d1.f32s.f1; - dp[3] = d2.f32s.f0; - sp2 += 3; - } - - if (dp < dend) { - sp = (mlib_f32 *)sp2; - *dp++ = sp[0]; - if (dp < dend) *dp++ = sp[1]; - if (dp < dend) *dp++ = sp[3]; - } - - sp = sl += slb; - dp = dl += dlb; - } -} - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_32_4_1(mlib_f32 *sp, mlib_s32 slb, - mlib_f32 *dp, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height) -{ - mlib_d64 *sp2; - int i, j, off; - - for (j = 0; j < height; j++) { - - if (((mlib_addr)sp & 7) == 0) { - sp2 = (mlib_d64 *)sp; -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - d64_2_f32 d; - d.d64 = sp2[2*i]; - dp[i] = d.f32s.f0; - } - } else { - sp2 = (mlib_d64 *)(sp - 1); -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - d64_2_f32 d; - d.d64 = sp2[2*i]; - dp[i] = d.f32s.f1; - } - } - - sp += slb; - dp += dlb; - } -} - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_32_4_2(mlib_f32 *sl, mlib_s32 slb, - mlib_f32 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 count1) -{ - mlib_f32 *sp = sl; - mlib_f32 *dp = dl; - mlib_d64 *sp2; - int i, j, off; - d64_2_f32 d0, d1; - - for (j = 0; j < height; j++) { - mlib_f32 *dend = dl + 2*width; - - if (count1 == 1) { - dp[0] = sp[0]; - sp += 3; - dp ++; - } - - if (((mlib_addr)sp & 7) == 0) { - sp2 = (mlib_d64 *)sp; -#pragma pipeloop(0) - for (; dp <= (dend-2); dp += 2) { - d64_2_f32 d; - d.d64 = sp2[0]; - dp[0] = d.f32s.f0; - dp[1] = d.f32s.f1; - sp2 += 2; - } - if (dp < dend) { - d0.d64 = sp2[0]; - dp[0] = d0.f32s.f0; - } - } else { - sp2 = (mlib_d64 *)(sp - 1); -#pragma pipeloop(0) - for (; dp <= (dend-2); dp += 2) { - d64_2_f32 d0, d1; - d0.d64 = sp2[0]; - d1.d64 = sp2[1]; - dp[0] = d0.f32s.f1; - dp[1] = d1.f32s.f0; - sp2 += 2; - } - if (dp < dend) { - d0.d64 = sp2[0]; - dp[0] = d0.f32s.f1; - } - } - - sp = sl += slb; - dp = dl += dlb; - } -} - -/***************************************************************/ - -void mlib_v_ImageChannelExtract_32_4_3(mlib_f32 *sl, mlib_s32 slb, - mlib_f32 *dl, mlib_s32 dlb, - mlib_s32 width, mlib_s32 height, - mlib_s32 count1) -{ - mlib_f32 *sp = sl; - mlib_f32 *dp = dl; - mlib_d64 *sp2; - int i, j, k; - d64_2_f32 d0, d1; - - for (j = 0; j < height; j++) { - mlib_f32 *dend = dl + 3*width; - - for (k = 0; k < count1; k++) { - if (dp < dend) *dp++ = *sp++; - } - sp++; - - if (((mlib_addr)sp & 7) == 0) { - sp2 = (mlib_d64 *)sp; -#pragma pipeloop(0) - for (; dp <= (dend-3); dp += 3) { - d64_2_f32 d0, d1; - d0.d64 = sp2[0]; - d1.d64 = sp2[1]; - dp[0] = d0.f32s.f0; - dp[1] = d0.f32s.f1; - dp[2] = d1.f32s.f0; - sp2 += 2; - } - if (dp < dend) { - d0.d64 = sp2[0]; - *dp++ = d0.f32s.f0; - if (dp < dend) *dp++ = d0.f32s.f1; - } - } else { - sp2 = (mlib_d64 *)(sp - 1); -#pragma pipeloop(0) - for (; dp <= (dend-3); dp += 3) { - d64_2_f32 d0, d1; - d0.d64 = sp2[0]; - d1.d64 = sp2[1]; - dp[0] = d0.f32s.f1; - dp[1] = d1.f32s.f0; - dp[2] = d1.f32s.f1; - sp2 += 2; - } - if (dp < dend) { - d0.d64 = sp2[0]; - d1.d64 = sp2[1]; - *dp++ = d0.f32s.f1; - if (dp < dend) *dp++ = d1.f32s.f0; - } - } - - sp = sl += slb; - dp = dl += dlb; - } -} - -/***************************************************************/ -/* general channel extraction: slower due to the inner loop */ - -void mlib_v_ImageChannelExtract_U8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 channels, mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask) -{ - mlib_u8 *sp; /* pointer for pixel in src */ - mlib_u8 *sl; /* pointer for line in src */ - mlib_u8 *dp; /* pointer for pixel in dst */ - mlib_u8 *dl; /* pointer for line in dst */ - int i, j, k; /* indices for x, y, channel */ - int deltac[5] = { 0, 1, 1, 1, 1 }; - int inc0, inc1, inc2, inc3; - mlib_u8 s0, s1, s2, s3; - - deltac[channeld] = 1; - for (i = (channels - 1), k = 0; i >= 0; i--) { - if ((cmask & (1 << i)) == 0) - deltac[k]++; - else - k++; - } - - deltac[channeld] = channels; - for (i = 1; i < channeld; i++) { - deltac[channeld] -= deltac[i]; - } - - sp = sl = src + deltac[0]; - dp = dl = dst; - -/* Only THREE CHANNEL CASE could be executed here!!! */ - - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - inc2 = deltac[3] + inc1; - for (j = 0; j < height; j++) { - for (i = 0; i < width; i++) { -#pragma pipeloop(0) - s0 = sp[0]; s1 = sp[inc0]; s2 = sp[inc1]; - dp[0] = s0; - dp[1] = s1; - dp[2] = s2; - sp += inc2; - dp += 3; - } - sp = sl += slb; - dp = dl += dlb; - } -} - -/***************************************************************/ -/* general channel extraction: slower due to the inner loop */ - -void mlib_v_ImageChannelExtract_S16(mlib_u16 *src, mlib_s32 slb, - mlib_u16 *dst, mlib_s32 dlb, - mlib_s32 channels, mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask) -{ - mlib_u16 *sp; /* pointer for pixel in src */ - mlib_u16 *sl; /* pointer for line in src */ - mlib_u16 *dp; /* pointer for pixel in dst */ - mlib_u16 *dl; /* pointer for line in dst */ - int i, j, k; /* indices for x, y, channel */ - int deltac[5] = { 0, 1, 1, 1, 1 }; - int inc0, inc1, inc2, inc3; - mlib_u16 s0, s1, s2, s3; - - slb >>= 1; - dlb >>= 1; - - deltac[channeld] = 1; - for (i = (channels - 1), k = 0; i >= 0; i--) { - if ((cmask & (1 << i)) == 0) - deltac[k]++; - else - k++; - } - - deltac[channeld] = channels; - for (i = 1; i < channeld; i++) { - deltac[channeld] -= deltac[i]; - } - - sp = sl = src + deltac[0]; - dp = dl = dst; - - if (channeld == 2) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; s1 = sp[inc0]; - dp[0] = s0; - dp[1] = s1; - sp += inc1; - dp += 2; - } - sp = sl = sl + slb; - dp = dl = dl + dlb; - } - } else - - if (channeld == 3) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - inc2 = deltac[3] + inc1; - for (j = 0; j < height; j++) { - for (i = 0; i < width; i++) { -#pragma pipeloop(0) - s0 = sp[0]; s1 = sp[inc0]; s2 = sp[inc1]; - dp[0] = s0; - dp[1] = s1; - dp[2] = s2; - sp += inc2; - dp += 3; - } - sp = sl = sl + slb; - dp = dl = dl + dlb; - } - }} - -/***************************************************************/ -/* general channel extraction: slower due to the inner loop */ - -void mlib_v_ImageChannelExtract_D64(mlib_d64 *src, mlib_s32 slb, - mlib_d64 *dst, mlib_s32 dlb, - mlib_s32 channels, mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask) -{ - mlib_d64 *sp; /* pointer for pixel in src */ - mlib_d64 *sl; /* pointer for line in src */ - mlib_d64 *dp; /* pointer for pixel in dst */ - mlib_d64 *dl; /* pointer for line in dst */ - int i, j, k; /* indices for x, y, channel */ - int deltac[5] = { 0, 1, 1, 1, 1 }; - int inc0, inc1, inc2, inc3; - mlib_d64 s0, s1, s2, s3; - - deltac[channeld] = 1; - for (i = (channels - 1), k = 0; i >= 0; i--) { - if ((cmask & (1 << i)) == 0) - deltac[k]++; - else - k++; - } - - deltac[channeld] = channels; - for (i = 1; i < channeld; i++) { - deltac[channeld] -= deltac[i]; - } - - sp = sl = src + deltac[0]; - dp = dl = dst; - - if (channeld == 1) { - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - dp[i] = s0; - sp += channels; - } - sp = sl = (mlib_d64 *)((mlib_u8 *)sl + slb); - dp = dl = (mlib_d64 *)((mlib_u8 *)dl + dlb); - } - } else - - if (channeld == 2) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; s1 = sp[inc0]; - dp[0] = s0; - dp[1] = s1; - sp += inc1; - dp += 2; - } - sp = sl = (mlib_d64 *)((mlib_u8 *)sl + slb); - dp = dl = (mlib_d64 *)((mlib_u8 *)dl + dlb); - } - } else - - if (channeld == 3) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - inc2 = deltac[3] + inc1; - for (j = 0; j < height; j++) { - for (i = 0; i < width; i++) { -#pragma pipeloop(0) - s0 = sp[0]; s1 = sp[inc0]; s2 = sp[inc1]; - dp[0] = s0; - dp[1] = s1; - dp[2] = s2; - sp += inc2; - dp += 3; - } - sp = sl = (mlib_d64 *)((mlib_u8 *)sl + slb); - dp = dl = (mlib_d64 *)((mlib_u8 *)dl + dlb); - } - } -} diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert.c deleted file mode 100644 index f9fbf93e677..00000000000 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert.c +++ /dev/null @@ -1,715 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - - - -/* - * FUNCTIONS - * mlib_ImageChannelInsert - Copy the source image into the selected - * channels of the destination image - * - * SYNOPSIS - * mlib_status mlib_ImageChannelInsert(mlib_image *dst, - * mlib_image *src, - * mlib_s32 cmask); - * - * ARGUMENT - * dst Pointer to destination image. - * src Pointer to source image. - * cmask Destination channel selection mask. - * The least significant bit (LSB) is corresponding to the - * last channel in the destination image data. - * The bits with value 1 stand for the channels selected. - * If more than N channels are selected, the leftmost N - * channels are inserted, where N is the number of channels - * in the source image. - * - * RESTRICTION - * The src and dst must have the same width, height and data type. - * The src and dst can have 1, 2, 3 or 4 channels. - * The src and dst can be either MLIB_BYTE, MLIB_SHORT, MLIB_INT, - * MLIB_FLOAT or MLIB_DOUBLE. - * - * DESCRIPTION - * Copy the source image into the selected channels of the destination - * image - */ - -#include -#include "mlib_image.h" -#include "mlib_ImageCheck.h" - -/***************************************************************/ -/* functions defined in mlib_v_ImageChannelInsert_1.c */ - -void -mlib_v_ImageChannelInsert_U8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_D64(mlib_d64 *src, mlib_s32 slb, - mlib_d64 *dst, mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S32(mlib_s32 *src, mlib_s32 slb, - mlib_s32 *dst, mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, mlib_s32 height, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_12_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_12_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_12_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_12(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_13_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_13_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_13_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_13(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_14_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_14_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_14_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_U8_14(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_12_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_12_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_12_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_12(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_13_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_13_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_13_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_13(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_14_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_14_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_14_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); -void -mlib_v_ImageChannelInsert_S16_14(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize, - mlib_s32 cmask); - -/***************************************************************/ -/* functions defined in mlib_v_ImageChannelInsert_34.c */ - -void -mlib_v_ImageChannelInsert_U8_34R_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelInsert_U8_34R_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelInsert_U8_34R_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelInsert_U8_34R(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelInsert_S16_34R_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelInsert_S16_34R_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelInsert_S16_34R_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelInsert_S16_34R(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelInsert_U8_34L_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelInsert_U8_34L_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelInsert_U8_34L_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelInsert_U8_34L(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelInsert_S16_34L_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelInsert_S16_34L_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); -void -mlib_v_ImageChannelInsert_S16_34L_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); -void -mlib_v_ImageChannelInsert_S16_34L(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize); - - -/***************************************************************/ - -#ifdef MLIB_TEST -mlib_status -mlib_v_ImageChannelInsert(mlib_image *dst, - mlib_image *src, - mlib_s32 cmask) -#else -mlib_status -mlib_ImageChannelInsert(mlib_image *dst, - mlib_image *src, - mlib_s32 cmask) -#endif -{ - const mlib_s32 X8 = 0x7; - const mlib_s32 X4 = 0x3; - const mlib_s32 X2 = 0x1; - const mlib_s32 A8D1 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_ONEDVECTOR; - const mlib_s32 A8D2X8 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH8X; - const mlib_s32 A8D2X4 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH4X; - const mlib_s32 A8D2X2 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH2X; - - void *sp; /* pointer for pixel in src */ - void *dp; /* pointer for pixel in dst */ - mlib_s32 ncmask = 0; /* normalized channel mask */ - mlib_s32 channels; /* number of channels for src */ - mlib_s32 channeld; /* number of channels for dst */ - mlib_s32 width, height;/* for src and dst */ - mlib_s32 strides; /* strides in bytes for src */ - mlib_s32 strided; /* strides in bytes for dst */ - mlib_s32 flags; - mlib_s32 flagd; - mlib_s32 dsize; - int i, bit1count = 0; - - MLIB_IMAGE_CHECK(src); - MLIB_IMAGE_CHECK(dst); - MLIB_IMAGE_TYPE_EQUAL(src,dst); - MLIB_IMAGE_SIZE_EQUAL(src,dst); - - channels = mlib_ImageGetChannels(src); - channeld = mlib_ImageGetChannels(dst); - width = mlib_ImageGetWidth(src); - height = mlib_ImageGetHeight(src); - strides = mlib_ImageGetStride(src); - strided = mlib_ImageGetStride(dst); - sp = mlib_ImageGetData(src); - dp = mlib_ImageGetData(dst); - flags = mlib_ImageGetFlags(src); - flagd = mlib_ImageGetFlags(dst); - dsize = width * height; - - /* normalize the cmask, and count the number of bit with value 1 */ - for (i = (channeld - 1); i >= 0; i--) { - if (((cmask & (1 << i)) != 0) && (bit1count < channels)) { - ncmask += (1 << i); - bit1count++; - } - } - - /* do not support the cases in which the number of selected channels is - * less than the nubmber of channels in the source image */ - if (bit1count < channels) { - return MLIB_FAILURE; - } - - if (((channels == 1) && (channeld == 1)) || - ((channels == 2) && (channeld == 2)) || - ((channels == 3) && (channeld == 3)) || - ((channels == 4) && (channeld == 4))) { - return mlib_ImageCopy(dst, src); - } - - switch (mlib_ImageGetType(src)) { - case MLIB_BYTE: - if (channels == 1) { - switch (channeld) { - case 2: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelInsert_U8_12_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelInsert_U8_12_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_U8_12_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelInsert_U8_12((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - break; - - case 3: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelInsert_U8_13_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelInsert_U8_13_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_U8_13_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelInsert_U8_13((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - break; - - case 4: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelInsert_U8_14_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelInsert_U8_14_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_U8_14_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelInsert_U8_14((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height, - ncmask); - } - break; - - default: - return MLIB_FAILURE; - } - } - else { - if ((channels == 3) && (channeld == 4) && (ncmask == 7)) { - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelInsert_U8_34R_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelInsert_U8_34R_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_U8_34R_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize); - } - else { - mlib_v_ImageChannelInsert_U8_34R((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height); - } - } - else if ((channels == 3) && (channeld == 4) && (ncmask == 14)) { - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X8) == 0)) { - mlib_v_ImageChannelInsert_U8_34L_A8D1X8((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize); - } - else if (((flags & A8D2X8) == 0) && - ((flagd & A8D2X8) == 0)) { - mlib_v_ImageChannelInsert_U8_34L_A8D2X8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_U8_34L_D1((mlib_u8 *)sp, - (mlib_u8 *)dp, - dsize); - } - else mlib_v_ImageChannelInsert_U8_34L((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - width, height); - } - else { - - mlib_v_ImageChannelInsert_U8((mlib_u8 *)sp, strides, - (mlib_u8 *)dp, strided, - channels, channeld, - width, height, - ncmask); - } - } - break; - - case MLIB_SHORT: - if (channels == 1) { - switch (channeld) { - case 2: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelInsert_S16_12_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelInsert_S16_12_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_S16_12_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelInsert_S16_12((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - break; - - case 3: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelInsert_S16_13_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelInsert_S16_13_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_S16_13_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelInsert_S16_13((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - break; - - case 4: - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelInsert_S16_14_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelInsert_S16_14_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_S16_14_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize, - ncmask); - } - else { - mlib_v_ImageChannelInsert_S16_14((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height, - ncmask); - } - break; - default: - return MLIB_FAILURE; - } - } - else if ((channels == 3) && (channeld == 4) && (ncmask == 7)) { - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelInsert_S16_34R_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelInsert_S16_34R_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_S16_34R_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize); - } - else { - mlib_v_ImageChannelInsert_S16_34R((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height); - } - } - else if ((channels == 3) && (channeld == 4) && (ncmask == 14)) { - if (((flags & A8D1) == 0) && - ((flagd & A8D1) == 0) && - ((dsize & X4) == 0)) { - mlib_v_ImageChannelInsert_S16_34L_A8D1X4((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize); - } - else if (((flags & A8D2X4) == 0) && - ((flagd & A8D2X4) == 0)) { - mlib_v_ImageChannelInsert_S16_34L_A8D2X4((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height); - } - else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) && - ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) { - mlib_v_ImageChannelInsert_S16_34L_D1((mlib_s16 *)sp, - (mlib_s16 *)dp, - dsize); - } - else { - mlib_v_ImageChannelInsert_S16_34L((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - width, height); - } - } - else { - mlib_v_ImageChannelInsert_S16((mlib_s16 *)sp, strides, - (mlib_s16 *)dp, strided, - channels, channeld, - width, height, - ncmask); - } - break; - - case MLIB_INT: - mlib_v_ImageChannelInsert_S32((mlib_s32 *)sp, strides, - (mlib_s32 *)dp, strided, - channels, channeld, - width, height, - ncmask); - break; - - case MLIB_FLOAT: - mlib_v_ImageChannelInsert_S32((mlib_s32 *)sp, strides, - (mlib_s32 *)dp, strided, - channels, channeld, - width, height, - ncmask); - break; - - - case MLIB_DOUBLE: - mlib_v_ImageChannelInsert_D64((mlib_d64 *)sp, strides, - (mlib_d64 *)dp, strided, - channels, channeld, - width, height, - ncmask); - break; - - - case MLIB_BIT: - default: - return MLIB_FAILURE; /* MLIB_BIT is not supported here */ - } - - return MLIB_SUCCESS; -} -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert.h b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert.h index ff3c228548d..e6840157948 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert.h +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert.h @@ -32,290 +32,21 @@ extern "C" { #endif /* __cplusplus */ -void mlib_v_ImageChannelInsert_U8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_D64(const mlib_d64 *src, - mlib_s32 slb, - mlib_d64 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S32(const mlib_s32 *src, - mlib_s32 slb, - mlib_s32 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_U8_12_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_U8_12_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - void mlib_v_ImageChannelInsert_U8_12_D1(const mlib_u8 *src, mlib_u8 *dst, mlib_s32 dsize, mlib_s32 cmask); -void mlib_v_ImageChannelInsert_U8_12(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_U8_13_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_U8_13_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - void mlib_v_ImageChannelInsert_U8_13_D1(const mlib_u8 *src, mlib_u8 *dst, mlib_s32 dsize, mlib_s32 cmask); -void mlib_v_ImageChannelInsert_U8_13(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_U8_14_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_U8_14_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - void mlib_v_ImageChannelInsert_U8_14_D1(const mlib_u8 *src, mlib_u8 *dst, mlib_s32 dsize, mlib_s32 cmask); -void mlib_v_ImageChannelInsert_U8_14(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_12_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_12_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_12_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_12(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_13_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_13_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_13_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_13(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_14_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_14_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_14_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_S16_14(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask); - -void mlib_v_ImageChannelInsert_U8_34R_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelInsert_U8_34R_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelInsert_U8_34R_D1(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelInsert_U8_34R(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelInsert_S16_34R_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelInsert_S16_34R_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelInsert_S16_34R_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelInsert_S16_34R(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelInsert_U8_34L_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelInsert_U8_34L_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelInsert_U8_34L_D1(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelInsert_U8_34L(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelInsert_S16_34L_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelInsert_S16_34L_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - -void mlib_v_ImageChannelInsert_S16_34L_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize); - -void mlib_v_ImageChannelInsert_S16_34L(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize); - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert_1.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert_1.c index ae0abf0dcea..b5dcf5e5cf2 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert_1.c +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert_1.c @@ -27,34 +27,9 @@ /* * FUNCTIONS - * mlib_v_ImageChannelInsert_U8 - * mlib_v_ImageChannelInsert_U8_12_A8D1X8 - * mlib_v_ImageChannelInsert_U8_12_A8D2X8 * mlib_v_ImageChannelInsert_U8_12_D1 - * mlib_v_ImageChannelInsert_U8_12 - * mlib_v_ImageChannelInsert_U8_13_A8D1X8 - * mlib_v_ImageChannelInsert_U8_13_A8D2X8 * mlib_v_ImageChannelInsert_U8_13_D1 - * mlib_v_ImageChannelInsert_U8_13 - * mlib_v_ImageChannelInsert_U8_14_A8D1X8 - * mlib_v_ImageChannelInsert_U8_14_A8D2X8 * mlib_v_ImageChannelInsert_U8_14_D1 - * mlib_v_ImageChannelInsert_U8_14 - * mlib_v_ImageChannelInsert_S16 - * mlib_v_ImageChannelInsert_S16_12_A8D1X4 - * mlib_v_ImageChannelInsert_S16_12_A8D2X4 - * mlib_v_ImageChannelInsert_S16_12_D1 - * mlib_v_ImageChannelInsert_S16_12 - * mlib_v_ImageChannelInsert_S16_13_A8D1X4 - * mlib_v_ImageChannelInsert_S16_13_A8D2X4 - * mlib_v_ImageChannelInsert_S16_13_D1 - * mlib_v_ImageChannelInsert_S16_13 - * mlib_v_ImageChannelInsert_S16_14_A8D1X4 - * mlib_v_ImageChannelInsert_S16_14_A8D2X4 - * mlib_v_ImageChannelInsert_S16_14_D1 - * mlib_v_ImageChannelInsert_S16_14 - * mlib_v_ImageChannelInsert_S32 - * mlib_v_ImageChannelInsert_D64 * * ARGUMENT * src pointer to source image data @@ -79,423 +54,11 @@ #include "mlib_image.h" #include "mlib_v_ImageChannelInsert.h" -/***************************************************************/ -/* general channel insertion: slower due to the inner loop */ -void mlib_v_ImageChannelInsert_U8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask) -{ - mlib_u8 *sp; /* pointer for pixel in src */ - mlib_u8 *sl; /* pointer for line in src */ - mlib_u8 *dp; /* pointer for pixel in dst */ - mlib_u8 *dl; /* pointer for line in dst */ - mlib_s32 i, j, k; /* indices for x, y, channel */ - mlib_s32 deltac[5] = { 0, 1, 1, 1, 1 }; - mlib_s32 inc0, inc1, inc2; - mlib_u8 s0, s1, s2; - - deltac[channels] = 1; - for (i = (channeld - 1), k = 0; i >= 0; i--) { - if ((cmask & (1 << i)) == 0) - deltac[k]++; - else - k++; - } - - deltac[channels] = channeld; - for (i = 1; i < channels; i++) { - deltac[channels] -= deltac[i]; - } - - sp = sl = (void *)src; - dp = dl = dst + deltac[0]; - - if (channels == 2) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - s1 = sp[1]; - dp[0] = s0; - dp[inc0] = s1; - dp += inc1; - sp += 2; - } - - sp = sl += slb; - dp = dl += dlb; - } - } - else if (channels == 3) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - inc2 = deltac[3] + inc1; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - s1 = sp[1]; - s2 = sp[2]; - dp[0] = s0; - dp[inc0] = s1; - dp[inc1] = s2; - dp += inc2; - sp += 3; - } - - sp = sl += slb; - dp = dl += dlb; - } - } -} - -/***************************************************************/ -/* general channel insertion: slower due to the inner loop */ -void mlib_v_ImageChannelInsert_D64(const mlib_d64 *src, - mlib_s32 slb, - mlib_d64 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask) -{ - mlib_d64 *sp; /* pointer for pixel in src */ - mlib_d64 *sl; /* pointer for line in src */ - mlib_d64 *dp; /* pointer for pixel in dst */ - mlib_d64 *dl; /* pointer for line in dst */ - mlib_s32 i, j, k; /* indices for x, y, channel */ - mlib_s32 deltac[5] = { 0, 1, 1, 1, 1 }; - mlib_s32 inc0, inc1, inc2; - mlib_d64 s0, s1, s2; - - deltac[channels] = 1; - for (i = (channeld - 1), k = 0; i >= 0; i--) { - if ((cmask & (1 << i)) == 0) - deltac[k]++; - else - k++; - } - - deltac[channels] = channeld; - for (i = 1; i < channels; i++) { - deltac[channels] -= deltac[i]; - } - - sp = sl = (void *)src; - dp = dl = dst + deltac[0]; - - if (channels == 1) { - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - dp[0] = s0; - dp += channeld; - sp++; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else if (channels == 2) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - s1 = sp[1]; - dp[0] = s0; - dp[inc0] = s1; - dp += inc1; - sp += 2; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } - else if (channels == 3) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - inc2 = deltac[3] + inc1; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - s1 = sp[1]; - s2 = sp[2]; - dp[0] = s0; - dp[inc0] = s1; - dp[inc1] = s2; - dp += inc2; - sp += 3; - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } - } -} - -/***************************************************************/ -/* general channel insertion: slower due to the inner loop */ -void mlib_v_ImageChannelInsert_S16(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask) -{ - mlib_s16 *sp; /* pointer for pixel in src */ - mlib_s16 *sl; /* pointer for line in src */ - mlib_s16 *dp; /* pointer for pixel in dst */ - mlib_s16 *dl; /* pointer for line in dst */ - mlib_s32 i, j, k; /* indices for x, y, channel */ - mlib_s32 deltac[5] = { 0, 1, 1, 1, 1 }; - mlib_s32 inc0, inc1, inc2; - mlib_s16 s0, s1, s2; - - deltac[channels] = 1; - for (i = (channeld - 1), k = 0; i >= 0; i--) { - if ((cmask & (1 << i)) == 0) - deltac[k]++; - else - k++; - } - - deltac[channels] = channeld; - for (i = 1; i < channels; i++) { - deltac[channels] -= deltac[i]; - } - - sp = sl = (void *)src; - dp = dl = dst + deltac[0]; - - if (channels == 2) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - s1 = sp[1]; - dp[0] = s0; - dp[inc0] = s1; - dp += inc1; - sp += 2; - } - - sp = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } - } - else if (channels == 3) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - inc2 = deltac[3] + inc1; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - s1 = sp[1]; - s2 = sp[2]; - dp[0] = s0; - dp[inc0] = s1; - dp[inc1] = s2; - dp += inc2; - sp += 3; - } - - sp = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } - } -} - -/***************************************************************/ -/* general channel insertion: slower due to the inner loop */ - -void mlib_v_ImageChannelInsert_S32(const mlib_s32 *src, - mlib_s32 slb, - mlib_s32 *dst, - mlib_s32 dlb, - mlib_s32 channels, - mlib_s32 channeld, - mlib_s32 width, - mlib_s32 height, - mlib_s32 cmask) -{ - mlib_s32 *sp; /* pointer for pixel in src */ - mlib_s32 *sl; /* pointer for line in src */ - mlib_s32 *dp; /* pointer for pixel in dst */ - mlib_s32 *dl; /* pointer for line in dst */ - mlib_s32 i, j, k; /* indices for x, y, channel */ - mlib_s32 deltac[5] = { 0, 1, 1, 1, 1 }; - mlib_s32 inc0, inc1, inc2; - mlib_s32 s0, s1, s2; - - deltac[channels] = 1; - for (i = (channeld - 1), k = 0; i >= 0; i--) { - if ((cmask & (1 << i)) == 0) - deltac[k]++; - else - k++; - } - - deltac[channels] = channeld; - for (i = 1; i < channels; i++) { - deltac[channels] -= deltac[i]; - } - - sp = sl = (void *)src; - dp = dl = dst + deltac[0]; - - if (channels == 1) { - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - dp[0] = s0; - dp += channeld; - sp++; - } - - sp = sl = (mlib_s32 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_s32 *) ((mlib_u8 *) dl + dlb); - } - } - else if (channels == 2) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - s1 = sp[1]; - dp[0] = s0; - dp[inc0] = s1; - dp += inc1; - sp += 2; - } - - sp = sl = (mlib_s32 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_s32 *) ((mlib_u8 *) dl + dlb); - } - } - else if (channels == 3) { - inc0 = deltac[1]; - inc1 = deltac[2] + inc0; - inc2 = deltac[3] + inc1; - for (j = 0; j < height; j++) { -#pragma pipeloop(0) - for (i = 0; i < width; i++) { - s0 = sp[0]; - s1 = sp[1]; - s2 = sp[2]; - dp[0] = s0; - dp[inc0] = s1; - dp[inc1] = s2; - dp += inc2; - sp += 3; - } - - sp = sl = (mlib_s32 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_s32 *) ((mlib_u8 *) dl + dlb); - } - } -} - /***************************************************************/ #define INSERT_U8_12(sd0, dd0, dd1) /* channel duplicate */ \ dd0 = vis_fpmerge(vis_read_hi(sd0), vis_read_hi(sd0)); \ dd1 = vis_fpmerge(vis_read_lo(sd0), vis_read_lo(sd0)) -/***************************************************************/ -/* insert one channel to a 2-channel image. - * both source and destination image data are 8-byte aligned. - * dsize is multiple of 8. - */ - -void mlib_v_ImageChannelInsert_U8_12_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0; - mlib_d64 dd0, dd1; - mlib_s32 bmask; - mlib_s32 i; - - bmask = cmask | (cmask << 2) | (cmask << 4) | (cmask << 6); - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - INSERT_U8_12(sd0, dd0, dd1); - vis_pst_8(dd0, dp++, bmask); - vis_pst_8(dd1, dp++, bmask); - } -} - -/***************************************************************/ -/* insert one channel to a 2-channel image. - * both source and destination image data are 8-byte aligned. - * xsize is multiple of 8. - */ - -void mlib_v_ImageChannelInsert_U8_12_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 *sl, *dl; - mlib_d64 sd0; - mlib_d64 dd0, dd1; - mlib_s32 bmask; - mlib_s32 i, j; - - bmask = cmask | (cmask << 2) | (cmask << 4) | (cmask << 6); - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - INSERT_U8_12(sd0, dd0, dd1); - vis_pst_8(dd0, dp++, bmask); - vis_pst_8(dd1, dp++, bmask); - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } -} - /***************************************************************/ /* insert one channel to a 2-channel image. */ @@ -723,56 +286,6 @@ void mlib_v_ImageChannelInsert_U8_12_D1(const mlib_u8 *src, } } -/***************************************************************/ -/* insert one channel to a 2-channel image. - */ - -void mlib_v_ImageChannelInsert_U8_12(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_U8_12_D1(sa, da, xsize, cmask); - sa = sl += slb; - da = dl += dlb; - } -} - -/***************************************************************/ -#define INSERT_U8_13(sd0, dd0, dd1, dd2) \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd0)); \ - sdb = vis_fpmerge(vis_read_hi(sda), vis_read_lo(sda)); \ - sdc = vis_fpmerge(vis_read_hi(sdb), vis_read_hi(sdb)); \ - sdd = vis_fpmerge(vis_read_lo(sdb), vis_read_lo(sdb)); \ - dd0 = vis_fpmerge(vis_read_hi(sdc), vis_read_hi(sdd)); \ - sde = vis_fpmerge(vis_read_lo(sdc), vis_read_lo(sdd)); \ - dd1 = vis_freg_pair(vis_read_lo(dd0), vis_read_hi(sde)); \ - dd2 = vis_freg_pair(vis_read_lo(sde), vis_read_lo(sde)) - -/***************************************************************/ -#define LOAD_INSERT_STORE_U8_A8(channeld) \ - sd = *sp++; \ - vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld - /***************************************************************/ #define LOAD_INSERT_STORE_U8(channeld) \ vis_alignaddr((void *)0, off); \ @@ -789,58 +302,6 @@ void mlib_v_ImageChannelInsert_U8_12(const mlib_u8 *src, vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld; \ vis_st_u8(sd = vis_faligndata(sd, sd), da); da += channeld -/***************************************************************/ -void mlib_v_ImageChannelInsert_U8_13_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_u8 *da; - mlib_d64 *sp; - mlib_d64 sd; - mlib_s32 i; - - vis_alignaddr((void *)0, 1); /* for 1-byte left shift */ - - sp = (mlib_d64 *) src; - da = dst + (2 / cmask); /* 4,2,1 -> 0,1,2 */ - -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - LOAD_INSERT_STORE_U8_A8(3); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_U8_13_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_u8 *da, *dl; - mlib_d64 *sp, *sl; - mlib_d64 sd; - mlib_s32 i, j; - - vis_alignaddr((void *)0, 1); - - sp = sl = (mlib_d64 *) src; - da = dl = dst + (2 / cmask); /* 4,2,1 -> 0,1,2 */ - - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - LOAD_INSERT_STORE_U8_A8(3); - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_u8 *) ((mlib_u8 *) dl + dlb); - } -} - /***************************************************************/ void mlib_v_ImageChannelInsert_U8_13_D1(const mlib_u8 *src, mlib_u8 *dst, @@ -907,30 +368,6 @@ void mlib_v_ImageChannelInsert_U8_13_D1(const mlib_u8 *src, } } -/***************************************************************/ -void mlib_v_ImageChannelInsert_U8_13(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_U8_13_D1(sa, da, xsize, cmask); - sa = sl += slb; - da = dl += dlb; - } -} - /***************************************************************/ #define INSERT_U8_14(sd0, dd0, dd1, dd2, dd3) \ sda = vis_fpmerge(vis_read_hi(sd0), vis_read_hi(sd0)); \ @@ -940,73 +377,6 @@ void mlib_v_ImageChannelInsert_U8_13(const mlib_u8 *src, dd2 = vis_fpmerge(vis_read_hi(sdb), vis_read_hi(sdb)); \ dd3 = vis_fpmerge(vis_read_lo(sdb), vis_read_lo(sdb)) -/***************************************************************/ -void mlib_v_ImageChannelInsert_U8_14_A8D1X8(const mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0; - mlib_d64 sda, sdb; - mlib_d64 dd0, dd1, dd2, dd3; - mlib_s32 bmask; - mlib_s32 i; - - bmask = cmask | (cmask << 4); - - sp = (mlib_d64 *) src; - dp = (mlib_d64 *) dst; - -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - sd0 = *sp++; - INSERT_U8_14(sd0, dd0, dd1, dd2, dd3); - vis_pst_8(dd0, dp++, bmask); - vis_pst_8(dd1, dp++, bmask); - vis_pst_8(dd2, dp++, bmask); - vis_pst_8(dd3, dp++, bmask); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_U8_14_A8D2X8(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_d64 *sp, *dp; - mlib_d64 *sl, *dl; - mlib_d64 sd0; - mlib_d64 sda, sdb; - mlib_d64 dd0, dd1, dd2, dd3; - mlib_s32 bmask; - mlib_s32 i, j; - - bmask = cmask | (cmask << 4); - - sp = sl = (mlib_d64 *) src; - dp = dl = (mlib_d64 *) dst; - - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - sd0 = *sp++; - INSERT_U8_14(sd0, dd0, dd1, dd2, dd3); - vis_pst_8(dd0, dp++, bmask); - vis_pst_8(dd1, dp++, bmask); - vis_pst_8(dd2, dp++, bmask); - vis_pst_8(dd3, dp++, bmask); - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - dp = dl = (mlib_d64 *) ((mlib_u8 *) dl + dlb); - } -} - /***************************************************************/ void mlib_v_ImageChannelInsert_U8_14_D1(const mlib_u8 *src, mlib_u8 *dst, @@ -1188,445 +558,5 @@ void mlib_v_ImageChannelInsert_U8_14_D1(const mlib_u8 *src, } } -/***************************************************************/ -void mlib_v_ImageChannelInsert_U8_14(const mlib_u8 *src, - mlib_s32 slb, - mlib_u8 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_U8_14_D1(sa, da, xsize, cmask); - sa = sl += slb; - da = dl += dlb; - } -} - -/***************************************************************/ -#define LOAD_INSERT_STORE_S16_1X_A8(channeld) \ - sd = *sp++; \ - vis_st_u16(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u16(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u16(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u16(sd = vis_faligndata(sd, sd), da); da += channeld - -/***************************************************************/ -#define LOAD_INSERT_STORE_S16_1X(channeld) \ - vis_alignaddr((void *)0, off); \ - sd0 = sd1; \ - sd1 = *sp++; \ - sd = vis_faligndata(sd0, sd1); \ - vis_alignaddr((void *)0, 2); \ - vis_st_u16(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u16(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u16(sd = vis_faligndata(sd, sd), da); da += channeld; \ - vis_st_u16(sd = vis_faligndata(sd, sd), da); da += channeld - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_12_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *da; - mlib_d64 *sp; - mlib_d64 sd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - da = dst + (2 - cmask); /* 2,1 -> 0,1 */ - - vis_alignaddr((void *)0, 2); - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X_A8(2); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_12_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *da, *dl; - mlib_d64 *sp, *sl; - mlib_d64 sd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - da = dl = dst + (2 - cmask); /* 2,1 -> 0,1 */ - - vis_alignaddr((void *)0, 2); - - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X_A8(2); - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_12_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *dend; /* end point in destination */ - mlib_d64 *sp; /* 8-byte aligned start points in src */ - mlib_d64 sd0, sd1, sd; /* 8-byte registers for source data */ - mlib_s32 off; /* offset of address alignment in src */ - mlib_s32 i; - - sa = (void *)src; - da = dst + (2 - cmask); /* 2,1 -> 0,1 */ - - /* prepare the src address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - off = (mlib_addr) sa & 7; - - dend = da + dsize * 2 - 1; - - sd1 = *sp++; - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X(2); - } - - /* right end handling */ - if ((mlib_addr) da <= (mlib_addr) dend) { - - vis_alignaddr((void *)0, off); - sd0 = sd1; - sd1 = *sp++; - sd = vis_faligndata(sd0, sd1); - - vis_alignaddr((void *)0, 2); - vis_st_u16(sd = vis_faligndata(sd, sd), da); - da += 2; - if ((mlib_addr) da <= (mlib_addr) dend) { - vis_st_u16(sd = vis_faligndata(sd, sd), da); - da += 2; - if ((mlib_addr) da <= (mlib_addr) dend) { - vis_st_u16(sd = vis_faligndata(sd, sd), da); - } - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_12(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_S16_12_D1(sa, da, xsize, cmask); - sa = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_13_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *da; - mlib_d64 *sp; - mlib_d64 sd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - da = dst + (2 / cmask); /* 4,2,1 -> 0,1,2 */ - - vis_alignaddr((void *)0, 2); - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X_A8(3); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_13_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *da, *dl; - mlib_d64 *sp, *sl; - mlib_d64 sd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - da = dl = dst + (2 / cmask); /* 4,2,1 -> 0,1,2 */ - - vis_alignaddr((void *)0, 2); - - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X_A8(3); - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_13_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *dend; /* end point in destination */ - mlib_d64 *sp; /* 8-byte aligned start points in src */ - mlib_d64 sd0, sd1, sd; /* 8-byte registers for source data */ - mlib_s32 off; /* offset of address alignment in src */ - mlib_s32 i; - - sa = (void *)src; - da = dst + (2 / cmask); /* 4,2,1 -> 0,1,2 */ - - /* prepare the src address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - off = (mlib_addr) sa & 7; - - dend = da + dsize * 3 - 1; - - sd1 = *sp++; - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X(3); - } - - /* right end handling */ - if ((mlib_addr) da <= (mlib_addr) dend) { - - vis_alignaddr((void *)0, off); - sd0 = sd1; - sd1 = *sp++; - sd = vis_faligndata(sd0, sd1); - - vis_alignaddr((void *)0, 2); - vis_st_u16(sd = vis_faligndata(sd, sd), da); - da += 3; - if ((mlib_addr) da <= (mlib_addr) dend) { - vis_st_u16(sd = vis_faligndata(sd, sd), da); - da += 3; - if ((mlib_addr) da <= (mlib_addr) dend) { - vis_st_u16(sd = vis_faligndata(sd, sd), da); - } - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_13(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_S16_13_D1(sa, da, xsize, cmask); - sa = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -#define INSERT_S16_14(sp, dp, bmask) /* channel duplicate */ \ - /* obsolete: it is slower than the vis_st_u16() version*/ \ - sd0 = *sp++; \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_hi(sd0)); \ - sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_lo(sd0)); \ - sdc = vis_fpmerge(vis_read_hi(sda), vis_read_hi(sda)); \ - sdd = vis_fpmerge(vis_read_lo(sda), vis_read_lo(sda)); \ - sde = vis_fpmerge(vis_read_hi(sdb), vis_read_hi(sdb)); \ - sdf = vis_fpmerge(vis_read_lo(sdb), vis_read_lo(sdb)); \ - dd0 = vis_fpmerge(vis_read_hi(sdc), vis_read_lo(sdc)); \ - dd1 = vis_fpmerge(vis_read_hi(sdd), vis_read_lo(sdd)); \ - dd2 = vis_fpmerge(vis_read_hi(sde), vis_read_lo(sde)); \ - dd3 = vis_fpmerge(vis_read_hi(sdf), vis_read_lo(sdf)); \ - vis_pst_16(dd0, dp++, bmask); \ - vis_pst_16(dd1, dp++, bmask); \ - vis_pst_16(dd2, dp++, bmask); \ - vis_pst_16(dd3, dp++, bmask) - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_14_A8D1X4(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *da; - mlib_d64 *sp; - mlib_d64 sd; - mlib_s32 i; - - sp = (mlib_d64 *) src; - da = dst + (6 / cmask + 1) / 2; /* 8,4,2,1 -> 0,1,2,3 */ - - vis_alignaddr((void *)0, 2); - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X_A8(4); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_14_A8D2X4(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *da, *dl; - mlib_d64 *sp, *sl; - mlib_d64 sd; - mlib_s32 i, j; - - sp = sl = (mlib_d64 *) src; - da = dl = dst + (6 / cmask + 1) / 2; /* 8,4,2,1 -> 0,1,2,3 */ - - vis_alignaddr((void *)0, 2); - - for (j = 0; j < ysize; j++) { -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X_A8(4); - } - - sp = sl = (mlib_d64 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_14_D1(const mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *dend; /* end point in destination */ - mlib_d64 *sp; /* 8-byte aligned start points in src */ - mlib_d64 sd0, sd1, sd; /* 8-byte registers for source data */ - mlib_s32 off; /* offset of address alignment in src */ - mlib_s32 i; - - sa = (void *)src; - da = dst + (6 / cmask + 1) / 2; /* 8,4,2,1 -> 0,1,2,3 */ - - /* prepare the src address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - off = (mlib_addr) sa & 7; - - dend = da + dsize * 4 - 1; - - sd1 = *sp++; - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_INSERT_STORE_S16_1X(4); - } - - /* right end handling */ - if ((mlib_addr) da <= (mlib_addr) dend) { - - vis_alignaddr((void *)0, off); - sd0 = sd1; - sd1 = *sp++; - sd = vis_faligndata(sd0, sd1); - - vis_alignaddr((void *)0, 2); - vis_st_u16(sd = vis_faligndata(sd, sd), da); - da += 4; - if ((mlib_addr) da <= (mlib_addr) dend) { - vis_st_u16(sd = vis_faligndata(sd, sd), da); - da += 4; - if ((mlib_addr) da <= (mlib_addr) dend) { - vis_st_u16(sd = vis_faligndata(sd, sd), da); - } - } - } -} - -/***************************************************************/ -void mlib_v_ImageChannelInsert_S16_14(const mlib_s16 *src, - mlib_s32 slb, - mlib_s16 *dst, - mlib_s32 dlb, - mlib_s32 xsize, - mlib_s32 ysize, - mlib_s32 cmask) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - mlib_s32 j; - - sa = sl = (void *)src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_S16_14_D1(sa, da, xsize, cmask); - sa = sl = (mlib_s16 *) ((mlib_u8 *) sl + slb); - da = dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb); - } -} /***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert_34.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert_34.c deleted file mode 100644 index 105409a8a56..00000000000 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageChannelInsert_34.c +++ /dev/null @@ -1,1225 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - - -/* - * FILENAME: mlib_v_ImageChannelInsert_34.c - * - * FUNCTIONS - * mlib_v_ImageChannelInsert_U8_34R_A8D1X8 - * mlib_v_ImageChannelInsert_U8_34R_A8D2X8 - * mlib_v_ImageChannelInsert_U8_34R_D1 - * mlib_v_ImageChannelInsert_U8_34R - * mlib_v_ImageChannelInsert_S16_34R_A8D1X4 - * mlib_v_ImageChannelInsert_S16_34R_A8D2X4 - * mlib_v_ImageChannelInsert_S16_34R_D1 - * mlib_v_ImageChannelInsert_S16_34R - * mlib_v_ImageChannelInsert_U8_34L_A8D1X8 - * mlib_v_ImageChannelInsert_U8_34L_A8D2X8 - * mlib_v_ImageChannelInsert_U8_34L_D1 - * mlib_v_ImageChannelInsert_U8_34L - * mlib_v_ImageChannelInsert_S16_34L_A8D1X4 - * mlib_v_ImageChannelInsert_S16_34L_A8D2X4 - * mlib_v_ImageChannelInsert_S16_34L_D1 - * mlib_v_ImageChannelInsert_S16_34L - * - * SYNOPSIS - * - * ARGUMENT - * src pointer to source image data - * dst pointer to destination image data - * slb source image line stride in bytes - * dlb destination image line stride in bytes - * dsize image data size in pixels - * xsize image width in pixels - * ysize image height in lines - * cmask channel mask - * - * DESCRIPTION - * Insert a 3-channel image into the right or left 3 channels of - * a 4-channel image low level functions. - * - * BGR => ABGR (34R), or RGB => RGBA (34L) - * - * NOTE - * These functions are separated from mlib_v_ImageChannelInsert.c - * for loop unrolling and structure clarity. - */ - -#include -#include "vis_proto.h" -#include "mlib_image.h" - -/***************************************************************/ -#define INSERT_U8_34R \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd1)); \ - sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_hi(sd2)); \ - sdc = vis_fpmerge(vis_read_hi(sd1), vis_read_lo(sd2)); \ - sdd = vis_fpmerge(vis_read_hi(sda), vis_read_lo(sdb)); \ - sde = vis_fpmerge(vis_read_lo(sda), vis_read_hi(sdc)); \ - sdf = vis_fpmerge(vis_read_hi(sdb), vis_read_lo(sdc)); \ - sdg = vis_fpmerge(vis_read_hi(sdd), vis_read_lo(sde)); \ - sdh = vis_fpmerge(vis_read_lo(sdd), vis_read_hi(sdf)); \ - sdi = vis_fpmerge(vis_read_hi(sde), vis_read_lo(sdf)); \ - sdj = vis_fpmerge(vis_read_hi(sdg), vis_read_hi(sdi)); \ - sdk = vis_fpmerge(vis_read_lo(sdg), vis_read_lo(sdi)); \ - sdl = vis_fpmerge(vis_read_hi(sdh), vis_read_hi(sdh)); \ - sdm = vis_fpmerge(vis_read_lo(sdh), vis_read_lo(sdh)); \ - dd0 = vis_fpmerge(vis_read_hi(sdl), vis_read_hi(sdj)); \ - dd1 = vis_fpmerge(vis_read_lo(sdl), vis_read_lo(sdj)); \ - dd2 = vis_fpmerge(vis_read_hi(sdm), vis_read_hi(sdk)); \ - dd3 = vis_fpmerge(vis_read_lo(sdm), vis_read_lo(sdk)); - -/***************************************************************/ -#define LOAD_INSERT_STORE_U8_34R_A8 \ - sd0 = *sp++; /* b0g0r0b1g1r1b2g2 */ \ - sd1 = *sp++; /* r2b3g3r3b4g4r4b5 */ \ - sd2 = *sp++; /* g5r5b6g6r6b7g7r7 */ \ - INSERT_U8_34R \ - vis_pst_8(dd0, dp++, bmask); \ - vis_pst_8(dd1, dp++, bmask); \ - vis_pst_8(dd2, dp++, bmask); \ - vis_pst_8(dd3, dp++, bmask); - -/***************************************************************/ -#define LOAD_INSERT_U8_34R \ - vis_alignaddr((void *)soff, 0); \ - s0 = s3; \ - s1 = sp[1]; \ - s2 = sp[2]; \ - s3 = sp[3]; \ - sd0 = vis_faligndata(s0, s1); \ - sd1 = vis_faligndata(s1, s2); \ - sd2 = vis_faligndata(s2, s3); \ - sp += 3; \ - dd4 = dd3; \ - INSERT_U8_34R - -/***************************************************************/ -/* - * Both source and destination image data are 1-d vectors and - * 8-byte aligned. And dsize is multiple of 8. - */ - -void -mlib_v_ImageChannelInsert_U8_34R_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1, sd2; /* source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - mlib_d64 sda, sdb, sdc, sdd; /* intermediate variables */ - mlib_d64 sde, sdf, sdg, sdh; - mlib_d64 sdi, sdj, sdk, sdl; - mlib_d64 sdm; - int bmask = 0x77; - int i; - - sp = (mlib_d64 *)src; - dp = (mlib_d64 *)dst; - -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - LOAD_INSERT_STORE_U8_34R_A8; - } -} - -/***************************************************************/ -/* - * Either source or destination image data are not 1-d vectors, but - * they are 8-byte aligned. And slb and dlb are multiple of 8. - * The xsize is multiple of 8. - */ - -void -mlib_v_ImageChannelInsert_U8_34R_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 *sl, *dl; /* 8-byte aligned pointer for line */ - mlib_d64 sd0, sd1, sd2; /* source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - mlib_d64 sda, sdb, sdc, sdd; /* intermediate variables */ - mlib_d64 sde, sdf, sdg, sdh; - mlib_d64 sdi, sdj, sdk, sdl; - mlib_d64 sdm; - int bmask = 0x77; - int i, j; /* indices for x, y */ - - sp = sl = (mlib_d64 *)src; - dp = dl = (mlib_d64 *)dst; - - /* row loop */ - for (j = 0; j < ysize; j++) { - /* 8-byte column loop */ -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - LOAD_INSERT_STORE_U8_34R_A8; - } - sp = sl = (mlib_d64 *)((mlib_u8 *)sl + slb); - dp = dl = (mlib_d64 *)((mlib_u8 *)dl + dlb); - } -} - -/***************************************************************/ -/* - * either source or destination data are not 8-byte aligned. - */ - -void -mlib_v_ImageChannelInsert_U8_34R_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize) -{ - mlib_u8 *sa, *da; - mlib_u8 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 s0, s1, s2, s3; /* 8-byte source raw data */ - mlib_d64 sd0, sd1, sd2; /* 8-byte source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - mlib_d64 dd4; /* the last datum of the last step */ - mlib_d64 sda, sdb, sdc, sdd; /* intermediate variables */ - mlib_d64 sde, sdf, sdg, sdh; - mlib_d64 sdi, sdj, sdk, sdl; - mlib_d64 sdm; - int soff; /* offset of address in src */ - int doff; /* offset of address in dst */ - int emask; /* edge mask */ - int bmask; /* channel mask */ - int i, n; - - sa = src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *)((mlib_addr) da & (~7)); - dend = da + dsize * 4 - 1; - dend2 = dend - 31; - doff = ((mlib_addr) da & 7); - - /* set band mask for vis_pst_8 to store the bytes needed */ - bmask = 0xff & (0x7777 >> doff) ; - - /* generate edge mask for the start point */ - emask = vis_edge8(da, dend); - - /* load 24 bytes, convert to 32 bytes */ - s3 = sp[0]; /* initial value */ - LOAD_INSERT_U8_34R; - - if (doff == 0) { /* dst is 8-byte aligned */ - - if (dsize >= 8 ) { - vis_pst_8(dd0, dp++, emask & bmask); - vis_pst_8(dd1, dp++, bmask); - vis_pst_8(dd2, dp++, bmask); - vis_pst_8(dd3, dp++, bmask); - } - else { /* for very small size */ - vis_pst_8(dd0, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd1, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd2, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd3, dp++, emask & bmask); - } - } - } - } - - /* no edge handling is needed in the loop */ - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *)dend2 - (mlib_u8 *)dp) / 32 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_INSERT_U8_34R; - vis_pst_8(dd0, dp++, bmask); - vis_pst_8(dd1, dp++, bmask); - vis_pst_8(dd2, dp++, bmask); - vis_pst_8(dd3, dp++, bmask); - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_INSERT_U8_34R; - emask = vis_edge8(dp, dend); - vis_pst_8(dd0, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd1, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd2, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd3, dp++, emask & bmask); - } - } - } - } - } - else { /* (doff != 0) */ - vis_alignaddr((void *)0, -doff); - - if (dsize >= 8 ) { - vis_pst_8(vis_faligndata(dd0, dd0), dp++, emask & bmask); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, bmask); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, bmask); - vis_pst_8(vis_faligndata(dd2, dd3), dp++, bmask); - } - else { /* for very small size */ - vis_pst_8(vis_faligndata(dd0, dd0), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd2, dd3), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd3, dd3), dp++, emask & bmask); - } - } - } - } - } - - /* no edge handling is needed in the loop */ - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *)dend2 - (mlib_u8 *)dp) / 32 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_INSERT_U8_34R; - vis_alignaddr((void *)0, -doff); - vis_pst_8(vis_faligndata(dd4, dd0), dp++, bmask); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, bmask); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, bmask); - vis_pst_8(vis_faligndata(dd2, dd3), dp++, bmask); - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_INSERT_U8_34R; - vis_alignaddr((void *)0, -doff); - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd4, dd0), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd2, dd3), dp++, emask & bmask); - } - } - } - } - } -} - -/***************************************************************/ - -void -mlib_v_ImageChannelInsert_U8_34R(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - int j; - - sa = sl = src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_U8_34R_D1(sa, da, xsize); - sa = sl += slb; - da = dl += dlb; - } -} - -/***************************************************************/ -#define INSERT_S16_34R \ - vis_alignaddr((void *)0, 6); \ - dd0 = vis_faligndata(sd0, sd0); /* b1b0g0r0 */ \ - vis_alignaddr((void *)0, 4); \ - dd1 = vis_faligndata(sd0, sd1); /* r0b1gbr1 */ \ - vis_alignaddr((void *)0, 2); \ - dd2 = vis_faligndata(sd1, sd2); /* r1b2g2r2 */ \ - dd3 = sd2; /* r2b3g3r3 */ - -/***************************************************************/ -#define LOAD_INSERT_STORE_S16_34R_A8 \ - sd0 = *sp++; /* b0g0r0b1 */ \ - sd1 = *sp++; /* g1r1b2g2 */ \ - sd2 = *sp++; /* r2b3g3r3 */ \ - INSERT_S16_34R \ - vis_pst_16(dd0, dp++, bmask); \ - vis_pst_16(dd1, dp++, bmask); \ - vis_pst_16(dd2, dp++, bmask); \ - vis_pst_16(dd3, dp++, bmask); - -/***************************************************************/ -#define LOAD_INSERT_S16_34R \ - vis_alignaddr((void *)soff, 0); \ - s0 = s3; \ - s1 = sp[1]; \ - s2 = sp[2]; \ - s3 = sp[3]; \ - sd0 = vis_faligndata(s0, s1); \ - sd1 = vis_faligndata(s1, s2); \ - sd2 = vis_faligndata(s2, s3); \ - sp += 3; \ - dd4 = dd3; \ - INSERT_S16_34R - -/***************************************************************/ -/* - * both source and destination image data are 1-d vectors and - * 8-byte aligned. dsize is multiple of 4. - */ - -void -mlib_v_ImageChannelInsert_S16_34R_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 sd0, sd1, sd2; /* source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - int bmask = 0x07; /* channel mask */ - int i; - - sp = (mlib_d64 *)src; - dp = (mlib_d64 *)dst; - - /* set GSR.offset for vis_faligndata() */ - /* vis_alignaddr((void *)0, 2); */ /* only for _old */ - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_INSERT_STORE_S16_34R_A8; - } -} - -/***************************************************************/ -/* - * either source or destination image data are not 1-d vectors, but - * they are 8-byte aligned. xsize is multiple of 4. - */ - -void -mlib_v_ImageChannelInsert_S16_34R_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 *sl, *dl; /* 8-byte aligned pointer for line */ - mlib_d64 sd0, sd1, sd2; /* source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - int bmask = 0x07; /* channel mask */ - int i, j; /* indices for x, y */ - - sp = sl = (mlib_d64 *)src; - dp = dl = (mlib_d64 *)dst; - - /* row loop */ - for (j = 0; j < ysize; j++) { - /* 4-pixel column loop */ -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - LOAD_INSERT_STORE_S16_34R_A8; - } - sp = sl = (mlib_d64 *)((mlib_u8 *)sl + slb); - dp = dl = (mlib_d64 *)((mlib_u8 *)dl + dlb); - } -} - -/***************************************************************/ -/* - * either source or destination data are not 8-byte aligned. - */ - -void -mlib_v_ImageChannelInsert_S16_34R_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize) -{ - mlib_s16 *sa, *da; /* pointer for pixel */ - mlib_s16 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 s0, s1, s2, s3; /* 8-byte source raw data */ - mlib_d64 sd0, sd1, sd2; /* 8-byte source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - mlib_d64 dd4; /* the last datum of the last step */ - int soff; /* offset of address in src */ - int doff; /* offset of address in dst */ - int emask; /* edge mask */ - int bmask; /* channel mask */ - int i, n; - - sa = src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *)((mlib_addr) da & (~7)); - dend = da + dsize * 4 - 1; - dend2 = dend - 15; - doff = ((mlib_addr) da & 7); - - /* set channel mask for vis_pst_16 to store the words needed */ - bmask = 0xff & (0x77 >> (doff / 2)); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 24 byte, convert, store 32 bytes */ - s3 = sp[0]; /* initial value */ - LOAD_INSERT_S16_34R; - - if (doff == 0) { /* dst is 8-byte aligned */ - - if (dsize >= 4 ) { - vis_pst_16(dd0, dp++, emask & bmask); - vis_pst_16(dd1, dp++, bmask); - vis_pst_16(dd2, dp++, bmask); - vis_pst_16(dd3, dp++, bmask); - } - else { /* for very small size */ - vis_pst_16(dd0, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd1, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd2, dp++, emask & bmask); - } - } - } - - /* no edge handling is needed in the loop */ - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *)dend2 - (mlib_u8 *)dp) / 32 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_INSERT_S16_34R; - vis_pst_16(dd0, dp++, bmask); - vis_pst_16(dd1, dp++, bmask); - vis_pst_16(dd2, dp++, bmask); - vis_pst_16(dd3, dp++, bmask); - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_INSERT_S16_34R; - emask = vis_edge16(dp, dend); - vis_pst_16(dd0, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd1, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd2, dp++, emask & bmask); - } - } - } - } - else { /* (doff != 0) */ - vis_alignaddr((void *)0, -doff); - - if (dsize >= 4 ) { - vis_pst_16(vis_faligndata(dd0, dd0), dp++, emask & bmask); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, bmask); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, bmask); - vis_pst_16(vis_faligndata(dd2, dd3), dp++, bmask); - } - else { /* for very small size */ - vis_pst_16(vis_faligndata(dd0, dd0), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd2, dd3), dp++, emask & bmask); - } - } - } - } - - /* no edge handling is needed in the loop */ - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *)dend2 - (mlib_u8 *)dp) / 32 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_INSERT_S16_34R; - vis_alignaddr((void *)0, -doff); - vis_pst_16(vis_faligndata(dd4, dd0), dp++, bmask); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, bmask); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, bmask); - vis_pst_16(vis_faligndata(dd2, dd3), dp++, bmask); - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_INSERT_S16_34R; - vis_alignaddr((void *)0, -doff); - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd4, dd0), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd2, dd3), dp++, emask & bmask); - } - } - } - } - } -} - -/***************************************************************/ - -void -mlib_v_ImageChannelInsert_S16_34R(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - int j; - - sa = sl = src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_S16_34R_D1(sa, da, xsize); - sa = sl = (mlib_s16 *)((mlib_u8 *)sl + slb); - da = dl = (mlib_s16 *)((mlib_u8 *)dl + dlb); - } -} - -/***************************************************************/ -#define INSERT_U8_34L \ - sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd1)); \ - sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_hi(sd2)); \ - sdc = vis_fpmerge(vis_read_hi(sd1), vis_read_lo(sd2)); \ - sdd = vis_fpmerge(vis_read_hi(sda), vis_read_lo(sdb)); \ - sde = vis_fpmerge(vis_read_lo(sda), vis_read_hi(sdc)); \ - sdf = vis_fpmerge(vis_read_hi(sdb), vis_read_lo(sdc)); \ - sdg = vis_fpmerge(vis_read_hi(sdd), vis_read_lo(sde)); \ - sdh = vis_fpmerge(vis_read_lo(sdd), vis_read_hi(sdf)); \ - sdi = vis_fpmerge(vis_read_hi(sde), vis_read_lo(sdf)); \ - sdj = vis_fpmerge(vis_read_hi(sdg), vis_read_hi(sdi)); \ - sdk = vis_fpmerge(vis_read_lo(sdg), vis_read_lo(sdi)); \ - sdl = vis_fpmerge(vis_read_hi(sdh), vis_read_hi(sdh)); \ - sdm = vis_fpmerge(vis_read_lo(sdh), vis_read_lo(sdh)); \ - dd0 = vis_fpmerge(vis_read_hi(sdj), vis_read_hi(sdl)); \ - dd1 = vis_fpmerge(vis_read_lo(sdj), vis_read_lo(sdl)); \ - dd2 = vis_fpmerge(vis_read_hi(sdk), vis_read_hi(sdm)); \ - dd3 = vis_fpmerge(vis_read_lo(sdk), vis_read_lo(sdm)); - -/***************************************************************/ -#define LOAD_INSERT_STORE_U8_34L_A8 \ - sd0 = *sp++; /* b0g0r0b1g1r1b2g2 */ \ - sd1 = *sp++; /* r2b3g3r3b4g4r4b5 */ \ - sd2 = *sp++; /* g5r5b6g6r6b7g7r7 */ \ - INSERT_U8_34L \ - vis_pst_8(dd0, dp++, bmask); \ - vis_pst_8(dd1, dp++, bmask); \ - vis_pst_8(dd2, dp++, bmask); \ - vis_pst_8(dd3, dp++, bmask); - -/***************************************************************/ -#define LOAD_INSERT_U8_34L \ - vis_alignaddr((void *)soff, 0); \ - s0 = s3; \ - s1 = sp[1]; \ - s2 = sp[2]; \ - s3 = sp[3]; \ - sd0 = vis_faligndata(s0, s1); \ - sd1 = vis_faligndata(s1, s2); \ - sd2 = vis_faligndata(s2, s3); \ - sp += 3; \ - dd4 = dd3; \ - INSERT_U8_34L - -/***************************************************************/ -/* - * Both source and destination image data are 1-d vectors and - * 8-byte aligned. And dsize is multiple of 8. - */ -void -mlib_v_ImageChannelInsert_U8_34L_A8D1X8(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize) -{ - mlib_d64 *sp, *dp; - mlib_d64 sd0, sd1, sd2; /* source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - mlib_d64 sda, sdb, sdc, sdd; /* intermediate variables */ - mlib_d64 sde, sdf, sdg, sdh; - mlib_d64 sdi, sdj, sdk, sdl; - mlib_d64 sdm; - int bmask = 0xee; - int i; - - sp = (mlib_d64 *)src; - dp = (mlib_d64 *)dst; - -#pragma pipeloop(0) - for (i = 0; i < dsize / 8; i++) { - LOAD_INSERT_STORE_U8_34L_A8; - } -} - -/***************************************************************/ -/* - * Either source or destination image data are not 1-d vectors, but - * they are 8-byte aligned. And slb and dlb are multiple of 8. - * The xsize is multiple of 8. - */ -void -mlib_v_ImageChannelInsert_U8_34L_A8D2X8(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 *sl, *dl; /* 8-byte aligned pointer for line */ - mlib_d64 sd0, sd1, sd2; /* source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - mlib_d64 sda, sdb, sdc, sdd; /* intermediate variables */ - mlib_d64 sde, sdf, sdg, sdh; - mlib_d64 sdi, sdj, sdk, sdl; - mlib_d64 sdm; - int bmask = 0xee; - int i, j; /* indices for x, y */ - - sp = sl = (mlib_d64 *)src; - dp = dl = (mlib_d64 *)dst; - - /* row loop */ - for (j = 0; j < ysize; j++) { - /* 8-byte column loop */ -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - LOAD_INSERT_STORE_U8_34L_A8; - } - sp = sl = (mlib_d64 *)((mlib_u8 *)sl + slb); - dp = dl = (mlib_d64 *)((mlib_u8 *)dl + dlb); - } -} - -/***************************************************************/ -/* - * either source or destination data are not 8-byte aligned. - */ -void -mlib_v_ImageChannelInsert_U8_34L_D1(mlib_u8 *src, - mlib_u8 *dst, - mlib_s32 dsize) -{ - mlib_u8 *sa, *da; - mlib_u8 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 s0, s1, s2, s3; /* 8-byte source raw data */ - mlib_d64 sd0, sd1, sd2; /* 8-byte source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - mlib_d64 dd4; /* the last datum of the last step */ - mlib_d64 sda, sdb, sdc, sdd; /* intermediate variables */ - mlib_d64 sde, sdf, sdg, sdh; - mlib_d64 sdi, sdj, sdk, sdl; - mlib_d64 sdm; - int soff; /* offset of address in src */ - int doff; /* offset of address in dst */ - int emask; /* edge mask */ - int bmask; /* channel mask */ - int i, n; - - sa = src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *)((mlib_addr) da & (~7)); - dend = da + dsize * 4 - 1; - dend2 = dend - 31; - doff = ((mlib_addr) da & 7); - - /* set band mask for vis_pst_8 to store the bytes needed */ - bmask = 0xff & (0xeeee >> doff) ; - - /* generate edge mask for the start point */ - emask = vis_edge8(da, dend); - - /* load 24 bytes, convert to 32 bytes */ - s3 = sp[0]; /* initial value */ - LOAD_INSERT_U8_34L; - - if (doff == 0) { /* dst is 8-byte aligned */ - - if (dsize >= 8 ) { - vis_pst_8(dd0, dp++, emask & bmask); - vis_pst_8(dd1, dp++, bmask); - vis_pst_8(dd2, dp++, bmask); - vis_pst_8(dd3, dp++, bmask); - } - else { /* for very small size */ - vis_pst_8(dd0, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd1, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd2, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd3, dp++, emask & bmask); - } - } - } - } - - /* no edge handling is needed in the loop */ - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *)dend2 - (mlib_u8 *)dp) / 32 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_INSERT_U8_34L; - vis_pst_8(dd0, dp++, bmask); - vis_pst_8(dd1, dp++, bmask); - vis_pst_8(dd2, dp++, bmask); - vis_pst_8(dd3, dp++, bmask); - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_INSERT_U8_34L; - emask = vis_edge8(dp, dend); - vis_pst_8(dd0, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd1, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd2, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(dd3, dp++, emask & bmask); - } - } - } - } - } - else { /* (doff != 0) */ - vis_alignaddr((void *)0, -doff); - - if (dsize >= 8 ) { - vis_pst_8(vis_faligndata(dd0, dd0), dp++, emask & bmask); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, bmask); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, bmask); - vis_pst_8(vis_faligndata(dd2, dd3), dp++, bmask); - } - else { /* for very small size */ - vis_pst_8(vis_faligndata(dd0, dd0), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd2, dd3), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd3, dd3), dp++, emask & bmask); - } - } - } - } - } - - /* no edge handling is needed in the loop */ - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *)dend2 - (mlib_u8 *)dp) / 32 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_INSERT_U8_34L; - vis_alignaddr((void *)0, -doff); - vis_pst_8(vis_faligndata(dd4, dd0), dp++, bmask); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, bmask); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, bmask); - vis_pst_8(vis_faligndata(dd2, dd3), dp++, bmask); - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_INSERT_U8_34L; - vis_alignaddr((void *)0, -doff); - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd4, dd0), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd0, dd1), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd1, dd2), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge8(dp, dend); - vis_pst_8(vis_faligndata(dd2, dd3), dp++, emask & bmask); - } - } - } - } - } -} - -/***************************************************************/ -void -mlib_v_ImageChannelInsert_U8_34L(mlib_u8 *src, mlib_s32 slb, - mlib_u8 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize) -{ - mlib_u8 *sa, *da; - mlib_u8 *sl, *dl; - int j; - - sa = sl = src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_U8_34L_D1(sa, da, xsize); - sa = sl += slb; - da = dl += dlb; - } -} - -/***************************************************************/ -#define INSERT_S16_34L \ - dd0 = sd0; /* b0g0r0b1 */ \ - vis_alignaddr((void *)0, 6); \ - dd1 = vis_faligndata(sd0, sd1); /* b1gbr1b2 */ \ - vis_alignaddr((void *)0, 4); \ - dd2 = vis_faligndata(sd1, sd2); /* b2g2r2b3 */ \ - vis_alignaddr((void *)0, 2); \ - dd3 = vis_faligndata(sd2, sd2); /* b3g3r3r2 */ - -/***************************************************************/ -#define LOAD_INSERT_STORE_S16_34L_A8 \ - sd0 = *sp++; /* b0g0r0b1 */ \ - sd1 = *sp++; /* g1r1b2g2 */ \ - sd2 = *sp++; /* r2b3g3r3 */ \ - INSERT_S16_34L \ - vis_pst_16(dd0, dp++, bmask); \ - vis_pst_16(dd1, dp++, bmask); \ - vis_pst_16(dd2, dp++, bmask); \ - vis_pst_16(dd3, dp++, bmask); - -/***************************************************************/ -#define LOAD_INSERT_S16_34L \ - vis_alignaddr((void *)soff, 0); \ - s0 = s3; \ - s1 = sp[1]; \ - s2 = sp[2]; \ - s3 = sp[3]; \ - sd0 = vis_faligndata(s0, s1); \ - sd1 = vis_faligndata(s1, s2); \ - sd2 = vis_faligndata(s2, s3); \ - sp += 3; \ - dd4 = dd3; \ - INSERT_S16_34L - -/***************************************************************/ -/* - * both source and destination image data are 1-d vectors and - * 8-byte aligned. dsize is multiple of 4. - */ - -void -mlib_v_ImageChannelInsert_S16_34L_A8D1X4(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 sd0, sd1, sd2; /* source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - int bmask = 0x0e; /* channel mask */ - int i; - - sp = (mlib_d64 *)src; - dp = (mlib_d64 *)dst; - -#pragma pipeloop(0) - for (i = 0; i < dsize / 4; i++) { - LOAD_INSERT_STORE_S16_34L_A8; - } -} - -/***************************************************************/ -/* - * either source or destination image data are not 1-d vectors, but - * they are 8-byte aligned. xsize is multiple of 4. - */ - -void -mlib_v_ImageChannelInsert_S16_34L_A8D2X4(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize) -{ - mlib_d64 *sp, *dp; /* 8-byte aligned pointer for pixel */ - mlib_d64 *sl, *dl; /* 8-byte aligned pointer for line */ - mlib_d64 sd0, sd1, sd2; /* source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - int bmask = 0x0e; /* channel mask */ - int i, j; /* indices for x, y */ - - sp = sl = (mlib_d64 *)src; - dp = dl = (mlib_d64 *)dst; - - /* row loop */ - for (j = 0; j < ysize; j++) { - /* 4-pixel column loop */ -#pragma pipeloop(0) - for (i = 0; i < xsize / 4; i++) { - LOAD_INSERT_STORE_S16_34L_A8; - } - sp = sl = (mlib_d64 *)((mlib_u8 *)sl + slb); - dp = dl = (mlib_d64 *)((mlib_u8 *)dl + dlb); - } -} - -/***************************************************************/ -/* - * either source or destination data are not 8-byte aligned. - */ - -void -mlib_v_ImageChannelInsert_S16_34L_D1(mlib_s16 *src, - mlib_s16 *dst, - mlib_s32 dsize) -{ - mlib_s16 *sa, *da; /* pointer for pixel */ - mlib_s16 *dend, *dend2; /* end points in dst */ - mlib_d64 *dp; /* 8-byte aligned start points in dst */ - mlib_d64 *sp; /* 8-byte aligned start point in src */ - mlib_d64 s0, s1, s2, s3; /* 8-byte source raw data */ - mlib_d64 sd0, sd1, sd2; /* 8-byte source data */ - mlib_d64 dd0, dd1, dd2, dd3; /* dst data */ - mlib_d64 dd4; /* the last datum of the last step */ - int soff; /* offset of address in src */ - int doff; /* offset of address in dst */ - int emask; /* edge mask */ - int bmask; /* channel mask */ - int i, n; - - sa = src; - da = dst; - - /* prepare the source address */ - sp = (mlib_d64 *) ((mlib_addr) sa & (~7)); - soff = ((mlib_addr) sa & 7); - - /* prepare the destination addresses */ - dp = (mlib_d64 *)((mlib_addr) da & (~7)); - dend = da + dsize * 4 - 1; - dend2 = dend - 15; - doff = ((mlib_addr) da & 7); - - /* set channel mask for vis_pst_16 to store the words needed */ - bmask = 0xff & (0xee >> (doff / 2)); - - /* generate edge mask for the start point */ - emask = vis_edge16(da, dend); - - /* load 24 byte, convert, store 32 bytes */ - s3 = sp[0]; /* initial value */ - LOAD_INSERT_S16_34L; - - if (doff == 0) { /* dst is 8-byte aligned */ - - if (dsize >= 4 ) { - vis_pst_16(dd0, dp++, emask & bmask); - vis_pst_16(dd1, dp++, bmask); - vis_pst_16(dd2, dp++, bmask); - vis_pst_16(dd3, dp++, bmask); - } - else { /* for very small size */ - vis_pst_16(dd0, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd1, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd2, dp++, emask & bmask); - } - } - } - - /* no edge handling is needed in the loop */ - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *)dend2 - (mlib_u8 *)dp) / 32 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_INSERT_S16_34L; - vis_pst_16(dd0, dp++, bmask); - vis_pst_16(dd1, dp++, bmask); - vis_pst_16(dd2, dp++, bmask); - vis_pst_16(dd3, dp++, bmask); - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_INSERT_S16_34L; - emask = vis_edge16(dp, dend); - vis_pst_16(dd0, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd1, dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(dd2, dp++, emask & bmask); - } - } - } - } - else { /* (doff != 0) */ - vis_alignaddr((void *)0, -doff); - - if (dsize >= 4 ) { - vis_pst_16(vis_faligndata(dd0, dd0), dp++, emask & bmask); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, bmask); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, bmask); - vis_pst_16(vis_faligndata(dd2, dd3), dp++, bmask); - } - else { /* for very small size */ - vis_pst_16(vis_faligndata(dd0, dd0), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd2, dd3), dp++, emask & bmask); - } - } - } - } - - /* no edge handling is needed in the loop */ - if ((mlib_addr) dp <= (mlib_addr) dend2) { - n = ((mlib_u8 *)dend2 - (mlib_u8 *)dp) / 32 + 1; -#pragma pipeloop(0) - for (i = 0; i < n; i++) { - LOAD_INSERT_S16_34L; - vis_alignaddr((void *)0, -doff); - vis_pst_16(vis_faligndata(dd4, dd0), dp++, bmask); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, bmask); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, bmask); - vis_pst_16(vis_faligndata(dd2, dd3), dp++, bmask); - } - } - - if ((mlib_addr) dp <= (mlib_addr) dend) { - LOAD_INSERT_S16_34L; - vis_alignaddr((void *)0, -doff); - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd4, dd0), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd0, dd1), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd1, dd2), dp++, emask & bmask); - if ((mlib_addr) dp <= (mlib_addr) dend) { - emask = vis_edge16(dp, dend); - vis_pst_16(vis_faligndata(dd2, dd3), dp++, emask & bmask); - } - } - } - } - } -} - -/***************************************************************/ - -void -mlib_v_ImageChannelInsert_S16_34L(mlib_s16 *src, mlib_s32 slb, - mlib_s16 *dst, mlib_s32 dlb, - mlib_s32 xsize, mlib_s32 ysize) -{ - mlib_s16 *sa, *da; - mlib_s16 *sl, *dl; - int j; - - sa = sl = src; - da = dl = dst; - -#pragma pipeloop(0) - for (j = 0; j < ysize; j++) { - mlib_v_ImageChannelInsert_S16_34L_D1(sa, da, xsize); - sa = sl = (mlib_s16 *)((mlib_u8 *)sl + slb); - da = dl = (mlib_s16 *)((mlib_u8 *)dl + dlb); - } -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConv.h b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConv.h index ea66f6798da..92a5890c5ab 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConv.h +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConv.h @@ -34,18 +34,6 @@ extern "C" { #if defined ( VIS ) && VIS == 0x200 -mlib_status mlib_conv2x2_8nw_f(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - -mlib_status mlib_conv3x3_8nw_f(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale, - mlib_s32 cmask); - mlib_status mlib_convMxN_8nw_f(mlib_image *dst, const mlib_image *src, mlib_s32 m, @@ -58,16 +46,6 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, #else -mlib_status mlib_conv2x2_8nw_f(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale); - -mlib_status mlib_conv3x3_8nw_f(mlib_image *dst, - const mlib_image *src, - const mlib_s32 *kern, - mlib_s32 scale); - mlib_status mlib_convMxN_8nw_f(mlib_image *dst, const mlib_image *src, mlib_s32 m, diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConvIndex3_8_16nw.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConvIndex3_8_16nw.c deleted file mode 100644 index 4127185b9e7..00000000000 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConvIndex3_8_16nw.c +++ /dev/null @@ -1,1673 +0,0 @@ -/* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - - -/* - * FUNCTION - * Internal functions for mlib_ImageConv* on U8 type - * and MLIB_EDGE_DST_NO_WRITE mask - * - */ - -/***************************************************************/ - -#include -#include -#include -#include - -/* - This defines switches between functions in - files: mlib_v_ImageConv_8nw.c, - mlib_v_ImageConvIndex3_8_16nw.c, - mlib_v_ImageConvIndex4_8_16nw.c, - mlib_v_ImageConvIndex3_8_16nw.c, - mlib_v_ImageConvIndex4_8_16nw.c -*/ - -#define CONV_INDEX - -#define DTYPE mlib_s16 -#define LTYPE mlib_u8 - -/***************************************************************/ - -#ifdef CONV_INDEX - -#define CONV_FUNC(KERN) \ - mlib_conv##KERN##_Index3_8_16nw(mlib_image *dst, \ - mlib_image *src, \ - mlib_s32 *kern, \ - mlib_s32 scale, \ - void *colormap) - -#else - -#define CONV_FUNC(KERN) \ - mlib_conv##KERN##_8nw_f(mlib_image *dst, \ - mlib_image *src, \ - mlib_s32 *kern, \ - mlib_s32 scale) - -#endif - -/***************************************************************/ - -#ifdef CONV_INDEX - -#define NCHAN 3 - -#else - -#define NCHAN nchan - -#endif - -/***************************************************************/ - -#define DEF_VARS \ - DTYPE *sl, *sp, *dl; \ - mlib_s32 hgt = mlib_ImageGetHeight(src); \ - mlib_s32 wid = mlib_ImageGetWidth(src); \ - mlib_s32 sll = mlib_ImageGetStride(src) / sizeof(DTYPE); \ - mlib_s32 dll = mlib_ImageGetStride(dst) / sizeof(DTYPE); \ - DTYPE *adr_src = (DTYPE *)mlib_ImageGetData(src); \ - DTYPE *adr_dst = (DTYPE *)mlib_ImageGetData(dst); \ - mlib_s32 ssize, xsize, dsize, esize, emask, buff_ind = 0; \ - mlib_d64 *pbuff, *dp; \ - mlib_f32 *karr = (mlib_f32 *)kern; \ - mlib_s32 gsr_scale = (31 - scale) << 3; \ - mlib_d64 drnd = vis_to_double_dup(mlib_round_8[31 - scale]); \ - mlib_s32 i, j, l - -/***************************************************************/ - -#ifdef CONV_INDEX - -#define DEF_EXTRA_VARS \ - int offset = mlib_ImageGetLutOffset(colormap); \ - LTYPE **lut_table = (LTYPE**)mlib_ImageGetLutData(colormap); \ - LTYPE *ltbl0 = lut_table[0] - offset; \ - LTYPE *ltbl1 = lut_table[1] - offset; \ - LTYPE *ltbl2 = lut_table[2] - offset; \ - LTYPE *ltbl3 = (NCHAN > 3) ? lut_table[3] - offset : ltbl2 - -#else - -#define DEF_EXTRA_VARS \ - mlib_s32 nchan = mlib_ImageGetChannels(dst) - -#endif - -/***************************************************************/ - -#if NCHAN == 3 - -#define LOAD_SRC() { \ - mlib_s32 s0 = sp[0], s1 = sp[1], s2 = sp[2], s3 = sp[3]; \ - mlib_s32 s4 = sp[4], s5 = sp[5], s6 = sp[6], s7 = sp[7]; \ - mlib_d64 t0, t1, t2; \ - \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s5), t2); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s5), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s2), t1); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s2), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s2), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s0), t0); \ - \ - buffn[i] = t0; \ - buffn[i + 1] = t1; \ - buffn[i + 2] = t2; \ - \ - sp += 8; \ - } - -#else - -#define LOAD_SRC() { \ - mlib_s32 s0 = sp[0], s1 = sp[1], s2 = sp[2], s3 = sp[3]; \ - mlib_s32 s4 = sp[4], s5 = sp[5], s6 = sp[6], s7 = sp[7]; \ - mlib_d64 t0, t1, t2; \ - \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl3, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl3, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s4), t2); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl3, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl3, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s2), t1); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl3, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl3, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s0), t0); \ - \ - buffn[i] = t0; \ - buffn[i + 1] = t1; \ - buffn[i + 2] = t2; \ - \ - sp += 6; \ - } - -#endif - -/***************************************************************/ - -static mlib_s32 mlib_round_8[16] = { 0x00400040, 0x00200020, 0x00100010, 0x00080008, - 0x00040004, 0x00020002, 0x00010001, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000 }; - -/***************************************************************/ - -void mlib_ImageCopy_na(mlib_u8 *sa, mlib_u8 *da, int size); - -/***************************************************************/ - -#define KSIZE 2 - -mlib_status CONV_FUNC(2x2) -{ - mlib_d64 *buffs[2*(KSIZE + 1)]; - mlib_d64 *buff0, *buff1, *buffn, *buffd, *buffe; - mlib_d64 s00, s01, s10, s11, s0, s1; - mlib_d64 d0, d1, d00, d01, d10, d11; - DEF_VARS; - DEF_EXTRA_VARS; - - sl = adr_src; - dl = adr_dst; - - ssize = NCHAN*wid; - dsize = (ssize + 7)/8; - esize = dsize + 4; - pbuff = mlib_malloc((KSIZE + 4)*esize*sizeof(mlib_d64)); - if (pbuff == NULL) return MLIB_FAILURE; - - for (i = 0; i < (KSIZE + 1); i++) buffs[i] = pbuff + i*esize; - for (i = 0; i < (KSIZE + 1); i++) buffs[(KSIZE + 1) + i] = buffs[i]; - buffd = buffs[KSIZE] + esize; - buffe = buffd + 2*esize; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - xsize = ssize - NCHAN*(KSIZE - 1); - emask = (0xFF00 >> (xsize & 7)) & 0xFF; - - vis_write_gsr(gsr_scale + 7); - - for (l = 0; l < KSIZE; l++) { - mlib_d64 *buffn = buffs[l]; - sp = sl + l*sll; - -#ifndef CONV_INDEX - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); - -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } -#endif /* CONV_INDEX */ - } - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind; - mlib_f32 *pk = karr, k0, k1; - sp = sl + KSIZE*sll; - - buff0 = buffc[0]; - buff1 = buffc[1]; - buffn = buffc[KSIZE]; - -#ifndef CONV_INDEX - if ((((mlib_addr)(sl )) & 7) == 0) buff0 = (mlib_d64*)sl; - if ((((mlib_addr)(sl + sll)) & 7) == 0) buff1 = (mlib_d64*)(sl + sll); - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#endif - - k0 = pk[1]; - k1 = pk[3]; - vis_write_gsr(gsr_scale + NCHAN); - - s01 = buff0[0]; - s11 = buff1[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = vis_fpadd16(d00, d10); - d1 = vis_fpadd16(d01, d11); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - k0 = pk[0]; - k1 = pk[2]; -#ifndef CONV_INDEX - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s0 = buff0[i]; - s1 = buff1[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - dp[i] = vis_fpack16_pair(d0, d1); - } - - if (emask) { - s0 = buff0[i]; - s1 = buff1[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - - d0 = vis_fpack16_pair(d0, d1); - vis_pst_8(d0, dp + i, emask); - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - -#else - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d2 = buffd[2*i + 2]; - d3 = buffd[2*i + 3]; - d4 = buffd[2*i + 4]; - d5 = buffd[2*i + 5]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - d02 = vis_fpadd16(d02, d12); - d2 = vis_fpadd16(d2, drnd); - d2 = vis_fpadd16(d2, d02); - d03 = vis_fpadd16(d03, d13); - d3 = vis_fpadd16(d3, drnd); - d3 = vis_fpadd16(d3, d03); - d04 = vis_fpadd16(d04, d14); - d4 = vis_fpadd16(d4, drnd); - d4 = vis_fpadd16(d4, d04); - d05 = vis_fpadd16(d05, d15); - d5 = vis_fpadd16(d5, drnd); - d5 = vis_fpadd16(d5, d05); - - buffe[i ] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - LOAD_SRC(); - } - - mlib_ImageColorTrue2IndexLine_U8_S16_3((void*)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - - sl += sll; - dl += dll; - - buff_ind++; - if (buff_ind >= (KSIZE + 1)) buff_ind = 0; - } - - mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ - -#undef KSIZE -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3) -{ - mlib_d64 *buffs[2*(KSIZE + 1)]; - mlib_d64 *buff0, *buff1, *buff2, *buffn, *buffd, *buffe; - mlib_d64 s00, s01, s10, s11, s20, s21, s0, s1, s2; - mlib_d64 dd, d0, d1, d00, d01, d10, d11, d20, d21; - mlib_s32 ik, ik_last, off, doff; - DEF_VARS; - DEF_EXTRA_VARS; - - sl = adr_src; -#ifdef CONV_INDEX - dl = adr_dst + ((KSIZE - 1)/2)*(dll + 1); -#else - dl = adr_dst + ((KSIZE - 1)/2)*(dll + NCHAN); -#endif - - ssize = NCHAN*wid; - dsize = (ssize + 7)/8; - esize = dsize + 4; - pbuff = mlib_malloc((KSIZE + 4)*esize*sizeof(mlib_d64)); - if (pbuff == NULL) return MLIB_FAILURE; - - for (i = 0; i < (KSIZE + 1); i++) buffs[i] = pbuff + i*esize; - for (i = 0; i < (KSIZE + 1); i++) buffs[(KSIZE + 1) + i] = buffs[i]; - buffd = buffs[KSIZE] + esize; - buffe = buffd + 2*esize; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - xsize = ssize - NCHAN*(KSIZE - 1); - emask = (0xFF00 >> (xsize & 7)) & 0xFF; - - vis_write_gsr(gsr_scale + 7); - - for (l = 0; l < KSIZE; l++) { - mlib_d64 *buffn = buffs[l]; - sp = sl + l*sll; - -#ifndef CONV_INDEX - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } -#endif /* CONV_INDEX */ - } - - /* init buffer */ -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind, *pbuff0, *pbuff1, *pbuff2; - mlib_f32 *pk = karr, k0, k1, k2; - sp = sl + KSIZE*sll; - - pbuff0 = buffc[0]; - pbuff1 = buffc[1]; - pbuff2 = buffc[2]; - buffn = buffc[KSIZE]; - -#ifndef CONV_INDEX - if ((((mlib_addr)(sl )) & 7) == 0) pbuff0 = (mlib_d64*)sl; - if ((((mlib_addr)(sl + sll)) & 7) == 0) pbuff1 = (mlib_d64*)(sl + sll); - if ((((mlib_addr)(sl + 2*sll)) & 7) == 0) pbuff2 = (mlib_d64*)(sl + 2*sll); - - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#endif - -#ifdef CONV_INDEX - ik_last = 0; -#else - ik_last = (KSIZE - 1); -#endif - - for (ik = 0; ik < KSIZE; ik++) { - k0 = pk[ik]; - k1 = pk[ik + KSIZE]; - k2 = pk[ik + 2*KSIZE]; - - off = ik*NCHAN; - doff = off/8; - off &= 7; - buff0 = pbuff0 + doff; - buff1 = pbuff1 + doff; - buff2 = pbuff2 + doff; - vis_write_gsr(gsr_scale + off); - - if (ik == ik_last) continue; - /*if (!ik_last) { - if ((off & 3) || (ik == (KSIZE - 1))) { - ik_last = ik; - continue; - } - }*/ - - if (off == 0) { -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s0 = buff0[i]; - s1 = buff1[i]; - s2 = buff2[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else if (off == 4) { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - - d00 = vis_fmul8x16au(vis_read_lo(s00), k0); - d01 = vis_fmul8x16au(vis_read_hi(s01), k0); - d10 = vis_fmul8x16au(vis_read_lo(s10), k1); - d11 = vis_fmul8x16au(vis_read_hi(s11), k1); - d20 = vis_fmul8x16au(vis_read_lo(s20), k2); - d21 = vis_fmul8x16au(vis_read_hi(s21), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - } - } - - k0 = pk[ik_last]; - k1 = pk[ik_last + KSIZE]; - k2 = pk[ik_last + 2*KSIZE]; - - off = ik_last*NCHAN; - doff = off/8; - off &= 7; - buff0 = pbuff0 + doff; - buff1 = pbuff1 + doff; - buff2 = pbuff2 + doff; - vis_write_gsr(gsr_scale + off); - -#ifndef CONV_INDEX - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - -#else - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d20, d21, d22, d23, d24, d25; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - mlib_d64 s20 = buff2[i]; - mlib_d64 s21 = buff2[i + 1]; - mlib_d64 s22 = buff2[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - d20 = vis_fmul8x16au(vis_read_hi(s20), k2); - d21 = vis_fmul8x16au(vis_read_lo(s20), k2); - d22 = vis_fmul8x16au(vis_read_hi(s21), k2); - d23 = vis_fmul8x16au(vis_read_lo(s21), k2); - d24 = vis_fmul8x16au(vis_read_hi(s22), k2); - d25 = vis_fmul8x16au(vis_read_lo(s22), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d2 = buffd[2*i + 2]; - d3 = buffd[2*i + 3]; - d4 = buffd[2*i + 4]; - d5 = buffd[2*i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d2 = vis_fpadd16(d2, d22); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d3 = vis_fpadd16(d3, d23); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d4 = vis_fpadd16(d4, d24); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - d5 = vis_fpadd16(d5, d25); - - buffe[i ] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - buffd[2*i + 2] = drnd; - buffd[2*i + 3] = drnd; - buffd[2*i + 4] = drnd; - buffd[2*i + 5] = drnd; - - LOAD_SRC(); - } - - mlib_ImageColorTrue2IndexLine_U8_S16_3((void*)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - - sl += sll; - dl += dll; - - buff_ind++; - if (buff_ind >= (KSIZE + 1)) buff_ind = 0; - } - - mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ - -#undef KSIZE -#define MAX_N 11 - -#ifdef CONV_INDEX - -mlib_status mlib_convMxN_Index3_8_16nw(mlib_image *dst, - mlib_image *src, - mlib_s32 m, - mlib_s32 n, - mlib_s32 dm, - mlib_s32 dn, - mlib_s32 *kern, - mlib_s32 scale, - void *colormap) - -#else - -mlib_status mlib_convMxN_8nw_f(mlib_image *dst, - mlib_image *src, - mlib_s32 m, - mlib_s32 n, - mlib_s32 dm, - mlib_s32 dn, - mlib_s32 *kern, - mlib_s32 scale) - -#endif -{ - mlib_d64 *buffs_local[3*(MAX_N + 1)], **buffs = buffs_local, **buff; - mlib_d64 *buff0, *buff1, *buff2, *buff3, *buffn, *buffd, *buffe; - mlib_d64 s00, s01, s10, s11, s20, s21, s30, s31, s0, s1, s2, s3; - mlib_d64 d00, d01, d10, d11, d20, d21, d30, d31; - mlib_d64 dd, d0, d1; - mlib_s32 ik, jk, ik_last, jk_size, coff, off, doff; - DEF_VARS; - DEF_EXTRA_VARS; - - if (n > MAX_N) { - buffs = mlib_malloc(3*(n + 1)*sizeof(mlib_d64*)); - if (buffs == NULL) return MLIB_FAILURE; - } - - buff = buffs + 2*(n + 1); - - sl = adr_src; -#ifdef CONV_INDEX - dl = adr_dst + dn*dll + dm; -#else - dl = adr_dst + dn*dll + dm*NCHAN; -#endif - - ssize = NCHAN*wid; - dsize = (ssize + 7)/8; - esize = dsize + 4; - pbuff = mlib_malloc((n + 4)*esize*sizeof(mlib_d64)); - if (pbuff == NULL) { - if (buffs != buffs_local) mlib_free(buffs); - return MLIB_FAILURE; - } - - for (i = 0; i < (n + 1); i++) buffs[i] = pbuff + i*esize; - for (i = 0; i < (n + 1); i++) buffs[(n + 1) + i] = buffs[i]; - buffd = buffs[n] + esize; - buffe = buffd + 2*esize; - - wid -= (m - 1); - hgt -= (n - 1); - xsize = ssize - NCHAN*(m - 1); - emask = (0xFF00 >> (xsize & 7)) & 0xFF; - - vis_write_gsr(gsr_scale + 7); - - for (l = 0; l < n; l++) { - mlib_d64 *buffn = buffs[l]; - sp = sl + l*sll; - -#ifndef CONV_INDEX - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } -#endif /* CONV_INDEX */ - } - - /* init buffer */ -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind; - mlib_f32 *pk = karr, k0, k1, k2, k3; - sp = sl + n*sll; - - for (l = 0; l < n; l++) { - buff[l] = buffc[l]; - } - buffn = buffc[n]; - -#ifndef CONV_INDEX - for (l = 0; l < n; l++) { - if ((((mlib_addr)(sl + l*sll)) & 7) == 0) buff[l] = (mlib_d64*)(sl + l*sll); - } - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#endif - -#ifdef CONV_INDEX - ik_last = 0; -#else - ik_last = (m - 1); -#endif - - for (jk = 0; jk < n; jk += jk_size) { - jk_size = n - jk; -#ifdef CONV_INDEX - if (jk_size >= 5) jk_size = 3; - if (jk_size == 4) jk_size = 2; -#else - if (jk_size >= 6) jk_size = 4; - if (jk_size == 5) jk_size = 3; -#endif - coff = 0; - - if (jk_size == 2) { - - for (ik = 0; ik < m; ik++, coff += NCHAN) { - if (!jk && ik == ik_last) continue; - - k0 = pk[ik]; - k1 = pk[ik + m]; - - doff = coff/8; - buff0 = buff[jk ] + doff; - buff1 = buff[jk + 1] + doff; - - off = coff & 7; - vis_write_gsr(gsr_scale + off); - - s01 = buff0[0]; - s11 = buff1[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } - - pk += 2*m; - - } else if (jk_size == 3) { - - for (ik = 0; ik < m; ik++, coff += NCHAN) { - if (!jk && ik == ik_last) continue; - - k0 = pk[ik]; - k1 = pk[ik + m]; - k2 = pk[ik + 2*m]; - - doff = coff/8; - buff0 = buff[jk ] + doff; - buff1 = buff[jk + 1] + doff; - buff2 = buff[jk + 2] + doff; - - off = coff & 7; - vis_write_gsr(gsr_scale + off); - - if (off == 0) { -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s0 = buff0[i]; - s1 = buff1[i]; - s2 = buff2[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d20, d0); - d0 = vis_fpadd16(d00, d0); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d21, d1); - d1 = vis_fpadd16(d01, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else if (off == 4) { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - - d00 = vis_fmul8x16au(vis_read_lo(s00), k0); - d01 = vis_fmul8x16au(vis_read_hi(s01), k0); - d10 = vis_fmul8x16au(vis_read_lo(s10), k1); - d11 = vis_fmul8x16au(vis_read_hi(s11), k1); - d20 = vis_fmul8x16au(vis_read_lo(s20), k2); - d21 = vis_fmul8x16au(vis_read_hi(s21), k2); - - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d20, d0); - d0 = vis_fpadd16(d00, d0); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d21, d1); - d1 = vis_fpadd16(d01, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d20, d0); - d0 = vis_fpadd16(d00, d0); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d21, d1); - d1 = vis_fpadd16(d01, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - } - } - - pk += 3*m; - - } else { /* jk_size == 4 */ - - for (ik = 0; ik < m; ik++, coff += NCHAN) { - if (!jk && ik == ik_last) continue; - - k0 = pk[ik]; - k1 = pk[ik + m]; - k2 = pk[ik + 2*m]; - k3 = pk[ik + 3*m]; - - doff = coff/8; - buff0 = buff[jk ] + doff; - buff1 = buff[jk + 1] + doff; - buff2 = buff[jk + 2] + doff; - buff3 = buff[jk + 3] + doff; - - off = coff & 7; - vis_write_gsr(gsr_scale + off); - - if (off == 0) { - -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s0 = buff0[i]; - s1 = buff1[i]; - s2 = buff2[i]; - s3 = buff3[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - d30 = vis_fmul8x16au(vis_read_hi(s3), k3); - d31 = vis_fmul8x16au(vis_read_lo(s3), k3); - - d00 = vis_fpadd16(d00, d10); - d20 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d20); - d01 = vis_fpadd16(d01, d11); - d21 = vis_fpadd16(d21, d31); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d21); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else if (off == 4) { - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; - s31 = buff3[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s00 = s01; - s10 = s11; - s20 = s21; - s30 = s31; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s31 = buff3[i + 1]; - - d00 = vis_fmul8x16au(vis_read_lo(s00), k0); - d01 = vis_fmul8x16au(vis_read_hi(s01), k0); - d10 = vis_fmul8x16au(vis_read_lo(s10), k1); - d11 = vis_fmul8x16au(vis_read_hi(s11), k1); - d20 = vis_fmul8x16au(vis_read_lo(s20), k2); - d21 = vis_fmul8x16au(vis_read_hi(s21), k2); - d30 = vis_fmul8x16au(vis_read_lo(s30), k3); - d31 = vis_fmul8x16au(vis_read_hi(s31), k3); - - d00 = vis_fpadd16(d00, d10); - d20 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d20); - d01 = vis_fpadd16(d01, d11); - d21 = vis_fpadd16(d21, d31); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d21); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else { - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; - s31 = buff3[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s00 = s01; - s10 = s11; - s20 = s21; - s30 = s31; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s31 = buff3[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - s3 = vis_faligndata(s30, s31); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - d30 = vis_fmul8x16au(vis_read_hi(s3), k3); - d31 = vis_fmul8x16au(vis_read_lo(s3), k3); - - d00 = vis_fpadd16(d00, d10); - d20 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d20); - d01 = vis_fpadd16(d01, d11); - d21 = vis_fpadd16(d21, d31); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d21); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - } - } - - pk += 4*m; - } - } - - /***************************************** - ***************************************** - ** Final iteration ** - ***************************************** - *****************************************/ - - jk_size = n; -#ifdef CONV_INDEX - if (jk_size >= 5) jk_size = 3; - if (jk_size == 4) jk_size = 2; -#else - if (jk_size >= 6) jk_size = 4; - if (jk_size == 5) jk_size = 3; -#endif - - k0 = karr[ik_last]; - k1 = karr[ik_last + m]; - k2 = karr[ik_last + 2*m]; - k3 = karr[ik_last + 3*m]; - - off = ik_last*NCHAN; - doff = off/8; - off &= 7; - buff0 = buff[0] + doff; - buff1 = buff[1] + doff; - buff2 = buff[2] + doff; - buff3 = buff[3] + doff; - vis_write_gsr(gsr_scale + off); - -#ifndef CONV_INDEX - if (jk_size == 2) { - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - - s01 = buff0[0]; - s11 = buff1[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - - } else if (jk_size == 3) { - - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - - } else /* if (jk_size == 4) */ { - - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; - s31 = buff3[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s30 = s31; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s31 = buff3[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - s3 = vis_faligndata(s30, s31); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - d30 = vis_fmul8x16au(vis_read_hi(s3), k3); - d31 = vis_fmul8x16au(vis_read_lo(s3), k3); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d0 = vis_fpadd16(d0, d30); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d1 = vis_fpadd16(d1, d31); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s20 = s21; - s30 = s31; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s31 = buff3[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - s3 = vis_faligndata(s30, s31); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - d30 = vis_fmul8x16au(vis_read_hi(s3), k3); - d31 = vis_fmul8x16au(vis_read_lo(s3), k3); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d0 = vis_fpadd16(d0, d30); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d1 = vis_fpadd16(d1, d31); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - } - -#else /* CONV_INDEX */ - - if (jk_size == 2) { - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d2 = buffd[2*i + 2]; - d3 = buffd[2*i + 3]; - d4 = buffd[2*i + 4]; - d5 = buffd[2*i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - - buffe[i ] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - buffd[2*i + 2] = drnd; - buffd[2*i + 3] = drnd; - buffd[2*i + 4] = drnd; - buffd[2*i + 5] = drnd; - - LOAD_SRC(); - } - - } else /* if (jk_size == 3) */ { - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d20, d21, d22, d23, d24, d25; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - mlib_d64 s20 = buff2[i]; - mlib_d64 s21 = buff2[i + 1]; - mlib_d64 s22 = buff2[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - d20 = vis_fmul8x16au(vis_read_hi(s20), k2); - d21 = vis_fmul8x16au(vis_read_lo(s20), k2); - d22 = vis_fmul8x16au(vis_read_hi(s21), k2); - d23 = vis_fmul8x16au(vis_read_lo(s21), k2); - d24 = vis_fmul8x16au(vis_read_hi(s22), k2); - d25 = vis_fmul8x16au(vis_read_lo(s22), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d2 = buffd[2*i + 2]; - d3 = buffd[2*i + 3]; - d4 = buffd[2*i + 4]; - d5 = buffd[2*i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d2 = vis_fpadd16(d2, d22); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d3 = vis_fpadd16(d3, d23); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d4 = vis_fpadd16(d4, d24); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - d5 = vis_fpadd16(d5, d25); - - buffe[i ] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - buffd[2*i + 2] = drnd; - buffd[2*i + 3] = drnd; - buffd[2*i + 4] = drnd; - buffd[2*i + 5] = drnd; - - LOAD_SRC(); - } - } -#endif /* CONV_INDEX */ - -#ifdef CONV_INDEX - mlib_ImageColorTrue2IndexLine_U8_S16_3((void*)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - - sl += sll; - dl += dll; - - buff_ind++; - if (buff_ind >= (n + 1)) buff_ind = 0; - } - - mlib_free(pbuff); - if (buffs != buffs_local) mlib_free(buffs); - - return MLIB_SUCCESS; -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConvIndex3_8_8nw.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConvIndex3_8_8nw.c deleted file mode 100644 index ada07fe2d89..00000000000 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConvIndex3_8_8nw.c +++ /dev/null @@ -1,1673 +0,0 @@ -/* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - - -/* - * FUNCTION - * Internal functions for mlib_ImageConv* on U8 type - * and MLIB_EDGE_DST_NO_WRITE mask - * - */ - -/***************************************************************/ - -#include -#include -#include -#include - -/* - This defines switches between functions in - files: mlib_v_ImageConv_8nw.c, - mlib_v_ImageConvIndex3_8_8nw.c, - mlib_v_ImageConvIndex4_8_8nw.c, - mlib_v_ImageConvIndex3_8_16nw.c, - mlib_v_ImageConvIndex4_8_16nw.c -*/ - -#define CONV_INDEX - -#define DTYPE mlib_u8 -#define LTYPE mlib_u8 - -/***************************************************************/ - -#ifdef CONV_INDEX - -#define CONV_FUNC(KERN) \ - mlib_conv##KERN##_Index3_8_8nw(mlib_image *dst, \ - mlib_image *src, \ - mlib_s32 *kern, \ - mlib_s32 scale, \ - void *colormap) - -#else - -#define CONV_FUNC(KERN) \ - mlib_conv##KERN##_8nw_f(mlib_image *dst, \ - mlib_image *src, \ - mlib_s32 *kern, \ - mlib_s32 scale) - -#endif - -/***************************************************************/ - -#ifdef CONV_INDEX - -#define NCHAN 3 - -#else - -#define NCHAN nchan - -#endif - -/***************************************************************/ - -#define DEF_VARS \ - DTYPE *sl, *sp, *dl; \ - mlib_s32 hgt = mlib_ImageGetHeight(src); \ - mlib_s32 wid = mlib_ImageGetWidth(src); \ - mlib_s32 sll = mlib_ImageGetStride(src) / sizeof(DTYPE); \ - mlib_s32 dll = mlib_ImageGetStride(dst) / sizeof(DTYPE); \ - DTYPE *adr_src = (DTYPE *)mlib_ImageGetData(src); \ - DTYPE *adr_dst = (DTYPE *)mlib_ImageGetData(dst); \ - mlib_s32 ssize, xsize, dsize, esize, emask, buff_ind = 0; \ - mlib_d64 *pbuff, *dp; \ - mlib_f32 *karr = (mlib_f32 *)kern; \ - mlib_s32 gsr_scale = (31 - scale) << 3; \ - mlib_d64 drnd = vis_to_double_dup(mlib_round_8[31 - scale]); \ - mlib_s32 i, j, l - -/***************************************************************/ - -#ifdef CONV_INDEX - -#define DEF_EXTRA_VARS \ - int offset = mlib_ImageGetLutOffset(colormap); \ - LTYPE **lut_table = (LTYPE**)mlib_ImageGetLutData(colormap); \ - LTYPE *ltbl0 = lut_table[0] - offset; \ - LTYPE *ltbl1 = lut_table[1] - offset; \ - LTYPE *ltbl2 = lut_table[2] - offset; \ - LTYPE *ltbl3 = (NCHAN > 3) ? lut_table[3] - offset : ltbl2 - -#else - -#define DEF_EXTRA_VARS \ - mlib_s32 nchan = mlib_ImageGetChannels(dst) - -#endif - -/***************************************************************/ - -#if NCHAN == 3 - -#define LOAD_SRC() { \ - mlib_s32 s0 = sp[0], s1 = sp[1], s2 = sp[2], s3 = sp[3]; \ - mlib_s32 s4 = sp[4], s5 = sp[5], s6 = sp[6], s7 = sp[7]; \ - mlib_d64 t0, t1, t2; \ - \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s5), t2); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s5), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s2), t1); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s2), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s2), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s0), t0); \ - \ - buffn[i] = t0; \ - buffn[i + 1] = t1; \ - buffn[i + 2] = t2; \ - \ - sp += 8; \ - } - -#else - -#define LOAD_SRC() { \ - mlib_s32 s0 = sp[0], s1 = sp[1], s2 = sp[2], s3 = sp[3]; \ - mlib_s32 s4 = sp[4], s5 = sp[5], s6 = sp[6], s7 = sp[7]; \ - mlib_d64 t0, t1, t2; \ - \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl3, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl3, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s4), t2); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl3, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl3, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s2), t1); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl3, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl3, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s0), t0); \ - \ - buffn[i] = t0; \ - buffn[i + 1] = t1; \ - buffn[i + 2] = t2; \ - \ - sp += 6; \ - } - -#endif - -/***************************************************************/ - -static mlib_s32 mlib_round_8[16] = { 0x00400040, 0x00200020, 0x00100010, 0x00080008, - 0x00040004, 0x00020002, 0x00010001, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000 }; - -/***************************************************************/ - -void mlib_ImageCopy_na(mlib_u8 *sa, mlib_u8 *da, int size); - -/***************************************************************/ - -#define KSIZE 2 - -mlib_status CONV_FUNC(2x2) -{ - mlib_d64 *buffs[2*(KSIZE + 1)]; - mlib_d64 *buff0, *buff1, *buffn, *buffd, *buffe; - mlib_d64 s00, s01, s10, s11, s0, s1; - mlib_d64 d0, d1, d00, d01, d10, d11; - DEF_VARS; - DEF_EXTRA_VARS; - - sl = adr_src; - dl = adr_dst; - - ssize = NCHAN*wid; - dsize = (ssize + 7)/8; - esize = dsize + 4; - pbuff = mlib_malloc((KSIZE + 4)*esize*sizeof(mlib_d64)); - if (pbuff == NULL) return MLIB_FAILURE; - - for (i = 0; i < (KSIZE + 1); i++) buffs[i] = pbuff + i*esize; - for (i = 0; i < (KSIZE + 1); i++) buffs[(KSIZE + 1) + i] = buffs[i]; - buffd = buffs[KSIZE] + esize; - buffe = buffd + 2*esize; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - xsize = ssize - NCHAN*(KSIZE - 1); - emask = (0xFF00 >> (xsize & 7)) & 0xFF; - - vis_write_gsr(gsr_scale + 7); - - for (l = 0; l < KSIZE; l++) { - mlib_d64 *buffn = buffs[l]; - sp = sl + l*sll; - -#ifndef CONV_INDEX - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); - -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } -#endif /* CONV_INDEX */ - } - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind; - mlib_f32 *pk = karr, k0, k1; - sp = sl + KSIZE*sll; - - buff0 = buffc[0]; - buff1 = buffc[1]; - buffn = buffc[KSIZE]; - -#ifndef CONV_INDEX - if ((((mlib_addr)(sl )) & 7) == 0) buff0 = (mlib_d64*)sl; - if ((((mlib_addr)(sl + sll)) & 7) == 0) buff1 = (mlib_d64*)(sl + sll); - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#endif - - k0 = pk[1]; - k1 = pk[3]; - vis_write_gsr(gsr_scale + NCHAN); - - s01 = buff0[0]; - s11 = buff1[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = vis_fpadd16(d00, d10); - d1 = vis_fpadd16(d01, d11); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - k0 = pk[0]; - k1 = pk[2]; -#ifndef CONV_INDEX - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s0 = buff0[i]; - s1 = buff1[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - dp[i] = vis_fpack16_pair(d0, d1); - } - - if (emask) { - s0 = buff0[i]; - s1 = buff1[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - - d0 = vis_fpack16_pair(d0, d1); - vis_pst_8(d0, dp + i, emask); - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - -#else - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d2 = buffd[2*i + 2]; - d3 = buffd[2*i + 3]; - d4 = buffd[2*i + 4]; - d5 = buffd[2*i + 5]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - d02 = vis_fpadd16(d02, d12); - d2 = vis_fpadd16(d2, drnd); - d2 = vis_fpadd16(d2, d02); - d03 = vis_fpadd16(d03, d13); - d3 = vis_fpadd16(d3, drnd); - d3 = vis_fpadd16(d3, d03); - d04 = vis_fpadd16(d04, d14); - d4 = vis_fpadd16(d4, drnd); - d4 = vis_fpadd16(d4, d04); - d05 = vis_fpadd16(d05, d15); - d5 = vis_fpadd16(d5, drnd); - d5 = vis_fpadd16(d5, d05); - - buffe[i ] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - LOAD_SRC(); - } - - mlib_ImageColorTrue2IndexLine_U8_U8_3((void*)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - - sl += sll; - dl += dll; - - buff_ind++; - if (buff_ind >= (KSIZE + 1)) buff_ind = 0; - } - - mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ - -#undef KSIZE -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3) -{ - mlib_d64 *buffs[2*(KSIZE + 1)]; - mlib_d64 *buff0, *buff1, *buff2, *buffn, *buffd, *buffe; - mlib_d64 s00, s01, s10, s11, s20, s21, s0, s1, s2; - mlib_d64 dd, d0, d1, d00, d01, d10, d11, d20, d21; - mlib_s32 ik, ik_last, off, doff; - DEF_VARS; - DEF_EXTRA_VARS; - - sl = adr_src; -#ifdef CONV_INDEX - dl = adr_dst + ((KSIZE - 1)/2)*(dll + 1); -#else - dl = adr_dst + ((KSIZE - 1)/2)*(dll + NCHAN); -#endif - - ssize = NCHAN*wid; - dsize = (ssize + 7)/8; - esize = dsize + 4; - pbuff = mlib_malloc((KSIZE + 4)*esize*sizeof(mlib_d64)); - if (pbuff == NULL) return MLIB_FAILURE; - - for (i = 0; i < (KSIZE + 1); i++) buffs[i] = pbuff + i*esize; - for (i = 0; i < (KSIZE + 1); i++) buffs[(KSIZE + 1) + i] = buffs[i]; - buffd = buffs[KSIZE] + esize; - buffe = buffd + 2*esize; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - xsize = ssize - NCHAN*(KSIZE - 1); - emask = (0xFF00 >> (xsize & 7)) & 0xFF; - - vis_write_gsr(gsr_scale + 7); - - for (l = 0; l < KSIZE; l++) { - mlib_d64 *buffn = buffs[l]; - sp = sl + l*sll; - -#ifndef CONV_INDEX - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } -#endif /* CONV_INDEX */ - } - - /* init buffer */ -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind, *pbuff0, *pbuff1, *pbuff2; - mlib_f32 *pk = karr, k0, k1, k2; - sp = sl + KSIZE*sll; - - pbuff0 = buffc[0]; - pbuff1 = buffc[1]; - pbuff2 = buffc[2]; - buffn = buffc[KSIZE]; - -#ifndef CONV_INDEX - if ((((mlib_addr)(sl )) & 7) == 0) pbuff0 = (mlib_d64*)sl; - if ((((mlib_addr)(sl + sll)) & 7) == 0) pbuff1 = (mlib_d64*)(sl + sll); - if ((((mlib_addr)(sl + 2*sll)) & 7) == 0) pbuff2 = (mlib_d64*)(sl + 2*sll); - - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#endif - -#ifdef CONV_INDEX - ik_last = 0; -#else - ik_last = (KSIZE - 1); -#endif - - for (ik = 0; ik < KSIZE; ik++) { - k0 = pk[ik]; - k1 = pk[ik + KSIZE]; - k2 = pk[ik + 2*KSIZE]; - - off = ik*NCHAN; - doff = off/8; - off &= 7; - buff0 = pbuff0 + doff; - buff1 = pbuff1 + doff; - buff2 = pbuff2 + doff; - vis_write_gsr(gsr_scale + off); - - if (ik == ik_last) continue; - /*if (!ik_last) { - if ((off & 3) || (ik == (KSIZE - 1))) { - ik_last = ik; - continue; - } - }*/ - - if (off == 0) { -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s0 = buff0[i]; - s1 = buff1[i]; - s2 = buff2[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else if (off == 4) { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - - d00 = vis_fmul8x16au(vis_read_lo(s00), k0); - d01 = vis_fmul8x16au(vis_read_hi(s01), k0); - d10 = vis_fmul8x16au(vis_read_lo(s10), k1); - d11 = vis_fmul8x16au(vis_read_hi(s11), k1); - d20 = vis_fmul8x16au(vis_read_lo(s20), k2); - d21 = vis_fmul8x16au(vis_read_hi(s21), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - } - } - - k0 = pk[ik_last]; - k1 = pk[ik_last + KSIZE]; - k2 = pk[ik_last + 2*KSIZE]; - - off = ik_last*NCHAN; - doff = off/8; - off &= 7; - buff0 = pbuff0 + doff; - buff1 = pbuff1 + doff; - buff2 = pbuff2 + doff; - vis_write_gsr(gsr_scale + off); - -#ifndef CONV_INDEX - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - -#else - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d20, d21, d22, d23, d24, d25; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - mlib_d64 s20 = buff2[i]; - mlib_d64 s21 = buff2[i + 1]; - mlib_d64 s22 = buff2[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - d20 = vis_fmul8x16au(vis_read_hi(s20), k2); - d21 = vis_fmul8x16au(vis_read_lo(s20), k2); - d22 = vis_fmul8x16au(vis_read_hi(s21), k2); - d23 = vis_fmul8x16au(vis_read_lo(s21), k2); - d24 = vis_fmul8x16au(vis_read_hi(s22), k2); - d25 = vis_fmul8x16au(vis_read_lo(s22), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d2 = buffd[2*i + 2]; - d3 = buffd[2*i + 3]; - d4 = buffd[2*i + 4]; - d5 = buffd[2*i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d2 = vis_fpadd16(d2, d22); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d3 = vis_fpadd16(d3, d23); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d4 = vis_fpadd16(d4, d24); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - d5 = vis_fpadd16(d5, d25); - - buffe[i ] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - buffd[2*i + 2] = drnd; - buffd[2*i + 3] = drnd; - buffd[2*i + 4] = drnd; - buffd[2*i + 5] = drnd; - - LOAD_SRC(); - } - - mlib_ImageColorTrue2IndexLine_U8_U8_3((void*)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - - sl += sll; - dl += dll; - - buff_ind++; - if (buff_ind >= (KSIZE + 1)) buff_ind = 0; - } - - mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ - -#undef KSIZE -#define MAX_N 11 - -#ifdef CONV_INDEX - -mlib_status mlib_convMxN_Index3_8_8nw(mlib_image *dst, - mlib_image *src, - mlib_s32 m, - mlib_s32 n, - mlib_s32 dm, - mlib_s32 dn, - mlib_s32 *kern, - mlib_s32 scale, - void *colormap) - -#else - -mlib_status mlib_convMxN_8nw_f(mlib_image *dst, - mlib_image *src, - mlib_s32 m, - mlib_s32 n, - mlib_s32 dm, - mlib_s32 dn, - mlib_s32 *kern, - mlib_s32 scale) - -#endif -{ - mlib_d64 *buffs_local[3*(MAX_N + 1)], **buffs = buffs_local, **buff; - mlib_d64 *buff0, *buff1, *buff2, *buff3, *buffn, *buffd, *buffe; - mlib_d64 s00, s01, s10, s11, s20, s21, s30, s31, s0, s1, s2, s3; - mlib_d64 d00, d01, d10, d11, d20, d21, d30, d31; - mlib_d64 dd, d0, d1; - mlib_s32 ik, jk, ik_last, jk_size, coff, off, doff; - DEF_VARS; - DEF_EXTRA_VARS; - - if (n > MAX_N) { - buffs = mlib_malloc(3*(n + 1)*sizeof(mlib_d64*)); - if (buffs == NULL) return MLIB_FAILURE; - } - - buff = buffs + 2*(n + 1); - - sl = adr_src; -#ifdef CONV_INDEX - dl = adr_dst + dn*dll + dm; -#else - dl = adr_dst + dn*dll + dm*NCHAN; -#endif - - ssize = NCHAN*wid; - dsize = (ssize + 7)/8; - esize = dsize + 4; - pbuff = mlib_malloc((n + 4)*esize*sizeof(mlib_d64)); - if (pbuff == NULL) { - if (buffs != buffs_local) mlib_free(buffs); - return MLIB_FAILURE; - } - - for (i = 0; i < (n + 1); i++) buffs[i] = pbuff + i*esize; - for (i = 0; i < (n + 1); i++) buffs[(n + 1) + i] = buffs[i]; - buffd = buffs[n] + esize; - buffe = buffd + 2*esize; - - wid -= (m - 1); - hgt -= (n - 1); - xsize = ssize - NCHAN*(m - 1); - emask = (0xFF00 >> (xsize & 7)) & 0xFF; - - vis_write_gsr(gsr_scale + 7); - - for (l = 0; l < n; l++) { - mlib_d64 *buffn = buffs[l]; - sp = sl + l*sll; - -#ifndef CONV_INDEX - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } -#endif /* CONV_INDEX */ - } - - /* init buffer */ -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind; - mlib_f32 *pk = karr, k0, k1, k2, k3; - sp = sl + n*sll; - - for (l = 0; l < n; l++) { - buff[l] = buffc[l]; - } - buffn = buffc[n]; - -#ifndef CONV_INDEX - for (l = 0; l < n; l++) { - if ((((mlib_addr)(sl + l*sll)) & 7) == 0) buff[l] = (mlib_d64*)(sl + l*sll); - } - if ((mlib_addr)sp & 7) mlib_ImageCopy_na((void*)sp, (void*)buffn, ssize); -#endif - -#ifdef CONV_INDEX - ik_last = 0; -#else - ik_last = (m - 1); -#endif - - for (jk = 0; jk < n; jk += jk_size) { - jk_size = n - jk; -#ifdef CONV_INDEX - if (jk_size >= 5) jk_size = 3; - if (jk_size == 4) jk_size = 2; -#else - if (jk_size >= 6) jk_size = 4; - if (jk_size == 5) jk_size = 3; -#endif - coff = 0; - - if (jk_size == 2) { - - for (ik = 0; ik < m; ik++, coff += NCHAN) { - if (!jk && ik == ik_last) continue; - - k0 = pk[ik]; - k1 = pk[ik + m]; - - doff = coff/8; - buff0 = buff[jk ] + doff; - buff1 = buff[jk + 1] + doff; - - off = coff & 7; - vis_write_gsr(gsr_scale + off); - - s01 = buff0[0]; - s11 = buff1[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } - - pk += 2*m; - - } else if (jk_size == 3) { - - for (ik = 0; ik < m; ik++, coff += NCHAN) { - if (!jk && ik == ik_last) continue; - - k0 = pk[ik]; - k1 = pk[ik + m]; - k2 = pk[ik + 2*m]; - - doff = coff/8; - buff0 = buff[jk ] + doff; - buff1 = buff[jk + 1] + doff; - buff2 = buff[jk + 2] + doff; - - off = coff & 7; - vis_write_gsr(gsr_scale + off); - - if (off == 0) { -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s0 = buff0[i]; - s1 = buff1[i]; - s2 = buff2[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d20, d0); - d0 = vis_fpadd16(d00, d0); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d21, d1); - d1 = vis_fpadd16(d01, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else if (off == 4) { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - - d00 = vis_fmul8x16au(vis_read_lo(s00), k0); - d01 = vis_fmul8x16au(vis_read_hi(s01), k0); - d10 = vis_fmul8x16au(vis_read_lo(s10), k1); - d11 = vis_fmul8x16au(vis_read_hi(s11), k1); - d20 = vis_fmul8x16au(vis_read_lo(s20), k2); - d21 = vis_fmul8x16au(vis_read_hi(s21), k2); - - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d20, d0); - d0 = vis_fpadd16(d00, d0); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d21, d1); - d1 = vis_fpadd16(d01, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d20, d0); - d0 = vis_fpadd16(d00, d0); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d21, d1); - d1 = vis_fpadd16(d01, d1); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - } - } - - pk += 3*m; - - } else { /* jk_size == 4 */ - - for (ik = 0; ik < m; ik++, coff += NCHAN) { - if (!jk && ik == ik_last) continue; - - k0 = pk[ik]; - k1 = pk[ik + m]; - k2 = pk[ik + 2*m]; - k3 = pk[ik + 3*m]; - - doff = coff/8; - buff0 = buff[jk ] + doff; - buff1 = buff[jk + 1] + doff; - buff2 = buff[jk + 2] + doff; - buff3 = buff[jk + 3] + doff; - - off = coff & 7; - vis_write_gsr(gsr_scale + off); - - if (off == 0) { - -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s0 = buff0[i]; - s1 = buff1[i]; - s2 = buff2[i]; - s3 = buff3[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - d30 = vis_fmul8x16au(vis_read_hi(s3), k3); - d31 = vis_fmul8x16au(vis_read_lo(s3), k3); - - d00 = vis_fpadd16(d00, d10); - d20 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d20); - d01 = vis_fpadd16(d01, d11); - d21 = vis_fpadd16(d21, d31); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d21); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else if (off == 4) { - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; - s31 = buff3[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s00 = s01; - s10 = s11; - s20 = s21; - s30 = s31; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s31 = buff3[i + 1]; - - d00 = vis_fmul8x16au(vis_read_lo(s00), k0); - d01 = vis_fmul8x16au(vis_read_hi(s01), k0); - d10 = vis_fmul8x16au(vis_read_lo(s10), k1); - d11 = vis_fmul8x16au(vis_read_hi(s11), k1); - d20 = vis_fmul8x16au(vis_read_lo(s20), k2); - d21 = vis_fmul8x16au(vis_read_hi(s21), k2); - d30 = vis_fmul8x16au(vis_read_lo(s30), k3); - d31 = vis_fmul8x16au(vis_read_hi(s31), k3); - - d00 = vis_fpadd16(d00, d10); - d20 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d20); - d01 = vis_fpadd16(d01, d11); - d21 = vis_fpadd16(d21, d31); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d21); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - - } else { - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; - s31 = buff3[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7)/8; i++) { - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - - s00 = s01; - s10 = s11; - s20 = s21; - s30 = s31; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s31 = buff3[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - s3 = vis_faligndata(s30, s31); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - d30 = vis_fmul8x16au(vis_read_hi(s3), k3); - d31 = vis_fmul8x16au(vis_read_lo(s3), k3); - - d00 = vis_fpadd16(d00, d10); - d20 = vis_fpadd16(d20, d30); - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d20); - d01 = vis_fpadd16(d01, d11); - d21 = vis_fpadd16(d21, d31); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d21); - buffd[2*i] = d0; - buffd[2*i + 1] = d1; - } - } - } - - pk += 4*m; - } - } - - /***************************************** - ***************************************** - ** Final iteration ** - ***************************************** - *****************************************/ - - jk_size = n; -#ifdef CONV_INDEX - if (jk_size >= 5) jk_size = 3; - if (jk_size == 4) jk_size = 2; -#else - if (jk_size >= 6) jk_size = 4; - if (jk_size == 5) jk_size = 3; -#endif - - k0 = karr[ik_last]; - k1 = karr[ik_last + m]; - k2 = karr[ik_last + 2*m]; - k3 = karr[ik_last + 3*m]; - - off = ik_last*NCHAN; - doff = off/8; - off &= 7; - buff0 = buff[0] + doff; - buff1 = buff[1] + doff; - buff2 = buff[2] + doff; - buff3 = buff[3] + doff; - vis_write_gsr(gsr_scale + off); - -#ifndef CONV_INDEX - if (jk_size == 2) { - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - - s01 = buff0[0]; - s11 = buff1[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - - } else if (jk_size == 3) { - - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - - } else /* if (jk_size == 4) */ { - - dp = ((mlib_addr)dl & 7) ? buffe : (mlib_d64*)dl; - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; - s31 = buff3[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize/8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s30 = s31; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s31 = buff3[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - s3 = vis_faligndata(s30, s31); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - d30 = vis_fmul8x16au(vis_read_hi(s3), k3); - d31 = vis_fmul8x16au(vis_read_lo(s3), k3); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d0 = vis_fpadd16(d0, d30); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d1 = vis_fpadd16(d1, d31); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s20 = s21; - s30 = s31; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s31 = buff3[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - s3 = vis_faligndata(s30, s31); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - d30 = vis_fmul8x16au(vis_read_hi(s3), k3); - d31 = vis_fmul8x16au(vis_read_lo(s3), k3); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d0 = vis_fpadd16(d0, d30); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d1 = vis_fpadd16(d1, d31); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - } - - if ((mlib_u8*)dp != dl) mlib_ImageCopy_na((void*)buffe, dl, xsize); - } - -#else /* CONV_INDEX */ - - if (jk_size == 2) { - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d2 = buffd[2*i + 2]; - d3 = buffd[2*i + 3]; - d4 = buffd[2*i + 4]; - d5 = buffd[2*i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - - buffe[i ] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - buffd[2*i + 2] = drnd; - buffd[2*i + 3] = drnd; - buffd[2*i + 4] = drnd; - buffd[2*i + 5] = drnd; - - LOAD_SRC(); - } - - } else /* if (jk_size == 3) */ { - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d20, d21, d22, d23, d24, d25; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - mlib_d64 s20 = buff2[i]; - mlib_d64 s21 = buff2[i + 1]; - mlib_d64 s22 = buff2[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - d20 = vis_fmul8x16au(vis_read_hi(s20), k2); - d21 = vis_fmul8x16au(vis_read_lo(s20), k2); - d22 = vis_fmul8x16au(vis_read_hi(s21), k2); - d23 = vis_fmul8x16au(vis_read_lo(s21), k2); - d24 = vis_fmul8x16au(vis_read_hi(s22), k2); - d25 = vis_fmul8x16au(vis_read_lo(s22), k2); - - d0 = buffd[2*i]; - d1 = buffd[2*i + 1]; - d2 = buffd[2*i + 2]; - d3 = buffd[2*i + 3]; - d4 = buffd[2*i + 4]; - d5 = buffd[2*i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d2 = vis_fpadd16(d2, d22); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d3 = vis_fpadd16(d3, d23); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d4 = vis_fpadd16(d4, d24); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - d5 = vis_fpadd16(d5, d25); - - buffe[i ] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2*i ] = drnd; - buffd[2*i + 1] = drnd; - buffd[2*i + 2] = drnd; - buffd[2*i + 3] = drnd; - buffd[2*i + 4] = drnd; - buffd[2*i + 5] = drnd; - - LOAD_SRC(); - } - } -#endif /* CONV_INDEX */ - -#ifdef CONV_INDEX - mlib_ImageColorTrue2IndexLine_U8_U8_3((void*)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - - sl += sll; - dl += dll; - - buff_ind++; - if (buff_ind >= (n + 1)) buff_ind = 0; - } - - mlib_free(pbuff); - if (buffs != buffs_local) mlib_free(buffs); - - return MLIB_SUCCESS; -} - -/***************************************************************/ diff --git a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConv_8nw.c b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConv_8nw.c index ac2e5f025a6..0605fa4fa84 100644 --- a/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConv_8nw.c +++ b/jdk/src/java.desktop/unix/native/libmlib_image/mlib_v_ImageConv_8nw.c @@ -34,58 +34,16 @@ #include "vis_proto.h" #include "mlib_image.h" #include "mlib_ImageCheck.h" -#include "mlib_ImageColormap.h" #include "mlib_ImageCopy.h" #include "mlib_ImageConv.h" #include "mlib_v_ImageConv.h" -/* - This defines switches between functions in - files: mlib_v_ImageConvIndex3_8_8nw.c, - mlib_v_ImageConvIndex4_8_8nw.c, - mlib_v_ImageConvIndex3_8_16nw.c, - mlib_v_ImageConvIndex4_8_16nw.c -*/ - -/*#define CONV_INDEX*/ - /***************************************************************/ #define DTYPE mlib_u8 -#define LTYPE mlib_u8 /***************************************************************/ -#ifdef CONV_INDEX - -#define CONV_FUNC(KERN) \ - mlib_conv##KERN##_Index3_8_8nw(mlib_image *dst, \ - const mlib_image *src, \ - const mlib_s32 *kern, \ - mlib_s32 scale, \ - const void *colormap) - -#else - -#define CONV_FUNC(KERN) \ - mlib_conv##KERN##_8nw_f(mlib_image *dst, \ - const mlib_image *src, \ - const mlib_s32 *kern, \ - mlib_s32 scale) - -#endif /* CONV_INDEX */ - -#define ColorTrue2IndexLine mlib_ImageColorTrue2IndexLine_U8_U8_3 - -/***************************************************************/ -#ifdef CONV_INDEX - -#define NCHAN 3 - -#else - #define NCHAN nchan -#endif /* CONV_INDEX */ - /***************************************************************/ #define DEF_VARS \ DTYPE *sl, *sp, *dl; \ @@ -103,104 +61,9 @@ mlib_s32 i, j, l /***************************************************************/ -#ifdef CONV_INDEX - -#define DEF_EXTRA_VARS \ - mlib_s32 offset = mlib_ImageGetLutOffset(colormap); \ - LTYPE **lut_table = (LTYPE**)mlib_ImageGetLutData(colormap); \ - LTYPE *ltbl0 = lut_table[0] - offset; \ - LTYPE *ltbl1 = lut_table[1] - offset; \ - LTYPE *ltbl2 = lut_table[2] - offset; \ - LTYPE *ltbl3 = (NCHAN > 3) ? lut_table[3] - offset : ltbl2 - -#else - #define DEF_EXTRA_VARS \ mlib_s32 nchan = mlib_ImageGetChannels(dst) -#endif /* CONV_INDEX */ - -/***************************************************************/ -#if NCHAN == 3 - -#define LOAD_SRC() { \ - mlib_s32 s0 = sp[0], s1 = sp[1], s2 = sp[2], s3 = sp[3]; \ - mlib_s32 s4 = sp[4], s5 = sp[5], s6 = sp[6], s7 = sp[7]; \ - mlib_d64 t0, t1, t2; \ - \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s7), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s6), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s5), t2); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s5), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s4), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s2), t1); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s2), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s2), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s0), t0); \ - \ - buffn[i] = t0; \ - buffn[i + 1] = t1; \ - buffn[i + 2] = t2; \ - \ - sp += 8; \ - } - -#else - -#define LOAD_SRC() { \ - mlib_s32 s0 = sp[0], s1 = sp[1], s2 = sp[2], s3 = sp[3]; \ - mlib_s32 s4 = sp[4], s5 = sp[5], s6 = sp[6], s7 = sp[7]; \ - mlib_d64 t0, t1, t2; \ - \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl3, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s5), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl3, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl2, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl1, s4), t2); \ - t2 = vis_faligndata(vis_ld_u8_i(ltbl0, s4), t2); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl3, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s3), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl3, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl2, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl1, s2), t1); \ - t1 = vis_faligndata(vis_ld_u8_i(ltbl0, s2), t1); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl3, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s1), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl3, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl2, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl1, s0), t0); \ - t0 = vis_faligndata(vis_ld_u8_i(ltbl0, s0), t0); \ - \ - buffn[i] = t0; \ - buffn[i + 1] = t1; \ - buffn[i + 2] = t2; \ - \ - sp += 6; \ - } - -#endif /* NCHAN == 3 */ - /***************************************************************/ static const mlib_s32 mlib_round_8[16] = { 0x00400040, 0x00200020, 0x00100010, 0x00080008, @@ -210,651 +73,8 @@ static const mlib_s32 mlib_round_8[16] = { }; /***************************************************************/ -#define KSIZE 2 - -mlib_status CONV_FUNC(2x2) -{ - mlib_d64 *buffs[2 * (KSIZE + 1)]; - mlib_d64 *buff0, *buff1, *buffn, *buffd, *buffe; - mlib_d64 s00, s01, s10, s11, s0, s1; - mlib_d64 d0, d1, d00, d01, d10, d11; - DEF_VARS; - DEF_EXTRA_VARS; - - sl = adr_src; - dl = adr_dst; - - ssize = NCHAN * wid; - dsize = (ssize + 7) / 8; - esize = dsize + 4; - pbuff = mlib_malloc((KSIZE + 4) * esize * sizeof(mlib_d64)); - - if (pbuff == NULL) - return MLIB_FAILURE; - - for (i = 0; i < (KSIZE + 1); i++) - buffs[i] = pbuff + i * esize; - for (i = 0; i < (KSIZE + 1); i++) - buffs[(KSIZE + 1) + i] = buffs[i]; - buffd = buffs[KSIZE] + esize; - buffe = buffd + 2 * esize; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - xsize = ssize - NCHAN * (KSIZE - 1); - emask = (0xFF00 >> (xsize & 7)) & 0xFF; - - vis_write_gsr(gsr_scale + 7); - - for (l = 0; l < KSIZE; l++) { - mlib_d64 *buffn = buffs[l]; - sp = sl + l * sll; - -#ifndef CONV_INDEX - - if ((mlib_addr) sp & 7) - mlib_ImageCopy_na((void *)sp, (void *)buffn, ssize); - -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } - -#endif /* CONV_INDEX */ - } - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind; - mlib_f32 *pk = karr, k0, k1; - sp = sl + KSIZE * sll; - - buff0 = buffc[0]; - buff1 = buffc[1]; - buffn = buffc[KSIZE]; - -#ifndef CONV_INDEX - - if ((((mlib_addr) (sl)) & 7) == 0) - buff0 = (mlib_d64 *) sl; - - if ((((mlib_addr) (sl + sll)) & 7) == 0) - buff1 = (mlib_d64 *) (sl + sll); - - if ((mlib_addr) sp & 7) - mlib_ImageCopy_na((void *)sp, (void *)buffn, ssize); -#endif /* CONV_INDEX */ - - k0 = pk[1]; - k1 = pk[3]; - vis_write_gsr(gsr_scale + NCHAN); - - s01 = buff0[0]; - s11 = buff1[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7) / 8; i++) { - s00 = s01; - s10 = s11; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = vis_fpadd16(d00, d10); - d1 = vis_fpadd16(d01, d11); - buffd[2 * i] = d0; - buffd[2 * i + 1] = d1; - } - - k0 = pk[0]; - k1 = pk[2]; -#ifndef CONV_INDEX - dp = ((mlib_addr) dl & 7) ? buffe : (mlib_d64 *) dl; - -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - s0 = buff0[i]; - s1 = buff1[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - dp[i] = vis_fpack16_pair(d0, d1); - } - - if (emask) { - s0 = buff0[i]; - s1 = buff1[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - - d0 = vis_fpack16_pair(d0, d1); - vis_pst_8(d0, dp + i, emask); - } - - if ((mlib_u8 *) dp != dl) - mlib_ImageCopy_na((void *)buffe, dl, xsize); - -#else - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d2 = buffd[2 * i + 2]; - d3 = buffd[2 * i + 3]; - d4 = buffd[2 * i + 4]; - d5 = buffd[2 * i + 5]; - d00 = vis_fpadd16(d00, d10); - d0 = vis_fpadd16(d0, drnd); - d0 = vis_fpadd16(d0, d00); - d01 = vis_fpadd16(d01, d11); - d1 = vis_fpadd16(d1, drnd); - d1 = vis_fpadd16(d1, d01); - d02 = vis_fpadd16(d02, d12); - d2 = vis_fpadd16(d2, drnd); - d2 = vis_fpadd16(d2, d02); - d03 = vis_fpadd16(d03, d13); - d3 = vis_fpadd16(d3, drnd); - d3 = vis_fpadd16(d3, d03); - d04 = vis_fpadd16(d04, d14); - d4 = vis_fpadd16(d4, drnd); - d4 = vis_fpadd16(d4, d04); - d05 = vis_fpadd16(d05, d15); - d5 = vis_fpadd16(d5, drnd); - d5 = vis_fpadd16(d5, d05); - - buffe[i] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - LOAD_SRC(); - } - - ColorTrue2IndexLine((void *)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - - sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= (KSIZE + 1)) - buff_ind = 0; - } - - mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE -#define KSIZE 3 - -mlib_status CONV_FUNC(3x3) -{ - mlib_d64 *buffs[2 * (KSIZE + 1)]; - mlib_d64 *buff0, *buff1, *buff2, *buffn, *buffd, *buffe; - mlib_d64 s00, s01, s10, s11, s20, s21, s0, s1, s2; - mlib_d64 dd, d0, d1, d00, d01, d10, d11, d20, d21; - mlib_s32 ik, ik_last, off, doff; - DEF_VARS; - DEF_EXTRA_VARS; - - sl = adr_src; -#ifdef CONV_INDEX - dl = adr_dst + ((KSIZE - 1) / 2) * (dll + 1); -#else - dl = adr_dst + ((KSIZE - 1) / 2) * (dll + NCHAN); -#endif /* CONV_INDEX */ - - ssize = NCHAN * wid; - dsize = (ssize + 7) / 8; - esize = dsize + 4; - pbuff = mlib_malloc((KSIZE + 4) * esize * sizeof(mlib_d64)); - - if (pbuff == NULL) - return MLIB_FAILURE; - - for (i = 0; i < (KSIZE + 1); i++) - buffs[i] = pbuff + i * esize; - for (i = 0; i < (KSIZE + 1); i++) - buffs[(KSIZE + 1) + i] = buffs[i]; - buffd = buffs[KSIZE] + esize; - buffe = buffd + 2 * esize; - - wid -= (KSIZE - 1); - hgt -= (KSIZE - 1); - xsize = ssize - NCHAN * (KSIZE - 1); - emask = (0xFF00 >> (xsize & 7)) & 0xFF; - - vis_write_gsr(gsr_scale + 7); - - for (l = 0; l < KSIZE; l++) { - mlib_d64 *buffn = buffs[l]; - sp = sl + l * sll; - -#ifndef CONV_INDEX - - if ((mlib_addr) sp & 7) - mlib_ImageCopy_na((void *)sp, (void *)buffn, ssize); -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } - -#endif /* CONV_INDEX */ - } - - /* init buffer */ -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7) / 8; i++) { - buffd[2 * i] = drnd; - buffd[2 * i + 1] = drnd; - } - - for (j = 0; j < hgt; j++) { - mlib_d64 **buffc = buffs + buff_ind, *pbuff0, *pbuff1, *pbuff2; - mlib_f32 *pk = karr, k0, k1, k2; - sp = sl + KSIZE * sll; - - pbuff0 = buffc[0]; - pbuff1 = buffc[1]; - pbuff2 = buffc[2]; - buffn = buffc[KSIZE]; - -#ifndef CONV_INDEX - - if ((((mlib_addr) (sl)) & 7) == 0) - pbuff0 = (mlib_d64 *) sl; - - if ((((mlib_addr) (sl + sll)) & 7) == 0) - pbuff1 = (mlib_d64 *) (sl + sll); - - if ((((mlib_addr) (sl + 2 * sll)) & 7) == 0) - pbuff2 = (mlib_d64 *) (sl + 2 * sll); - - if ((mlib_addr) sp & 7) - mlib_ImageCopy_na((void *)sp, (void *)buffn, ssize); -#endif /* CONV_INDEX */ - -#ifdef CONV_INDEX - ik_last = 0; -#else - ik_last = (KSIZE - 1); -#endif /* CONV_INDEX */ - - for (ik = 0; ik < KSIZE; ik++) { - k0 = pk[ik]; - k1 = pk[ik + KSIZE]; - k2 = pk[ik + 2 * KSIZE]; - - off = ik * NCHAN; - doff = off / 8; - off &= 7; - buff0 = pbuff0 + doff; - buff1 = pbuff1 + doff; - buff2 = pbuff2 + doff; - vis_write_gsr(gsr_scale + off); - - if (ik == ik_last) - continue; - /*if (!ik_last) { - * if ((off & 3) || (ik == (KSIZE - 1))) { - * ik_last = ik; - * continue; - * } - * } */ - - if (off == 0) { -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7) / 8; i++) { - s0 = buff0[i]; - s1 = buff1[i]; - s2 = buff2[i]; - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2 * i] = d0; - buffd[2 * i + 1] = d1; - } - } - else if (off == 4) { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7) / 8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - - d00 = vis_fmul8x16au(vis_read_lo(s00), k0); - d01 = vis_fmul8x16au(vis_read_hi(s01), k0); - d10 = vis_fmul8x16au(vis_read_lo(s10), k1); - d11 = vis_fmul8x16au(vis_read_hi(s11), k1); - d20 = vis_fmul8x16au(vis_read_lo(s20), k2); - d21 = vis_fmul8x16au(vis_read_hi(s21), k2); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2 * i] = d0; - buffd[2 * i + 1] = d1; - } - } - else { - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < (xsize + 7) / 8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d0 = vis_fpadd16(d00, d0); - d0 = vis_fpadd16(d10, d0); - d0 = vis_fpadd16(d20, d0); - d1 = vis_fpadd16(d01, d1); - d1 = vis_fpadd16(d11, d1); - d1 = vis_fpadd16(d21, d1); - buffd[2 * i] = d0; - buffd[2 * i + 1] = d1; - } - } - } - - k0 = pk[ik_last]; - k1 = pk[ik_last + KSIZE]; - k2 = pk[ik_last + 2 * KSIZE]; - - off = ik_last * NCHAN; - doff = off / 8; - off &= 7; - buff0 = pbuff0 + doff; - buff1 = pbuff1 + doff; - buff2 = pbuff2 + doff; - vis_write_gsr(gsr_scale + off); - -#ifndef CONV_INDEX - dp = ((mlib_addr) dl & 7) ? buffe : (mlib_d64 *) dl; - - s01 = buff0[0]; - s11 = buff1[0]; - s21 = buff2[0]; -#pragma pipeloop(0) - for (i = 0; i < xsize / 8; i++) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - dp[i] = dd; - - buffd[2 * i] = drnd; - buffd[2 * i + 1] = drnd; - } - - if (emask) { - s00 = s01; - s10 = s11; - s20 = s21; - s01 = buff0[i + 1]; - s11 = buff1[i + 1]; - s21 = buff2[i + 1]; - s0 = vis_faligndata(s00, s01); - s1 = vis_faligndata(s10, s11); - s2 = vis_faligndata(s20, s21); - - d00 = vis_fmul8x16au(vis_read_hi(s0), k0); - d01 = vis_fmul8x16au(vis_read_lo(s0), k0); - d10 = vis_fmul8x16au(vis_read_hi(s1), k1); - d11 = vis_fmul8x16au(vis_read_lo(s1), k1); - d20 = vis_fmul8x16au(vis_read_hi(s2), k2); - d21 = vis_fmul8x16au(vis_read_lo(s2), k2); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - - dd = vis_fpack16_pair(d0, d1); - vis_pst_8(dd, dp + i, emask); - - buffd[2 * i] = drnd; - buffd[2 * i + 1] = drnd; - } - - if ((mlib_u8 *) dp != dl) - mlib_ImageCopy_na((void *)buffe, dl, xsize); - -#else - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d20, d21, d22, d23, d24, d25; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - mlib_d64 s20 = buff2[i]; - mlib_d64 s21 = buff2[i + 1]; - mlib_d64 s22 = buff2[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - d20 = vis_fmul8x16au(vis_read_hi(s20), k2); - d21 = vis_fmul8x16au(vis_read_lo(s20), k2); - d22 = vis_fmul8x16au(vis_read_hi(s21), k2); - d23 = vis_fmul8x16au(vis_read_lo(s21), k2); - d24 = vis_fmul8x16au(vis_read_hi(s22), k2); - d25 = vis_fmul8x16au(vis_read_lo(s22), k2); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d2 = buffd[2 * i + 2]; - d3 = buffd[2 * i + 3]; - d4 = buffd[2 * i + 4]; - d5 = buffd[2 * i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d2 = vis_fpadd16(d2, d22); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d3 = vis_fpadd16(d3, d23); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d4 = vis_fpadd16(d4, d24); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - d5 = vis_fpadd16(d5, d25); - - buffe[i] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2 * i] = drnd; - buffd[2 * i + 1] = drnd; - buffd[2 * i + 2] = drnd; - buffd[2 * i + 3] = drnd; - buffd[2 * i + 4] = drnd; - buffd[2 * i + 5] = drnd; - - LOAD_SRC(); - } - - ColorTrue2IndexLine((void *)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - - sl += sll; - dl += dll; - - buff_ind++; - - if (buff_ind >= (KSIZE + 1)) - buff_ind = 0; - } - - mlib_free(pbuff); - - return MLIB_SUCCESS; -} - -/***************************************************************/ -#undef KSIZE #define MAX_N 11 -#ifdef CONV_INDEX - -mlib_status mlib_convMxN_Index3_8_8nw(mlib_image *dst, - const mlib_image *src, - mlib_s32 m, - mlib_s32 n, - mlib_s32 dm, - mlib_s32 dn, - const mlib_s32 *kern, - mlib_s32 scale, - const void *colormap) -#else - mlib_status mlib_convMxN_8nw_f(mlib_image *dst, const mlib_image *src, mlib_s32 m, @@ -863,7 +83,6 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, mlib_s32 dn, const mlib_s32 *kern, mlib_s32 scale) -#endif /* CONV_INDEX */ { mlib_d64 *buffs_local[3 * (MAX_N + 1)], **buffs = buffs_local, **buff; mlib_d64 *buff0, *buff1, *buff2, *buff3, *buffn, *buffd, *buffe; @@ -884,11 +103,7 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, buff = buffs + 2 * (n + 1); sl = adr_src; -#ifdef CONV_INDEX - dl = adr_dst + dn * dll + dm; -#else dl = adr_dst + dn * dll + dm * NCHAN; -#endif /* CONV_INDEX */ ssize = NCHAN * wid; dsize = (ssize + 7) / 8; @@ -919,17 +134,8 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, mlib_d64 *buffn = buffs[l]; sp = sl + l * sll; -#ifndef CONV_INDEX - if ((mlib_addr) sp & 7) mlib_ImageCopy_na((void *)sp, (void *)buffn, ssize); -#else -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - LOAD_SRC(); - } - -#endif /* CONV_INDEX */ } /* init buffer */ @@ -950,7 +156,6 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, buffn = buffc[n]; -#ifndef CONV_INDEX for (l = 0; l < n; l++) { if ((((mlib_addr) (sl + l * sll)) & 7) == 0) buff[l] = (mlib_d64 *) (sl + l * sll); @@ -958,31 +163,18 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, if ((mlib_addr) sp & 7) mlib_ImageCopy_na((void *)sp, (void *)buffn, ssize); -#endif /* CONV_INDEX */ -#ifdef CONV_INDEX - ik_last = 0; -#else ik_last = (m - 1); -#endif /* CONV_INDEX */ for (jk = 0; jk < n; jk += jk_size) { jk_size = n - jk; -#ifdef CONV_INDEX - - if (jk_size >= 5) - jk_size = 3; - - if (jk_size == 4) - jk_size = 2; -#else if (jk_size >= 6) jk_size = 4; if (jk_size == 5) jk_size = 3; -#endif /* CONV_INDEX */ + coff = 0; if (jk_size == 1) { @@ -1335,21 +527,12 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, *****************************************/ jk_size = n; -#ifdef CONV_INDEX - - if (jk_size >= 5) - jk_size = 3; - - if (jk_size == 4) - jk_size = 2; -#else if (jk_size >= 6) jk_size = 4; if (jk_size == 5) jk_size = 3; -#endif /* CONV_INDEX */ k0 = karr[ik_last]; k1 = karr[ik_last + m]; @@ -1365,8 +548,6 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, buff3 = buff[3] + doff; vis_write_gsr(gsr_scale + off); -#ifndef CONV_INDEX - if (jk_size == 1) { dp = ((mlib_addr) dl & 7) ? buffe : (mlib_d64 *) dl; @@ -1652,200 +833,6 @@ mlib_status mlib_convMxN_8nw_f(mlib_image *dst, mlib_ImageCopy_na((void *)buffe, dl, xsize); } -#else /* CONV_INDEX */ - - if (jk_size == 1) { - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d2 = buffd[2 * i + 2]; - d3 = buffd[2 * i + 3]; - d4 = buffd[2 * i + 4]; - d5 = buffd[2 * i + 5]; - d0 = vis_fpadd16(d0, d00); - d1 = vis_fpadd16(d1, d01); - d2 = vis_fpadd16(d2, d02); - d3 = vis_fpadd16(d3, d03); - d4 = vis_fpadd16(d4, d04); - d5 = vis_fpadd16(d5, d05); - - buffe[i] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2 * i] = drnd; - buffd[2 * i + 1] = drnd; - buffd[2 * i + 2] = drnd; - buffd[2 * i + 3] = drnd; - buffd[2 * i + 4] = drnd; - buffd[2 * i + 5] = drnd; - - LOAD_SRC(); - } - } - else if (jk_size == 2) { - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d2 = buffd[2 * i + 2]; - d3 = buffd[2 * i + 3]; - d4 = buffd[2 * i + 4]; - d5 = buffd[2 * i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - - buffe[i] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2 * i] = drnd; - buffd[2 * i + 1] = drnd; - buffd[2 * i + 2] = drnd; - buffd[2 * i + 3] = drnd; - buffd[2 * i + 4] = drnd; - buffd[2 * i + 5] = drnd; - - LOAD_SRC(); - } - } - else { /* if (jk_size == 3) */ - - vis_write_gsr(gsr_scale + 7); - -#pragma pipeloop(0) - for (i = 0; i < dsize; i += 3) { - mlib_d64 d00, d01, d02, d03, d04, d05; - mlib_d64 d10, d11, d12, d13, d14, d15; - mlib_d64 d20, d21, d22, d23, d24, d25; - mlib_d64 d0, d1, d2, d3, d4, d5; - mlib_d64 s00 = buff0[i]; - mlib_d64 s01 = buff0[i + 1]; - mlib_d64 s02 = buff0[i + 2]; - mlib_d64 s10 = buff1[i]; - mlib_d64 s11 = buff1[i + 1]; - mlib_d64 s12 = buff1[i + 2]; - mlib_d64 s20 = buff2[i]; - mlib_d64 s21 = buff2[i + 1]; - mlib_d64 s22 = buff2[i + 2]; - - d00 = vis_fmul8x16au(vis_read_hi(s00), k0); - d01 = vis_fmul8x16au(vis_read_lo(s00), k0); - d02 = vis_fmul8x16au(vis_read_hi(s01), k0); - d03 = vis_fmul8x16au(vis_read_lo(s01), k0); - d04 = vis_fmul8x16au(vis_read_hi(s02), k0); - d05 = vis_fmul8x16au(vis_read_lo(s02), k0); - d10 = vis_fmul8x16au(vis_read_hi(s10), k1); - d11 = vis_fmul8x16au(vis_read_lo(s10), k1); - d12 = vis_fmul8x16au(vis_read_hi(s11), k1); - d13 = vis_fmul8x16au(vis_read_lo(s11), k1); - d14 = vis_fmul8x16au(vis_read_hi(s12), k1); - d15 = vis_fmul8x16au(vis_read_lo(s12), k1); - d20 = vis_fmul8x16au(vis_read_hi(s20), k2); - d21 = vis_fmul8x16au(vis_read_lo(s20), k2); - d22 = vis_fmul8x16au(vis_read_hi(s21), k2); - d23 = vis_fmul8x16au(vis_read_lo(s21), k2); - d24 = vis_fmul8x16au(vis_read_hi(s22), k2); - d25 = vis_fmul8x16au(vis_read_lo(s22), k2); - - d0 = buffd[2 * i]; - d1 = buffd[2 * i + 1]; - d2 = buffd[2 * i + 2]; - d3 = buffd[2 * i + 3]; - d4 = buffd[2 * i + 4]; - d5 = buffd[2 * i + 5]; - d0 = vis_fpadd16(d0, d00); - d0 = vis_fpadd16(d0, d10); - d0 = vis_fpadd16(d0, d20); - d1 = vis_fpadd16(d1, d01); - d1 = vis_fpadd16(d1, d11); - d1 = vis_fpadd16(d1, d21); - d2 = vis_fpadd16(d2, d02); - d2 = vis_fpadd16(d2, d12); - d2 = vis_fpadd16(d2, d22); - d3 = vis_fpadd16(d3, d03); - d3 = vis_fpadd16(d3, d13); - d3 = vis_fpadd16(d3, d23); - d4 = vis_fpadd16(d4, d04); - d4 = vis_fpadd16(d4, d14); - d4 = vis_fpadd16(d4, d24); - d5 = vis_fpadd16(d5, d05); - d5 = vis_fpadd16(d5, d15); - d5 = vis_fpadd16(d5, d25); - - buffe[i] = vis_fpack16_pair(d0, d1); - buffe[i + 1] = vis_fpack16_pair(d2, d3); - buffe[i + 2] = vis_fpack16_pair(d4, d5); - - buffd[2 * i] = drnd; - buffd[2 * i + 1] = drnd; - buffd[2 * i + 2] = drnd; - buffd[2 * i + 3] = drnd; - buffd[2 * i + 4] = drnd; - buffd[2 * i + 5] = drnd; - - LOAD_SRC(); - } - } - -#endif /* CONV_INDEX */ - -#ifdef CONV_INDEX - ColorTrue2IndexLine((void *)buffe, dl, wid, colormap); -#endif /* CONV_INDEX */ - sl += sll; dl += dll; diff --git a/jdk/src/java.desktop/windows/classes/sun/java2d/windows/WindowsFlags.java b/jdk/src/java.desktop/windows/classes/sun/java2d/windows/WindowsFlags.java index 4973ac389bd..8fc1a827e38 100644 --- a/jdk/src/java.desktop/windows/classes/sun/java2d/windows/WindowsFlags.java +++ b/jdk/src/java.desktop/windows/classes/sun/java2d/windows/WindowsFlags.java @@ -55,8 +55,6 @@ public class WindowsFlags { * This flag can force us to use d3d * anyway in these situations. Or, this flag can force us to * not use d3d in a situation where we would use it otherwise. - * translAccelEnabled: usage: "-Dsun.java2d.translaccel=true" - * equivalent to sun.java2d.d3d=true * offscreenSharingEnabled: usage: "-Dsun.java2d.offscreenSharing=true" * Turns on the ability to share a hardware-accelerated * offscreen surface through the JAWT interface. See @@ -67,23 +65,6 @@ public class WindowsFlags { * without being very sure that we will be willing to support * that API in the future regardless of other native * rendering pipeline changes. - * accelReset: usage: "-Dsun.java2d.accelReset" - * This flag tells us to reset any persistent information - * the display device acceleration characteristics so that - * we are forced to retest these characteristics. This flag - * is primarily used for debugging purposes (to allow testing - * of the persistent storage mechanisms) but may also be - * needed by some users if, for example, a driver upgrade - * may change the runtime characteristics and they want the - * tests to be re-run. - * checkRegistry: usage: "-Dsun.java2d.checkRegistry" - * This flag tells us to output the current registry settings - * (after our initialization) to the console. - * disableRegistry: usage: "-Dsun.java2d.disableRegistry" - * This flag tells us to disable all registry-related - * activities. It is mainly here for debugging purposes, - * to allow us to see whether any runtime bugs are caused - * by or related to registry problems. * magPresent: usage: "-Djavax.accessibility.screen_magnifier_present" * This flag is set either on the command line or in the * properties file. It tells Swing whether the user is @@ -121,9 +102,6 @@ public class WindowsFlags { private static boolean oglEnabled; private static boolean oglVerbose; private static boolean offscreenSharingEnabled; - private static boolean accelReset; - private static boolean checkRegistry; - private static boolean disableRegistry; private static boolean magPresent; private static boolean setHighDPIAware; // TODO: other flags, including nopixfmt @@ -234,11 +212,6 @@ public class WindowsFlags { } offscreenSharingEnabled = getBooleanProp("sun.java2d.offscreenSharing", false); - accelReset = getBooleanProp("sun.java2d.accelReset", false); - checkRegistry = - getBooleanProp("sun.java2d.checkRegistry", false); - disableRegistry = - getBooleanProp("sun.java2d.disableRegistry", false); String dpiOverride = System.getProperty("sun.java2d.dpiaware"); if (dpiOverride != null) { setHighDPIAware = dpiOverride.equalsIgnoreCase("true"); @@ -265,22 +238,12 @@ public class WindowsFlags { System.out.println("WindowsFlags (Java):"); System.out.println(" ddEnabled: " + ddEnabled + "\n" + " ddOffscreenEnabled: " + ddOffscreenEnabled + "\n" + - " ddVramForced: " + ddVramForced + "\n" + - " ddLockEnabled: " + ddLockEnabled + "\n" + - " ddLockSet: " + ddLockSet + "\n" + - " ddBlitEnabled: " + ddBlitEnabled + "\n" + - " ddScaleEnabled: " + ddScaleEnabled + "\n" + " d3dEnabled: " + d3dEnabled + "\n" + " d3dSet: " + d3dSet + "\n" + " oglEnabled: " + oglEnabled + "\n" + " oglVerbose: " + oglVerbose + "\n" + " gdiBlitEnabled: " + gdiBlitEnabled + "\n" + - " translAccelEnabled: " + translAccelEnabled + "\n" + - " offscreenSharingEnabled: " + offscreenSharingEnabled + "\n" + - " accelReset: " + accelReset + "\n" + - " checkRegistry: " + checkRegistry + "\n" + - " disableRegistry: " + disableRegistry + "\n" + - " d3dTexBPP: " + d3dTexBpp); + " offscreenSharingEnabled: " + offscreenSharingEnabled); */ } @@ -304,10 +267,6 @@ public class WindowsFlags { return gdiBlitEnabled; } - public static boolean isTranslucentAccelerationEnabled() { - return d3dEnabled; - } - public static boolean isOffscreenSharingEnabled() { return offscreenSharingEnabled; } diff --git a/jdk/src/java.desktop/windows/native/libawt/java2d/d3d/D3DBadHardware.h b/jdk/src/java.desktop/windows/native/libawt/java2d/d3d/D3DBadHardware.h index 91ee7b358a4..115626c857c 100644 --- a/jdk/src/java.desktop/windows/native/libawt/java2d/d3d/D3DBadHardware.h +++ b/jdk/src/java.desktop/windows/native/libawt/java2d/d3d/D3DBadHardware.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,131 +51,8 @@ typedef struct ADAPTER_INFO { static const ADAPTER_INFO badHardware[] = { - // Intel HD - // Clarkdale (Desktop) GMA HD Lines - { 0x8086, 0x0042, NO_VERSION, OS_ALL }, - // Arrandale (Mobile) GMA HD Lines - { 0x8086, 0x0046, NO_VERSION, OS_ALL }, - - // Sandy Bridge HD Graphics 3000/2000 - { 0x8086, 0x0102, NO_VERSION, OS_ALL }, - { 0x8086, 0x0106, NO_VERSION, OS_ALL }, - { 0x8086, 0x0112, NO_VERSION, OS_ALL }, - { 0x8086, 0x0116, NO_VERSION, OS_ALL }, - { 0x8086, 0x0122, NO_VERSION, OS_ALL }, - { 0x8086, 0x0126, NO_VERSION, OS_ALL }, - { 0x8086, 0x010A, NO_VERSION, OS_ALL }, - - // Ivy Bridge - { 0x8086, 0x0162, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0162, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0166, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0166, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x016A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x016A, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0152, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0152, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0156, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0156, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x015A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x015A, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - - // Haswell - { 0x8086, 0x0402, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0402, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0406, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0406, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0412, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0412, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0416, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0416, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x041E, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x041E, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x040A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x040A, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x041A, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x041A, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0A06, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0A06, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0A16, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0A16, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0A26, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0A26, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0A2E, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0A2E, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0A1E, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0A1E, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0A0E, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0A0E, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0D26, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0D26, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - { 0x8086, 0x0D22, D_VERSION(6,14,10,5437), OS_WINXP | OS_WINXP_64 }, - { 0x8086, 0x0D22, D_VERSION(9,18,10,3257), OS_VISTA | OS_WINDOWS7 }, - - // Reason: workaround for 6620073, 6612195 - // Intel 740 - { 0x8086, 0x7800, NO_VERSION, OS_ALL }, - { 0x8086, 0x1240, NO_VERSION, OS_ALL }, - { 0x8086, 0x7121, NO_VERSION, OS_ALL }, - { 0x8086, 0x7123, NO_VERSION, OS_ALL }, - { 0x8086, 0x7125, NO_VERSION, OS_ALL }, - { 0x8086, 0x1132, NO_VERSION, OS_ALL }, - // IEG - { 0x8086, 0x2562, NO_VERSION, OS_ALL }, - { 0x8086, 0x3577, NO_VERSION, OS_ALL }, - { 0x8086, 0x2572, NO_VERSION, OS_ALL }, - { 0x8086, 0x3582, NO_VERSION, OS_ALL }, - { 0x8086, 0x358E, NO_VERSION, OS_ALL }, - // GMA - { 0x8086, 0x2582, NO_VERSION, OS_ALL }, - { 0x8086, 0x2782, NO_VERSION, OS_ALL }, - { 0x8086, 0x2592, NO_VERSION, OS_ALL }, - { 0x8086, 0x2792, NO_VERSION, OS_ALL }, - { 0x8086, 0x2772, NO_VERSION, OS_ALL }, - { 0x8086, 0x2776, NO_VERSION, OS_ALL }, - { 0x8086, 0x27A2, NO_VERSION, OS_ALL }, - { 0x8086, 0x27A6, NO_VERSION, OS_ALL }, - { 0x8086, 0x27AE, NO_VERSION, OS_ALL }, - { 0x8086, 0x29D2, NO_VERSION, OS_ALL }, - { 0x8086, 0x29D3, NO_VERSION, OS_ALL }, - { 0x8086, 0x29B2, NO_VERSION, OS_ALL }, - { 0x8086, 0x29B3, NO_VERSION, OS_ALL }, - { 0x8086, 0x29C2, NO_VERSION, OS_ALL }, - { 0x8086, 0x29C3, NO_VERSION, OS_ALL }, - { 0x8086, 0xA001, NO_VERSION, OS_ALL }, - { 0x8086, 0xA002, NO_VERSION, OS_ALL }, - { 0x8086, 0xA011, NO_VERSION, OS_ALL }, - { 0x8086, 0xA012, NO_VERSION, OS_ALL }, - // GMA - { 0x8086, 0x2972, NO_VERSION, OS_ALL }, - { 0x8086, 0x2973, NO_VERSION, OS_ALL }, - { 0x8086, 0x2992, NO_VERSION, OS_ALL }, - { 0x8086, 0x2993, NO_VERSION, OS_ALL }, - { 0x8086, 0x29A2, NO_VERSION, OS_ALL }, - { 0x8086, 0x29A3, NO_VERSION, OS_ALL }, - { 0x8086, 0x2982, NO_VERSION, OS_ALL }, - { 0x8086, 0x2983, NO_VERSION, OS_ALL }, - { 0x8086, 0x2A02, NO_VERSION, OS_ALL }, - { 0x8086, 0x2A03, NO_VERSION, OS_ALL }, - { 0x8086, 0x2A12, NO_VERSION, OS_ALL }, - { 0x8086, 0x2A13, NO_VERSION, OS_ALL }, - - // Eaglelake (Desktop) GMA 4500 Lines - { 0x8086, 0x2E42, NO_VERSION, OS_ALL }, - { 0x8086, 0x2E43, NO_VERSION, OS_ALL }, - { 0x8086, 0x2E92, NO_VERSION, OS_ALL }, - { 0x8086, 0x2E93, NO_VERSION, OS_ALL }, - { 0x8086, 0x2E12, NO_VERSION, OS_ALL }, - { 0x8086, 0x2E13, NO_VERSION, OS_ALL }, - // Eaglelake (Desktop) GMA X4500 Lines - { 0x8086, 0x2E32, NO_VERSION, OS_ALL }, - { 0x8086, 0x2E33, NO_VERSION, OS_ALL }, - { 0x8086, 0x2E22, NO_VERSION, OS_ALL }, - // Eaglelake (Desktop) GMA X4500HD Lines - { 0x8086, 0x2E23, NO_VERSION, OS_ALL }, - // Cantiga (Mobile) GMA 4500MHD Lines - { 0x8086, 0x2A42, NO_VERSION, OS_ALL }, - { 0x8086, 0x2A43, NO_VERSION, OS_ALL }, + // All Intel Chips. + { 0x8086, ALL_DEVICEIDS, NO_VERSION, OS_ALL }, // ATI Mobility Radeon X1600, X1400, X1450, X1300, X1350 // Reason: workaround for 6613066, 6687166 diff --git a/jdk/src/java.desktop/windows/native/libawt/java2d/windows/WindowsFlags.cpp b/jdk/src/java.desktop/windows/native/libawt/java2d/windows/WindowsFlags.cpp index 1de213f838e..528e95e326a 100644 --- a/jdk/src/java.desktop/windows/native/libawt/java2d/windows/WindowsFlags.cpp +++ b/jdk/src/java.desktop/windows/native/libawt/java2d/windows/WindowsFlags.cpp @@ -27,13 +27,10 @@ #include "Trace.h" #include "WindowsFlags.h" -BOOL accelReset; // reset registry 2d acceleration settings BOOL useD3D = TRUE; // d3d enabled flag // initially is TRUE to allow D3D preloading BOOL forceD3DUsage; // force d3d on or off jboolean g_offscreenSharing; // JAWT accelerated surface sharing -BOOL checkRegistry; // Diagnostic tool: outputs 2d registry settings -BOOL disableRegistry; // Diagnostic tool: disables registry interaction BOOL setHighDPIAware; // Whether to set the high-DPI awareness flag extern WCHAR *j2dAccelKey; // Name of java2d root key @@ -95,12 +92,6 @@ void GetFlagValues(JNIEnv *env, jclass wFlagsClass) g_offscreenSharing = GetStaticBoolean(env, wFlagsClass, "offscreenSharingEnabled"); JNU_CHECK_EXCEPTION(env); - accelReset = GetStaticBoolean(env, wFlagsClass, "accelReset"); - JNU_CHECK_EXCEPTION(env); - checkRegistry = GetStaticBoolean(env, wFlagsClass, "checkRegistry"); - JNU_CHECK_EXCEPTION(env); - disableRegistry = GetStaticBoolean(env, wFlagsClass, "disableRegistry"); - JNU_CHECK_EXCEPTION(env); setHighDPIAware = (IS_WINVISTA && GetStaticBoolean(env, wFlagsClass, "setHighDPIAware")); @@ -113,12 +104,6 @@ void GetFlagValues(JNIEnv *env, jclass wFlagsClass) (forceD3DUsage ? "true" : "false")); J2dTraceLn1(J2D_TRACE_INFO, " offscreenSharing = %s", (g_offscreenSharing ? "true" : "false")); - J2dTraceLn1(J2D_TRACE_INFO, " accelReset = %s", - (accelReset ? "true" : "false")); - J2dTraceLn1(J2D_TRACE_INFO, " checkRegistry = %s", - (checkRegistry ? "true" : "false")); - J2dTraceLn1(J2D_TRACE_INFO, " disableRegistry = %s", - (disableRegistry ? "true" : "false")); J2dTraceLn1(J2D_TRACE_INFO, " setHighDPIAware = %s", (setHighDPIAware ? "true" : "false")); } diff --git a/jdk/src/java.desktop/windows/native/libawt/java2d/windows/WindowsFlags.h b/jdk/src/java.desktop/windows/native/libawt/java2d/windows/WindowsFlags.h index 68a51e4e940..1a3f0418a6f 100644 --- a/jdk/src/java.desktop/windows/native/libawt/java2d/windows/WindowsFlags.h +++ b/jdk/src/java.desktop/windows/native/libawt/java2d/windows/WindowsFlags.h @@ -27,12 +27,9 @@ #ifndef WINDOWSFLAGS_H #define WINDOWSFLAGS_H -extern BOOL accelReset; // reset registry 2d acceleration settings extern BOOL useD3D; // d3d enabled flag extern BOOL forceD3DUsage; // force d3d on or off extern jboolean g_offscreenSharing; // JAWT accelerated surface sharing -extern BOOL checkRegistry; // Diag tool: outputs 2d registry settings -extern BOOL disableRegistry; // Diag tool: disables registry interaction extern BOOL setHighDPIAware; // whether to set High DPI Aware flag on Vista void SetD3DEnabledFlag(JNIEnv *env, BOOL d3dEnabled, BOOL d3dSet); diff --git a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp index 746b1114488..781d4c5201e 100644 --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp @@ -2720,6 +2720,7 @@ KeyMapEntry keyMapTable[] = { {java_awt_event_KeyEvent_VK_SHIFT, VK_SHIFT}, {java_awt_event_KeyEvent_VK_CONTROL, VK_CONTROL}, {java_awt_event_KeyEvent_VK_ALT, VK_MENU}, + {java_awt_event_KeyEvent_VK_ALT_GRAPH, VK_RMENU}, {java_awt_event_KeyEvent_VK_NUM_LOCK, VK_NUMLOCK}, // Miscellaneous Windows keys diff --git a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Robot.cpp b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Robot.cpp index 0528148e23e..3baf7f7448c 100644 --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Robot.cpp +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Robot.cpp @@ -335,6 +335,9 @@ void AwtRobot::DoKeyEvent( jint jkey, DWORD dwFlags ) } else { // get the scancode from the virtual key scancode = ::MapVirtualKey(vkey, 0); + if (vkey == VK_RMENU) { + dwFlags |= KEYEVENTF_EXTENDEDKEY; + } keybd_event(vkey, scancode, dwFlags, 0); } } diff --git a/jdk/src/java.desktop/windows/native/libawt/windows/awt_TrayIcon.cpp b/jdk/src/java.desktop/windows/native/libawt/windows/awt_TrayIcon.cpp index 56280a583ac..b7ec441d556 100644 --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_TrayIcon.cpp +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_TrayIcon.cpp @@ -93,6 +93,12 @@ AwtTrayIcon::~AwtTrayIcon() { void AwtTrayIcon::Dispose() { SendTrayMessage(NIM_DELETE); + + // Destroy the icon to avoid leak of GDI objects + if (m_nid.hIcon != NULL) { + ::DestroyIcon(m_nid.hIcon); + } + UnlinkObjects(); if (--sm_instCount == 0) { diff --git a/jdk/src/java.httpclient/share/classes/java/net/http/AsyncSSLDelegate.java b/jdk/src/java.httpclient/share/classes/java/net/http/AsyncSSLDelegate.java index b3ff5c311e4..ae0d19c6cde 100644 --- a/jdk/src/java.httpclient/share/classes/java/net/http/AsyncSSLDelegate.java +++ b/jdk/src/java.httpclient/share/classes/java/net/http/AsyncSSLDelegate.java @@ -26,7 +26,6 @@ package java.net.http; import java.io.Closeable; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Arrays; import java.util.LinkedList; import java.util.concurrent.ExecutorService; import java.util.function.Consumer; @@ -557,25 +556,37 @@ public class AsyncSSLDelegate implements Closeable, AsyncConnection { } static void logParams(SSLParameters p) { - if (!Log.ssl()) + if (!Log.ssl()) { return; + } + Log.logSSL("SSLParameters:"); if (p == null) { Log.logSSL("Null params"); return; } - for (String cipher : p.getCipherSuites()) { - Log.logSSL("cipher: {0}\n", cipher); + + if (p.getCipherSuites() != null) { + for (String cipher : p.getCipherSuites()) { + Log.logSSL("cipher: {0}\n", cipher); + } } + + // SSLParameters.getApplicationProtocols() can't return null for (String approto : p.getApplicationProtocols()) { Log.logSSL("application protocol: {0}\n", approto); } - for (String protocol : p.getProtocols()) { - Log.logSSL("protocol: {0}\n", protocol); + + if (p.getProtocols() != null) { + for (String protocol : p.getProtocols()) { + Log.logSSL("protocol: {0}\n", protocol); + } } - if (p.getServerNames() != null) + + if (p.getServerNames() != null) { for (SNIServerName sname : p.getServerNames()) { Log.logSSL("server name: {0}\n", sname.toString()); + } } } diff --git a/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java b/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java index 446987d6b5d..226cee95c55 100644 --- a/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java +++ b/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java @@ -35,6 +35,7 @@ import java.nio.channels.ClosedChannelException; import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; +import java.nio.channels.SocketChannel; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Iterator; @@ -155,6 +156,15 @@ class HttpClientImpl extends HttpClient implements BufferHandler { selmgr.register(exchange); } + /** + * Only used from RawChannel to disconnect the channel from + * the selector + */ + void cancelRegistration(SocketChannel s) { + selmgr.cancel(s); + } + + Http2ClientImpl client2() { return client2; } @@ -220,6 +230,13 @@ class HttpClientImpl extends HttpClient implements BufferHandler { selector.wakeup(); } + synchronized void cancel(SocketChannel e) { + SelectionKey key = e.keyFor(selector); + if (key != null) + key.cancel(); + selector.wakeup(); + } + void wakeupSelector() { selector.wakeup(); } diff --git a/jdk/src/java.httpclient/share/classes/java/net/http/HttpResponseImpl.java b/jdk/src/java.httpclient/share/classes/java/net/http/HttpResponseImpl.java index 10758d6db99..dcbfbdb8f1a 100644 --- a/jdk/src/java.httpclient/share/classes/java/net/http/HttpResponseImpl.java +++ b/jdk/src/java.httpclient/share/classes/java/net/http/HttpResponseImpl.java @@ -176,7 +176,7 @@ class HttpResponseImpl extends HttpResponse { * * @return */ - RawChannel rawChannel() { + RawChannel rawChannel() throws IOException { if (rawchan == null) { rawchan = new RawChannel(request.client(), connection); } diff --git a/jdk/src/java.httpclient/share/classes/java/net/http/Log.java b/jdk/src/java.httpclient/share/classes/java/net/http/Log.java index 991edfefa6c..51e5ce9633e 100644 --- a/jdk/src/java.httpclient/share/classes/java/net/http/Log.java +++ b/jdk/src/java.httpclient/share/classes/java/net/http/Log.java @@ -88,7 +88,7 @@ abstract class Log implements System.Logger { logging |= TRACE; break; case "all": - logging |= CONTENT|HEADERS|REQUESTS|FRAMES|ERRORS|TRACE; + logging |= CONTENT|HEADERS|REQUESTS|FRAMES|ERRORS|TRACE|SSL; break; } if (val.startsWith("frames")) { diff --git a/jdk/src/java.httpclient/share/classes/java/net/http/RawChannel.java b/jdk/src/java.httpclient/share/classes/java/net/http/RawChannel.java index e4dc3b00b8d..5f6fb4df6c0 100644 --- a/jdk/src/java.httpclient/share/classes/java/net/http/RawChannel.java +++ b/jdk/src/java.httpclient/share/classes/java/net/http/RawChannel.java @@ -29,6 +29,7 @@ import java.nio.channels.ByteChannel; import java.nio.channels.GatheringByteChannel; import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; +import java.nio.channels.SocketChannel; // // Used to implement WebSocket. Each RawChannel corresponds to a TCP connection @@ -56,9 +57,21 @@ final class RawChannel implements ByteChannel, GatheringByteChannel { interface NonBlockingEvent extends RawEvent { } - RawChannel(HttpClientImpl client, HttpConnection connection) { + RawChannel(HttpClientImpl client, HttpConnection connection) + throws IOException { this.client = client; this.connection = connection; + SocketChannel chan = connection.channel(); + client.cancelRegistration(chan); + chan.configureBlocking(false); + } + + SocketChannel socketChannel() { + return connection.channel(); + } + + ByteBuffer getRemaining() { + return connection.getRemaining(); } private class RawAsyncEvent extends AsyncEvent { diff --git a/jdk/src/java.httpclient/share/classes/java/net/http/WSOpeningHandshake.java b/jdk/src/java.httpclient/share/classes/java/net/http/WSOpeningHandshake.java index 6a7ddaa882c..d3cc7da3520 100644 --- a/jdk/src/java.httpclient/share/classes/java/net/http/WSOpeningHandshake.java +++ b/jdk/src/java.httpclient/share/classes/java/net/http/WSOpeningHandshake.java @@ -24,6 +24,8 @@ */ package java.net.http; +import java.io.UncheckedIOException; +import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; @@ -126,6 +128,8 @@ final class WSOpeningHandshake { return CompletableFuture.completedFuture(result); } catch (WebSocketHandshakeException e) { return CompletableFuture.failedFuture(e); + } catch (UncheckedIOException ee) { + return CompletableFuture.failedFuture(ee.getCause()); } }); } @@ -149,7 +153,12 @@ final class WSOpeningHandshake { checkAccept(response, h); checkExtensions(response, h); String subprotocol = checkAndReturnSubprotocol(response, h); - RawChannel channel = ((HttpResponseImpl) response).rawChannel(); + RawChannel channel = null; + try { + channel = ((HttpResponseImpl) response).rawChannel(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } return new Result(subprotocol, channel); } diff --git a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java index bc06286e8da..f429452419e 100644 --- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java +++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java @@ -2506,15 +2506,12 @@ public class LogManager { } } - // Management Support - private static LoggingMXBean loggingMXBean = null; /** * String representation of the * {@link javax.management.ObjectName} for the management interface * for the logging facility. * * @see java.lang.management.PlatformLoggingMXBean - * @see java.util.logging.LoggingMXBean * * @since 1.5 */ @@ -2523,24 +2520,21 @@ public class LogManager { /** * Returns {@code LoggingMXBean} for managing loggers. - * An alternative way to manage loggers is through the - * {@link java.lang.management.PlatformLoggingMXBean} interface - * that can be obtained by calling: - *
      -     *     PlatformLoggingMXBean logging = {@link java.lang.management.ManagementFactory#getPlatformMXBean(Class)
      -     *         ManagementFactory.getPlatformMXBean}(PlatformLoggingMXBean.class);
      -     * 
      * * @return a {@link LoggingMXBean} object. * + * @deprecated {@code java.util.logging.LoggingMXBean} is deprecated and + * replaced with {@code java.lang.management.PlatformLoggingMXBean}. Use + * {@link java.lang.management.ManagementFactory#getPlatformMXBean(Class) + * ManagementFactory.getPlatformMXBean}(PlatformLoggingMXBean.class) + * instead. + * * @see java.lang.management.PlatformLoggingMXBean * @since 1.5 */ + @Deprecated(since="9") public static synchronized LoggingMXBean getLoggingMXBean() { - if (loggingMXBean == null) { - loggingMXBean = new Logging(); - } - return loggingMXBean; + return Logging.getInstance(); } /** diff --git a/jdk/src/java.logging/share/classes/java/util/logging/Logging.java b/jdk/src/java.logging/share/classes/java/util/logging/Logging.java index 70c59503e4e..716e8bc150d 100644 --- a/jdk/src/java.logging/share/classes/java/util/logging/Logging.java +++ b/jdk/src/java.logging/share/classes/java/util/logging/Logging.java @@ -44,16 +44,18 @@ import java.util.ArrayList; * @see Logger * @see LogManager */ -class Logging implements LoggingMXBean { +@SuppressWarnings("deprecation") // implements LoggingMXBean +final class Logging implements LoggingMXBean { private static LogManager logManager = LogManager.getLogManager(); /** Constructor of Logging which is the implementation class * of LoggingMXBean. */ - Logging() { + private Logging() { } + @Override public List getLoggerNames() { Enumeration loggers = logManager.getLoggerNames(); ArrayList array = new ArrayList<>(); @@ -65,6 +67,7 @@ class Logging implements LoggingMXBean { } private static String EMPTY_STRING = ""; + @Override public String getLoggerLevel(String loggerName) { Logger l = logManager.getLogger(loggerName); if (l == null) { @@ -79,6 +82,7 @@ class Logging implements LoggingMXBean { } } + @Override public void setLoggerLevel(String loggerName, String levelName) { if (loggerName == null) { throw new NullPointerException("loggerName is null"); @@ -102,6 +106,7 @@ class Logging implements LoggingMXBean { logger.setLevel(level); } + @Override public String getParentLoggerName( String loggerName ) { Logger l = logManager.getLogger( loggerName ); if (l == null) { @@ -116,4 +121,11 @@ class Logging implements LoggingMXBean { return p.getName(); } } + + static Logging getInstance() { + return INSTANCE; + } + + private static final Logging INSTANCE = new Logging(); + } diff --git a/jdk/src/java.logging/share/classes/java/util/logging/LoggingMXBean.java b/jdk/src/java.logging/share/classes/java/util/logging/LoggingMXBean.java index 9d545d8d28d..812eb36622d 100644 --- a/jdk/src/java.logging/share/classes/java/util/logging/LoggingMXBean.java +++ b/jdk/src/java.logging/share/classes/java/util/logging/LoggingMXBean.java @@ -27,30 +27,23 @@ package java.util.logging; /** - * The management interface for the logging facility. It is recommended - * to use the {@link java.lang.management.PlatformLoggingMXBean} management - * interface that implements all attributes defined in this - * {@code LoggingMXBean}. The - * {@link java.lang.management.ManagementFactory#getPlatformMXBean(Class) - * ManagementFactory.getPlatformMXBean} method can be used to obtain - * the {@code PlatformLoggingMXBean} object representing the management - * interface for logging. + * The management interface for the logging facility. * - *

      There is a single global instance of the {@code LoggingMXBean}. - * This instance is an {@link javax.management.MXBean MXBean} that - * can be obtained by calling the {@link LogManager#getLoggingMXBean} - * method or from the - * {@linkplain java.lang.management.ManagementFactory#getPlatformMBeanServer + * {@link java.lang.management.PlatformLoggingMXBean + * java.lang.management.PlatformLoggingMXBean} is the management interface + * for logging facility registered in the {@link + * java.lang.management.ManagementFactory#getPlatformMBeanServer() * platform MBeanServer}. - *

      - * The {@link javax.management.ObjectName ObjectName} that uniquely identifies - * the management interface for logging within the {@code MBeanServer} is: - *

      - *    {@link LogManager#LOGGING_MXBEAN_NAME java.util.logging:type=Logging}
      - * 
      - *

      - * The instance registered in the platform {@code MBeanServer} - * is also a {@link java.lang.management.PlatformLoggingMXBean}. + * It is recommended to use the {@code PlatformLoggingMXBean} obtained via + * the {@link java.lang.management.ManagementFactory#getPlatformMXBean(Class) + * ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class)} method. + * + * @deprecated {@code LoggingMXBean} is no longer a {@link + * java.lang.management.PlatformManagedObject platform MXBean} and is replaced + * with {@link java.lang.management.PlatformLoggingMXBean}. + * It will not register in the platform {@code MBeanServer}. + * Use {@code ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class)} + * instead. * * @author Ron Mann * @author Mandy Chung @@ -58,6 +51,7 @@ package java.util.logging; * * @see java.lang.management.PlatformLoggingMXBean */ +@Deprecated(since="9") public interface LoggingMXBean { /** diff --git a/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java b/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java index 8d0083ff807..9a6252add85 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java +++ b/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java @@ -598,9 +598,8 @@ public class ManagementFactory { try { final ObjectName objName = new ObjectName(mxbeanName); - // skip the isInstanceOf check for LoggingMXBean String intfName = mxbeanInterface.getName(); - if (!connection.isInstanceOf(objName, intfName)) { + if (!isInstanceOf(connection, objName, intfName)) { throw new IllegalArgumentException(mxbeanName + " is not an instance of " + mxbeanInterface); } @@ -616,6 +615,33 @@ public class ManagementFactory { } } + // This makes it possible to obtain an instance of LoggingMXBean + // using newPlatformMXBeanProxy(mbs, on, LoggingMXBean.class) + // even though the underlying MXBean no longer implements + // java.util.logging.LoggingMXBean. + // Altough java.util.logging.LoggingMXBean is deprecated, an application + // that uses newPlatformMXBeanProxy(mbs, on, LoggingMXBean.class) will + // continue to work. + // + private static boolean isInstanceOf(MBeanServerConnection connection, + ObjectName objName, String intfName) + throws InstanceNotFoundException, IOException + { + // special case for java.util.logging.LoggingMXBean. + // java.util.logging.LoggingMXBean is deprecated and + // replaced with java.lang.management.PlatformLoggingMXBean, + // so we will consider that any MBean implementing + // java.lang.management.PlatformLoggingMXBean also implements + // java.util.logging.LoggingMXBean. + if ("java.util.logging.LoggingMXBean".equals(intfName)) { + if (connection.isInstanceOf(objName, + PlatformLoggingMXBean.class.getName())) { + return true; + } + } + return connection.isInstanceOf(objName, intfName); + } + /** * Returns the platform MXBean implementing * the given {@code mxbeanInterface} which is specified diff --git a/jdk/src/java.management/share/classes/java/lang/management/PlatformLoggingMXBean.java b/jdk/src/java.management/share/classes/java/lang/management/PlatformLoggingMXBean.java index d18d0b30c40..80595dd75d6 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/PlatformLoggingMXBean.java +++ b/jdk/src/java.management/share/classes/java/lang/management/PlatformLoggingMXBean.java @@ -44,10 +44,6 @@ package java.lang.management; * {@link java.util.logging.LogManager#LOGGING_MXBEAN_NAME java.util.logging:type=Logging} * * - *

      The instance registered in the platform {@code MBeanServer} with - * this {@code ObjectName} implements all attributes defined by - * {@link java.util.logging.LoggingMXBean}. - * * @since 1.7 */ public interface PlatformLoggingMXBean extends PlatformManagedObject { diff --git a/jdk/src/java.management/share/classes/sun/management/ManagementFactoryHelper.java b/jdk/src/java.management/share/classes/sun/management/ManagementFactoryHelper.java index 44682b29971..4eb5742b2ba 100644 --- a/jdk/src/java.management/share/classes/sun/management/ManagementFactoryHelper.java +++ b/jdk/src/java.management/share/classes/sun/management/ManagementFactoryHelper.java @@ -26,6 +26,8 @@ package sun.management; import java.lang.management.*; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.MBeanServer; @@ -43,9 +45,13 @@ import jdk.internal.misc.SharedSecrets; import java.util.ArrayList; import java.util.List; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Module; +import java.lang.reflect.UndeclaredThrowableException; import java.security.PrivilegedAction; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; /** * ManagementFactoryHelper provides static factory methods to create @@ -66,6 +72,7 @@ public class ManagementFactoryHelper { return jvm; } + static final String LOGGING_MXBEAN_NAME = "java.util.logging:type=Logging"; private static ClassLoadingImpl classMBean = null; private static MemoryImpl memoryMBean = null; private static ThreadImpl threadMBean = null; @@ -145,74 +152,138 @@ public class ManagementFactoryHelper { } public static PlatformLoggingMXBean getPlatformLoggingMXBean() { - if (LoggingMXBeanSupport.isAvailable()) { - return PlatformLoggingImpl.instance; + if (LoggingMXBeanAccess.isAvailable()) { + return PlatformLoggingImpl.MBEAN; } else { return null; } } public static boolean isPlatformLoggingMXBeanAvailable() { - return LoggingMXBeanSupport.isAvailable(); + return LoggingMXBeanAccess.isAvailable(); } - /** - * The logging MXBean object is an instance of - * PlatformLoggingMXBean and java.util.logging.LoggingMXBean - * but it can't directly implement two MXBean interfaces - * as a compliant MXBean implements exactly one MXBean interface, - * or if it implements one interface that is a subinterface of - * all the others; otherwise, it is a non-compliant MXBean - * and MBeanServer will throw NotCompliantMBeanException. - * See the Definition of an MXBean section in javax.management.MXBean spec. - * - * To create a compliant logging MXBean, define a LoggingMXBean interface - * that extend PlatformLoggingMXBean and j.u.l.LoggingMXBean - */ - public interface LoggingMXBean - extends PlatformLoggingMXBean, java.util.logging.LoggingMXBean { - } - - // This is a trick: if java.util.logging is not present then - // attempting to access something that implements - // java.util.logging.LoggingMXBean will trigger a CNFE. - // So we cannot directly call any static method or access any static field - // on PlatformLoggingImpl, as we would risk raising a CNFE. - // Instead we use this intermediate LoggingMXBeanSupport class to determine + // The LoggingMXBeanAccess class uses reflection to determine // whether java.util.logging is present, and load the actual LoggingMXBean // implementation. // - static final class LoggingMXBeanSupport { - final static Object loggingImpl = - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Object run() { - try { - // create a LoggingProxyImpl instance when - // java.util.logging classes exist - Class c = Class.forName("java.util.logging.Logging", true, null); - Constructor cons = c.getDeclaredConstructor(); - cons.setAccessible(true); - return cons.newInstance(); - } catch (ClassNotFoundException cnf) { - return null; - } catch (NoSuchMethodException | InstantiationException - | IllegalAccessException | InvocationTargetException e) { - throw new AssertionError(e); - } - }}); + static final class LoggingMXBeanAccess { + + final static String LOG_MANAGER_CLASS_NAME = "java.util.logging.LogManager"; + final static String LOGGING_MXBEAN_CLASS_NAME = "java.util.logging.LoggingMXBean"; + final static Class LOG_MANAGER_CLASS = loadLoggingClass(LOG_MANAGER_CLASS_NAME); static boolean isAvailable() { - return loggingImpl != null; + return LOG_MANAGER_CLASS != null; } + + private static Class loadLoggingClass(String className) { + return AccessController.doPrivileged(new PrivilegedAction<>() { + @Override + public Class run() { + Optional logging = java.lang.reflect.Layer.boot() + .findModule("java.logging"); + if (logging.isPresent()) { + return Class.forName(logging.get(), className); + } + return null; + } + }); + } + + private Map initMethodMap(Object impl) { + if (impl == null) { + return Collections.emptyMap(); + } + Class intfClass = loadLoggingClass(LOGGING_MXBEAN_CLASS_NAME); + final Map methodsMap = new HashMap<>(); + for (Method m : intfClass.getMethods()) { + try { + // Sanity checking: all public methods present in + // java.util.logging.LoggingMXBean should + // also be in PlatformLoggingMXBean + Method specMethod = PlatformLoggingMXBean.class + .getMethod(m.getName(), m.getParameterTypes()); + if (specMethod.getReturnType().isAssignableFrom(m.getReturnType())) { + if (methodsMap.putIfAbsent(m.getName(), m) != null) { + throw new RuntimeException("unexpected polymorphic method: " + + m.getName()); + } + } + } catch (NoSuchMethodException x) { + // All methods in java.util.logging.LoggingMXBean should + // also be in PlatformLoggingMXBean + throw new InternalError(x); + } + } + return Collections.unmodifiableMap(methodsMap); + } + + private static Object getMXBeanImplementation() { + if (!isAvailable()) { + // should not happen + throw new NoClassDefFoundError(LOG_MANAGER_CLASS_NAME); + } + try { + final Method m = LOG_MANAGER_CLASS.getMethod("getLoggingMXBean"); + return m.invoke(null); + } catch (NoSuchMethodException + | IllegalAccessException + | InvocationTargetException x) { + throw new ExceptionInInitializerError(x); + } + } + + // The implementation object, which will be invoked through + // reflection. The implementation does not need to implement + // PlatformLoggingMXBean, but must declare the same methods + // with same signatures, and they must be public, with one + // exception: + // getObjectName will not be called on the implementation object, + // so the implementation object does not need to declare such + // a method. + final Object impl = getMXBeanImplementation(); + final Map methods = initMethodMap(impl); + + LoggingMXBeanAccess() { + } + + T invoke(String methodName, Object... args) { + Method m = methods.get(methodName); + if (m == null) { + throw new UnsupportedOperationException(methodName); + } + try { + @SuppressWarnings("unchecked") + T result = (T) m.invoke(impl, args); + return result; + } catch (IllegalAccessException ex) { + throw new UnsupportedOperationException(ex); + } catch (InvocationTargetException ex) { + throw unwrap(ex); + } + } + + private static RuntimeException unwrap(InvocationTargetException x) { + Throwable t = x.getCause(); + if (t instanceof RuntimeException) { + return (RuntimeException)t; + } + if (t instanceof Error) { + throw (Error)t; + } + return new UndeclaredThrowableException(t == null ? x : t); + } + + } - static class PlatformLoggingImpl implements LoggingMXBean - { - final static java.util.logging.LoggingMXBean impl = - (java.util.logging.LoggingMXBean) LoggingMXBeanSupport.loggingImpl; - final static PlatformLoggingMXBean instance = new PlatformLoggingImpl(); - final static String LOGGING_MXBEAN_NAME = "java.util.logging:type=Logging"; + static final class PlatformLoggingImpl implements PlatformLoggingMXBean { + + private final LoggingMXBeanAccess loggingAccess; + private PlatformLoggingImpl(LoggingMXBeanAccess loggingAccess) { + this.loggingAccess = loggingAccess; + } private volatile ObjectName objname; // created lazily @Override @@ -232,23 +303,29 @@ public class ManagementFactoryHelper { @Override public java.util.List getLoggerNames() { - return impl.getLoggerNames(); + return loggingAccess.invoke("getLoggerNames"); } @Override public String getLoggerLevel(String loggerName) { - return impl.getLoggerLevel(loggerName); + return loggingAccess.invoke("getLoggerLevel", loggerName); } @Override public void setLoggerLevel(String loggerName, String levelName) { - impl.setLoggerLevel(loggerName, levelName); + loggingAccess.invoke("setLoggerLevel", loggerName, levelName); } @Override public String getParentLoggerName(String loggerName) { - return impl.getParentLoggerName(loggerName); + return loggingAccess.invoke("getParentLoggerName", loggerName); } + + private static PlatformLoggingImpl getInstance() { + return new PlatformLoggingImpl(new LoggingMXBeanAccess()); + } + + static final PlatformLoggingMXBean MBEAN = getInstance(); } private static List bufferPools = null; diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/PrincipalName.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/PrincipalName.java index e60507fe443..b3a0e8bea38 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/PrincipalName.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/PrincipalName.java @@ -424,6 +424,9 @@ public class PrincipalName implements Cloneable { } catch (UnknownHostException | SecurityException e) { // not canonicalized or no permission to do so, use old } + if (hostName.endsWith(".")) { + hostName = hostName.substring(0, hostName.length() - 1); + } nameParts[1] = hostName.toLowerCase(Locale.ENGLISH); } nameStrings = nameParts; diff --git a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java index 2c9337d6404..9b7edac4d33 100644 --- a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java +++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java @@ -2498,6 +2498,12 @@ public class ConsoleReader //ignore } + if (o instanceof Runnable) { + ((Runnable) o).run(); + sb.setLength(0); + continue; + } + // Search mode. // // Note that we have to do this first, because if there is a command diff --git a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/extra/EditingHistory.java b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/extra/EditingHistory.java new file mode 100644 index 00000000000..7e4bbbff6a4 --- /dev/null +++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/extra/EditingHistory.java @@ -0,0 +1,418 @@ +/* + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.jline.extra; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.function.Supplier; + +import jdk.internal.jline.console.ConsoleReader; +import jdk.internal.jline.console.KeyMap; +import jdk.internal.jline.console.history.History; +import jdk.internal.jline.console.history.History.Entry; +import jdk.internal.jline.console.history.MemoryHistory; + +/*Public for tests (HistoryTest). + */ +public abstract class EditingHistory implements History { + + private final History fullHistory; + private History currentDelegate; + + protected EditingHistory(ConsoleReader in, Iterable originalHistory) { + this.fullHistory = new MemoryHistory(); + this.currentDelegate = fullHistory; + bind(in, CTRL_UP, + (Runnable) () -> moveHistoryToSnippet(in, ((EditingHistory) in.getHistory())::previousSnippet)); + bind(in, CTRL_DOWN, + (Runnable) () -> moveHistoryToSnippet(in, ((EditingHistory) in.getHistory())::nextSnippet)); + load(originalHistory); + } + + private void moveHistoryToSnippet(ConsoleReader in, Supplier action) { + if (!action.get()) { + try { + in.beep(); + } catch (IOException ex) { + throw new IllegalStateException(ex); + } + } else { + try { + //could use: + //in.resetPromptLine(in.getPrompt(), in.getHistory().current().toString(), -1); + //but that would mean more re-writing on the screen, (and prints an additional + //empty line), so using setBuffer directly: + Method setBuffer = in.getClass().getDeclaredMethod("setBuffer", String.class); + + setBuffer.setAccessible(true); + setBuffer.invoke(in, in.getHistory().current().toString()); + in.flush(); + } catch (ReflectiveOperationException | IOException ex) { + throw new IllegalStateException(ex); + } + } + } + + private void bind(ConsoleReader in, String shortcut, Object action) { + KeyMap km = in.getKeys(); + for (int i = 0; i < shortcut.length(); i++) { + Object value = km.getBound(Character.toString(shortcut.charAt(i))); + if (value instanceof KeyMap) { + km = (KeyMap) value; + } else { + km.bind(shortcut.substring(i), action); + } + } + } + + private static final String CTRL_UP = "\033\133\061\073\065\101"; //Ctrl-UP + private static final String CTRL_DOWN = "\033\133\061\073\065\102"; //Ctrl-DOWN + + @Override + public int size() { + return currentDelegate.size(); + } + + @Override + public boolean isEmpty() { + return currentDelegate.isEmpty(); + } + + @Override + public int index() { + return currentDelegate.index(); + } + + @Override + public void clear() { + if (currentDelegate != fullHistory) + throw new IllegalStateException("narrowed"); + currentDelegate.clear(); + } + + @Override + public CharSequence get(int index) { + return currentDelegate.get(index); + } + + @Override + public void add(CharSequence line) { + NarrowingHistoryLine currentLine = null; + int origIndex = fullHistory.index(); + int fullSize; + try { + fullHistory.moveToEnd(); + fullSize = fullHistory.index(); + if (currentDelegate == fullHistory) { + if (origIndex < fullHistory.index()) { + for (Entry entry : fullHistory) { + if (!(entry.value() instanceof NarrowingHistoryLine)) + continue; + int[] cluster = ((NarrowingHistoryLine) entry.value()).span; + if (cluster[0] == origIndex && cluster[1] > cluster[0]) { + currentDelegate = new MemoryHistory(); + for (int i = cluster[0]; i <= cluster[1]; i++) { + currentDelegate.add(fullHistory.get(i)); + } + } + } + } + } + fullHistory.moveToEnd(); + while (fullHistory.previous()) { + CharSequence c = fullHistory.current(); + if (c instanceof NarrowingHistoryLine) { + currentLine = (NarrowingHistoryLine) c; + break; + } + } + } finally { + fullHistory.moveTo(origIndex); + } + if (currentLine == null || currentLine.span[1] != (-1)) { + line = currentLine = new NarrowingHistoryLine(line, fullSize); + } + StringBuilder complete = new StringBuilder(); + for (int i = currentLine.span[0]; i < fullSize; i++) { + complete.append(fullHistory.get(i)); + } + complete.append(line); + if (isComplete(complete)) { + currentLine.span[1] = fullSize; //TODO: +1? + currentDelegate = fullHistory; + } + fullHistory.add(line); + } + + protected abstract boolean isComplete(CharSequence input); + + @Override + public void set(int index, CharSequence item) { + if (currentDelegate != fullHistory) + throw new IllegalStateException("narrowed"); + currentDelegate.set(index, item); + } + + @Override + public CharSequence remove(int i) { + if (currentDelegate != fullHistory) + throw new IllegalStateException("narrowed"); + return currentDelegate.remove(i); + } + + @Override + public CharSequence removeFirst() { + if (currentDelegate != fullHistory) + throw new IllegalStateException("narrowed"); + return currentDelegate.removeFirst(); + } + + @Override + public CharSequence removeLast() { + if (currentDelegate != fullHistory) + throw new IllegalStateException("narrowed"); + return currentDelegate.removeLast(); + } + + @Override + public void replace(CharSequence item) { + if (currentDelegate != fullHistory) + throw new IllegalStateException("narrowed"); + currentDelegate.replace(item); + } + + @Override + public ListIterator entries(int index) { + return currentDelegate.entries(index); + } + + @Override + public ListIterator entries() { + return currentDelegate.entries(); + } + + @Override + public Iterator iterator() { + return currentDelegate.iterator(); + } + + @Override + public CharSequence current() { + return currentDelegate.current(); + } + + @Override + public boolean previous() { + return currentDelegate.previous(); + } + + @Override + public boolean next() { + return currentDelegate.next(); + } + + @Override + public boolean moveToFirst() { + return currentDelegate.moveToFirst(); + } + + @Override + public boolean moveToLast() { + return currentDelegate.moveToLast(); + } + + @Override + public boolean moveTo(int index) { + return currentDelegate.moveTo(index); + } + + @Override + public void moveToEnd() { + currentDelegate.moveToEnd(); + } + + public boolean previousSnippet() { + for (int i = index() - 1; i >= 0; i--) { + if (get(i) instanceof NarrowingHistoryLine) { + moveTo(i); + return true; + } + } + + return false; + } + + public boolean nextSnippet() { + for (int i = index() + 1; i < size(); i++) { + if (get(i) instanceof NarrowingHistoryLine) { + moveTo(i); + return true; + } + } + + if (index() < size()) { + moveToEnd(); + return true; + } + + return false; + } + + public final void load(Iterable originalHistory) { + NarrowingHistoryLine currentHistoryLine = null; + boolean start = true; + int currentLine = 0; + for (String historyItem : originalHistory) { + StringBuilder line = new StringBuilder(historyItem); + int trailingBackSlashes = countTrailintBackslashes(line); + boolean continuation = trailingBackSlashes % 2 != 0; + line.delete(line.length() - trailingBackSlashes / 2 - (continuation ? 1 : 0), line.length()); + if (start) { + class PersistentNarrowingHistoryLine extends NarrowingHistoryLine implements PersistentEntryMarker { + public PersistentNarrowingHistoryLine(CharSequence delegate, int start) { + super(delegate, start); + } + } + fullHistory.add(currentHistoryLine = new PersistentNarrowingHistoryLine(line, currentLine)); + } else { + class PersistentLine implements CharSequence, PersistentEntryMarker { + private final CharSequence delegate; + public PersistentLine(CharSequence delegate) { + this.delegate = delegate; + } + @Override public int length() { + return delegate.length(); + } + @Override public char charAt(int index) { + return delegate.charAt(index); + } + @Override public CharSequence subSequence(int start, int end) { + return delegate.subSequence(start, end); + } + @Override public String toString() { + return delegate.toString(); + } + } + fullHistory.add(new PersistentLine(line)); + } + start = !continuation; + currentHistoryLine.span[1] = currentLine; + currentLine++; + } + } + + public Collection save() { + Collection result = new ArrayList<>(); + Iterator entries = fullHistory.iterator(); + + if (entries.hasNext()) { + Entry entry = entries.next(); + while (entry != null) { + StringBuilder historyLine = new StringBuilder(entry.value()); + int trailingBackSlashes = countTrailintBackslashes(historyLine); + for (int i = 0; i < trailingBackSlashes; i++) { + historyLine.append("\\"); + } + entry = entries.hasNext() ? entries.next() : null; + if (entry != null && !(entry.value() instanceof NarrowingHistoryLine)) { + historyLine.append("\\"); + } + result.add(historyLine.toString()); + } + } + + return result; + } + + private int countTrailintBackslashes(CharSequence text) { + int count = 0; + + for (int i = text.length() - 1; i >= 0; i--) { + if (text.charAt(i) == '\\') { + count++; + } else { + break; + } + } + + return count; + } + + public List currentSessionEntries() { + List result = new ArrayList<>(); + + for (Entry e : fullHistory) { + if (!(e.value() instanceof PersistentEntryMarker)) { + result.add(e.value().toString()); + } + } + + return result; + } + + public void fullHistoryReplace(String source) { + fullHistory.replace(source); + } + + private class NarrowingHistoryLine implements CharSequence { + private final CharSequence delegate; + private final int[] span; + + public NarrowingHistoryLine(CharSequence delegate, int start) { + this.delegate = delegate; + this.span = new int[] {start, -1}; + } + + @Override + public int length() { + return delegate.length(); + } + + @Override + public char charAt(int index) { + return delegate.charAt(index); + } + + @Override + public CharSequence subSequence(int start, int end) { + return delegate.subSequence(start, end); + } + + @Override + public String toString() { + return delegate.toString(); + } + + } + + private interface PersistentEntryMarker {} +} + diff --git a/jdk/src/jdk.internal.le/share/classes/module-info.java b/jdk/src/jdk.internal.le/share/classes/module-info.java index b4ae508ac6e..d52b3b5f98d 100644 --- a/jdk/src/jdk.internal.le/share/classes/module-info.java +++ b/jdk/src/jdk.internal.le/share/classes/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,9 @@ module jdk.internal.le { exports jdk.internal.jline.console.history to jdk.scripting.nashorn.shell, jdk.jshell; + exports jdk.internal.jline.extra to + jdk.scripting.nashorn.shell, + jdk.jshell; exports jdk.internal.jline.internal to jdk.scripting.nashorn.shell, jdk.jshell; diff --git a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/AboutDialog.java b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/AboutDialog.java index 8e54a707142..b4d4d11d150 100644 --- a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/AboutDialog.java +++ b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/AboutDialog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -181,7 +181,7 @@ public class AboutDialog extends InternalDialog { } private static String getOnlineDocUrl() { - String version = Integer.toString(jdk.Version.current().major()); + String version = Integer.toString(Runtime.version().major()); return Resources.format(Messages.HELP_ABOUT_DIALOG_USER_GUIDE_LINK_URL, version); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/Jlink.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/Jlink.java index 92d7eb64fcf..e899d378963 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/Jlink.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/Jlink.java @@ -34,11 +34,9 @@ import java.util.Objects; import java.util.Set; import jdk.tools.jlink.internal.JlinkTask; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.PluginContext; import jdk.tools.jlink.plugin.PluginException; import jdk.tools.jlink.plugin.ExecutableImage; import jdk.tools.jlink.builder.ImageBuilder; -import jdk.tools.jlink.internal.PluginContextImpl; import jdk.tools.jlink.internal.PluginRepository; /** @@ -71,7 +69,6 @@ public final class Jlink { private final List plugins; private final ImageBuilder imageBuilder; private final String lastSorterPluginName; - private final PluginContext pluginContext; /** * Empty plugins configuration. @@ -86,7 +83,7 @@ public final class Jlink { * @param plugins List of plugins. */ public PluginsConfiguration(List plugins) { - this(plugins, null, null, null); + this(plugins, null, null); } /** @@ -101,28 +98,10 @@ public final class Jlink { */ public PluginsConfiguration(List plugins, ImageBuilder imageBuilder, String lastSorterPluginName) { - this(plugins, imageBuilder, lastSorterPluginName, null); - } - - /** - * Plugins configuration with a last sorter and an ImageBuilder. No - * sorting can occur after the last sorter plugin. The ImageBuilder is - * in charge to layout the image content on disk. - * - * @param plugins List of transformer plugins. - * @param imageBuilder Image builder. - * @param lastSorterPluginName Name of last sorter plugin, no sorting - * @param ctx the plugin context - * can occur after it. - */ - public PluginsConfiguration(List plugins, - ImageBuilder imageBuilder, String lastSorterPluginName, - PluginContext ctx) { this.plugins = plugins == null ? Collections.emptyList() : plugins; this.imageBuilder = imageBuilder; this.lastSorterPluginName = lastSorterPluginName; - this.pluginContext = ctx != null? ctx : new PluginContextImpl(); } /** @@ -146,13 +125,6 @@ public final class Jlink { return lastSorterPluginName; } - /** - * @return the pluginContext - */ - public PluginContext getPluginContext() { - return pluginContext; - } - @Override public String toString() { StringBuilder builder = new StringBuilder(); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java index a3943145c06..2c0620a99db 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java @@ -1,3 +1,4 @@ + /* * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -24,8 +25,6 @@ */ package jdk.tools.jlink.builder; -import jdk.tools.jlink.plugin.ExecutableImage; -import jdk.tools.jlink.plugin.PluginException; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; @@ -47,8 +46,10 @@ import java.nio.file.StandardOpenOption; import java.nio.file.attribute.PosixFileAttributeView; import java.nio.file.attribute.PosixFilePermission; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Properties; @@ -56,23 +57,40 @@ import java.util.Set; import jdk.tools.jlink.internal.BasicImageWriter; import jdk.tools.jlink.internal.plugins.FileCopierPlugin; import jdk.tools.jlink.internal.plugins.FileCopierPlugin.SymImageFile; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.Module; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ExecutableImage; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.PluginException; /** * * Default Image Builder. This builder creates the default runtime image layout. */ -public class DefaultImageBuilder implements ImageBuilder { +public final class DefaultImageBuilder implements ImageBuilder { /** * The default java executable Image. */ - static class DefaultExecutableImage extends ExecutableImage { + static final class DefaultExecutableImage implements ExecutableImage { + + private final Path home; + private final List args; + private final Set modules; public DefaultExecutableImage(Path home, Set modules) { - super(home, modules, createArgs(home)); + this(home, modules, createArgs(home)); + } + + private DefaultExecutableImage(Path home, Set modules, + List args) { + Objects.requireNonNull(home); + Objects.requireNonNull(args); + if (!Files.exists(home)) { + throw new IllegalArgumentException("Invalid image home"); + } + this.home = home; + this.modules = Collections.unmodifiableSet(modules); + this.args = Collections.unmodifiableList(args); } private static List createArgs(Path home) { @@ -83,6 +101,21 @@ public class DefaultImageBuilder implements ImageBuilder { return javaArgs; } + @Override + public Path getHome() { + return home; + } + + @Override + public Set getModules() { + return modules; + } + + @Override + public List getExecutionArgs() { + return args; + } + @Override public void storeLaunchArgs(List args) { try { @@ -111,17 +144,19 @@ public class DefaultImageBuilder implements ImageBuilder { Files.createDirectories(mdir); } - private void storeFiles(Set modules, Properties release) throws IOException { + private void storeFiles(Set modules, Map release) throws IOException { if (release != null) { - addModules(release, modules); + Properties props = new Properties(); + props.putAll(release); + addModules(props, modules); File r = new File(root.toFile(), "release"); try (FileOutputStream fo = new FileOutputStream(r)) { - release.store(fo, null); + props.store(fo, null); } } } - private void addModules(Properties release, Set modules) throws IOException { + private void addModules(Properties props, Set modules) throws IOException { StringBuilder builder = new StringBuilder(); int i = 0; for (String m : modules) { @@ -131,28 +166,32 @@ public class DefaultImageBuilder implements ImageBuilder { } i++; } - release.setProperty("MODULES", builder.toString()); + props.setProperty("MODULES", builder.toString()); } @Override - public void storeFiles(Pool files, Properties release) { + public void storeFiles(ModulePool files) { try { - for (ModuleData f : files.getContent()) { - if (!f.getType().equals(Pool.ModuleDataType.CLASS_OR_RESOURCE)) { - accept(f); + files.entries().forEach(f -> { + if (!f.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) { + try { + accept(f); + } catch (IOException ioExp) { + throw new UncheckedIOException(ioExp); + } } - } - for (Module m : files.getModules()) { + }); + files.modules().forEach(m -> { // Only add modules that contain packages if (!m.getAllPackages().isEmpty()) { // Skip the fake module used by FileCopierPlugin when copying files. if (m.getName().equals(FileCopierPlugin.FAKE_MODULE)) { - continue; + return; } modules.add(m.getName()); } - } - storeFiles(modules, release); + }); + storeFiles(modules, files.getReleaseProperties()); if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) { // launchers in the bin directory need execute permission @@ -168,8 +207,8 @@ public class DefaultImageBuilder implements ImageBuilder { Path lib = root.resolve("lib"); if (Files.isDirectory(lib)) { Files.find(lib, 2, (path, attrs) -> { - return path.getFileName().toString().equals("jspawnhelper") || - path.getFileName().toString().equals("jexec"); + return path.getFileName().toString().equals("jspawnhelper") + || path.getFileName().toString().equals("jexec"); }).forEach(this::setExecutable); } } @@ -180,27 +219,23 @@ public class DefaultImageBuilder implements ImageBuilder { } } - @Override - public void storeFiles(Pool files) { - storeFiles(files, new Properties()); - } - /** * Generates launcher scripts. + * * @param imageContent The image content. * @param modules The set of modules that the runtime image contains. * @throws IOException */ - protected void prepareApplicationFiles(Pool imageContent, Set modules) throws IOException { + protected void prepareApplicationFiles(ModulePool imageContent, Set modules) throws IOException { // generate launch scripts for the modules with a main class for (String module : modules) { String path = "/" + module + "/module-info.class"; - ModuleData res = imageContent.get(path); - if (res == null) { + Optional res = imageContent.findEntry(path); + if (!res.isPresent()) { throw new IOException("module-info.class not found for " + module + " module"); } Optional mainClass; - ByteArrayInputStream stream = new ByteArrayInputStream(res.getBytes()); + ByteArrayInputStream stream = new ByteArrayInputStream(res.get().getBytes()); mainClass = ModuleDescriptor.read(stream).mainClass(); if (mainClass.isPresent()) { Path cmd = root.resolve("bin").resolve(module); @@ -263,9 +298,9 @@ public class DefaultImageBuilder implements ImageBuilder { } } - private void accept(ModuleData file) throws IOException { + private void accept(ModuleEntry file) throws IOException { String fullPath = file.getPath(); - String module = "/" + file.getModule()+ "/"; + String module = "/" + file.getModule() + "/"; String filename = fullPath.substring(module.length()); // Remove radical native|config|... filename = filename.substring(filename.indexOf('/') + 1); @@ -404,8 +439,7 @@ public class DefaultImageBuilder implements ImageBuilder { public static ExecutableImage getExecutableImage(Path root) { if (Files.exists(root.resolve("bin").resolve(getJavaProcessName()))) { - return new DefaultImageBuilder.DefaultExecutableImage(root, - retrieveModules(root)); + return new DefaultExecutableImage(root, retrieveModules(root)); } return null; } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/ImageBuilder.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/ImageBuilder.java index dc0bf71c535..10cea85d363 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/ImageBuilder.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/ImageBuilder.java @@ -29,7 +29,7 @@ import java.util.Properties; import jdk.tools.jlink.plugin.ExecutableImage; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; /** * Implement this interface to develop your own image layout. First the jimage @@ -45,7 +45,7 @@ public interface ImageBuilder { * @param release the release properties * @throws PluginException */ - public default void storeFiles(Pool content, Properties release) { + public default void storeFiles(ModulePool content, Properties release) { storeFiles(content); } @@ -55,7 +55,7 @@ public interface ImageBuilder { * @param content Pool of module content. * @throws PluginException */ - public default void storeFiles(Pool content) { + public default void storeFiles(ModulePool content) { throw new UnsupportedOperationException("storeFiles"); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java index e0347e52a21..f765be2919b 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java @@ -44,12 +44,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.tools.jlink.internal.Archive.Entry; import jdk.tools.jlink.internal.Archive.Entry.EntryType; -import jdk.tools.jlink.internal.PoolImpl.CompressedModuleData; +import jdk.tools.jlink.internal.ModulePoolImpl.CompressedModuleData; import jdk.tools.jlink.plugin.ExecutableImage; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.plugin.ModuleEntry; /** * An image (native endian.) @@ -145,7 +144,7 @@ public final class ImageFileCreator { })); ByteOrder order = ByteOrder.nativeOrder(); BasicImageWriter writer = new BasicImageWriter(order); - PoolImpl pool = createPools(archives, entriesForModule, order, writer); + ModulePoolImpl pool = createPools(archives, entriesForModule, order, writer); try (OutputStream fos = Files.newOutputStream(jimageFile); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream out = new DataOutputStream(bos)) { @@ -163,9 +162,9 @@ public final class ImageFileCreator { ByteOrder byteOrder) throws IOException { BasicImageWriter writer = new BasicImageWriter(byteOrder); - PoolImpl allContent = createPools(archives, + ModulePoolImpl allContent = createPools(archives, entriesForModule, byteOrder, writer); - PoolImpl result = generateJImage(allContent, + ModulePoolImpl result = generateJImage(allContent, writer, plugins, plugins.getJImageFileOutputStream()); //Handle files. @@ -176,12 +175,12 @@ public final class ImageFileCreator { } } - private static PoolImpl generateJImage(PoolImpl allContent, + private static ModulePoolImpl generateJImage(ModulePoolImpl allContent, BasicImageWriter writer, ImagePluginStack pluginSupport, DataOutputStream out ) throws IOException { - PoolImpl resultResources; + ModulePoolImpl resultResources; try { resultResources = pluginSupport.visitResources(allContent); } catch (PluginException pe) { @@ -190,14 +189,14 @@ public final class ImageFileCreator { throw new IOException(ex); } Set duplicates = new HashSet<>(); - long offset = 0; + long[] offset = new long[1]; - List content = new ArrayList<>(); + List content = new ArrayList<>(); List paths = new ArrayList<>(); // the order of traversing the resources and the order of // the module content being written must be the same - for (ModuleData res : resultResources.getContent()) { - if (res.getType().equals(ModuleDataType.CLASS_OR_RESOURCE)) { + resultResources.entries().forEach(res -> { + if (res.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) { String path = res.getPath(); content.add(res); long uncompressedSize = res.getLength(); @@ -216,24 +215,24 @@ public final class ImageFileCreator { // TODO Need to hang bytes on resource and write // from resource not zip. // Skipping resource throws off writing from zip. - offset += onFileSize; - continue; + offset[0] += onFileSize; + return; } duplicates.add(path); - writer.addLocation(path, offset, compressedSize, uncompressedSize); + writer.addLocation(path, offset[0], compressedSize, uncompressedSize); paths.add(path); - offset += onFileSize; + offset[0] += onFileSize; } - } + }); - ImageResourcesTree tree = new ImageResourcesTree(offset, writer, paths); + ImageResourcesTree tree = new ImageResourcesTree(offset[0], writer, paths); // write header and indices byte[] bytes = writer.getBytes(); out.write(bytes, 0, bytes.length); // write module content - for (ModuleData res : content) { + for (ModuleEntry res : content) { byte[] buf = res.getBytes(); out.write(buf, 0, buf.length); } @@ -245,26 +244,26 @@ public final class ImageFileCreator { return resultResources; } - private static Pool.ModuleDataType mapImageFileType(EntryType type) { + private static ModuleEntry.Type mapImageFileType(EntryType type) { switch(type) { case CONFIG: { - return Pool.ModuleDataType.CONFIG; + return ModuleEntry.Type.CONFIG; } case NATIVE_CMD: { - return Pool.ModuleDataType.NATIVE_CMD; + return ModuleEntry.Type.NATIVE_CMD; } case NATIVE_LIB: { - return Pool.ModuleDataType.NATIVE_LIB; + return ModuleEntry.Type.NATIVE_LIB; } } return null; } - private static PoolImpl createPools(Set archives, + private static ModulePoolImpl createPools(Set archives, Map> entriesForModule, ByteOrder byteOrder, BasicImageWriter writer) throws IOException { - PoolImpl resources = new PoolImpl(byteOrder, new StringTable() { + ModulePoolImpl resources = new ModulePoolImpl(byteOrder, new StringTable() { @Override public int addString(String str) { @@ -291,7 +290,7 @@ public final class ImageFileCreator { path = "/" + mn + "/" + path; } try { - resources.add(Pool.newResource(path, bytes)); + resources.add(ModuleEntry.create(path, bytes)); } catch (Exception ex) { throw new IOException(ex); } @@ -300,7 +299,7 @@ public final class ImageFileCreator { try { // Entry.path() contains the kind of file native, conf, bin, ... // Keep it to avoid naming conflict (eg: native/jvm.cfg and config/jvm.cfg - resources.add(Pool.newImageFile(mn, + resources.add(ModuleEntry.create(mn, "/" + mn + "/" + entry.path(), mapImageFileType(entry.type()), entry.stream(), entry.size())); } catch (Exception ex) { diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java index 7bd631a8c72..08ff3cb7e64 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java @@ -28,22 +28,17 @@ import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Objects; -import java.util.Properties; import jdk.tools.jlink.plugin.ExecutableImage; import jdk.tools.jlink.builder.ImageBuilder; import jdk.tools.jlink.Jlink; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.PluginContext; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Plugin.CATEGORY; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.Plugin.Category; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.PostProcessorPlugin; import jdk.tools.jlink.plugin.TransformerPlugin; @@ -52,17 +47,18 @@ import jdk.tools.jlink.plugin.TransformerPlugin; */ public final class ImagePluginConfiguration { - private static final List CATEGORIES_ORDER = new ArrayList<>(); + private static final List CATEGORIES_ORDER = new ArrayList<>(); static { - CATEGORIES_ORDER.add(Plugin.CATEGORY.FILTER); - CATEGORIES_ORDER.add(Plugin.CATEGORY.TRANSFORMER); - CATEGORIES_ORDER.add(Plugin.CATEGORY.MODULEINFO_TRANSFORMER); - CATEGORIES_ORDER.add(Plugin.CATEGORY.SORTER); - CATEGORIES_ORDER.add(Plugin.CATEGORY.COMPRESSOR); - CATEGORIES_ORDER.add(Plugin.CATEGORY.VERIFIER); - CATEGORIES_ORDER.add(Plugin.CATEGORY.PROCESSOR); - CATEGORIES_ORDER.add(Plugin.CATEGORY.PACKAGER); + CATEGORIES_ORDER.add(Plugin.Category.FILTER); + CATEGORIES_ORDER.add(Plugin.Category.TRANSFORMER); + CATEGORIES_ORDER.add(Plugin.Category.MODULEINFO_TRANSFORMER); + CATEGORIES_ORDER.add(Plugin.Category.SORTER); + CATEGORIES_ORDER.add(Plugin.Category.COMPRESSOR); + CATEGORIES_ORDER.add(Plugin.Category.METAINFO_ADDER); + CATEGORIES_ORDER.add(Plugin.Category.VERIFIER); + CATEGORIES_ORDER.add(Plugin.Category.PROCESSOR); + CATEGORIES_ORDER.add(Plugin.Category.PACKAGER); } private ImagePluginConfiguration() { @@ -76,8 +72,8 @@ public final class ImagePluginConfiguration { if (pluginsConfiguration == null) { return new ImagePluginStack(); } - Map> plugins = new LinkedHashMap<>(); - for (Plugin.CATEGORY cat : CATEGORIES_ORDER) { + Map> plugins = new LinkedHashMap<>(); + for (Plugin.Category cat : CATEGORIES_ORDER) { plugins.put(cat, new ArrayList<>()); } @@ -89,7 +85,7 @@ public final class ImagePluginConfiguration { + " added more than once to stack "); } seen.add(plug.getName()); - CATEGORY category = Utils.getCategory(plug); + Category category = Utils.getCategory(plug); if (category == null) { throw new PluginException("Invalid category for " + plug.getName()); @@ -100,10 +96,10 @@ public final class ImagePluginConfiguration { List transformerPlugins = new ArrayList<>(); List postProcessingPlugins = new ArrayList<>(); - for (Entry> entry : plugins.entrySet()) { + for (Entry> entry : plugins.entrySet()) { // Sort according to plugin constraints List orderedPlugins = PluginOrderingGraph.sort(entry.getValue()); - CATEGORY category = entry.getKey(); + Category category = entry.getKey(); for (Plugin p : orderedPlugins) { if (Utils.isPostProcessor(category)) { @SuppressWarnings("unchecked") @@ -143,14 +139,13 @@ public final class ImagePluginConfiguration { } @Override - public void storeFiles(Pool files) { + public void storeFiles(ModulePool files) { throw new PluginException("No directory setup to store files"); } }; } - PluginContext ctxt = pluginsConfiguration.getPluginContext(); return new ImagePluginStack(builder, transformerPlugins, - lastSorter, postProcessingPlugins, ctxt); + lastSorter, postProcessingPlugins); } } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java index 6a5db82ccdf..24b8aeb632d 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java @@ -37,20 +37,21 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Properties; +import java.util.Optional; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.internal.jimage.decompressor.Decompressor; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.PluginContext; import jdk.tools.jlink.plugin.ExecutableImage; import jdk.tools.jlink.builder.ImageBuilder; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.plugin.LinkModule; +import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.PostProcessorPlugin; /** @@ -64,9 +65,9 @@ public final class ImagePluginStack { ExecutableImage retrieve(ImagePluginStack stack) throws IOException; } - public static final class OrderedResourcePool extends PoolImpl { + public static final class OrderedResourcePool extends ModulePoolImpl { - private final List orderedList = new ArrayList<>(); + private final List orderedList = new ArrayList<>(); public OrderedResourcePool(ByteOrder order, StringTable table) { super(order, table); @@ -78,22 +79,22 @@ public final class ImagePluginStack { * @param resource The Resource to add. */ @Override - public void add(ModuleData resource) { + public void add(ModuleEntry resource) { super.add(resource); orderedList.add(resource); } - List getOrderedList() { + List getOrderedList() { return Collections.unmodifiableList(orderedList); } } - private final static class CheckOrderResourcePool extends PoolImpl { + private final static class CheckOrderResourcePool extends ModulePoolImpl { - private final List orderedList; + private final List orderedList; private int currentIndex; - public CheckOrderResourcePool(ByteOrder order, List orderedList, StringTable table) { + public CheckOrderResourcePool(ByteOrder order, List orderedList, StringTable table) { super(order, table); this.orderedList = orderedList; } @@ -104,8 +105,8 @@ public final class ImagePluginStack { * @param resource The Resource to add. */ @Override - public void add(ModuleData resource) { - ModuleData ordered = orderedList.get(currentIndex); + public void add(ModuleEntry resource) { + ModuleEntry ordered = orderedList.get(currentIndex); if (!resource.equals(ordered)) { throw new PluginException("Resource " + resource.getPath() + " not in the right order"); } @@ -166,26 +167,16 @@ public final class ImagePluginStack { private final List resourcePrevisitors = new ArrayList<>(); private final ImageBuilder imageBuilder; - private final Properties release; public ImagePluginStack() { this(null, Collections.emptyList(), null, - Collections.emptyList(), null); + Collections.emptyList()); } public ImagePluginStack(ImageBuilder imageBuilder, List contentPlugins, Plugin lastSorter, List postprocessingPlugins) { - this(imageBuilder, contentPlugins, lastSorter, - postprocessingPlugins, null); - } - - public ImagePluginStack(ImageBuilder imageBuilder, - List contentPlugins, - Plugin lastSorter, - List postprocessingPlugins, - PluginContext ctxt) { Objects.requireNonNull(contentPlugins); this.lastSorter = lastSorter; for (TransformerPlugin p : contentPlugins) { @@ -200,7 +191,6 @@ public final class ImagePluginStack { this.postProcessingPlugins.add(p); } this.imageBuilder = imageBuilder; - this.release = ctxt != null? ctxt.getReleaseProperties() : new Properties(); } public void operate(ImageProvider provider) throws Exception { @@ -231,12 +221,12 @@ public final class ImagePluginStack { * @return The result of the visit. * @throws IOException */ - public PoolImpl visitResources(PoolImpl resources) + public ModulePoolImpl visitResources(ModulePoolImpl resources) throws Exception { Objects.requireNonNull(resources); resources.setReadOnly(); if (resources.isEmpty()) { - return new PoolImpl(resources.getByteOrder(), + return new ModulePoolImpl(resources.getByteOrder(), resources.getStringTable()); } PreVisitStrings previsit = new PreVisitStrings(); @@ -250,11 +240,11 @@ public final class ImagePluginStack { resources.getStringTable().addString(s); } - PoolImpl current = resources; - List frozenOrder = null; + ModulePoolImpl current = resources; + List frozenOrder = null; for (TransformerPlugin p : contentPlugins) { current.setReadOnly(); - PoolImpl output = null; + ModulePoolImpl output = null; if (p == lastSorter) { if (frozenOrder != null) { throw new Exception("Order of resources is already frozen. Plugin " @@ -268,7 +258,7 @@ public final class ImagePluginStack { output = new CheckOrderResourcePool(current.getByteOrder(), frozenOrder, resources.getStringTable()); } else { - output = new PoolImpl(current.getByteOrder(), + output = new ModulePoolImpl(current.getByteOrder(), resources.getStringTable()); } } @@ -287,15 +277,15 @@ public final class ImagePluginStack { } /** - * This pool wrap the original pool and automatically uncompress moduledata + * This pool wrap the original pool and automatically uncompress ModuleEntry * if needed. */ - private class LastPool extends Pool { - private class LastModule implements Module { + private class LastPool implements ModulePool { + private class LastModule implements LinkModule { - private final Module module; + final LinkModule module; - LastModule(Module module) { + LastModule(LinkModule module) { this.module = module; } @@ -305,9 +295,9 @@ public final class ImagePluginStack { } @Override - public ModuleData get(String path) { - ModuleData d = module.get(path); - return getUncompressed(d); + public Optional findEntry(String path) { + Optional d = module.findEntry(path); + return d.isPresent()? Optional.of(getUncompressed(d.get())) : Optional.empty(); } @Override @@ -316,7 +306,7 @@ public final class ImagePluginStack { } @Override - public void add(ModuleData data) { + public void add(ModuleEntry data) { throw new PluginException("pool is readonly"); } @@ -331,19 +321,24 @@ public final class ImagePluginStack { } @Override - public Collection getContent() { - List lst = new ArrayList<>(); - for(ModuleData md : module.getContent()) { + public Stream entries() { + List lst = new ArrayList<>(); + module.entries().forEach(md -> { lst.add(getUncompressed(md)); - } - return lst; + }); + return lst.stream(); + } + + @Override + public int getEntryCount() { + return module.getEntryCount(); } } - private final PoolImpl pool; + private final ModulePoolImpl pool; Decompressor decompressor = new Decompressor(); - Collection content; + Collection content; - LastPool(PoolImpl pool) { + LastPool(ModulePoolImpl pool) { this.pool = pool; } @@ -353,23 +348,14 @@ public final class ImagePluginStack { } @Override - public void add(ModuleData resource) { + public void add(ModuleEntry resource) { throw new PluginException("pool is readonly"); } - /** - * Retrieves the module of the provided name. - * - * @param name The module name - * @return the module or null if the module doesn't exist. - */ @Override - public Module getModule(String name) { - Module module = pool.getModule(name); - if (module != null) { - module = new LastModule(module); - } - return module; + public Optional findModule(String name) { + Optional module = pool.findModule(name); + return module.isPresent()? Optional.of(new LastModule(module.get())) : Optional.empty(); } /** @@ -378,45 +364,55 @@ public final class ImagePluginStack { * @return The collection of modules. */ @Override - public Collection getModules() { - List modules = new ArrayList<>(); - for (Module m : pool.getModules()) { + public Stream modules() { + List modules = new ArrayList<>(); + pool.modules().forEach(m -> { modules.add(new LastModule(m)); - } - return modules; + }); + return modules.stream(); + } + + @Override + public int getModuleCount() { + return pool.getModuleCount(); } /** * Get all resources contained in this pool instance. * - * @return The collection of resources; + * @return The stream of resources; */ @Override - public Collection getContent() { + public Stream entries() { if (content == null) { content = new ArrayList<>(); - for (ModuleData md : pool.getContent()) { + pool.entries().forEach(md -> { content.add(getUncompressed(md)); - } + }); } - return content; + return content.stream(); + } + + @Override + public int getEntryCount() { + return pool.getEntryCount(); } /** * Get the resource for the passed path. * * @param path A resource path - * @return A Resource instance or null if the resource is not found + * @return A Resource instance if the resource is found */ @Override - public ModuleData get(String path) { + public Optional findEntry(String path) { Objects.requireNonNull(path); - Pool.ModuleData res = pool.get(path); - return getUncompressed(res); + Optional res = pool.findEntry(path); + return res.isPresent()? Optional.of(getUncompressed(res.get())) : Optional.empty(); } @Override - public boolean contains(ModuleData res) { + public boolean contains(ModuleEntry res) { return pool.contains(res); } @@ -426,8 +422,8 @@ public final class ImagePluginStack { } @Override - public void visit(Visitor visitor, Pool output) { - pool.visit(visitor, output); + public void transformAndCopy(Function visitor, ModulePool output) { + pool.transformAndCopy(visitor, output); } @Override @@ -435,14 +431,19 @@ public final class ImagePluginStack { return pool.getByteOrder(); } - private ModuleData getUncompressed(ModuleData res) { + @Override + public Map getReleaseProperties() { + return Collections.unmodifiableMap(pool.getReleaseProperties()); + } + + private ModuleEntry getUncompressed(ModuleEntry res) { if (res != null) { - if (res instanceof PoolImpl.CompressedModuleData) { + if (res instanceof ModulePoolImpl.CompressedModuleData) { try { byte[] bytes = decompressor.decompressResource(getByteOrder(), (int offset) -> pool.getStringTable().getString(offset), res.getBytes()); - res = Pool.newResource(res.getPath(), + res = ModuleEntry.create(res.getPath(), new ByteArrayInputStream(bytes), bytes.length); } catch (IOException ex) { @@ -462,20 +463,24 @@ public final class ImagePluginStack { * @param writer * @throws java.lang.Exception */ - public void storeFiles(PoolImpl original, PoolImpl transformed, + public void storeFiles(ModulePoolImpl original, ModulePoolImpl transformed, BasicImageWriter writer) throws Exception { Objects.requireNonNull(original); - try { - // fill release information available from transformed "java.base" module! - ModuleDescriptor desc = transformed.getModule("java.base").getDescriptor(); - desc.osName().ifPresent(s -> release.put("OS_NAME", s)); - desc.osVersion().ifPresent(s -> release.put("OS_VERSION", s)); - desc.osArch().ifPresent(s -> release.put("OS_ARCH", s)); - } catch (Exception ignored) { - } + Objects.requireNonNull(transformed); + Optional javaBase = transformed.findModule("java.base"); + javaBase.ifPresent(mod -> { + try { + Map release = transformed.getReleaseProperties(); + // fill release information available from transformed "java.base" module! + ModuleDescriptor desc = mod.getDescriptor(); + desc.osName().ifPresent(s -> release.put("OS_NAME", s)); + desc.osVersion().ifPresent(s -> release.put("OS_VERSION", s)); + desc.osArch().ifPresent(s -> release.put("OS_ARCH", s)); + } catch (Exception ignored) {} + }); - imageBuilder.storeFiles(new LastPool(transformed), release); + imageBuilder.storeFiles(new LastPool(transformed)); } public ExecutableImage getExecutableImage() throws IOException { diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleEntryImpl.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleEntryImpl.java new file mode 100644 index 00000000000..30c07a3b2d7 --- /dev/null +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleEntryImpl.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.tools.jlink.internal; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.util.Objects; +import jdk.tools.jlink.plugin.ModuleEntry; + +/** + * A LinkModuleEntry is the elementary unit of data inside an image. It is + * generally a file. e.g.: a java class file, a resource file, a shared library, + * ... + *
      + * A LinkModuleEntry is identified by a path of the form: + *
        + *
      • For jimage content: /{module name}/{package1}/.../{packageN}/{file + * name}
      • + *
      • For other files (shared lib, launchers, config, ...):/{module name}/ + * {@literal bin|conf|native}/{dir1}>/.../{dirN}/{file name}
      • + *
      + */ +public class ModuleEntryImpl implements ModuleEntry { + + private final Type type; + private final String path; + private final String module; + private final long length; + private final InputStream stream; + private byte[] buffer; + + /** + * Create a new LinkModuleEntry. + * + * @param module The module name. + * @param path The data path identifier. + * @param type The data type. + * @param stream The data content stream. + * @param length The stream length. + */ + public ModuleEntryImpl(String module, String path, Type type, InputStream stream, long length) { + Objects.requireNonNull(module); + Objects.requireNonNull(path); + Objects.requireNonNull(type); + Objects.requireNonNull(stream); + this.path = path; + this.type = type; + this.module = module; + this.stream = stream; + this.length = length; + } + + /** + * The LinkModuleEntry module name. + * + * @return The module name. + */ + @Override + public final String getModule() { + return module; + } + + /** + * The LinkModuleEntry path. + * + * @return The module path. + */ + @Override + public final String getPath() { + return path; + } + + /** + * The LinkModuleEntry's type. + * + * @return The data type. + */ + @Override + public final Type getType() { + return type; + } + + /** + * The LinkModuleEntry content as an array of byte. + * + * @return An Array of bytes. + */ + @Override + public byte[] getBytes() { + if (buffer == null) { + try (InputStream is = stream) { + buffer = is.readAllBytes(); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + return buffer; + } + + /** + * The LinkModuleEntry content length. + * + * @return The length. + */ + @Override + public long getLength() { + return length; + } + + /** + * The LinkModuleEntry stream. + * + * @return The module data stream. + */ + @Override + public InputStream stream() { + return stream; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 89 * hash + Objects.hashCode(this.path); + return hash; + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof ModuleEntryImpl)) { + return false; + } + ModuleEntryImpl f = (ModuleEntryImpl) other; + return f.path.equals(path); + } + + @Override + public String toString() { + return getPath(); + } +} \ No newline at end of file diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModulePoolImpl.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModulePoolImpl.java new file mode 100644 index 00000000000..a572fa48637 --- /dev/null +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModulePoolImpl.java @@ -0,0 +1,421 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.tools.jlink.internal; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.lang.module.ModuleDescriptor; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Stream; +import jdk.internal.jimage.decompressor.CompressedResourceHeader; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.plugin.LinkModule; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.PluginException; +import jdk.tools.jlink.internal.plugins.FileCopierPlugin; + +/** + * Pool of module data. + */ +public class ModulePoolImpl implements ModulePool { + + private class ModuleImpl implements LinkModule { + + final Map moduleContent = new LinkedHashMap<>(); + private ModuleDescriptor descriptor; + final String name; + + private ModuleImpl(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + public Optional findEntry(String path) { + if (!path.startsWith("/")) { + path = "/" + path; + } + if (!path.startsWith("/" + name)) { + path = "/" + name + path; + } + return Optional.ofNullable(moduleContent.get(path)); + } + + @Override + public ModuleDescriptor getDescriptor() { + if (descriptor == null) { + String p = "/" + name + "/module-info.class"; + Optional content = findEntry(p); + if (!content.isPresent()) { + throw new PluginException("No module-info for " + name + + " module"); + } + ByteBuffer bb = ByteBuffer.wrap(content.get().getBytes()); + descriptor = ModuleDescriptor.read(bb); + } + return descriptor; + } + + @Override + public void add(ModuleEntry data) { + if (isReadOnly()) { + throw new PluginException("LinkConfiguration is readonly"); + } + Objects.requireNonNull(data); + if (!data.getModule().equals(name)) { + throw new PluginException("Can't add resource " + data.getPath() + + " to module " + name); + } + ModulePoolImpl.this.add(data); + } + + @Override + public Set getAllPackages() { + Set pkgs = new HashSet<>(); + moduleContent.values().stream().filter(m -> m.getType(). + equals(ModuleEntry.Type.CLASS_OR_RESOURCE)).forEach(res -> { + // Module metadata only contains packages with .class files + if (ImageFileCreator.isClassPackage(res.getPath())) { + String[] split = ImageFileCreator.splitPath(res.getPath()); + String pkg = split[1]; + if (pkg != null && !pkg.isEmpty()) { + pkgs.add(pkg); + } + } + }); + return pkgs; + } + + @Override + public String toString() { + return getName(); + } + + @Override + public Stream entries() { + return moduleContent.values().stream(); + } + + @Override + public int getEntryCount() { + return moduleContent.values().size(); + } + } + + private final Map resources = new LinkedHashMap<>(); + private final Map modules = new LinkedHashMap<>(); + private final ModuleImpl fileCopierModule = new ModuleImpl(FileCopierPlugin.FAKE_MODULE); + private Map releaseProps = new HashMap<>(); + + private final ByteOrder order; + + private boolean isReadOnly; + private final StringTable table; + + public ModulePoolImpl() { + this(ByteOrder.nativeOrder()); + } + + public ModulePoolImpl(ByteOrder order) { + this(order, new StringTable() { + + @Override + public int addString(String str) { + return -1; + } + + @Override + public String getString(int id) { + return null; + } + }); + } + + public ModulePoolImpl(ByteOrder order, StringTable table) { + this.order = order; + this.table = table; + } + + /** + * Add a ModuleEntry. + * + * @param data The ModuleEntry to add. + */ + @Override + public void add(ModuleEntry data) { + if (isReadOnly()) { + throw new PluginException("LinkConfiguration is readonly"); + } + Objects.requireNonNull(data); + if (resources.get(data.getPath()) != null) { + throw new PluginException("Resource " + data.getPath() + + " already present"); + } + String modulename = data.getModule(); + ModuleImpl m = modules.get(modulename); + // ## TODO: FileCopierPlugin should not add content to a module + // FAKE_MODULE is not really a module to be added in the image + if (FileCopierPlugin.FAKE_MODULE.equals(modulename)) { + m = fileCopierModule; + } + if (m == null) { + m = new ModuleImpl(modulename); + modules.put(modulename, m); + } + resources.put(data.getPath(), data); + m.moduleContent.put(data.getPath(), data); + } + + /** + * Retrieves the module for the provided name. + * + * @param name The module name + * @return the module of matching name, if found + */ + @Override + public Optional findModule(String name) { + Objects.requireNonNull(name); + return Optional.ofNullable(modules.get(name)); + } + + /** + * The stream of modules contained in this LinkConfiguration. + * + * @return The stream of modules. + */ + @Override + public Stream modules() { + return modules.values().stream(); + } + + /** + * Return the number of LinkModule count in this LinkConfiguration. + * + * @return the module count. + */ + @Override + public int getModuleCount() { + return modules.size(); + } + + /** + * Get all ModuleEntry contained in this LinkConfiguration instance. + * + * @return The stream of LinkModuleEntries. + */ + @Override + public Stream entries() { + return resources.values().stream(); + } + + /** + * Return the number of ModuleEntry count in this LinkConfiguration. + * + * @return the entry count. + */ + @Override + public int getEntryCount() { + return resources.values().size(); + } + + /** + * Get the ModuleEntry for the passed path. + * + * @param path A data path + * @return A ModuleEntry instance or null if the data is not found + */ + @Override + public Optional findEntry(String path) { + Objects.requireNonNull(path); + return Optional.ofNullable(resources.get(path)); + } + + /** + * Check if the LinkConfiguration contains the given ModuleEntry. + * + * @param data The module data to check existence for. + * @return The module data or null if not found. + */ + @Override + public boolean contains(ModuleEntry data) { + Objects.requireNonNull(data); + return findEntry(data.getPath()).isPresent(); + } + + /** + * Check if the LinkConfiguration contains some content at all. + * + * @return True, no content, false otherwise. + */ + @Override + public boolean isEmpty() { + return resources.isEmpty(); + } + + /** + * Visit each ModuleEntry in this LinkConfiguration to transform it and + * copy the transformed ModuleEntry to the output LinkConfiguration. + * + * @param transform The function called for each ModuleEntry found in + * the LinkConfiguration. The transform function should return a + * ModuleEntry instance which will be added to the output or it should + * return null if the passed ModuleEntry is to be ignored for the + * output. + * + * @param output The LinkConfiguration to be filled with Visitor returned + * ModuleEntry. + */ + @Override + public void transformAndCopy(Function transform, + ModulePool output) { + entries().forEach(resource -> { + ModuleEntry res = transform.apply(resource); + if (res != null) { + output.add(res); + } + }); + } + + /** + * The ByteOrder currently in use when generating the jimage file. + * + * @return The ByteOrder. + */ + @Override + public ByteOrder getByteOrder() { + return order; + } + + @Override + public Map getReleaseProperties() { + return isReadOnly()? Collections.unmodifiableMap(releaseProps) : releaseProps; + } + + public StringTable getStringTable() { + return table; + } + + /** + * Make this Resources instance read-only. No resource can be added. + */ + public void setReadOnly() { + isReadOnly = true; + } + + /** + * Read only state. + * + * @return true if readonly false otherwise. + */ + @Override + public boolean isReadOnly() { + return isReadOnly; + } + + /** + * A resource that has been compressed. + */ + public static final class CompressedModuleData extends ModuleEntryImpl { + + final long uncompressed_size; + + private CompressedModuleData(String module, String path, + InputStream stream, long size, + long uncompressed_size) { + super(module, path, ModuleEntry.Type.CLASS_OR_RESOURCE, stream, size); + this.uncompressed_size = uncompressed_size; + } + + public long getUncompressedSize() { + return uncompressed_size; + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof CompressedModuleData)) { + return false; + } + CompressedModuleData f = (CompressedModuleData) other; + return f.getPath().equals(getPath()); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + } + + public static CompressedModuleData newCompressedResource(ModuleEntry original, + ByteBuffer compressed, + String plugin, String pluginConfig, StringTable strings, + ByteOrder order) { + Objects.requireNonNull(original); + Objects.requireNonNull(compressed); + Objects.requireNonNull(plugin); + + boolean isTerminal = !(original instanceof CompressedModuleData); + long uncompressed_size = original.getLength(); + if (original instanceof CompressedModuleData) { + CompressedModuleData comp = (CompressedModuleData) original; + uncompressed_size = comp.getUncompressedSize(); + } + int nameOffset = strings.addString(plugin); + int configOffset = -1; + if (pluginConfig != null) { + configOffset = strings.addString(plugin); + } + CompressedResourceHeader rh + = new CompressedResourceHeader(compressed.limit(), original.getLength(), + nameOffset, configOffset, isTerminal); + // Merge header with content; + byte[] h = rh.getBytes(order); + ByteBuffer bb = ByteBuffer.allocate(compressed.limit() + h.length); + bb.order(order); + bb.put(h); + bb.put(compressed); + byte[] contentWithHeader = bb.array(); + + CompressedModuleData compressedResource + = new CompressedModuleData(original.getModule(), original.getPath(), + new ByteArrayInputStream(contentWithHeader), + contentWithHeader.length, uncompressed_size); + return compressedResource; + } + +} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PoolImpl.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PoolImpl.java deleted file mode 100644 index 2b1dd827bae..00000000000 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PoolImpl.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package jdk.tools.jlink.internal; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.Objects; -import jdk.internal.jimage.decompressor.CompressedResourceHeader; -import jdk.tools.jlink.plugin.Pool; - -/** - * Pool of module data. - */ -public class PoolImpl extends Pool { - - /** - * A resource that has been compressed. - */ - public static final class CompressedModuleData extends ModuleData { - - private final long uncompressed_size; - - private CompressedModuleData(String module, String path, - InputStream stream, long size, - long uncompressed_size) { - super(module, path, ModuleDataType.CLASS_OR_RESOURCE, stream, size); - this.uncompressed_size = uncompressed_size; - } - - public long getUncompressedSize() { - return uncompressed_size; - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof CompressedModuleData)) { - return false; - } - CompressedModuleData f = (CompressedModuleData) other; - return f.getPath().equals(getPath()); - } - - @Override - public int hashCode() { - return super.hashCode(); - } - } - - private boolean isReadOnly; - private final StringTable table; - - public PoolImpl() { - this(ByteOrder.nativeOrder(), new StringTable() { - - @Override - public int addString(String str) { - return -1; - } - @Override - public String getString(int id) { - return null; - } - }); - } - - public PoolImpl(ByteOrder order) { - this(order, new StringTable() { - - @Override - public int addString(String str) { - return -1; - } - @Override - public String getString(int id) { - return null; - } - }); - } - - public PoolImpl(ByteOrder order, StringTable table) { - super(order); - this.table = table; - } - - public StringTable getStringTable() { - return table; - } - - /** - * Make this Resources instance read-only. No resource can be added. - */ - public void setReadOnly() { - isReadOnly = true; - } - - /** - * Read only state. - * - * @return true if readonly false otherwise. - */ - @Override - public boolean isReadOnly() { - return isReadOnly; - } - - public static CompressedModuleData newCompressedResource(ModuleData original, - ByteBuffer compressed, - String plugin, String pluginConfig, StringTable strings, - ByteOrder order) { - Objects.requireNonNull(original); - Objects.requireNonNull(compressed); - Objects.requireNonNull(plugin); - - boolean isTerminal = !(original instanceof CompressedModuleData); - long uncompressed_size = original.getLength(); - if (original instanceof CompressedModuleData) { - CompressedModuleData comp = (CompressedModuleData) original; - uncompressed_size = comp.getUncompressedSize(); - } - int nameOffset = strings.addString(plugin); - int configOffset = -1; - if (pluginConfig != null) { - configOffset = strings.addString(plugin); - } - CompressedResourceHeader rh - = new CompressedResourceHeader(compressed.limit(), original.getLength(), - nameOffset, configOffset, isTerminal); - // Merge header with content; - byte[] h = rh.getBytes(order); - ByteBuffer bb = ByteBuffer.allocate(compressed.limit() + h.length); - bb.order(order); - bb.put(h); - bb.put(compressed); - byte[] contentWithHeader = bb.array(); - - CompressedModuleData compressedResource - = new CompressedModuleData(original.getModule(), original.getPath(), - new ByteArrayInputStream(contentWithHeader), - contentWithHeader.length, uncompressed_size); - return compressedResource; - } - -} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePrevisitor.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePrevisitor.java index d9c5bab9a61..c8b8bc79ed6 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePrevisitor.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePrevisitor.java @@ -24,7 +24,7 @@ */ package jdk.tools.jlink.internal; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; /** * Plugin wishing to pre-visit the resources must implement this interface. @@ -44,5 +44,5 @@ public interface ResourcePrevisitor { * usage. * @throws PluginException */ - public void previsit(Pool resources, StringTable strings); + public void previsit(ModulePool resources, StringTable strings); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java index 31064ab79d6..b255312bbf4 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java @@ -52,7 +52,7 @@ import jdk.internal.module.ConfigurableModuleFinder.Phase; import jdk.tools.jlink.Jlink; import jdk.tools.jlink.Jlink.PluginsConfiguration; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.Plugin.CATEGORY; +import jdk.tools.jlink.plugin.Plugin.Category; import jdk.tools.jlink.builder.DefaultImageBuilder; import jdk.tools.jlink.builder.ImageBuilder; import jdk.tools.jlink.plugin.PluginException; @@ -346,7 +346,6 @@ public final class TaskHelper { } } - PluginContextImpl pluginContext = new PluginContextImpl(); List pluginsList = new ArrayList<>(); for (Entry>> entry : pluginToMaps.entrySet()) { Plugin plugin = entry.getKey(); @@ -356,7 +355,7 @@ public final class TaskHelper { // we call configure once for each occurrence. It is upto the plugin // to 'merge' and/or 'override' arguments. for (Map map : argsMaps) { - plugin.configure(Collections.unmodifiableMap(map), pluginContext); + plugin.configure(Collections.unmodifiableMap(map)); } if (!Utils.isDisabled(plugin)) { @@ -371,7 +370,7 @@ public final class TaskHelper { } return new Jlink.PluginsConfiguration(pluginsList, - builder, lastSorter, pluginContext); + builder, lastSorter); } } @@ -594,7 +593,7 @@ public final class TaskHelper { + ": " + plugin.getClass().getName()); log.println(bundleHelper.getMessage("main.plugin.module") + ": " + plugin.getClass().getModule().getName()); - CATEGORY category = Utils.getCategory(plugin); + Category category = Utils.getCategory(plugin); log.println(bundleHelper.getMessage("main.plugin.category") + ": " + category.getName()); log.println(bundleHelper.getMessage("main.plugin.state") diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java index a8a9a45a5f4..0e29969a034 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java @@ -30,7 +30,6 @@ import java.util.Comparator; import java.util.List; import java.util.function.Function; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.Plugin.PluginType; public class Utils { @@ -50,25 +49,26 @@ public class Utils { return arguments; }; - public static boolean isPostProcessor(Plugin.CATEGORY category) { - return category.equals(Plugin.CATEGORY.VERIFIER) - || category.equals(Plugin.CATEGORY.PROCESSOR) - || category.equals(Plugin.CATEGORY.PACKAGER); + public static boolean isPostProcessor(Plugin.Category category) { + return category.equals(Plugin.Category.VERIFIER) + || category.equals(Plugin.Category.PROCESSOR) + || category.equals(Plugin.Category.PACKAGER); } - public static boolean isPreProcessor(Plugin.CATEGORY category) { - return category.equals(Plugin.CATEGORY.COMPRESSOR) - || category.equals(Plugin.CATEGORY.FILTER) - || category.equals(Plugin.CATEGORY.MODULEINFO_TRANSFORMER) - || category.equals(Plugin.CATEGORY.SORTER) - || category.equals(Plugin.CATEGORY.TRANSFORMER); + public static boolean isPreProcessor(Plugin.Category category) { + return category.equals(Plugin.Category.COMPRESSOR) + || category.equals(Plugin.Category.FILTER) + || category.equals(Plugin.Category.MODULEINFO_TRANSFORMER) + || category.equals(Plugin.Category.SORTER) + || category.equals(Plugin.Category.TRANSFORMER) + || category.equals(Plugin.Category.METAINFO_ADDER); } public static boolean isPostProcessor(Plugin prov) { if (prov.getType() != null) { - for (PluginType pt : prov.getType()) { - if (pt instanceof Plugin.CATEGORY) { - return isPostProcessor((Plugin.CATEGORY) pt); + for (Plugin.Category pt : prov.getType()) { + if (pt instanceof Plugin.Category) { + return isPostProcessor(pt); } } } @@ -77,20 +77,20 @@ public class Utils { public static boolean isPreProcessor(Plugin prov) { if (prov.getType() != null) { - for (PluginType pt : prov.getType()) { - if (pt instanceof Plugin.CATEGORY) { - return isPreProcessor((Plugin.CATEGORY) pt); + for (Plugin.Category pt : prov.getType()) { + if (pt instanceof Plugin.Category) { + return isPreProcessor(pt); } } } return false; } - public static Plugin.CATEGORY getCategory(Plugin provider) { + public static Plugin.Category getCategory(Plugin provider) { if (provider.getType() != null) { - for (Plugin.PluginType t : provider.getType()) { - if (t instanceof Plugin.CATEGORY) { - return (Plugin.CATEGORY) t; + for (Plugin.Category t : provider.getType()) { + if (t instanceof Plugin.Category) { + return t; } } } @@ -140,15 +140,15 @@ public class Utils { } public static boolean isFunctional(Plugin prov) { - return prov.getState().contains(Plugin.STATE.FUNCTIONAL); + return prov.getState().contains(Plugin.State.FUNCTIONAL); } public static boolean isAutoEnabled(Plugin prov) { - return prov.getState().contains(Plugin.STATE.AUTO_ENABLED); + return prov.getState().contains(Plugin.State.AUTO_ENABLED); } public static boolean isDisabled(Plugin prov) { - return prov.getState().contains(Plugin.STATE.DISABLED); + return prov.getState().contains(Plugin.State.DISABLED); } // is this a builtin (jdk.jlink) plugin? diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java index e448acd0b1d..874b338c93f 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java @@ -30,7 +30,7 @@ import jdk.tools.jlink.Jlink; import jdk.tools.jlink.builder.ImageBuilder; import jdk.tools.jlink.plugin.Plugin; import jdk.tools.jlink.builder.*; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java index aa068f1136e..43eb6f27dec 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java @@ -26,16 +26,13 @@ package jdk.tools.jlink.internal.plugins; import java.io.IOException; import java.io.UncheckedIOException; -import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; -import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.internal.PoolImpl; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.internal.ModulePoolImpl; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.internal.ImagePluginStack; import jdk.tools.jlink.internal.ResourcePrevisitor; @@ -62,10 +59,10 @@ public final class DefaultCompressPlugin implements TransformerPlugin, ResourceP } @Override - public void visit(Pool in, Pool out) { + public void visit(ModulePool in, ModulePool out) { if (ss != null && zip != null) { - Pool output = new ImagePluginStack.OrderedResourcePool(in.getByteOrder(), - ((PoolImpl) in).getStringTable()); + ModulePool output = new ImagePluginStack.OrderedResourcePool(in.getByteOrder(), + ((ModulePoolImpl) in).getStringTable()); ss.visit(in, output); zip.visit(output, out); } else if (ss != null) { @@ -76,16 +73,16 @@ public final class DefaultCompressPlugin implements TransformerPlugin, ResourceP } @Override - public void previsit(Pool resources, StringTable strings) { + public void previsit(ModulePool resources, StringTable strings) { if (ss != null) { ss.previsit(resources, strings); } } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.COMPRESSOR); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.COMPRESSOR); return Collections.unmodifiableSet(set); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java index 0271670e4c1..628d8f6346e 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java @@ -32,8 +32,8 @@ import java.util.Map; import java.util.Set; import java.util.function.Predicate; import jdk.tools.jlink.plugin.TransformerPlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.internal.Utils; /** @@ -51,9 +51,9 @@ public final class ExcludeFilesPlugin implements TransformerPlugin { } @Override - public void visit(Pool in, Pool out) { - in.visit((file) -> { - if (!file.getType().equals(ModuleDataType.CLASS_OR_RESOURCE)) { + public void visit(ModulePool in, ModulePool out) { + in.transformAndCopy((file) -> { + if (!file.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) { file = predicate.test(file.getPath()) ? file : null; } return file; @@ -61,9 +61,9 @@ public final class ExcludeFilesPlugin implements TransformerPlugin { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.FILTER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.FILTER); return Collections.unmodifiableSet(set); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java index 6d4737a4661..626087b76be 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java @@ -32,7 +32,8 @@ import java.util.Set; import java.util.function.Predicate; import jdk.tools.jlink.plugin.PluginException; import jdk.tools.jlink.plugin.TransformerPlugin; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.internal.Utils; /** @@ -50,9 +51,9 @@ public final class ExcludePlugin implements TransformerPlugin { } @Override - public void visit(Pool in, Pool out) { - in.visit((resource) -> { - if (resource.getType().equals(Pool.ModuleDataType.CLASS_OR_RESOURCE)) { + public void visit(ModulePool in, ModulePool out) { + in.transformAndCopy((resource) -> { + if (resource.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) { resource = predicate.test(resource.getPath()) ? resource : null; } return resource; @@ -75,9 +76,9 @@ public final class ExcludePlugin implements TransformerPlugin { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.FILTER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.FILTER); return Collections.unmodifiableSet(set); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java index 4d502904c37..753d63e5cfc 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java @@ -40,9 +40,10 @@ import java.util.TreeSet; import java.util.function.Predicate; import java.util.stream.Collectors; import jdk.tools.jlink.plugin.TransformerPlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.internal.Utils; +import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.PluginException; /** @@ -102,24 +103,24 @@ public final class ExcludeVMPlugin implements TransformerPlugin { * e.g.: /java.base/native/amd64/server/libjvm.so * /java.base/native/server/libjvm.dylib */ - private List getVMs(Pool in) { + private List getVMs(ModulePool in) { String jvmlib = jvmlib(); - List ret = in.getModule("java.base").getContent().stream().filter((t) -> { + List ret = in.findModule("java.base").get().entries().filter((t) -> { return t.getPath().endsWith("/" + jvmlib); }).collect(Collectors.toList()); return ret; } @Override - public void visit(Pool in, Pool out) { + public void visit(ModulePool in, ModulePool out) { String jvmlib = jvmlib(); TreeSet existing = new TreeSet<>(new JvmComparator()); TreeSet removed = new TreeSet<>(new JvmComparator()); if (!keepAll) { // First retrieve all available VM names and removed VM - List jvms = getVMs(in); + List jvms = getVMs(in); for (Jvm jvm : Jvm.values()) { - for (Pool.ModuleData md : jvms) { + for (ModuleEntry md : jvms) { if (md.getPath().endsWith("/" + jvm.getName() + "/" + jvmlib)) { existing.add(jvm); if (isRemoved(md)) { @@ -137,9 +138,9 @@ public final class ExcludeVMPlugin implements TransformerPlugin { } // Rewrite the jvm.cfg file. - in.visit((file) -> { + in.transformAndCopy((file) -> { if (!keepAll) { - if (file.getType().equals(ModuleDataType.NATIVE_LIB)) { + if (file.getType().equals(ModuleEntry.Type.NATIVE_LIB)) { if (file.getPath().endsWith(JVM_CFG)) { try { file = handleJvmCfgFile(file, existing, removed); @@ -155,14 +156,14 @@ public final class ExcludeVMPlugin implements TransformerPlugin { } - private boolean isRemoved(Pool.ModuleData file) { + private boolean isRemoved(ModuleEntry file) { return !predicate.test(file.getPath()); } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.FILTER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.FILTER); return Collections.unmodifiableSet(set); } @@ -217,7 +218,7 @@ public final class ExcludeVMPlugin implements TransformerPlugin { } } - private Pool.ModuleData handleJvmCfgFile(Pool.ModuleData orig, + private ModuleEntry handleJvmCfgFile(ModuleEntry orig, TreeSet existing, TreeSet removed) throws IOException { if (keepAll) { @@ -253,7 +254,7 @@ public final class ExcludeVMPlugin implements TransformerPlugin { byte[] content = builder.toString().getBytes(StandardCharsets.UTF_8); - return Pool.newImageFile(orig.getModule(), + return ModuleEntry.create(orig.getModule(), orig.getPath(), orig.getType(), new ByteArrayInputStream(content), content.length); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java index 7a51d6cbcdf..497d97e50a6 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java @@ -41,10 +41,10 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import jdk.tools.jlink.internal.ModuleEntryImpl; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.internal.Utils; @@ -68,12 +68,12 @@ public class FileCopierPlugin implements TransformerPlugin { /** * Symbolic link to another path. */ - public static abstract class SymImageFile extends Pool.ModuleData { + public static abstract class SymImageFile extends ModuleEntryImpl { private final String targetPath; public SymImageFile(String targetPath, String module, String path, - Pool.ModuleDataType type, InputStream stream, long size) { + ModuleEntry.Type type, InputStream stream, long size) { super(module, path, type, stream, size); this.targetPath = targetPath; } @@ -86,7 +86,7 @@ public class FileCopierPlugin implements TransformerPlugin { private static final class SymImageFileImpl extends SymImageFile { public SymImageFileImpl(String targetPath, Path file, String module, - String path, ModuleDataType type) { + String path, ModuleEntry.Type type) { super(targetPath, module, path, type, newStream(file), length(file)); } } @@ -110,11 +110,11 @@ public class FileCopierPlugin implements TransformerPlugin { private static final class DirectoryCopy implements FileVisitor { private final Path source; - private final Pool pool; + private final ModulePool pool; private final String targetDir; private final List symlinks = new ArrayList<>(); - DirectoryCopy(Path source, Pool pool, String targetDir) { + DirectoryCopy(Path source, ModulePool pool, String targetDir) { this.source = source; this.pool = pool; this.targetDir = targetDir; @@ -148,7 +148,7 @@ public class FileCopierPlugin implements TransformerPlugin { } SymImageFileImpl impl = new SymImageFileImpl(symTarget.toString(), file, path, Objects.requireNonNull(file.getFileName()).toString(), - Pool.ModuleDataType.OTHER); + ModuleEntry.Type.OTHER); symlinks.add(impl); } else { addFile(pool, file, path); @@ -172,14 +172,14 @@ public class FileCopierPlugin implements TransformerPlugin { } } - private static void addFile(Pool pool, Path file, String path) + private static void addFile(ModulePool pool, Path file, String path) throws IOException { Objects.requireNonNull(pool); Objects.requireNonNull(file); Objects.requireNonNull(path); - ModuleData impl = Pool.newImageFile(FAKE_MODULE, + ModuleEntry impl = ModuleEntry.create(FAKE_MODULE, "/" + FAKE_MODULE + "/other/" + path, - Pool.ModuleDataType.OTHER, newStream(file), length(file)); + ModuleEntry.Type.OTHER, newStream(file), length(file)); try { pool.add(impl); } catch (Exception ex) { @@ -188,9 +188,9 @@ public class FileCopierPlugin implements TransformerPlugin { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } @@ -239,8 +239,8 @@ public class FileCopierPlugin implements TransformerPlugin { } @Override - public void visit(Pool in, Pool out) { - in.visit((file) -> { + public void visit(ModulePool in, ModulePool out) { + in.transformAndCopy((file) -> { return file; }, out); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java index d2b2995bdda..9e0805ec361 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java @@ -33,8 +33,9 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; /** @@ -60,8 +61,8 @@ public final class GenerateJLIClassesPlugin implements TransformerPlugin { } @Override - public Set getType() { - return Collections.singleton(CATEGORY.TRANSFORMER); + public Set getType() { + return Collections.singleton(Category.TRANSFORMER); } @Override @@ -75,8 +76,8 @@ public final class GenerateJLIClassesPlugin implements TransformerPlugin { } @Override - public Set getState() { - return EnumSet.of(STATE.AUTO_ENABLED, STATE.FUNCTIONAL); + public Set getState() { + return EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL); } @Override @@ -151,8 +152,8 @@ public final class GenerateJLIClassesPlugin implements TransformerPlugin { } @Override - public void visit(Pool in, Pool out) { - for (Pool.ModuleData data : in.getContent()) { + public void visit(ModulePool in, ModulePool out) { + in.entries().forEach(data -> { if (("/java.base/" + BMH + ".class").equals(data.getPath())) { // Add BoundMethodHandle unchanged out.add(data); @@ -162,11 +163,11 @@ public final class GenerateJLIClassesPlugin implements TransformerPlugin { out.add(data); } } - } + }); } @SuppressWarnings("unchecked") - private void generateConcreteClass(String types, Pool.ModuleData data, Pool out) { + private void generateConcreteClass(String types, ModuleEntry data, ModulePool out) { try { // Generate class Map.Entry result = (Map.Entry) @@ -175,9 +176,9 @@ public final class GenerateJLIClassesPlugin implements TransformerPlugin { byte[] bytes = result.getValue(); // Add class to pool - Pool.ModuleData ndata = new Pool.ModuleData(data.getModule(), + ModuleEntry ndata = ModuleEntry.create(data.getModule(), "/java.base/" + className + ".class", - Pool.ModuleDataType.CLASS_OR_RESOURCE, + ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(bytes), bytes.length); if (!out.contains(ndata)) { out.add(ndata); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java index b8b7aa46cc1..3083c19d2ba 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java @@ -34,6 +34,7 @@ import java.util.IllformedLocaleException; import java.util.Locale; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -44,9 +45,10 @@ import jdk.internal.org.objectweb.asm.ClassReader; import jdk.tools.jlink.internal.ResourcePrevisitor; import jdk.tools.jlink.internal.StringTable; import jdk.tools.jlink.internal.Utils; +import jdk.tools.jlink.plugin.LinkModule; +import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; /** @@ -112,19 +114,19 @@ public final class IncludeLocalesPlugin implements TransformerPlugin, ResourcePr } @Override - public void visit(Pool in, Pool out) { - in.visit((resource) -> { + public void visit(ModulePool in, ModulePool out) { + in.transformAndCopy((resource) -> { if (resource.getModule().equals(MODULENAME)) { String path = resource.getPath(); resource = predicate.test(path) ? resource: null; if (resource != null && - resource.getType().equals(ModuleDataType.CLASS_OR_RESOURCE)) { + resource.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) { byte[] bytes = resource.getBytes(); ClassReader cr = new ClassReader(bytes); if (Arrays.stream(cr.getInterfaces()) .anyMatch(i -> i.contains(METAINFONAME)) && stripUnsupportedLocales(bytes, cr)) { - resource = new Pool.ModuleData(MODULENAME, path, + resource = ModuleEntry.create(MODULENAME, path, resource.getType(), new ByteArrayInputStream(bytes), bytes.length); } @@ -135,9 +137,9 @@ public final class IncludeLocalesPlugin implements TransformerPlugin, ResourcePr } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.FILTER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.FILTER); return Collections.unmodifiableSet(set); } @@ -172,12 +174,13 @@ public final class IncludeLocalesPlugin implements TransformerPlugin, ResourcePr } @Override - public void previsit(Pool resources, StringTable strings) { + public void previsit(ModulePool resources, StringTable strings) { final Pattern p = Pattern.compile(".*((Data_)|(Names_))(?.*)\\.class"); - Pool.Module module = resources.getModule(MODULENAME); + Optional optMod = resources.findModule(MODULENAME); // jdk.localedata module validation - if (module != null) { + if (optMod.isPresent()) { + LinkModule module = optMod.get(); Set packages = module.getAllPackages(); if (!packages.containsAll(LOCALEDATA_PACKAGES)) { throw new PluginException(PluginsResourceBundle.getMessage(NAME + ".missingpackages") + @@ -186,7 +189,7 @@ public final class IncludeLocalesPlugin implements TransformerPlugin, ResourcePr .collect(Collectors.joining(",\n\t"))); } - available = Stream.concat(module.getContent().stream() + available = Stream.concat(module.entries() .map(md -> p.matcher(md.getPath())) .filter(m -> m.matches()) .map(m -> m.group("tag").replaceAll("_", "-")), diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java index 4f8e5eade53..9632cdf9b95 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java @@ -24,7 +24,6 @@ */ package jdk.tools.jlink.internal.plugins; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -287,9 +286,9 @@ public final class OptimizationPlugin extends AsmPlugin { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java index 8fb124dd775..5060bf5c519 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java @@ -36,9 +36,8 @@ import java.util.Map; import java.util.Set; import java.util.function.ToIntFunction; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.internal.Utils; @@ -62,15 +61,15 @@ public final class OrderResourcesPlugin implements TransformerPlugin { } static class SortWrapper { - private final ModuleData resource; + private final ModuleEntry resource; private final int ordinal; - SortWrapper(ModuleData resource, int ordinal) { + SortWrapper(ModuleEntry resource, int ordinal) { this.resource = resource; this.ordinal = ordinal; } - ModuleData getResource() { + ModuleEntry getResource() { return resource; } @@ -95,7 +94,7 @@ public final class OrderResourcesPlugin implements TransformerPlugin { return path; } - private int getOrdinal(ModuleData resource) { + private int getOrdinal(ModuleEntry resource) { String path = resource.getPath(); Integer value = orderedPaths.get(stripModule(path)); @@ -126,23 +125,23 @@ public final class OrderResourcesPlugin implements TransformerPlugin { } @Override - public void visit(Pool in, Pool out) { - in.getContent().stream() + public void visit(ModulePool in, ModulePool out) { + in.entries() .filter(resource -> resource.getType() - .equals(ModuleDataType.CLASS_OR_RESOURCE)) + .equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) .map((resource) -> new SortWrapper(resource, getOrdinal(resource))) .sorted(OrderResourcesPlugin::compare) .forEach((wrapper) -> out.add(wrapper.getResource())); - in.getContent().stream() + in.entries() .filter(other -> !other.getType() - .equals(ModuleDataType.CLASS_OR_RESOURCE)) + .equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) .forEach((other) -> out.add(other)); } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.SORTER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.SORTER); return Collections.unmodifiableSet(set); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java index bbc7428a41e..579aace7e0a 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java @@ -24,34 +24,33 @@ */ package jdk.tools.jlink.internal.plugins; -import java.lang.module.ModuleDescriptor; import java.io.FileInputStream; import java.io.IOException; import java.util.Collections; import java.util.EnumSet; -import java.util.List; +import java.util.HashMap; import java.util.Map; -import java.util.Set; import java.util.Properties; - +import java.util.Set; +import java.util.function.Function; import jdk.tools.jlink.internal.Utils; -import jdk.tools.jlink.plugin.ExecutableImage; -import jdk.tools.jlink.plugin.PluginContext; -import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.PostProcessorPlugin; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.plugin.Plugin.Category; +import jdk.tools.jlink.plugin.Plugin.State; +import jdk.tools.jlink.plugin.TransformerPlugin; /** * This plugin adds/deletes information for 'release' file. */ -public final class ReleaseInfoPlugin implements PostProcessorPlugin { +public final class ReleaseInfoPlugin implements TransformerPlugin { // option name public static final String NAME = "release-info"; public static final String KEYS = "keys"; + private final Map release = new HashMap<>(); @Override - public Set getType() { - return Collections.singleton(CATEGORY.PROCESSOR); + public Set getType() { + return Collections.singleton(Category.METAINFO_ADDER); } @Override @@ -65,8 +64,8 @@ public final class ReleaseInfoPlugin implements PostProcessorPlugin { } @Override - public Set getState() { - return EnumSet.of(STATE.FUNCTIONAL); + public Set getState() { + return EnumSet.of(State.FUNCTIONAL); } @Override @@ -80,49 +79,49 @@ public final class ReleaseInfoPlugin implements PostProcessorPlugin { } @Override - public void configure(Map config, PluginContext ctx) { - Properties release = ctx != null? ctx.getReleaseProperties() : null; - if (release != null) { - String operation = config.get(NAME); - switch (operation) { - case "add": { - // leave it to open-ended! source, java_version, java_full_version - // can be passed via this option like: - // - // --release-info add:build_type=fastdebug,source=openjdk,java_version=9 - // and put whatever value that was passed in command line. + public void configure(Map config) { + String operation = config.get(NAME); + switch (operation) { + case "add": { + // leave it to open-ended! source, java_version, java_full_version + // can be passed via this option like: + // + // --release-info add:build_type=fastdebug,source=openjdk,java_version=9 + // and put whatever value that was passed in command line. - config.keySet().stream(). - filter(s -> !NAME.equals(s)). - forEach(s -> release.put(s, config.get(s))); - } - break; - - case "del": { - // --release-info del:keys=openjdk,java_version - String[] keys = Utils.listParser.apply(config.get(KEYS)); - for (String k : keys) { - release.remove(k); - } - } - break; - - default: { - // --release-info - try (FileInputStream fis = new FileInputStream(operation)) { - release.load(fis); - } catch (IOException exp) { - throw new RuntimeException(exp); - } - } - break; + config.keySet().stream(). + filter(s -> !NAME.equals(s)). + forEach(s -> release.put(s, config.get(s))); } + break; + + case "del": { + // --release-info del:keys=openjdk,java_version + String[] keys = Utils.listParser.apply(config.get(KEYS)); + for (String k : keys) { + release.remove(k); + } + } + break; + + default: { + // --release-info + Properties props = new Properties(); + try (FileInputStream fis = new FileInputStream(operation)) { + props.load(fis); + } catch (IOException exp) { + throw new RuntimeException(exp); + } + props.forEach((k, v) -> release.put(k.toString(), v.toString())); + } + break; } } @Override - public List process(ExecutableImage image) { - // Nothing to do! Release info copied already during configure! - return Collections.emptyList(); + public void visit(ModulePool in, ModulePool out) { + in.transformAndCopy(Function.identity(), out); + out.getReleaseProperties().putAll(in.getReleaseProperties()); + out.getReleaseProperties().putAll(release); } } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java index a4aa8f9d5ca..b3a1e7cf3cf 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java @@ -56,11 +56,11 @@ import java.util.stream.Collectors; import jdk.internal.jimage.decompressor.CompressIndexes; import jdk.internal.jimage.decompressor.SignatureParser; import jdk.internal.jimage.decompressor.StringSharingDecompressor; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.internal.ResourcePrevisitor; import jdk.tools.jlink.internal.StringTable; import jdk.tools.jlink.internal.Utils; @@ -228,7 +228,7 @@ public class StringSharingPlugin implements TransformerPlugin, ResourcePrevisito } } - public byte[] transform(ModuleData resource, Pool out, + public byte[] transform(ModuleEntry resource, ModulePool out, StringTable strings) throws IOException, Exception { byte[] content = resource.getBytes(); ClassFile cf; @@ -243,7 +243,7 @@ public class StringSharingPlugin implements TransformerPlugin, ResourcePrevisito } @SuppressWarnings("fallthrough") - private byte[] optimize(ModuleData resource, Pool resources, + private byte[] optimize(ModuleEntry resource, ModulePool resources, StringTable strings, Set descriptorIndexes, byte[] content) throws Exception { DataInputStream stream = new DataInputStream(new ByteArrayInputStream(content)); @@ -348,27 +348,27 @@ public class StringSharingPlugin implements TransformerPlugin, ResourcePrevisito } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.COMPRESSOR); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.COMPRESSOR); return Collections.unmodifiableSet(set); } @Override - public void visit(Pool in, Pool result) { + public void visit(ModulePool in, ModulePool result) { CompactCPHelper visit = new CompactCPHelper(); - in.visit((resource) -> { - ModuleData res = resource; + in.transformAndCopy((resource) -> { + ModuleEntry res = resource; if (predicate.test(resource.getPath()) && resource.getPath().endsWith(".class")) { byte[] compressed = null; try { - compressed = visit.transform(resource, result, ((PoolImpl) in).getStringTable()); + compressed = visit.transform(resource, result, ((ModulePoolImpl) in).getStringTable()); } catch (Exception ex) { throw new PluginException(ex); } - res = PoolImpl.newCompressedResource(resource, + res = ModulePoolImpl.newCompressedResource(resource, ByteBuffer.wrap(compressed), getName(), null, - ((PoolImpl) in).getStringTable(), in.getByteOrder()); + ((ModulePoolImpl) in).getStringTable(), in.getByteOrder()); } return res; }, result); @@ -405,10 +405,10 @@ public class StringSharingPlugin implements TransformerPlugin, ResourcePrevisito } @Override - public void previsit(Pool resources, StringTable strings) { + public void previsit(ModulePool resources, StringTable strings) { CompactCPHelper preVisit = new CompactCPHelper(); - for (ModuleData resource : resources.getContent()) { - if (resource.getType().equals(Pool.ModuleDataType.CLASS_OR_RESOURCE) + resources.entries().forEach(resource -> { + if (resource.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE) && resource.getPath().endsWith(".class") && predicate.test(resource.getPath())) { try { preVisit.transform(resource, null, strings); @@ -416,6 +416,6 @@ public class StringSharingPlugin implements TransformerPlugin, ResourcePrevisito throw new PluginException(ex); } } - } + }); } } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java index ae927952226..4e7a036d838 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java @@ -29,14 +29,12 @@ import java.io.IOException; import java.io.UncheckedIOException; import java.util.Collections; import java.util.HashSet; -import java.util.Map; import java.util.Set; import java.util.function.Predicate; import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; /** @@ -61,9 +59,9 @@ public final class StripDebugPlugin implements TransformerPlugin { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } @@ -73,11 +71,11 @@ public final class StripDebugPlugin implements TransformerPlugin { } @Override - public void visit(Pool in, Pool out) { + public void visit(ModulePool in, ModulePool out) { //remove *.diz files as well as debug attributes. - in.visit((resource) -> { - ModuleData res = resource; - if (resource.getType().equals(ModuleDataType.CLASS_OR_RESOURCE)) { + in.transformAndCopy((resource) -> { + ModuleEntry res = resource; + if (resource.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) { String path = resource.getPath(); if (path.endsWith(".class")) { if (path.endsWith("module-info.class")) { @@ -87,7 +85,7 @@ public final class StripDebugPlugin implements TransformerPlugin { ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); reader.accept(writer, ClassReader.SKIP_DEBUG); byte[] content = writer.toByteArray(); - res = Pool.newResource(path, new ByteArrayInputStream(content), content.length); + res = ModuleEntry.create(path, new ByteArrayInputStream(content), content.length); } } } else if (predicate.test(res.getPath())) { diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin.java index dc64582be21..496a4e538d7 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin.java @@ -26,9 +26,9 @@ package jdk.tools.jlink.internal.plugins; import java.util.Collections; import java.util.HashSet; -import java.util.Map; import java.util.Set; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; /** @@ -45,16 +45,16 @@ public final class StripNativeCommandsPlugin implements TransformerPlugin { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.FILTER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.FILTER); return Collections.unmodifiableSet(set); } @Override - public void visit(Pool in, Pool out) { - in.visit((file) -> { - return file.getType() == Pool.ModuleDataType.NATIVE_CMD ? null : file; + public void visit(ModulePool in, ModulePool out) { + in.transformAndCopy((file) -> { + return file.getType() == ModuleEntry.Type.NATIVE_CMD ? null : file; }, out); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java index f4cba7607ea..b60fecb5d16 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java @@ -36,6 +36,7 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -50,9 +51,10 @@ import jdk.internal.org.objectweb.asm.Opcodes; import static jdk.internal.org.objectweb.asm.Opcodes.*; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.internal.plugins.SystemModuleDescriptorPlugin.Builder.*; +import jdk.tools.jlink.plugin.ModuleEntry; /** * Jlink plugin to reconstitute module descriptors for installed modules. @@ -81,8 +83,8 @@ public final class SystemModuleDescriptorPlugin implements TransformerPlugin { } @Override - public Set getType() { - return Collections.singleton(CATEGORY.TRANSFORMER); + public Set getType() { + return Collections.singleton(Category.TRANSFORMER); } @Override @@ -96,9 +98,9 @@ public final class SystemModuleDescriptorPlugin implements TransformerPlugin { } @Override - public Set getState() { - return enabled ? EnumSet.of(STATE.AUTO_ENABLED, STATE.FUNCTIONAL) - : EnumSet.of(STATE.DISABLED); + public Set getState() { + return enabled ? EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL) + : EnumSet.of(State.DISABLED); } @Override @@ -110,7 +112,7 @@ public final class SystemModuleDescriptorPlugin implements TransformerPlugin { @Override - public void visit(Pool in, Pool out) { + public void visit(ModulePool in, ModulePool out) { if (!enabled) { throw new PluginException(NAME + " was set"); } @@ -119,13 +121,14 @@ public final class SystemModuleDescriptorPlugin implements TransformerPlugin { // generate the byte code to create ModuleDescriptors // skip parsing module-info.class and skip name check - for (Pool.Module module : in.getModules()) { - Pool.ModuleData data = module.get("module-info.class"); - if (data == null) { + in.modules().forEach(module -> { + Optional optData = module.findEntry("module-info.class"); + if (! optData.isPresent()) { // automatic module not supported yet throw new PluginException("module-info.class not found for " + module.getName() + " module"); } + ModuleEntry data = optData.get(); assert module.getName().equals(data.getModule()); try { ByteArrayInputStream bain = new ByteArrayInputStream(data.getBytes()); @@ -141,7 +144,7 @@ public final class SystemModuleDescriptorPlugin implements TransformerPlugin { ModuleInfoRewriter minfoWriter = new ModuleInfoRewriter(bain, mbuilder.conceals()); // replace with the overridden version - data = new Pool.ModuleData(data.getModule(), + data = ModuleEntry.create(data.getModule(), data.getPath(), data.getType(), minfoWriter.stream(), @@ -151,19 +154,17 @@ public final class SystemModuleDescriptorPlugin implements TransformerPlugin { } catch (IOException e) { throw new PluginException(e); } - - } + }); // Generate the new class ClassWriter cwriter = builder.build(); - for (Pool.ModuleData data : in.getContent()) { + in.entries().forEach(data -> { if (data.getPath().endsWith("module-info.class")) - continue; - + return; if (builder.isOverriddenClass(data.getPath())) { byte[] bytes = cwriter.toByteArray(); - Pool.ModuleData ndata = - new Pool.ModuleData(data.getModule(), + ModuleEntry ndata = + ModuleEntry.create(data.getModule(), data.getPath(), data.getType(), new ByteArrayInputStream(bytes), @@ -172,7 +173,7 @@ public final class SystemModuleDescriptorPlugin implements TransformerPlugin { } else { out.add(data); } - } + }); } /* diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java index df66e300f5c..d3dd7bff210 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java @@ -34,10 +34,9 @@ import java.util.Set; import java.util.function.Predicate; import java.util.zip.Deflater; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.internal.PoolImpl; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.internal.ModulePoolImpl; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.internal.Utils; @@ -68,9 +67,9 @@ public final class ZipPlugin implements TransformerPlugin { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.COMPRESSOR); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.COMPRESSOR); return Collections.unmodifiableSet(set); } @@ -124,16 +123,16 @@ public final class ZipPlugin implements TransformerPlugin { } @Override - public void visit(Pool in, Pool out) { - in.visit((resource) -> { - ModuleData res = resource; - if (resource.getType().equals(ModuleDataType.CLASS_OR_RESOURCE) + public void visit(ModulePool in, ModulePool out) { + in.transformAndCopy((resource) -> { + ModuleEntry res = resource; + if (resource.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE) && predicate.test(resource.getPath())) { byte[] compressed; compressed = compress(resource.getBytes()); - res = PoolImpl.newCompressedResource(resource, + res = ModulePoolImpl.newCompressedResource(resource, ByteBuffer.wrap(compressed), getName(), null, - ((PoolImpl) in).getStringTable(), in.getByteOrder()); + ((ModulePoolImpl) in).getStringTable(), in.getByteOrder()); } return res; }, out); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPlugin.java index 9902959d059..52712172d5e 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPlugin.java @@ -26,9 +26,9 @@ package jdk.tools.jlink.internal.plugins.asm; import java.util.Objects; import jdk.tools.jlink.plugin.TransformerPlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.internal.ModulePoolImpl; /** * Extend this class to develop your own plugin in order to transform jimage @@ -41,17 +41,17 @@ public abstract class AsmPlugin implements TransformerPlugin { } @Override - public void visit(Pool allContent, Pool outResources) { + public void visit(ModulePool allContent, ModulePool outResources) { Objects.requireNonNull(allContent); Objects.requireNonNull(outResources); - PoolImpl resources = new PoolImpl(allContent.getByteOrder()); - for(ModuleData md : allContent.getContent()) { - if(md.getType().equals(Pool.ModuleDataType.CLASS_OR_RESOURCE)) { + ModulePoolImpl resources = new ModulePoolImpl(allContent.getByteOrder()); + allContent.entries().forEach(md -> { + if(md.getType().equals(ModuleEntry.Type.CLASS_OR_RESOURCE)) { resources.add(md); } else { outResources.add(md); } - } + }); AsmPools pools = new AsmPools(resources); visit(pools); pools.fillOutputResources(outResources); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPool.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPool.java index 9184bb86257..aa5c1cb5ef5 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPool.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPool.java @@ -24,13 +24,12 @@ */ package jdk.tools.jlink.internal.plugins.asm; -import java.io.InputStream; -import java.nio.ByteBuffer; import java.util.Collection; import java.util.List; import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; /** * A pool of ClassReader and other resource files. @@ -138,14 +137,14 @@ public interface AsmPool { * @return The ClassReader or null if the class is not found. * @throws jdk.tools.jlink.plugin.PluginException */ - public ClassReader getClassReader(Pool.ModuleData res); + public ClassReader getClassReader(ModuleEntry res); /** * Returns all the classes contained in the writable pool. * * @return The collection of classes. */ - public Collection getClasses(); + public Collection getClasses(); } /** @@ -185,14 +184,14 @@ public interface AsmPool { * @param res The java resource * @return The Resource or null if the resource is not found. */ - public ResourceFile getResourceFile(Pool.ModuleData res); + public ResourceFile getResourceFile(ModuleEntry res); /** * Returns all the resources contained in the writable pool. * * @return The array of resources. */ - public Collection getResourceFiles(); + public Collection getResourceFiles(); } /** @@ -206,7 +205,7 @@ public interface AsmPool { * @return The resource paths ordered in the way to use for storage in the jimage. * @throws jdk.tools.jlink.plugin.PluginException */ - public List sort(Pool resources); + public List sort(ModulePool resources); } /** @@ -237,7 +236,7 @@ public interface AsmPool { * * @return The classes. */ - public Collection getClasses(); + public Collection getClasses(); /** * Returns the resources contained in the pool. Resources are all the file @@ -245,7 +244,7 @@ public interface AsmPool { * * @return The array of resource files. */ - public Collection getResourceFiles(); + public Collection getResourceFiles(); /** * Retrieves a resource based on the binary name. This name doesn't contain @@ -266,7 +265,7 @@ public interface AsmPool { * @param res The resource * @return The resource file or null if it doesn't exist. */ - public ResourceFile getResourceFile(Pool.ModuleData res); + public ResourceFile getResourceFile(ModuleEntry res); /** * Retrieve a ClassReader from the pool. @@ -284,7 +283,7 @@ public interface AsmPool { * @return A reader or null if the class is unknown * @throws jdk.tools.jlink.plugin.PluginException */ - public ClassReader getClassReader(Pool.ModuleData res); + public ClassReader getClassReader(ModuleEntry res); /** * To visit the set of ClassReaders. @@ -310,6 +309,6 @@ public interface AsmPool { * @param output The pool used to fill the jimage. * @throws jdk.tools.jlink.plugin.PluginException */ - public void fillOutputResources(Pool output); + public void fillOutputResources(ModulePool output); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPoolImpl.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPoolImpl.java index cb838d11efa..20c17c85b7b 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPoolImpl.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPoolImpl.java @@ -41,15 +41,14 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; -import java.util.Optional; import java.util.Set; import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.tools.jlink.internal.ImageFileCreator; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; +import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModulePool; /** * A pool of ClassReader and other resource files. This class allows to @@ -94,7 +93,7 @@ final class AsmPoolImpl implements AsmModulePool { } byte[] content = writer.toByteArray(); - ModuleData res = Pool.newResource(path, + ModuleEntry res = ModuleEntry.create(path, new ByteArrayInputStream(content), content.length); transformedClasses.put(className, res); } @@ -108,7 +107,7 @@ final class AsmPoolImpl implements AsmModulePool { public void forgetClass(String className) { Objects.requireNonNull(className); // do we have a resource? - ModuleData res = transformedClasses.get(className); + ModuleEntry res = transformedClasses.get(className); if (res == null) { res = inputClasses.get(className); if (res == null) { @@ -130,7 +129,7 @@ final class AsmPoolImpl implements AsmModulePool { @Override public ClassReader getClassReader(String binaryName) { Objects.requireNonNull(binaryName); - ModuleData res = transformedClasses.get(binaryName); + ModuleEntry res = transformedClasses.get(binaryName); ClassReader reader = null; if (res != null) { reader = getClassReader(res); @@ -144,16 +143,16 @@ final class AsmPoolImpl implements AsmModulePool { * @return The array of transformed classes. */ @Override - public Collection getClasses() { - List classes = new ArrayList<>(); - for (Entry entry : transformedClasses.entrySet()) { + public Collection getClasses() { + List classes = new ArrayList<>(); + for (Entry entry : transformedClasses.entrySet()) { classes.add(entry.getValue()); } return classes; } @Override - public ClassReader getClassReader(ModuleData res) { + public ClassReader getClassReader(ModuleEntry res) { return newClassReader(res.getBytes()); } } @@ -176,7 +175,7 @@ final class AsmPoolImpl implements AsmModulePool { public void addResourceFile(ResourceFile resFile) { Objects.requireNonNull(resFile); String path = toResourceNamePath(resFile.getPath()); - ModuleData res = Pool.newResource(path, resFile.getContent()); + ModuleEntry res = ModuleEntry.create(path, resFile.getContent()); transformedResources.put(resFile.getPath(), res); } @@ -191,7 +190,7 @@ final class AsmPoolImpl implements AsmModulePool { Objects.requireNonNull(resourceName); String path = toResourceNamePath(resourceName); // do we have a resource? - ModuleData res = transformedResources.get(resourceName); + ModuleEntry res = transformedResources.get(resourceName); if (res == null) { res = inputResources.get(resourceName); if (res == null) { @@ -212,7 +211,7 @@ final class AsmPoolImpl implements AsmModulePool { @Override public ResourceFile getResourceFile(String name) { Objects.requireNonNull(name); - ModuleData res = transformedResources.get(name); + ModuleEntry res = transformedResources.get(name); ResourceFile resFile = null; if (res != null) { resFile = getResourceFile(res); @@ -226,24 +225,24 @@ final class AsmPoolImpl implements AsmModulePool { * @return The array of transformed classes. */ @Override - public Collection getResourceFiles() { - List resources = new ArrayList<>(); - for (Entry entry : transformedResources.entrySet()) { + public Collection getResourceFiles() { + List resources = new ArrayList<>(); + for (Entry entry : transformedResources.entrySet()) { resources.add(entry.getValue()); } return resources; } @Override - public ResourceFile getResourceFile(ModuleData res) { + public ResourceFile getResourceFile(ModuleEntry res) { return new ResourceFile(toJavaBinaryResourceName(res.getPath()), res.getBytes()); } } - private final Pool jimageResources; - private final Map inputClasses; - private final Map inputResources; + private final ModulePool jimageResources; + private final Map inputClasses; + private final Map inputResources; private final Map inputClassPackageMapping; private final Map inputOtherPackageMapping; @@ -254,9 +253,9 @@ final class AsmPoolImpl implements AsmModulePool { private Sorter sorter; - private final Map transformedClasses + private final Map transformedClasses = new LinkedHashMap<>(); - private final Map transformedResources + private final Map transformedResources = new LinkedHashMap<>(); private final List forgetResources = new ArrayList<>(); private final Map newPackageMapping = new HashMap<>(); @@ -274,7 +273,7 @@ final class AsmPoolImpl implements AsmModulePool { * @param pools The resource pools. * @param descriptor The module descriptor. */ - AsmPoolImpl(Pool inputResources, String moduleName, + AsmPoolImpl(ModulePool inputResources, String moduleName, AsmPools pools, ModuleDescriptor descriptor) { Objects.requireNonNull(inputResources); @@ -285,11 +284,11 @@ final class AsmPoolImpl implements AsmModulePool { this.moduleName = moduleName; this.pools = pools; this.descriptor = descriptor; - Map classes = new LinkedHashMap<>(); - Map resources = new LinkedHashMap<>(); + Map classes = new LinkedHashMap<>(); + Map resources = new LinkedHashMap<>(); Map packageClassToModule = new HashMap<>(); Map packageOtherToModule = new HashMap<>(); - for (ModuleData res : inputResources.getContent()) { + inputResources.entries().forEach(res -> { if (res.getPath().endsWith(".class")) { classes.put(toJavaBinaryClassName(res.getPath()), res); } else { @@ -305,7 +304,7 @@ final class AsmPoolImpl implements AsmModulePool { packageOtherToModule.put(split[1], res.getModule()); } } - } + }); this.inputClasses = Collections.unmodifiableMap(classes); this.inputResources = Collections.unmodifiableMap(resources); @@ -356,7 +355,7 @@ final class AsmPoolImpl implements AsmModulePool { * @return The array of classes. */ @Override - public Collection getClasses() { + public Collection getClasses() { return inputClasses.values(); } @@ -367,7 +366,7 @@ final class AsmPoolImpl implements AsmModulePool { * @return The array of classes. */ @Override - public Collection getResourceFiles() { + public Collection getResourceFiles() { return inputResources.values(); } @@ -385,7 +384,7 @@ final class AsmPoolImpl implements AsmModulePool { @Override public ResourceFile getResourceFile(String binaryName) { Objects.requireNonNull(binaryName); - ModuleData res = inputResources.get(binaryName); + ModuleEntry res = inputResources.get(binaryName); ResourceFile resFile = null; if (res != null) { resFile = getResourceFile(res); @@ -402,7 +401,7 @@ final class AsmPoolImpl implements AsmModulePool { @Override public ClassReader getClassReader(String binaryName) { Objects.requireNonNull(binaryName); - ModuleData res = inputClasses.get(binaryName); + ModuleEntry res = inputClasses.get(binaryName); ClassReader reader = null; if (res != null) { reader = getClassReader(res); @@ -411,13 +410,13 @@ final class AsmPoolImpl implements AsmModulePool { } @Override - public ResourceFile getResourceFile(ModuleData res) { + public ResourceFile getResourceFile(ModuleEntry res) { return new ResourceFile(toJavaBinaryResourceName(res.getPath()), res.getBytes()); } @Override - public ClassReader getClassReader(ModuleData res) { + public ClassReader getClassReader(ModuleEntry res) { return newClassReader(res.getBytes()); } @@ -505,7 +504,7 @@ final class AsmPoolImpl implements AsmModulePool { @Override public void visitClassReaders(ClassReaderVisitor visitor) { Objects.requireNonNull(visitor); - for (ModuleData res : getClasses()) { + for (ModuleEntry res : getClasses()) { ClassReader reader = newClassReader(res.getBytes()); ClassWriter writer = visitor.visit(reader); if (writer != null) { @@ -523,7 +522,7 @@ final class AsmPoolImpl implements AsmModulePool { @Override public void visitResourceFiles(ResourceFileVisitor visitor) { Objects.requireNonNull(visitor); - for (ModuleData resource : getResourceFiles()) { + for (ModuleEntry resource : getResourceFiles()) { ResourceFile resFile = new ResourceFile(toJavaBinaryResourceName(resource.getPath()), resource.getBytes()); @@ -540,18 +539,18 @@ final class AsmPoolImpl implements AsmModulePool { * been set, it is used to sort the returned resources. * */ @Override - public void fillOutputResources(Pool outputResources) { + public void fillOutputResources(ModulePool outputResources) { List added = new ArrayList<>(); // If the sorter is null, use the input order. // New resources are added at the end // First input classes that have not been removed - Pool output = new PoolImpl(outputResources.getByteOrder(), - ((PoolImpl)outputResources).getStringTable()); - for (ModuleData inResource : jimageResources.getContent()) { + ModulePool output = new ModulePoolImpl(outputResources.getByteOrder(), + ((ModulePoolImpl)outputResources).getStringTable()); + jimageResources.entries().forEach(inResource -> { if (!forgetResources.contains(inResource.getPath())) { - ModuleData resource = inResource; + ModuleEntry resource = inResource; // Do we have a transformed class with the same name? - ModuleData res = transformedResources. + ModuleEntry res = transformedResources. get(toJavaBinaryResourceName(inResource.getPath())); if (res != null) { resource = res; @@ -565,10 +564,10 @@ final class AsmPoolImpl implements AsmModulePool { output.add(resource); added.add(resource.getPath()); } - } + }); // Then new resources - for (Map.Entry entry : transformedResources.entrySet()) { - ModuleData resource = entry.getValue(); + for (Map.Entry entry : transformedResources.entrySet()) { + ModuleEntry resource = entry.getValue(); if (!forgetResources.contains(resource.getPath())) { if (!added.contains(resource.getPath())) { output.add(resource); @@ -576,8 +575,8 @@ final class AsmPoolImpl implements AsmModulePool { } } // And new classes - for (Map.Entry entry : transformedClasses.entrySet()) { - ModuleData resource = entry.getValue(); + for (Map.Entry entry : transformedClasses.entrySet()) { + ModuleEntry resource = entry.getValue(); if (!forgetResources.contains(resource.getPath())) { if (!added.contains(resource.getPath())) { output.add(resource); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPools.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPools.java index bbb2d5403f8..53742ee5ad7 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPools.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPools.java @@ -41,11 +41,11 @@ import java.util.Objects; import java.util.Set; import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.plugins.asm.AsmPool.Sorter; +import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModulePool; /** * A container for pools of ClassReader and other resource files. A pool of all @@ -97,10 +97,10 @@ public final class AsmPools { } @Override - public Collection getClasses() { - List all = new ArrayList<>(); + public Collection getClasses() { + List all = new ArrayList<>(); visitAllPools((AsmModulePool pool) -> { - for (Pool.ModuleData rf : pool.getTransformedClasses().getClasses()) { + for (ModuleEntry rf : pool.getTransformedClasses().getClasses()) { all.add(rf); } }); @@ -108,7 +108,7 @@ public final class AsmPools { } @Override - public ClassReader getClassReader(Pool.ModuleData res) { + public ClassReader getClassReader(ModuleEntry res) { return visitPools((AsmModulePool pool) -> { return pool.getTransformedClasses().getClassReader(res); }); @@ -140,10 +140,10 @@ public final class AsmPools { } @Override - public Collection getResourceFiles() { - List all = new ArrayList<>(); + public Collection getResourceFiles() { + List all = new ArrayList<>(); visitAllPools((AsmModulePool pool) -> { - for (Pool.ModuleData rf : pool.getTransformedResourceFiles().getResourceFiles()) { + for (ModuleEntry rf : pool.getTransformedResourceFiles().getResourceFiles()) { all.add(rf); } }); @@ -151,7 +151,7 @@ public final class AsmPools { } @Override - public ResourceFile getResourceFile(Pool.ModuleData res) { + public ResourceFile getResourceFile(ModuleEntry res) { return visitPools((AsmModulePool pool) -> { return pool.getTransformedResourceFiles().getResourceFile(res); }); @@ -175,10 +175,10 @@ public final class AsmPools { } @Override - public Collection getClasses() { - List all = new ArrayList<>(); + public Collection getClasses() { + List all = new ArrayList<>(); visitAllPools((AsmModulePool pool) -> { - for (Pool.ModuleData rf : pool.getClasses()) { + for (ModuleEntry rf : pool.getClasses()) { all.add(rf); } }); @@ -186,10 +186,10 @@ public final class AsmPools { } @Override - public Collection getResourceFiles() { - List all = new ArrayList<>(); + public Collection getResourceFiles() { + List all = new ArrayList<>(); visitAllPools((AsmModulePool pool) -> { - for (Pool.ModuleData rf : pool.getResourceFiles()) { + for (ModuleEntry rf : pool.getResourceFiles()) { all.add(rf); } }); @@ -211,14 +211,14 @@ public final class AsmPools { } @Override - public ResourceFile getResourceFile(Pool.ModuleData res) { + public ResourceFile getResourceFile(ModuleEntry res) { return visitPools((AsmModulePool pool) -> { return pool.getResourceFile(res); }); } @Override - public ClassReader getClassReader(Pool.ModuleData res) { + public ClassReader getClassReader(ModuleEntry res) { return visitPoolsEx((AsmModulePool pool) -> { return pool.getClassReader(res); }); @@ -239,7 +239,7 @@ public final class AsmPools { } @Override - public void fillOutputResources(Pool outputResources) { + public void fillOutputResources(ModulePool outputResources) { AsmPools.this.fillOutputResources(outputResources); } @@ -324,15 +324,15 @@ public final class AsmPools { * * @param inputResources The raw resources to build the pool from. */ - public AsmPools(Pool inputResources) { + public AsmPools(ModulePool inputResources) { Objects.requireNonNull(inputResources); - Map resPools = new LinkedHashMap<>(); + Map resPools = new LinkedHashMap<>(); Map descriptors = new HashMap<>(); - for (Pool.ModuleData res : inputResources.getContent()) { - Pool p = resPools.get(res.getModule()); + inputResources.entries().forEach(res -> { + ModulePool p = resPools.get(res.getModule()); if (p == null) { - p = new PoolImpl(inputResources.getByteOrder(), - ((PoolImpl)inputResources).getStringTable()); + p = new ModulePoolImpl(inputResources.getByteOrder(), + ((ModulePoolImpl)inputResources).getStringTable()); resPools.put(res.getModule(), p); } if (res.getPath().endsWith("module-info.class")) { @@ -341,11 +341,11 @@ public final class AsmPools { descriptors.put(res.getModule(), descriptor); } p.add(res); - } + }); poolsArray = new AsmModulePool[resPools.size()]; int i = 0; - for (Entry entry : resPools.entrySet()) { + for (Entry entry : resPools.entrySet()) { ModuleDescriptor descriptor = descriptors.get(entry.getKey()); if (descriptor == null) { throw new PluginException("module-info.class not found for " + entry.getKey() + " module"); @@ -405,7 +405,7 @@ public final class AsmPools { * * @param outputResources The pool used to fill the jimage. */ - public void fillOutputResources(Pool outputResources) { + public void fillOutputResources(ModulePool outputResources) { // First sort modules List modules = new ArrayList<>(); for (String k : pools.keySet()) { @@ -414,8 +414,8 @@ public final class AsmPools { if (moduleSorter != null) { modules = moduleSorter.sort(modules); } - Pool output = new PoolImpl(outputResources.getByteOrder(), - ((PoolImpl)outputResources).getStringTable()); + ModulePool output = new ModulePoolImpl(outputResources.getByteOrder(), + ((ModulePoolImpl)outputResources).getStringTable()); for (String mn : modules) { AsmPool pool = pools.get(mn); pool.fillOutputResources(output); @@ -423,17 +423,17 @@ public final class AsmPools { sort(outputResources, output, global.sorter); } - static void sort(Pool outputResources, - Pool transientOutput, Sorter sorter) { + static void sort(ModulePool outputResources, + ModulePool transientOutput, Sorter sorter) { if (sorter != null) { List order = sorter.sort(transientOutput); for (String s : order) { - outputResources.add(transientOutput.get(s)); + outputResources.add(transientOutput.findEntry(s).get()); } } else { - for (ModuleData res : transientOutput.getContent()) { + transientOutput.entries().forEach(res-> { outputResources.add(res); - } + }); } } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ExecutableImage.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ExecutableImage.java index d5e767cd553..499d23dd450 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ExecutableImage.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ExecutableImage.java @@ -24,66 +24,41 @@ */ package jdk.tools.jlink.plugin; -import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collections; import java.util.List; -import java.util.Objects; import java.util.Set; /** - * An executable runtime image. Instance of this class contains the information - * needed to create image processes. + * An executable runtime image. Contains the information about the executable + * image created. */ -public abstract class ExecutableImage { - - private final Path home; - private final List args; - private final Set modules; - - protected ExecutableImage(Path home, Set modules, - List args) { - Objects.requireNonNull(home); - Objects.requireNonNull(args); - if (!Files.exists(home)) { - throw new IllegalArgumentException("Invalid image home"); - } - this.home = home; - this.modules = Collections.unmodifiableSet(modules); - this.args = Collections.unmodifiableList(args); - } +public interface ExecutableImage { /** * Image home directory, * * @return The home directory. */ - public Path getHome() { - return home; - } + public Path getHome(); /** * The names of the modules located in the image. * * @return The set of modules. */ - public Set getModules() { - return modules; - } + public Set getModules(); /** * The list of arguments required to execute the image. * * @return The list of arguments. */ - public List getExecutionArgs() { - return args; - } + public List getExecutionArgs(); /** * Store new arguments required to execute the image. * * @param args Additional arguments */ - public abstract void storeLaunchArgs(List args); + public void storeLaunchArgs(List args); } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/LinkModule.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/LinkModule.java new file mode 100644 index 00000000000..f516d8d0494 --- /dev/null +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/LinkModule.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.tools.jlink.plugin; + +import java.lang.module.ModuleDescriptor; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Stream; + +/** + * Link-time representation of a Java module. + */ +public interface LinkModule { + + /** + * The module name. + * + * @return The name. + */ + public String getName(); + + /** + * Retrieves a LinkModuleEntry from the given path (e.g: + * /mymodule/com.foo.bar/MyClass.class) + * + * @param path The piece of data path. + * @return A LinkModuleEntry of the given path, if found. + */ + public Optional findEntry(String path); + + /** + * The module descriptor of this module. + * + * @return The module descriptor. + */ + public ModuleDescriptor getDescriptor(); + + /** + * Add a LinkModuleEntry to this module. + * + * @param data The LinkModuleEntry to add. + */ + public void add(ModuleEntry data); + + /** + * Retrieves all the packages located in this module. + * + * @return The set of packages. + */ + public Set getAllPackages(); + + /** + * Retrieves the stream of LinkModuleEntry. + * + * @return The LinkModuleEntry stream. + */ + public Stream entries(); + + /** + * Return the number of LinkModuleEntry count in this LinkModule. + * + * @return the entry count. + */ + public int getEntryCount(); +} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModuleEntry.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModuleEntry.java new file mode 100644 index 00000000000..61f828fc914 --- /dev/null +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModuleEntry.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.tools.jlink.plugin; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.Objects; +import jdk.tools.jlink.internal.ImageFileCreator; +import jdk.tools.jlink.internal.ModuleEntryImpl; + +/** + * A LinkModuleEntry is the elementary unit of data inside an image. It is + * generally a file. e.g.: a java class file, a resource file, a shared library, + * ... + *
      + * A LinkModuleEntry is identified by a path of the form: + *
        + *
      • For jimage content: /{module name}/{package1}/.../{packageN}/{file + * name}
      • + *
      • For other files (shared lib, launchers, config, ...):/{module name}/ + * {@literal bin|conf|native}/{dir1}>/.../{dirN}/{file name}
      • + *
      + */ +public interface ModuleEntry { + + /** + * Type of module data. + *
    • + *
        CLASS_OR_RESOURCE: A java class or resource file.
      + *
        CONFIG: A configuration file.
      + *
        NATIVE_CMD: A native process launcher.
      + *
        NATIVE_LIB: A native library.
      + *
        OTHER: Other kind of file.
      + *
    • + */ + public enum Type { + CLASS_OR_RESOURCE, + CONFIG, + NATIVE_CMD, + NATIVE_LIB, + OTHER + } + /** + * The LinkModuleEntry module name. + * + * @return The module name. + */ + public String getModule(); + + /** + * The LinkModuleEntry path. + * + * @return The module path. + */ + public String getPath(); + + /** + * The LinkModuleEntry's type. + * + * @return The data type. + */ + public Type getType(); + + /** + * The LinkModuleEntry content as an array of byte. + * + * @return An Array of bytes. + */ + public byte[] getBytes(); + + /** + * The LinkModuleEntry content length. + * + * @return The length. + */ + public long getLength(); + + /** + * The LinkModuleEntry stream. + * + * @return The module data stream. + */ + public InputStream stream(); + + + /** + * Create a LinkModuleEntry located inside a jimage file. Such + * LinkModuleEntry has a Type being equals to CLASS_OR_RESOURCE. + * + * @param path The complete resource path (contains the module radical). + * @param content The resource content. + * @param size The content size. + * @return A new LinkModuleEntry. + */ + public static ModuleEntry create(String path, InputStream content, long size) { + Objects.requireNonNull(path); + Objects.requireNonNull(content); + String[] split = ImageFileCreator.splitPath(path); + String module = split[0]; + return new ModuleEntryImpl(module, path, Type.CLASS_OR_RESOURCE, content, size); + } + + /** + * Create a LinkModuleEntry for a file that will be located inside a jimage + * file. + * + * @param path The resource path. + * @param content The resource content. + * @return A new LinkModuleEntry. + */ + public static ModuleEntry create(String path, byte[] content) { + return create(path, new ByteArrayInputStream(content), + content.length); + } + + /** + * Create a LinkModuleEntry for a file that will be located outside a jimage + * file. + * + * @param module The module in which this files is located. + * @param path The file path locator (doesn't contain the module name). + * @param type The LinkModuleEntry type. + * @param content The file content. + * @param size The content size. + * @return A new LinkModuleEntry. + */ + public static ModuleEntry create(String module, String path, ModuleEntry.Type type, + InputStream content, long size) { + Objects.requireNonNull(path); + Objects.requireNonNull(content); + return new ModuleEntryImpl(module, path, type, content, size); + } +} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModulePool.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModulePool.java new file mode 100644 index 00000000000..4d0f230e1c6 --- /dev/null +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModulePool.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.tools.jlink.plugin; + +import java.nio.ByteOrder; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +/** + * Pool of module data. + */ +public interface ModulePool { +/** + * Is this a read-only ModulePool? + * + * @return true if this is a read-only configuration. + */ + public boolean isReadOnly(); + + /** + * Add a ModuleEntry. + * + * @param data The ModuleEntry to add. + */ + public void add(ModuleEntry data); + /** + * Retrieves the module for the provided name. + * + * @param name The module name + * @return the module of matching name, if found + */ + public Optional findModule(String name); + + /** + * The stream of modules contained in this ModulePool. + * + * @return The stream of modules. + */ + public Stream modules(); + + /** + * Return the number of LinkModule count in this ModulePool. + * + * @return the module count. + */ + public int getModuleCount(); + + /** + * Get all ModuleEntry contained in this ModulePool instance. + * + * @return The stream of LinkModuleEntries. + */ + public Stream entries(); + + /** + * Return the number of ModuleEntry count in this ModulePool. + * + * @return the entry count. + */ + public int getEntryCount(); + + /** + * Get the ModuleEntry for the passed path. + * + * @param path A data path + * @return A ModuleEntry instance or null if the data is not found + */ + public Optional findEntry(String path); + + /** + * Check if the ModulePool contains the given ModuleEntry. + * + * @param data The module data to check existence for. + * @return The module data or null if not found. + */ + public boolean contains(ModuleEntry data); + + /** + * Check if the ModulePool contains some content at all. + * + * @return True, no content, false otherwise. + */ + public boolean isEmpty(); + + /** + * Visit each ModuleEntry in this ModulePool to transform it and copy + * the transformed ModuleEntry to the output ModulePool. + * + * @param transform The function called for each ModuleEntry found in the + * ModulePool. The transform function should return a ModuleEntry + * instance which will be added to the output or it should return null if + * the passed ModuleEntry is to be ignored for the output. + * + * @param output The ModulePool to be filled with Visitor returned + * ModuleEntry. + */ + public void transformAndCopy(Function transform, ModulePool output); + + /** + * The ByteOrder currently in use when generating the jimage file. + * + * @return The ByteOrder. + */ + public ByteOrder getByteOrder(); + + /** + * Release properties such as OS, CPU name, version etc. + * + * @return the release properties + */ + public Map getReleaseProperties(); +} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java index 56e51bc9bc5..30633b546d3 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java @@ -26,7 +26,6 @@ package jdk.tools.jlink.plugin; import java.util.Collections; import java.util.EnumSet; -import java.util.List; import java.util.Map; import java.util.Set; import jdk.tools.jlink.internal.plugins.PluginsResourceBundle; @@ -36,14 +35,6 @@ import jdk.tools.jlink.internal.plugins.PluginsResourceBundle; */ public interface Plugin { - /** - * Type of plugin. - */ - public interface PluginType { - - public String getName(); - } - /** * Order of categories: *
        @@ -53,28 +44,29 @@ public interface Plugin { *
      1. MODULEINFO_TRANSFORMER: Transform only module-info.class
      2. *
      3. SORTER: Sort resources within the resource container.
      4. *
      5. COMPRESSOR: Compress resource within the resouce containers.
      6. + *
      7. METAINFO_ADDER: Added meta info (like release, copyright etc.)
      8. *
      9. VERIFIER: Does some image verification.
      10. *
      11. PROCESSOR: Does some post processing on image.
      12. *
      13. PACKAGER: Final processing
      14. *
      */ - public enum CATEGORY implements PluginType { + public enum Category { FILTER("FILTER"), TRANSFORMER("TRANSFORMER"), MODULEINFO_TRANSFORMER("MODULEINFO_TRANSFORMER"), SORTER("SORTER"), COMPRESSOR("COMPRESSOR"), + METAINFO_ADDER("METAINFO_ADDER"), VERIFIER("VERIFIER"), PROCESSOR("PROCESSOR"), PACKAGER("PACKAGER"); private final String name; - CATEGORY(String name) { + Category(String name) { this.name = name; } - @Override public String getName() { return name; } @@ -91,7 +83,7 @@ public interface Plugin { * {@link #getStateDescription() getStateDescription} method * */ - public enum STATE { + public enum State { DISABLED, AUTO_ENABLED, FUNCTIONAL @@ -101,7 +93,7 @@ public interface Plugin { * The Plugin set of types. * @return The set of types. */ - public default Set getType() { + public default Set getType() { return Collections.emptySet(); } @@ -109,8 +101,8 @@ public interface Plugin { * The Plugin set of states. * @return The set of states. */ - public default Set getState() { - return EnumSet.of(STATE.FUNCTIONAL); + public default Set getState() { + return EnumSet.of(State.FUNCTIONAL); } /** @@ -191,7 +183,7 @@ public interface Plugin { * @return A status description. */ public default String getStateDescription() { - return getState().contains(STATE.FUNCTIONAL) + return getState().contains(State.FUNCTIONAL) ? PluginsResourceBundle.getMessage("main.status.ok") : PluginsResourceBundle.getMessage("main.status.not.ok"); } @@ -206,18 +198,4 @@ public interface Plugin { */ public default void configure(Map config) { } - - /** - * Configure the plugin based on the passed configuration. - * This method is called prior to invoke the plugin. - * - * @param config The plugin configuration. - * @param ctx The plugin context - * @throws IllegalArgumentException if a mandatory argument is missing or - * if an argument has invalid value. - * - */ - public default void configure(Map config, PluginContext ctx) { - configure(config); - } } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Pool.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Pool.java deleted file mode 100644 index 380ca41ac1a..00000000000 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Pool.java +++ /dev/null @@ -1,528 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package jdk.tools.jlink.plugin; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; -import java.lang.module.ModuleDescriptor; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import jdk.tools.jlink.internal.ImageFileCreator; -import jdk.tools.jlink.internal.plugins.FileCopierPlugin; - -/** - * Pool of module data. - * - */ -public abstract class Pool { - - /** - * Interface to visit the content of a Pool. - */ - public interface Visitor { - - /** - * Called for each visited ModuleData. - * - * @param content A ModuleData - * @return A ModuleData instance or null if the passed ModuleData is to - * be removed from the image. - * @throws PluginException - */ - public ModuleData visit(ModuleData content); - } - - /** - * Type of module data. - *
    • - *
        CLASS_OR_RESOURCE: A java class or resource file.
      - *
        CONFIG: A configuration file.
      - *
        NATIVE_CMD: A native process launcher.
      - *
        NATIVE_LIB: A native library.
      - *
        OTHER: Other kind of file.
      - *
    • - */ - public static enum ModuleDataType { - - CLASS_OR_RESOURCE, - CONFIG, - NATIVE_CMD, - NATIVE_LIB, - OTHER; - } - - /** - * A module in the pool. - */ - public interface Module { - - /** - * The module name. - * - * @return The name. - */ - public String getName(); - - /** - * Retrieves a ModuleData from a path (e.g: - * /mymodule/com.foo.bar/MyClass.class) - * - * @param path The piece of data path. - * @return A ModuleData or null if the path doesn't identify a - * ModuleData. - */ - public ModuleData get(String path); - - /** - * The module descriptor of this module. - * - * @return The module descriptor. - */ - public ModuleDescriptor getDescriptor(); - - /** - * Add a ModuleData to this module. - * - * @param data The ModuleData to add. - */ - public void add(ModuleData data); - - /** - * Retrieves all the packages located in this module. - * - * @return The set of packages. - */ - public Set getAllPackages(); - - /** - * Retrieves the collection of ModuleData. - * - * @return The ModuleData collection. - */ - public Collection getContent(); - - } - - private class ModuleImpl implements Module { - - private final Map moduleContent = new LinkedHashMap<>(); - private ModuleDescriptor descriptor; - private final String name; - - private ModuleImpl(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public ModuleData get(String path) { - if (!path.startsWith("/")) { - path = "/" + path; - } - if (!path.startsWith("/" + name)) { - path = "/" + name + path; - } - return moduleContent.get(path); - } - - @Override - public ModuleDescriptor getDescriptor() { - if (descriptor == null) { - String p = "/" + name + "/module-info.class"; - ModuleData content = moduleContent.get(p); - if (content == null) { - throw new PluginException("No module-info for " + name - + " module"); - } - ByteBuffer bb = ByteBuffer.wrap(content.getBytes()); - descriptor = ModuleDescriptor.read(bb); - } - return descriptor; - } - - @Override - public void add(ModuleData data) { - if (isReadOnly()) { - throw new PluginException("pool is readonly"); - } - Objects.requireNonNull(data); - if (!data.getModule().equals(name)) { - throw new PluginException("Can't add resource " + data.getPath() - + " to module " + name); - } - Pool.this.add(data); - } - - @Override - public Set getAllPackages() { - Set pkgs = new HashSet<>(); - moduleContent.values().stream().filter(m -> m.getType(). - equals(ModuleDataType.CLASS_OR_RESOURCE)).forEach((res) -> { - // Module metadata only contains packages with .class files - if (ImageFileCreator.isClassPackage(res.getPath())) { - String[] split = ImageFileCreator.splitPath(res.getPath()); - String pkg = split[1]; - if (pkg != null && !pkg.isEmpty()) { - pkgs.add(pkg); - } - } - }); - return pkgs; - } - - @Override - public String toString() { - return getName(); - } - - @Override - public Collection getContent() { - return Collections.unmodifiableCollection(moduleContent.values()); - } - } - - /** - * A ModuleData is the elementary unit of data inside an image. It is - * generally a file. e.g.: a java class file, a resource file, a shared - * library, ... - *
      - * A ModuleData is identified by a path of the form: - *
        - *
      • For jimage content: /{module name}/{package1}/.../{packageN}/{file - * name}
      • - *
      • For other files (shared lib, launchers, config, ...):/{module name}/ - * {@literal bin|conf|native}/{dir1}/.../{dirN}/{file name}
      • - *
      - */ - public static class ModuleData { - - private final ModuleDataType type; - private final String path; - private final String module; - private final long length; - private final InputStream stream; - private byte[] buffer; - - /** - * Create a new ModuleData. - * - * @param module The module name. - * @param path The data path identifier. - * @param type The data type. - * @param stream The data content stream. - * @param length The stream length. - */ - public ModuleData(String module, String path, ModuleDataType type, - InputStream stream, long length) { - Objects.requireNonNull(module); - Objects.requireNonNull(path); - Objects.requireNonNull(type); - Objects.requireNonNull(stream); - this.path = path; - this.type = type; - this.module = module; - this.stream = stream; - this.length = length; - } - - /** - * The ModuleData module name. - * - * @return The module name. - */ - public final String getModule() { - return module; - } - - /** - * The ModuleData path. - * - * @return The module path. - */ - public final String getPath() { - return path; - } - - /** - * The ModuleData type. - * - * @return The data type. - */ - public final ModuleDataType getType() { - return type; - } - - /** - * The ModuleData content as an array of byte. - * - * @return An Array of bytes. - */ - public byte[] getBytes() { - if (buffer == null) { - try { - buffer = stream.readAllBytes(); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } - } - return buffer; - } - - /** - * The ModuleData content length. - * - * @return The length. - */ - public long getLength() { - return length; - } - - /** - * The ModuleData stream. - * - * @return The module data stream. - */ - public InputStream stream() { - return stream; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 89 * hash + Objects.hashCode(this.path); - return hash; - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof ModuleData)) { - return false; - } - ModuleData f = (ModuleData) other; - return f.path.equals(path); - } - - @Override - public String toString() { - return getPath(); - } - } - - private final Map resources = new LinkedHashMap<>(); - private final Map modules = new LinkedHashMap<>(); - private final ModuleImpl fileCopierModule = new ModuleImpl(FileCopierPlugin.FAKE_MODULE); - - private final ByteOrder order; - - protected Pool() { - this(ByteOrder.nativeOrder()); - } - - protected Pool(ByteOrder order) { - Objects.requireNonNull(order); - this.order = order; - } - - /** - * Read only state. No data can be added to a ReadOnly Pool. - * - * @return true if readonly false otherwise. - */ - public abstract boolean isReadOnly(); - - /** - * Add a ModuleData. - * - * @param data The ModuleData to add. - */ - public void add(ModuleData data) { - if (isReadOnly()) { - throw new PluginException("pool is readonly"); - } - Objects.requireNonNull(data); - if (resources.get(data.getPath()) != null) { - throw new PluginException("Resource " + data.getPath() - + " already present"); - } - String modulename = data.getModule(); - ModuleImpl m = modules.get(modulename); - // ## TODO: FileCopierPlugin should not add content to a module - // FAKE_MODULE is not really a module to be added in the image - if (FileCopierPlugin.FAKE_MODULE.equals(modulename)) { - m = fileCopierModule; - } - if (m == null) { - m = new ModuleImpl(modulename); - modules.put(modulename, m); - } - resources.put(data.getPath(), data); - m.moduleContent.put(data.getPath(), data); - } - - /** - * Retrieves the module for the provided name. - * - * @param name The module name - * @return the module or null if the module doesn't exist. - */ - public Module getModule(String name) { - Objects.requireNonNull(name); - return modules.get(name); - } - - /** - * The collection of modules contained in this pool. - * - * @return The collection of modules. - */ - public Collection getModules() { - return Collections.unmodifiableCollection(modules.values()); - } - - /** - * Get all ModuleData contained in this pool instance. - * - * @return The collection of resources; - */ - public Collection getContent() { - return Collections.unmodifiableCollection(resources.values()); - } - - /** - * Get the ModuleData for the passed path. - * - * @param path A data path - * @return A ModuleData instance or null if the data is not found - */ - public ModuleData get(String path) { - Objects.requireNonNull(path); - return resources.get(path); - } - - /** - * Check if the pool contains this data. - * - * @param data The module data to check existence for. - * @return The module data or null if not found. - */ - public boolean contains(ModuleData data) { - Objects.requireNonNull(data); - return get(data.getPath()) != null; - } - - /** - * Check if the Pool contains some content. - * - * @return True, no content, false otherwise. - */ - public boolean isEmpty() { - return resources.isEmpty(); - } - - /** - * Visit the pool. - * - * @param visitor The Visitor called for each ModuleData found in the pool. - * @param output The pool to be filled with Visitor returned ModuleData. - */ - public void visit(Visitor visitor, Pool output) { - for (ModuleData resource : getContent()) { - ModuleData res = visitor.visit(resource); - if (res != null) { - output.add(res); - } - } - } - - /** - * The ByteOrder currently in use when generating the jimage file. - * - * @return The ByteOrder. - */ - public ByteOrder getByteOrder() { - return order; - } - - /** - * Create a ModuleData located inside a jimage file. Such ModuleData has a - * ModuleDataType being equals to CLASS_OR_RESOURCE. - * - * @param path The complete resource path (contains the module radical). - * @param content The resource content. - * @param size The content size. - * @return A new ModuleData. - */ - public static ModuleData newResource(String path, InputStream content, long size) { - Objects.requireNonNull(path); - Objects.requireNonNull(content); - String[] split = ImageFileCreator.splitPath(path); - String module = split[0]; - return new ModuleData(module, path, ModuleDataType.CLASS_OR_RESOURCE, content, size); - } - - /** - * Create a ModuleData for a file that will be located inside a jimage file. - * - * @param path The resource path. - * @param content The resource content. - * @return A new ModuleData. - */ - public static ModuleData newResource(String path, byte[] content) { - return newResource(path, new ByteArrayInputStream(content), - content.length); - } - - /** - * Create a ModuleData for a file that will be located outside a jimage - * file. - * - * @param module The module in which this files is located. - * @param path The file path locator (doesn't contain the module name). - * @param type The ModuleData type. - * @param content The file content. - * @param size The content size. - * @return A new ModuleData. - */ - public static ModuleData newImageFile(String module, String path, ModuleDataType type, - InputStream content, long size) { - Objects.requireNonNull(path); - Objects.requireNonNull(content); - return new ModuleData(module, path, type, content, size); - } - -} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/TransformerPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/TransformerPlugin.java index 4af4897e636..15133221c43 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/TransformerPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/TransformerPlugin.java @@ -40,5 +40,5 @@ public interface TransformerPlugin extends Plugin { * * @throws PluginException */ - public void visit(Pool in, Pool out); + public void visit(ModulePool in, ModulePool out); } diff --git a/jdk/src/jdk.jlink/share/classes/module-info.java b/jdk/src/jdk.jlink/share/classes/module-info.java index 49e426fed12..c23116404ac 100644 --- a/jdk/src/jdk.jlink/share/classes/module-info.java +++ b/jdk/src/jdk.jlink/share/classes/module-info.java @@ -24,9 +24,7 @@ */ module jdk.jlink { - exports jdk.tools.jlink; exports jdk.tools.jlink.plugin; - exports jdk.tools.jlink.builder; requires jdk.internal.opt; requires jdk.jdeps; @@ -46,5 +44,5 @@ module jdk.jlink { provides jdk.tools.jlink.plugin.TransformerPlugin with jdk.tools.jlink.internal.plugins.ExcludeVMPlugin; provides jdk.tools.jlink.plugin.TransformerPlugin with jdk.tools.jlink.internal.plugins.IncludeLocalesPlugin; provides jdk.tools.jlink.plugin.TransformerPlugin with jdk.tools.jlink.internal.plugins.GenerateJLIClassesPlugin; - provides jdk.tools.jlink.plugin.PostProcessorPlugin with jdk.tools.jlink.internal.plugins.ReleaseInfoPlugin; + provides jdk.tools.jlink.plugin.TransformerPlugin with jdk.tools.jlink.internal.plugins.ReleaseInfoPlugin; } diff --git a/jdk/src/jdk.pack200/share/native/common-unpack/constants.h b/jdk/src/jdk.pack200/share/native/common-unpack/constants.h index f1a1f73edff..8d8376dd23a 100644 --- a/jdk/src/jdk.pack200/share/native/common-unpack/constants.h +++ b/jdk/src/jdk.pack200/share/native/common-unpack/constants.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,30 +23,10 @@ * questions. */ -/* - Java Class Version numbers history - 1.0 to 1.3.X 45,3 - 1.4 to 1.4.X 46,0 - 1.5 to 1.5.X 49,0 - 1.6 to 1.5.x 50,0 NOTE Assumed for now -*/ - // classfile constants #define JAVA_MAGIC 0xCAFEBABE -#define JAVA_MIN_MAJOR_VERSION 45 -#define JAVA_MIN_MINOR_VERSION 3 -#define JAVA5_MAX_MAJOR_VERSION 49 -#define JAVA5_MAX_MINOR_VERSION 0 - -#define JAVA6_MAX_MAJOR_VERSION 50 -#define JAVA6_MAX_MINOR_VERSION 0 - -#define JAVA7_MAX_MAJOR_VERSION 51 -#define JAVA7_MAX_MINOR_VERSION 0 - -#define JAVA8_MAX_MAJOR_VERSION 52 -#define JAVA8_MAX_MINOR_VERSION 0 +// Class version history, refer to Constants.java // package file constants #define JAVA_PACKAGE_MAGIC 0xCAFED00D diff --git a/jdk/src/jdk.unsupported/unix/classes/sun/misc/GThreadHelper.java b/jdk/src/jdk.unsupported/unix/classes/sun/misc/GThreadHelper.java deleted file mode 100644 index 180a5d5c1af..00000000000 --- a/jdk/src/jdk.unsupported/unix/classes/sun/misc/GThreadHelper.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.misc; - -import java.util.concurrent.locks.ReentrantLock; - -/** - * This class is used to prevent multiple calling of g_thread_init () - * and gdk_thread_init (). - * - * Since version 2.24 of GLib, calling g_thread_init () multiple times is - * allowed, but it will crash for older versions. There are two ways to - * find out if g_thread_init () has been called: - * g_thread_get_initialized (), but it was introduced in 2.20 - * g_thread_supported (), but it is a macro and cannot be loaded with dlsym. - * - * usage: - *
      - * lock();
      - * try {
      - *    if (!getAndSetInitializationNeededFlag()) {
      - *        //call to g_thread_init();
      - *        //call to gdk_thread_init();
      - *    }
      - * } finally {
      - *    unlock();
      - * }
      - * 
      - */ -public final class GThreadHelper { - - private static final ReentrantLock LOCK = new ReentrantLock(); - private static boolean isGThreadInitialized = false; - - /** - * Acquires the lock. - */ - public static void lock() { - LOCK.lock(); - } - - /** - * Releases the lock. - */ - public static void unlock() { - LOCK.unlock(); - } - - /** - * Gets current value of initialization flag and sets it to {@code true}. - * MUST be called under the lock. - * - * A return value of {@code false} indicates that the calling code - * should call the g_thread_init() and gdk_thread_init() functions - * before releasing the lock. - * - * @return {@code true} if initialization has been completed. - */ - public static boolean getAndSetInitializationNeededFlag() { - boolean ret = isGThreadInitialized; - isGThreadInitialized = true; - return ret; - } -} diff --git a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java index 4ddeaff4c78..1e05e84e40f 100644 --- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java +++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ package jdk.nio.zipfs; import java.io.IOException; import java.io.InputStream; +import java.lang.Runtime.Version; import java.nio.file.Path; import java.util.Arrays; import java.util.HashMap; @@ -36,7 +37,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.jar.Attributes; import java.util.jar.Manifest; -import jdk.Version; /** * Adds aliasing to ZipFileSystem to support multi-release jar files. An alias map @@ -69,7 +69,7 @@ class JarFileSystem extends ZipFileSystem { if (o instanceof String) { String s = (String)o; if (s.equals("runtime")) { - version = jdk.Version.current().major(); + version = Runtime.version().major(); } else { version = Integer.parseInt(s); } diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index b10263b9f39..5d2113b99b1 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -116,10 +116,8 @@ # jdk_beans -java/beans/XMLEncoder/Test4903007.java 8060027 generic-all -java/beans/XMLEncoder/java_awt_GridBagLayout.java 8060027 generic-all -java/beans/XMLDecoder/8028054/TestConstructorFinder.java 8060027 generic-all -java/beans/XMLDecoder/8028054/TestMethodFinder.java 8060027 generic-all +java/beans/XMLDecoder/8028054/TestConstructorFinder.java 8156579 generic-all +java/beans/XMLDecoder/8028054/TestMethodFinder.java 8156579 generic-all java/beans/Introspector/8132566/OverridePropertyInfoTest.java 8132565 generic-all java/beans/Introspector/8132566/OverrideUserDefPropertyInfoTest.java 8132565 generic-all @@ -128,8 +126,6 @@ java/beans/Introspector/8132566/OverrideUserDefPropertyInfoTest.java 8132565 gen # jdk_lang -java/lang/ClassLoader/deadlock/GetResource.java 8029891 generic-all - java/lang/StringCoding/CheckEncodings.sh 7008363 generic-all ############################################################################ @@ -145,6 +141,12 @@ java/lang/management/MemoryMXBean/LowMemoryTest.java 8130339 generic- ############################################################################ +# jdk_io + +java/io/pathNames/GeneralWin32.java 8156595 windows-all + +############################################################################ + # jdk_jmx com/sun/management/OperatingSystemMXBean/GetProcessCpuLoad.java 8030957 aix-all @@ -228,6 +230,8 @@ sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java 8077138,8023434 sun/security/pkcs11/KeyAgreement/TestDH.java 8077138,8023434 windows-all sun/security/pkcs11/KeyAgreement/TestInterop.java 8077138,8023434 windows-all sun/security/pkcs11/KeyAgreement/TestShort.java 8077138,8023434 windows-all +sun/security/pkcs11/KeyAgreement/SupportedDHKeys.java 8154910 windows-all +sun/security/pkcs11/KeyAgreement/UnsupportedDHKeys.java 8154910 windows-all sun/security/pkcs11/KeyGenerator/DESParity.java 8077138,8023434 windows-all sun/security/pkcs11/KeyGenerator/TestKeyGenerator.java 8077138,8023434 windows-all sun/security/pkcs11/KeyPairGenerator/TestDH2048.java 8077138,8023434 windows-all @@ -288,11 +292,12 @@ sun/security/provider/NSASuiteB/TestDSAGenParameterSpec.java 8137255 generic- sun/security/x509/URICertStore/ExtensionsWithLDAP.java 8134577 generic-all +sun/security/provider/SecureRandom/StrongSecureRandom.java 8157387 linux-all + ############################################################################ # jdk_sound -javax/sound/midi/Gervill/SoftProvider/GetDevice.java 8059743 generic-all javax/sound/sampled/DirectAudio/bug6400879.java 8148915 linux-all ############################################################################ diff --git a/jdk/test/TEST.groups b/jdk/test/TEST.groups index 3f5461582e5..2e82e3b2585 100644 --- a/jdk/test/TEST.groups +++ b/jdk/test/TEST.groups @@ -76,6 +76,7 @@ jdk_lang = \ jdk/lambda \ jdk/internal/misc \ jdk/internal/ref \ + jdk/internal/jimage \ jdk/modules \ vm @@ -352,7 +353,7 @@ jdk_desktop = \ # SwingSet3 tests. jdk_client_sanity = \ sanity/client/SwingSet - + ############################################################################### # # Serviceability sanity groups diff --git a/jdk/test/com/sun/jdi/ReferrersTest.java b/jdk/test/com/sun/jdi/ReferrersTest.java index b78a5618019..3293b089f31 100644 --- a/jdk/test/com/sun/jdi/ReferrersTest.java +++ b/jdk/test/com/sun/jdi/ReferrersTest.java @@ -446,7 +446,7 @@ public class ReferrersTest extends TestScaffold { if (rt instanceof ClassType) { ClassType ct = (ClassType)rt; String name = ct.name(); - if (name.equals("sun.misc.SoftCache$ValueCell")) { + if (name.equals("sun.awt.SoftCache$ValueCell")) { return; } if (name.equals("java.lang.ref.Finalizer")) { diff --git a/jdk/test/java/awt/Robot/ModifierRobotKey/ModifierRobotKeyTest.java b/jdk/test/java/awt/Robot/ModifierRobotKey/ModifierRobotKeyTest.java index 5cdc8085255..1e941473061 100644 --- a/jdk/test/java/awt/Robot/ModifierRobotKey/ModifierRobotKeyTest.java +++ b/jdk/test/java/awt/Robot/ModifierRobotKey/ModifierRobotKeyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,17 +21,23 @@ * questions. */ - -import java.awt.*; -import java.awt.event.*; +import java.awt.BorderLayout; +import java.awt.Canvas; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.InputEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import static jdk.testlibrary.Asserts.assertTrue; /* - * @test + * @test 8155742 * @summary Make sure that modifier key mask is set when robot press - * some key with one or more modifiers. - * + * some key with one or more modifiers. * @library ../../../../lib/testlibrary/ * @build ExtendedRobot * @run main ModifierRobotKeyTest @@ -60,15 +66,17 @@ public class ModifierRobotKeyTest extends KeyAdapter { } public ModifierRobotKeyTest() throws Exception { - modifierKeys = new int[3]; + modifierKeys = new int[4]; modifierKeys[0] = KeyEvent.VK_SHIFT; modifierKeys[1] = KeyEvent.VK_CONTROL; modifierKeys[2] = KeyEvent.VK_ALT; + modifierKeys[3] = KeyEvent.VK_ALT_GRAPH; - inputMasks = new int[3]; + inputMasks = new int[4]; inputMasks[0] = InputEvent.SHIFT_MASK; inputMasks[1] = InputEvent.CTRL_MASK; inputMasks[2] = InputEvent.ALT_MASK; + inputMasks[3] = InputEvent.ALT_GRAPH_MASK; modifierStatus = new boolean[modifierKeys.length]; diff --git a/jdk/test/java/awt/Toolkit/DynamicLayout/bug7172833.java b/jdk/test/java/awt/Toolkit/DynamicLayout/bug7172833.java index 7c61804892b..2c4f04147b8 100644 --- a/jdk/test/java/awt/Toolkit/DynamicLayout/bug7172833.java +++ b/jdk/test/java/awt/Toolkit/DynamicLayout/bug7172833.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,16 +45,34 @@ public final class bug7172833 { public static void main(final String[] args) throws Exception { final StubbedToolkit t = new StubbedToolkit(); - + final Boolean dynamicLayoutSupported + = (Boolean) t.getDesktopProperty("awt.dynamicLayoutSupported"); t.setDynamicLayout(true); if(!t.isDynamicLayoutSet()){ throw new RuntimeException("'true' expected but 'false' returned"); } + if (dynamicLayoutSupported) { + if (!t.isDynamicLayoutActive()) { + throw new RuntimeException("is inactive but set+supported"); + } + } else { + if (t.isDynamicLayoutActive()) { + throw new RuntimeException("is active but unsupported"); + } + } t.setDynamicLayout(false); if(t.isDynamicLayoutSet()){ throw new RuntimeException("'false' expected but 'true' returned"); } + if (dynamicLayoutSupported) { + // Layout is supported and was set to false, cannot verifym because + // the native system is free to ignore our request. + } else { + if (t.isDynamicLayoutActive()) { + throw new RuntimeException("is active but unset+unsupported"); + } + } } static final class StubbedToolkit extends Toolkit { diff --git a/jdk/test/java/awt/TrayIcon/ActionEventTest/ActionEventTest.java b/jdk/test/java/awt/TrayIcon/ActionEventTest/ActionEventTest.java index 7a5f87a38f3..95879ce4f80 100644 --- a/jdk/test/java/awt/TrayIcon/ActionEventTest/ActionEventTest.java +++ b/jdk/test/java/awt/TrayIcon/ActionEventTest/ActionEventTest.java @@ -23,10 +23,13 @@ /* * @test - * @bug 6191390 + * @bug 6191390 8154328 * @summary Verify that ActionEvent is received with correct modifiers set. * @library ../../../../lib/testlibrary ../ + * @library /java/awt/patchlib + * @build java.desktop/java.awt.Helper * @build ExtendedRobot SystemTrayIconHelper + * @run main ActionEventTest */ import java.awt.Image; @@ -46,6 +49,7 @@ public class ActionEventTest { Image image; TrayIcon icon; Robot robot; + boolean actionPerformed; public static void main(String[] args) throws Exception { if (!SystemTray.isSupported()) { @@ -82,6 +86,7 @@ public class ActionEventTest { icon.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { + actionPerformed = true; int md = ae.getModifiers(); int expectedMask = ActionEvent.ALT_MASK | ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK; @@ -102,6 +107,9 @@ public class ActionEventTest { } public void clear() { + robot.keyRelease(KeyEvent.VK_ALT); + robot.keyRelease(KeyEvent.VK_SHIFT); + robot.keyRelease(KeyEvent.VK_CONTROL); SystemTray.getSystemTray().remove(icon); } @@ -123,10 +131,9 @@ public class ActionEventTest { robot.delay(100); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); - robot.delay(100); robot.waitForIdle(); - robot.keyRelease(KeyEvent.VK_ALT); - robot.keyRelease(KeyEvent.VK_SHIFT); - robot.keyRelease(KeyEvent.VK_CONTROL); + if (!actionPerformed) { + robot.delay(500); + } } } diff --git a/jdk/test/java/awt/TrayIcon/TrayIconMouseTest/TrayIconMouseTest.java b/jdk/test/java/awt/TrayIcon/TrayIconMouseTest/TrayIconMouseTest.java index 551878efb04..f7549a385eb 100644 --- a/jdk/test/java/awt/TrayIcon/TrayIconMouseTest/TrayIconMouseTest.java +++ b/jdk/test/java/awt/TrayIcon/TrayIconMouseTest/TrayIconMouseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,16 +21,19 @@ * questions. */ -import java.awt.*; -import java.awt.event.*; +import java.awt.EventQueue; +import java.awt.Point; +import java.awt.SystemTray; +import java.awt.TrayIcon; +import java.awt.event.InputEvent; import java.awt.image.BufferedImage; /* - * @test - * @summary Check if ActionEvent is triggered by a TrayIcon only when - * it is double clicked using mouse button 1 (or single clicked - * with button 3 (on Mac OS X)) - * @author Dmitriy Ermashov (dmitriy.ermashov@oracle.com) + * @test 6384991 + * @summary Check if ActionEvent is triggered by a TrayIcon when + * it is double clicked with mouse button 1 on windows + * or single clicked with button 3 on Mac OS X + * or single clicked with button 1 on rest. * @library /java/awt/patchlib * @library ../../../../lib/testlibrary ../ * @build java.desktop/java.awt.Helper @@ -42,19 +45,17 @@ public class TrayIconMouseTest { TrayIcon icon; ExtendedRobot robot; - boolean actionPerformed = false; Object actionLock = new Object(); static boolean isMacOS = false; - + static boolean isWinOS = false; + static boolean isOelOS = false; String caption = "Sample Icon"; - int[] buttonTypes = { InputEvent.BUTTON1_MASK, InputEvent.BUTTON2_MASK, InputEvent.BUTTON3_MASK }; - String[] buttonNames = { "BUTTON1", "BUTTON2", @@ -62,30 +63,31 @@ public class TrayIconMouseTest { }; public static void main(String[] args) throws Exception { - if (! SystemTray.isSupported()) { - System.out.println("SystemTray not supported on the platform under test. " + - "Marking the test passed"); + if (!SystemTray.isSupported()) { + System.out.println("SystemTray not supported on the platform " + + "under test. Marking the test passed"); } else { - if (System.getProperty("os.name").toLowerCase().startsWith("mac")) { + String osName = System.getProperty("os.name").toLowerCase(); + if (osName.startsWith("mac")) { isMacOS = true; - } else if (SystemTrayIconHelper.isOel7()) { - System.out.println("OEL 7 doesn't support double click in " + - "systray. Skipped"); - return; + } else if (osName.startsWith("win")) { + isWinOS = true; + } else { + isOelOS = SystemTrayIconHelper.isOel7(); } new TrayIconMouseTest().doTest(); } } - TrayIconMouseTest() throws Exception{ + TrayIconMouseTest() throws Exception { robot = new ExtendedRobot(); EventQueue.invokeAndWait(this::initializeGUI); } void initializeGUI() { - SystemTray tray = SystemTray.getSystemTray(); - icon = new TrayIcon(new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB), caption); + icon = new TrayIcon( + new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB), caption); icon.addActionListener(event -> { actionPerformed = true; synchronized (actionLock) { @@ -103,31 +105,32 @@ public class TrayIconMouseTest { } private void doTest() throws Exception { - Point iconPosition = SystemTrayIconHelper.getTrayIconLocation(icon); - if (iconPosition == null) + if (iconPosition == null) { throw new RuntimeException("Unable to find the icon location!"); - + } robot.mouseMove(iconPosition.x, iconPosition.y); robot.waitForIdle(); for (int i = 0; i < buttonTypes.length; i++) { actionPerformed = false; robot.click(buttonTypes[i]); - robot.waitForIdle(6000); + robot.waitForIdle(); + delayIfRequired(); - if (isMacOS && actionPerformed && i == 2) { - - }else if (isMacOS && i == 2) { - throw new RuntimeException("FAIL: ActionEvent NOT triggered when " + - buttonNames[i] + " is single clicked on Mac OS"); - }else if (actionPerformed) { - throw new RuntimeException("FAIL: ActionEvent triggered when " + - buttonNames[i] + " is single clicked"); + if (isMacOS && i == 2 && !actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent NOT triggered " + + "when " + buttonNames[i] + " is single clicked on Mac"); + } else if (isWinOS && actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent triggered " + + "when " + buttonNames[i] + " is single clicked"); + } else if (!isMacOS && !isWinOS && i == 0 && !actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent NOT triggered " + + "when " + buttonNames[i] + " is single clicked"); } } - if(!isMacOS) { + if (!isMacOS && !isOelOS) { for (int i = 0; i < buttonTypes.length; i++) { for (int j = 0; j < buttonTypes.length; j++) { if (j != i) { @@ -136,13 +139,22 @@ public class TrayIconMouseTest { robot.mousePress(buttonTypes[j]); robot.mouseRelease(buttonTypes[j]); robot.mouseRelease(buttonTypes[i]); - robot.waitForIdle(); + delayIfRequired(); - if (actionPerformed) - throw new RuntimeException("FAIL: ActionEvent triggered when " + - buttonNames[i] + " and " + buttonNames[j] + - " is clicked and released"); + if (isWinOS) { + if (actionPerformed) { + throw new RuntimeException( + "FAIL: ActionEvent triggered when " + + buttonNames[i] + " & " + buttonNames[j] + + " is clicked and released"); + } + + } else if ((i == 0 || j == 0) && !actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent is " + + "NOT triggered when " + buttonNames[i] + " & " + + buttonNames[j] + " is pressed & released"); + } } } } @@ -150,31 +162,34 @@ public class TrayIconMouseTest { for (int i = 0; i < buttonTypes.length; i++) { actionPerformed = false; robot.mousePress(buttonTypes[i]); - robot.delay(50); robot.mouseRelease(buttonTypes[i]); robot.delay(50); robot.mousePress(buttonTypes[i]); - robot.delay(50); robot.mouseRelease(buttonTypes[i]); + robot.waitForIdle(); + delayIfRequired(); if (i == 0) { - if (! actionPerformed) { - synchronized (actionLock) { - try { - actionLock.wait(6000); - } catch (Exception e) { - } - } + if (!actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent not " + + "triggered when " + buttonNames[i] + + " is double clicked"); } - if (! actionPerformed) - throw new RuntimeException("FAIL: ActionEvent not triggered when " + - buttonNames[i] + " is double clicked"); - } else { - robot.waitForIdle(); + } else if (actionPerformed) { + throw new RuntimeException("FAIL: ActionEvent " + + "triggered when " + buttonNames[i] + + " is double clicked"); + } + } + } + } - if (actionPerformed) - throw new RuntimeException("FAIL: ActionEvent triggered when " + - buttonNames[i] + " is double clicked"); + public void delayIfRequired() { + if (!actionPerformed) { + synchronized (actionLock) { + try { + actionLock.wait(500); + } catch (Exception e) { } } } diff --git a/jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.html b/jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.html deleted file mode 100644 index 91dcf4f413d..00000000000 --- a/jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - -

      Button2DragTest
      Bug ID: 4955110

      - -

      This is an AUTOMATIC test, simply wait for completion

      - - - - diff --git a/jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.java b/jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.java index 33bb5058706..c5045ed7fa7 100644 --- a/jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.java +++ b/jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,45 +21,52 @@ * questions. */ -/* - test - @bug 4955110 - @summary tests that a drag ends on button2 release - @author Alexander.Gerasimov area=dnd - @library ../../regtesthelpers - @build Util - @run applet/othervm Button2DragTest.html -*/ +import java.awt.Frame; +import java.awt.Point; +import java.awt.Robot; +import java.awt.datatransfer.StringSelection; +import java.awt.dnd.DnDConstants; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragSource; +import java.awt.dnd.DragSourceAdapter; +import java.awt.dnd.DragSourceDropEvent; +import java.awt.dnd.DragSourceListener; +import java.awt.dnd.DropTarget; +import java.awt.dnd.DropTargetAdapter; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.event.InputEvent; - -/** - * Button2DragTest.java - * - * summary: tests that DragSourceDragEvent.getDropAction() accords to its new spec - * (does not depend on the user drop action) - * - */ - -import java.applet.Applet; -import java.awt.*; -import java.awt.event.*; -import java.awt.datatransfer.*; -import java.awt.dnd.*; import test.java.awt.regtesthelpers.Util; - -public class Button2DragTest extends Applet { +/** + * @test + * @bug 4955110 + * @summary tests that DragSourceDragEvent.getDropAction() accords to its new + * spec (does not depend on the user drop action) + * @library ../../regtesthelpers + * @build Util + * @run main/othervm Button2DragTest + * @author Alexander.Gerasimov area=dnd + */ +public final class Button2DragTest { private volatile boolean dropSuccess; - private Frame frame; + private static Frame frame; + public static void main(final String[] args) { + Button2DragTest test = new Button2DragTest(); + try { + test.run(); + } finally { + if (frame != null) { + frame.dispose(); + } + } + } - public void init() { - // Set up the environment -- set the layout manager, add - // buttons, etc. - setLayout(new BorderLayout()); - + public void run() { frame = new Frame(); final DragSourceListener dragSourceListener = new DragSourceAdapter() { @@ -84,20 +91,13 @@ public class Button2DragTest extends Applet { } }; new DropTarget(frame, dropTargetListener); - } - - - public void start() { - //Get things going. Request focus, set size, et cetera - setSize(200,200); - setVisible(true); - validate(); //What would normally go into main() will probably go here. //Use System.out.println for diagnostic messages that you want //to read after the test is done. - + frame.setUndecorated(true); frame.setBounds(100, 100, 200, 200); + frame.setLocationRelativeTo(null); frame.setVisible(true); Robot robot = Util.createRobot(); diff --git a/jdk/test/java/awt/event/MouseEvent/AltGraphModifierTest/AltGraphModifierTest.java b/jdk/test/java/awt/event/MouseEvent/AltGraphModifierTest/AltGraphModifierTest.java index 92dcc214376..11cd886d598 100644 --- a/jdk/test/java/awt/event/MouseEvent/AltGraphModifierTest/AltGraphModifierTest.java +++ b/jdk/test/java/awt/event/MouseEvent/AltGraphModifierTest/AltGraphModifierTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,13 +44,9 @@ public class AltGraphModifierTest { = { "This test is for verifying Alt-Gr modifier of an event.", "Windows :-", - "1. Please check if Alt-Gr key is present on keyboard.", - "2. If present, press the Alt-Gr key and perform", - " mouse click on the TestWindow.", - "3. If Alt-Gr key is not present, press Ctrl+Alt keys &", - " perform mouse click on the TestWindow.", - "4. Test will exit by itself with appropriate result.", - "", + "1. Click Pass.", + "2. Alt-Gr modifier is tested under Robot tests.", + " ", "Linux :-", "1. Please check if Alt-Gr key is present on keyboard.", "2. If present, press the Alt-Gr key and perform", @@ -63,10 +59,11 @@ public class AltGraphModifierTest { "6. Press Right Alt Key & perform mouse click on the", " TestWindow", "7. Test will exit by itself with appropriate result.", - "", + " ", "Mac :-", - " Mac fix is under progress, & will be fixed soon.", - " Please click Fail" + "1. Press Right Option key on the keyboard and mouse click", + " on the TestWindow", + "3. Test will exit by itself with appropriate result.", }; Sysout.createDialog(); @@ -77,7 +74,7 @@ public class AltGraphModifierTest { public static void initTestWindow() { mainFrame = new Frame(); mainFrame.setTitle("TestWindow"); - mainFrame.setSize(300, 200); + mainFrame.setBounds(700, 10, 300, 300); mainFrame.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { diff --git a/jdk/test/java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.html b/jdk/test/java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.html deleted file mode 100644 index 9973c033612..00000000000 --- a/jdk/test/java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - -RestoreActiveWindowTest - - - -

      RestoreActiveWindowTest
      Bug ID: 6365992

      - -

      See the dialog box (usually in upper left corner) for instructions

      - - - - diff --git a/jdk/test/java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.java b/jdk/test/java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.java index 66e4148931c..8d29dbb5849 100644 --- a/jdk/test/java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.java +++ b/jdk/test/java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,210 +22,194 @@ */ /* - test - @bug 6365992 6379599 - @summary REG: Showing and disposing a native print dialog makes the main frame inactive, Win32 - @author Dmitry.Cherepanov@SUN.COM area=awt.printdialog - @run applet/manual=yesno RestoreActiveWindowTest.html -*/ - -import java.applet.Applet; -import java.awt.*; -import java.awt.event.*; -import java.awt.print.*; -import javax.print.attribute.*; - -public class RestoreActiveWindowTest extends Applet -{ - Button showBtn1 = new Button("show a native print dialog"); - Button showBtn2 = new Button("show a native page dialog"); - - public void init() - { - showBtn1.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent ae) { - PrinterJob.getPrinterJob().printDialog(); - } - }); - showBtn2.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent ae){ - PrinterJob.getPrinterJob().pageDialog(new PageFormat()); - } - }); - - add(showBtn1); - add(showBtn2); - - String[] instructions = { - "1.1) Click on 'show a native print dialog'. A native print dialog will come up.", - "1.2) Click on the 'close'(X) button. The dialog will be closed.", - "1.3) After the dialog closing another window should become the active window.", - "1.4) If there no any active window then the test failed.", - "2.1) Click on 'show a native page dialog'. A native page dialog will come up.", - "2.2) Click on the 'close'(X) button. The dialog will be closed.", - "2.3) After the dialog closing another window should become the active window.", - "2.4) If there no any active window then the test failed.", - "3) Test Passed." - }; - - Sysout.createDialogWithInstructions( instructions ); - - }//End init() - - public void start () - { - //Get things going. Request focus, set size, et cetera - setSize (200,200); - show(); - - }// start() - - //The rest of this class is the actions which perform the test... - - //Use Sysout.println to communicate with the user NOT System.out!! - //Sysout.println ("Something Happened!"); - -}// class ManualYesNoTest - -/* Place other classes related to the test after this line */ - - - - - -/**************************************************** - Standard Test Machinery - DO NOT modify anything below -- it's a standard - chunk of code whose purpose is to make user - interaction uniform, and thereby make it simpler - to read and understand someone else's test. - ****************************************************/ - -/** - This is part of the standard test machinery. - It creates a dialog (with the instructions), and is the interface - for sending text messages to the user. - To print the instructions, send an array of strings to Sysout.createDialog - WithInstructions method. Put one line of instructions per array entry. - To display a message for the tester to see, simply call Sysout.println - with the string to be displayed. - This mimics System.out.println but works within the test harness as well - as standalone. + * @test + * @bug 6365992 6379599 8137137 + * @summary REG: Showing and disposing a native print dialog makes the main + * frame inactive, Win32 + * @run main/manual RestoreActiveWindowTest */ +import java.awt.Frame; +import java.awt.Button; +import java.awt.GridBagLayout; +import java.awt.Panel; +import java.awt.TextArea; +import java.awt.GridLayout; +import java.awt.GridBagConstraints; +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.print.PrinterJob; +import java.awt.print.PageFormat; -class Sysout -{ - private static TestDialog dialog; +public class RestoreActiveWindowTest implements ActionListener { - public static void createDialogWithInstructions( String[] instructions ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - dialog.printInstructions( instructions ); - dialog.setVisible(true); - println( "Any messages for the tester will display here." ); + private static Frame mainFrame; + private static Button printDialogButton; + private static Button pageDialogButton; + private static Frame instructionFrame; + private static GridBagLayout layout; + private static Panel mainControlPanel; + private static Panel resultButtonPanel; + private static TextArea instructionTextArea; + private static Button passButton; + private static Button failButton; + private static Thread mainThread = null; + private static boolean testPassed = false; + private static boolean isInterrupted = false; + private static final int testTimeOut = 300000; + private static String testFailMessage; + + public void createAndShowGUI() { + mainFrame = new Frame("Test"); + mainFrame.setSize(200, 200); + mainFrame.setLocationRelativeTo(null); + mainFrame.setLayout(new GridLayout(2, 1)); + + printDialogButton = new Button("show a native print dialog"); + pageDialogButton = new Button("show a native page dialog"); + printDialogButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + PrinterJob.getPrinterJob().printDialog(); + setButtonEnable(true); + testFailMessage = "Print dialog test failed."; + } + }); + pageDialogButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + PrinterJob.getPrinterJob().pageDialog(new PageFormat()); + setButtonEnable(true); + testFailMessage = "Page dialog test failed."; + } + }); + + mainFrame.add(printDialogButton); + mainFrame.add(pageDialogButton); + mainFrame.setVisible(true); + + mainFrame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent we) { + cleanUp(); + throw new RuntimeException("User has closed the test window " + + "without clicking Pass or Fail."); + } + }); } - public static void createDialog( ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - String[] defInstr = { "Instructions will appear here. ", "" } ; - dialog.printInstructions( defInstr ); - dialog.setVisible(true); - println( "Any messages for the tester will display here." ); + private void createInstructionUI() { + instructionFrame = new Frame("Native Print Dialog and Page Dialog"); + layout = new GridBagLayout(); + mainControlPanel = new Panel(layout); + resultButtonPanel = new Panel(layout); + + GridBagConstraints gbc = new GridBagConstraints(); + String instructions + = "\nINSTRUCTIONS:\n" + + "\n 1. Click on the 'show a native print dialog' button. A " + + "native print dialog will come up." + + "\n 2. Click on the 'Cancel' button on Mac OS X or " + + "'close'(X) on other paltforms. Dialog will be closed." + + "\n 3. After the dialog is closed another window should " + + "become the active window." + + "\n 4. If there no any active window then the test has " + + "failed. Click on 'Fail' Button." + + "\n 5. Click on the 'show a native page dialog' button. A " + + "native page dialog will come up." + + "\n 6. Click on the 'Cancel' button on Mac OS X or " + + "'close'(X) on other paltforms. Dialog will be closed." + + "\n 7. After the dialog is closed another window should " + + "become the active window." + + "\n 8. If there no any active window then the test has " + + "failed. Click on 'Fail' Button." + + "\n 9. Test Passed. Click on 'Pass' Button."; + + instructionTextArea = new TextArea(13, 80); + instructionTextArea.setText(instructions); + instructionTextArea.setEnabled(false); + instructionTextArea.setBackground(Color.white); + + gbc.gridx = 0; + gbc.gridy = 0; + gbc.weightx = 0.5; + gbc.fill = GridBagConstraints.HORIZONTAL; + mainControlPanel.add(instructionTextArea, gbc); + + passButton = new Button("Pass"); + passButton.setName("Pass"); + passButton.addActionListener((ActionListener) this); + + failButton = new Button("Fail"); + failButton.setName("Fail"); + failButton.addActionListener((ActionListener) this); + + setButtonEnable(false); + + gbc.gridx = 0; + gbc.gridy = 0; + resultButtonPanel.add(passButton, gbc); + gbc.gridx = 1; + gbc.gridy = 0; + resultButtonPanel.add(failButton, gbc); + gbc.gridx = 0; + gbc.gridy = 1; + mainControlPanel.add(resultButtonPanel, gbc); + + instructionFrame.add(mainControlPanel); + instructionFrame.pack(); + instructionFrame.setVisible(true); } - - public static void printInstructions( String[] instructions ) - { - dialog.printInstructions( instructions ); + @Override + public void actionPerformed(ActionEvent ae) { + if (ae.getSource() instanceof Button) { + Button btn = (Button) ae.getSource(); + switch (btn.getName()) { + case "Pass": + testPassed = true; + isInterrupted = true; + mainThread.interrupt(); + break; + case "Fail": + testPassed = false; + isInterrupted = true; + mainThread.interrupt(); + break; + } + } } - - public static void println( String messageIn ) - { - dialog.displayMessage( messageIn ); + private static void setButtonEnable(boolean status) { + passButton.setEnabled(status); + failButton.setEnabled(status); } -}// Sysout class - -/** - This is part of the standard test machinery. It provides a place for the - test instructions to be displayed, and a place for interactive messages - to the user to be displayed. - To have the test instructions displayed, see Sysout. - To have a message to the user be displayed, see Sysout. - Do not call anything in this dialog directly. - */ -class TestDialog extends Dialog -{ - - TextArea instructionsText; - TextArea messageText; - int maxStringLength = 80; - - //DO NOT call this directly, go through Sysout - public TestDialog( Frame frame, String name ) - { - super( frame, name ); - int scrollBoth = TextArea.SCROLLBARS_BOTH; - instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); - add( "North", instructionsText ); - - messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); - add("Center", messageText); - - pack(); - - setVisible(true); - }// TestDialog() - - //DO NOT call this directly, go through Sysout - public void printInstructions( String[] instructions ) - { - //Clear out any current instructions - instructionsText.setText( "" ); - - //Go down array of instruction strings - - String printStr, remainingStr; - for( int i=0; i < instructions.length; i++ ) - { - //chop up each into pieces maxSringLength long - remainingStr = instructions[ i ]; - while( remainingStr.length() > 0 ) - { - //if longer than max then chop off first max chars to print - if( remainingStr.length() >= maxStringLength ) - { - //Try to chop on a word boundary - int posOfSpace = remainingStr. - lastIndexOf( ' ', maxStringLength - 1 ); - - if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; - - printStr = remainingStr.substring( 0, posOfSpace + 1 ); - remainingStr = remainingStr.substring( posOfSpace + 1 ); - } - //else just print - else - { - printStr = remainingStr; - remainingStr = ""; - } - - instructionsText.append( printStr + "\n" ); - - }// while - - }// for - - }//printInstructions() - - //DO NOT call this directly, go through Sysout - public void displayMessage( String messageIn ) - { - messageText.append( messageIn + "\n" ); - System.out.println(messageIn); + private static void cleanUp() { + mainFrame.dispose(); + instructionFrame.dispose(); } -}// TestDialog class + public static void main(String args[]) { + RestoreActiveWindowTest printDialogs = new RestoreActiveWindowTest(); + printDialogs.createInstructionUI(); + printDialogs.createAndShowGUI(); + + mainThread = Thread.currentThread(); + try { + mainThread.sleep(testTimeOut); + } catch (InterruptedException ex) { + if (!testPassed) { + throw new RuntimeException(testFailMessage); + } + } finally { + cleanUp(); + } + + if (!isInterrupted) { + throw new RuntimeException("Test Timed out after " + + testTimeOut / 1000 + " seconds"); + } + } +} diff --git a/jdk/test/java/beans/Introspector/AnonymousClassBeanPropertyTest.java b/jdk/test/java/beans/Introspector/AnonymousClassBeanPropertyTest.java index a8ec7d49188..b5fc3667b94 100644 --- a/jdk/test/java/beans/Introspector/AnonymousClassBeanPropertyTest.java +++ b/jdk/test/java/beans/Introspector/AnonymousClassBeanPropertyTest.java @@ -33,7 +33,7 @@ import java.util.Arrays; /** * @test - * @bug 8132973 8132732 8155013 + * @bug 8132973 8132732 8155013 8154958 * @summary Some check for BeanProperty annotation * @author a.stepanov * @run main AnonymousClassBeanPropertyTest @@ -62,6 +62,10 @@ public class AnonymousClassBeanPropertyTest { // ---------- test cases (interfaces) ---------- + public interface IPublic { + double getX(); + } + private interface IGet { double getX(); } @@ -113,6 +117,10 @@ public class AnonymousClassBeanPropertyTest { void setX(double a[]); } + private interface IIs { + boolean isX(); + } + // ---------- checks ---------- @@ -124,7 +132,7 @@ public class AnonymousClassBeanPropertyTest { return ok; } - private static boolean checkInfo(Class c, String what) { + private static boolean checkInfo(Class c, String what, boolean checkVals) { BeanInfo i; try { i = Introspector.getBeanInfo(c, Object.class); } @@ -154,6 +162,8 @@ public class AnonymousClassBeanPropertyTest { ok &= check("visualUpdate", (boolean) d.getValue("visualUpdate"), UPDATE); + if (!checkVals) { return ok; } + Object vals[] = (Object[]) d.getValue("enumerationValues"); if (vals == null) { System.out.println("null enumerationValues"); @@ -210,8 +220,10 @@ public class AnonymousClassBeanPropertyTest { (boolean) d.getValue("visualUpdate"), !UPDATE); Object vals[] = (Object[]) d.getValue("enumerationValues"); - if (vals != null || vals.length > 0) { - System.out.println("non-empty enumerationValues"); + if (vals != null && vals.length > 0) { + System.out.println("non-empty enumerationValues:"); + for (Object v: vals) { System.out.print(v.toString()); } + System.out.println(); return false; } @@ -228,6 +240,31 @@ public class AnonymousClassBeanPropertyTest { //---------------------------------------------------------------------- + // TODO: please uncomment/update after 8154958 fix + /* + IPublic testPublic = new IPublic() { + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + @Override + public double getX() { return X; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + }; + ok = checkInfo(testPublic.getClass(), "IPublic", true); + System.out.println("OK = " + ok); + passed = passed && ok; + */ + + //---------------------------------------------------------------------- + IGet testGet = new IGet() { @BeanProperty( description = DESCRIPTION, @@ -244,7 +281,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGet.getClass(), "IGet"); + ok = checkInfo(testGet.getClass(), "IGet", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -269,7 +306,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testSet.getClass(), "ISet"); + ok = checkInfo(testSet.getClass(), "ISet", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -294,7 +331,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetByIndex.getClass(), "IGetByIndex"); + ok = checkInfo(testGetByIndex.getClass(), "IGetByIndex", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -319,7 +356,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testSetByIndex.getClass(), "ISetByIndex"); + ok = checkInfo(testSetByIndex.getClass(), "ISetByIndex", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -346,7 +383,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetArray.getClass(), "IGetArray"); + ok = checkInfo(testGetArray.getClass(), "IGetArray", true); System.out.println("OK = " + ok); passed = passed && ok; */ @@ -374,7 +411,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testSetArray.getClass(), "ISetArray"); + ok = checkInfo(testSetArray.getClass(), "ISetArray", true); System.out.println("OK = " + ok); passed = passed && ok; */ @@ -402,7 +439,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetBoth_1.getClass(), "IGetBoth-1"); + ok = checkInfo(testGetBoth_1.getClass(), "IGetBoth-1", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -429,7 +466,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetBoth_2.getClass(), "IGetBoth-2"); + ok = checkInfo(testGetBoth_2.getClass(), "IGetBoth-2", true); System.out.println("OK = " + ok); passed = passed && ok; */ @@ -465,11 +502,11 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetBoth_3.getClass(), "IGetBoth-3"); + ok = checkInfo(testGetBoth_3.getClass(), "IGetBoth-3", true); System.out.println("OK = " + ok); ok2 = checkAlternativeInfo(testGetBoth_3.getClass(), "IGetBoth-3"); System.out.println("OK = " + ok2); - passed = passed && ok && ok2; + passed = passed && (ok || ok2); */ //---------------------------------------------------------------------- @@ -495,7 +532,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testSetBoth_1.getClass(), "ISetBoth-1"); + ok = checkInfo(testSetBoth_1.getClass(), "ISetBoth-1", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -522,7 +559,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testSetBoth_2.getClass(), "ISetBoth-2"); + ok = checkInfo(testSetBoth_2.getClass(), "ISetBoth-2", true); System.out.println("OK = " + ok); passed = passed && ok; */ @@ -558,11 +595,11 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testSetBoth_3.getClass(), "ISetBoth-3"); + ok = checkInfo(testSetBoth_3.getClass(), "ISetBoth-3", true); System.out.println("OK = " + ok); ok2 = checkAlternativeInfo(testSetBoth_3.getClass(), "ISetBoth-3"); System.out.println("OK = " + ok2); - passed = passed && ok && ok2; + passed = passed && (ok || ok2); */ //---------------------------------------------------------------------- @@ -588,7 +625,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSet_1.getClass(), "IGetSet-1"); + ok = checkInfo(testGetSet_1.getClass(), "IGetSet-1", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -614,7 +651,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSet_2.getClass(), "IGetSet-2"); + ok = checkInfo(testGetSet_2.getClass(), "IGetSet-2", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -649,11 +686,11 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSet_3.getClass(), "IGetSet-3"); + ok = checkInfo(testGetSet_3.getClass(), "IGetSet-3", true); System.out.println("OK = " + ok); ok2 = checkAlternativeInfo(testGetSet_3.getClass(), "IGetSet-3"); System.out.println("OK = " + ok2); - passed = passed && ok && ok2; + passed = passed && (ok || ok2); */ //---------------------------------------------------------------------- @@ -679,7 +716,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSetByIndex_1.getClass(), "IGetSetByIndex-1"); + ok = checkInfo(testGetSetByIndex_1.getClass(), "IGetSetByIndex-1", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -705,7 +742,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSetByIndex_2.getClass(), "IGetSetByIndex-2"); + ok = checkInfo(testGetSetByIndex_2.getClass(), "IGetSetByIndex-2", true); System.out.println("OK = " + ok); passed = passed && ok; @@ -744,12 +781,12 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSetByIndex_3.getClass(), "IGetSetByIndex-3"); + ok = checkInfo(testGetSetByIndex_3.getClass(), "IGetSetByIndex-3", true); System.out.println("OK = " + ok); ok2 = checkAlternativeInfo( testGetSetByIndex_3.getClass(), "IGetSetByIndex-3"); System.out.println("OK = " + ok2); - passed = passed && ok && ok2; + passed = passed && (ok || ok2); */ //---------------------------------------------------------------------- @@ -781,7 +818,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSetBoth_1.getClass(), "IGetSetBoth-1"); + ok = checkInfo(testGetSetBoth_1.getClass(), "IGetSetBoth-1", true); System.out.println("OK = " + ok); passed = passed && ok; */ @@ -813,7 +850,7 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSetBoth_2.getClass(), "IGetSetBoth-2"); + ok = checkInfo(testGetSetBoth_2.getClass(), "IGetSetBoth-2", true); System.out.println("OK = " + ok); passed = passed && ok; */ @@ -853,14 +890,135 @@ public class AnonymousClassBeanPropertyTest { public void addPropertyChangeListener(PropertyChangeListener l) {} public void removePropertyChangeListener(PropertyChangeListener l) {} }; - ok = checkInfo(testGetSetBoth_3.getClass(), "IGetSetBoth-3"); + ok = checkInfo(testGetSetBoth_3.getClass(), "IGetSetBoth-3", true); System.out.println("OK = " + ok); ok2 = checkAlternativeInfo( testGetSetBoth_3.getClass(), "IGetSetBoth-3"); System.out.println("OK = " + ok2); - passed = passed && ok && ok2; + passed = passed && (ok || ok2); */ + //---------------------------------------------------------------------- + + IIs testIs_1 = new IIs() { + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + @Override + public boolean isX() { return false; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + }; + ok = checkInfo(testIs_1.getClass(), "IIs-1", false); + System.out.println("OK = " + ok); + passed = passed && ok; + + + IIs testIs_2 = new IIs() { + + private boolean b; + + @Override + public boolean isX() { return b; } + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + public void setX(boolean v) { b = v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + }; + ok = checkInfo(testIs_2.getClass(), "IIs-2", false); + System.out.println("OK = " + ok); + passed = passed && ok; + + + IIs testIs_3 = new IIs() { + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + @Override + public boolean isX() { return false; } + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public boolean getX() { return false; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + }; + ok = checkInfo(testIs_3.getClass(), "IIs-3", false); + System.out.println("OK = " + ok); + ok2 = checkAlternativeInfo(testIs_3.getClass(), "IIs-3"); + System.out.println("OK = " + ok2); + passed = passed && (ok || ok2); + + // TODO: please uncomment/update after 8132973 fix + /* + IIs testIs_4 = new IIs() { + + private boolean b; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + @Override + public boolean isX() { return b; } + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public void setX(boolean v) { b = v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + }; + ok = checkInfo(testIs_4.getClass(), "IIs-4", false); + System.out.println("OK = " + ok); + ok2 = checkAlternativeInfo(testIs_4.getClass(), "IIs-4"); + System.out.println("OK = " + ok2); + passed = passed && (ok || ok2); + */ + + + //---------------------------------------------------------------------- + + if (!passed) { throw new RuntimeException("test failed"); } System.out.println("\ntest passed"); } diff --git a/jdk/test/java/beans/Introspector/BeanPropertyTest.java b/jdk/test/java/beans/Introspector/BeanPropertyTest.java index 6f957074c6e..5e84aaaed4e 100644 --- a/jdk/test/java/beans/Introspector/BeanPropertyTest.java +++ b/jdk/test/java/beans/Introspector/BeanPropertyTest.java @@ -33,7 +33,7 @@ import java.util.Arrays; /** * @test - * @bug 8132703 8132163 8132732 8132973 8154756 8132888 + * @bug 8132703 8132163 8132732 8132973 8154756 8132888 8155103 * @summary Some check for BeanProperty annotation * @author a.stepanov * @run main BeanPropertyTest @@ -853,6 +853,64 @@ public class BeanPropertyTest { public void removePropertyChangeListener(PropertyChangeListener l) {} } + // JDK-8155103 + public static enum E { + + ONE, + TWO { + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public void setX(int v) {} + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + }; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public void setX(int v) {} + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + + } + + private static enum EB { + + TRUE(true), FALSE(false); + + private boolean b; + private EB(boolean v) { b = v; } + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + public boolean isTrue() { return true; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + + } + // ---------- checks ---------- @@ -953,7 +1011,7 @@ public class BeanPropertyTest { } private static boolean ignoreVals(Class c) { - return (c.equals(Self.class) || c.equals(SelfArr.class)); + return (c.equals(Self.class) || c.equals(SelfArr.class)) || c.equals(EB.class); } @@ -1003,6 +1061,29 @@ public class BeanPropertyTest { passed = passed && ok; } + // enums + + Class enumCases[] = { + + // TODO: uncomment/update after 8155103 fix + //E.class, E.TWO.getClass(), EB.class + }; + + int ne = 1; + for (Class c: enumCases) { + + System.out.println("\nEnum-" + ne + ":"); + ne++; + + BeanInfo i; + try { i = Introspector.getBeanInfo(c, Object.class); } + catch (IntrospectionException e) { throw new RuntimeException(e); } + boolean ok = checkInfo(i, !ignoreVals(c)); + System.out.println(ok ? "OK" : "NOK"); + passed = passed && ok; + } + + if (!passed) { throw new RuntimeException("test failed"); } System.out.println("\ntest passed"); } diff --git a/jdk/test/java/beans/Introspector/InheritanceBeanPropertyTest.java b/jdk/test/java/beans/Introspector/InheritanceBeanPropertyTest.java new file mode 100644 index 00000000000..e42fa6228f3 --- /dev/null +++ b/jdk/test/java/beans/Introspector/InheritanceBeanPropertyTest.java @@ -0,0 +1,1281 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.beans.BeanInfo; +import java.beans.BeanProperty; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyChangeListener; +import java.beans.PropertyDescriptor; + +import java.util.Arrays; + + +/** + * @test + * @bug 8132565 8155013 + * @summary Some inheritance check for BeanProperty annotation + * @author a.stepanov + * @run main InheritanceBeanPropertyTest + */ + + +public class InheritanceBeanPropertyTest { + + private final static String DESCRIPTION = "TEST"; + private final static boolean BOUND = true; + private final static boolean EXPERT = false; + private final static boolean HIDDEN = true; + private final static boolean PREFERRED = false; + private final static boolean REQUIRED = true; + private final static boolean UPDATE = false; + + private final static double X = java.lang.Math.PI; + + private final static String + V_NAME = "java.lang.Math.PI", + V_SHORT = "PI", + V = Double.toString(X); + + private final static String DESCRIPTION_2 = "XYZ"; + + + // ---------- test cases ---------- + + public static class BaseGet { + + private final static String TESTCASE = "base getter"; + + public double getX() { return X; } + } + + public static class OverloadGet extends BaseGet { + + private final static String TESTCASE = "overload getter"; + + private final double x[] = {X, X, X}; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public double getX(int i) { return x[i]; } // indexed + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static class BaseSet { + + private final static String TESTCASE = "base setter"; + + double u; + public void setX(double v) { u = v; } + } + + public static class OverloadSet extends BaseSet { + + private final static String TESTCASE = "overload setter"; + + private final double x[] = {X, X, X}; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public void setX(int i, double v) { x[i] = v; } // indexed + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static class BaseIGet { + + protected final double x[] = {X, X, X}; + public double[] getX() { return x; } + } + + public static class OverloadIGet extends BaseIGet { + + private final static String TESTCASE = "overload indexed getter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public double getX(int i) { return x[i]; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static class BaseISet { + + protected double x[] = {X, X, X}; + public void setX(double a[]) { x = Arrays.copyOf(a, a.length); } + } + + public static class OverloadISet extends BaseISet { + + private final static String TESTCASE = "overload indexed setter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public void setX(int i, double v) { x[i] = v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static class BoolGet { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public boolean getX() { return false; } + } + + public static class BoolGetIs extends BoolGet { + + private final static String TESTCASE = "base boolean getter + is"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + public boolean isX() { return false; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + // ---------- + + public static class BoolIs { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public boolean isX() { return false; } + } + + public static class BoolIsGet extends BoolIs { + + private final static String TESTCASE = "base is + boolean getter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + public boolean getX() { return false; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static class AnnotatedGet { + + private final static String TESTCASE = "annotated super getter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public double getX() { return 0.; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public static class OverrideAnnotatedGet extends AnnotatedGet { + + private final static String TESTCASE = "override annotated getter"; + + @Override + public double getX() { return X; } + } + + // ---------- + + public static class AnnotatedIs { + + private final static String TESTCASE = "annotated super is"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public boolean isX() { return false; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public static class OverrideAnnotatedIs extends AnnotatedIs { + + private final static String TESTCASE = "override annotated is"; + + @Override + public boolean isX() { return false; } + } + + // ---------- + + public static class AnnotatedSet { + + private final static String TESTCASE = "annotated super set"; + + protected double x; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public void setX(double v) { x = -v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public static class OverrideAnnotatedSet extends AnnotatedSet { + + private final static String TESTCASE = "override annotated setter"; + + @Override + public void setX(double v) { x = v; } + } + + // ---------- + + public static class AnnotatedGet2 { + + protected double x; + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public double getX() { return 0.; } + } + + public static class OverrideAnnotatedGet2 extends AnnotatedGet2 { + + private final static String TESTCASE = "override annotated getter - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + @Override + public double getX() { return X; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public static class AnnotatedGet2Ext extends AnnotatedGet2 { + + private final static String TESTCASE = "extend annotated getter - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public void setX(double v) { x = v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static class AnnotatedIs2 { + + protected boolean b = false; + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public boolean isX() { return false; } + } + + public static class OverrideAnnotatedIs2 extends AnnotatedIs2 { + + private final static String TESTCASE = "override annotated is - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + @Override + public boolean isX() { return b; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public static class AnnotatedIs2Ext extends AnnotatedIs2 { + + private final static String TESTCASE = "extend annotated is - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + public void setX(boolean v) { b = v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static class AnnotatedSet2 { + + protected double x; + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public void setX(double v) { x = -v; } + } + + public static class OverrideAnnotatedSet2 extends AnnotatedSet2 { + + private final static String TESTCASE = "override annotated setter - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + @Override + public void setX(double v) { x = v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public static class AnnotatedSet2Ext extends AnnotatedSet2 { + + private final static String TESTCASE = "extend annotated setter - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public double getX() { return x; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public abstract static class AbstractGet { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public abstract double getX(); + } + + public static class OverrideAbstractGet extends AbstractGet { + + private final static String TESTCASE = + "override abstract annotated getter"; + + @Override + public double getX() { return X; } + } + + public static class OverrideAbstractGet2 extends AbstractGet { + + private final static String TESTCASE = + "override abstract annotated getter - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + @Override + public double getX() { return X; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public abstract static class AbstractGetExt extends AbstractGet { + + private final static String TESTCASE = + "extend abstract annotated getter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public abstract void setX(double v); + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public abstract static class AbstractIs { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public abstract boolean isX(); + } + + public static class OverrideAbstractIs extends AbstractIs { + + private final static String TESTCASE = + "override abstract annotated is"; + + @Override + public boolean isX() { return true; } + } + + public static class OverrideAbstractIs2 extends AbstractIs { + + private final static String TESTCASE = + "override abstract annotated is - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + @Override + public boolean isX() { return true; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + + public abstract static class AbstractIsExt extends AbstractIs { + + private final static String TESTCASE = + "extend abstract annotated is"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + public abstract boolean getX(); + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public abstract static class AbstractSet { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public abstract void setX(double v); + } + + public static class OverrideAbstractSet extends AbstractSet { + + private final static String TESTCASE = + "override abstract annotated setter"; + + private double x; + + @Override + public void setX(double v) { x = v; } + } + + public static class OverrideAbstractSet2 extends AbstractSet { + + private final static String TESTCASE = + "override abstract annotated setter - 2"; + + private double x; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + @Override + public void setX(double v) { x = v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public abstract static class AbstractSetExt extends AbstractSet { + + private final static String TESTCASE = + "extend abstract annotated setter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public abstract void setX(double v[]); + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static abstract class AbstractGet2 { + + private final static String TESTCASE = "abstract super getter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public abstract double getX(); + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public static abstract class AbstractGet2Ext extends AbstractGet2 { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public abstract void setX(double a[]); + } + + // ---------- + + public static interface IGet { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + double getX(); + } + + public static class IGetImpl implements IGet { + + private final static String TESTCASE = "implement getter interface"; + + @Override + public double getX() { return X; } + } + + public static class IGetImpl2 implements IGet { + + private final static String TESTCASE = "implement getter interface - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + @Override + public double getX() { return X; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public abstract static class IGetImpl3 implements IGet { + + private final static String TESTCASE = "implement getter interface - 3"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public abstract void setX(double v); + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static interface IIs { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public boolean isX(); + } + + public static class IIsImpl implements IIs { + + private final static String TESTCASE = "implement is interface"; + + @Override + public boolean isX() { return true; } + } + + public static class IIsImpl2 implements IIs { + + private final static String TESTCASE = "implement is interface - 2"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + @Override + public boolean isX() { return true; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public abstract static class IIsImpl3 implements IIs { + + private final static String TESTCASE = "implement is interface - 3"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE) + public abstract void setX(boolean v); + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static interface ISet { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public void setX(double v); + } + + public static class ISetImpl implements ISet { + + private final static String TESTCASE = "implement getter interface"; + + private double x; + + @Override + public void setX(double v) { x = v; } + } + + public static class ISetImpl2 implements ISet { + + private final static String TESTCASE = "implement getter interface - 2"; + + private double x; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + @Override + public void setX(double v) { x = v; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + public abstract static class ISetImpl3 implements ISet { + + private final static String TESTCASE = "implement getter interface - 3"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public abstract double getX(); + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static interface ISet2 { + + final static String TESTCASE = "super interface - setter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public void setX(double v); + + public void addPropertyChangeListener(PropertyChangeListener l); + public void removePropertyChangeListener(PropertyChangeListener l); + } + + public static class ISet2Impl implements ISet2 { + + private double x; + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + @Override + public void setX(double v) { x = v; } + + @Override + public void addPropertyChangeListener(PropertyChangeListener l) {} + @Override + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static interface IGet2 { + + final static String TESTCASE = "super interface - indexed getter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + public double[] getX(); + + public void addPropertyChangeListener(PropertyChangeListener l); + public void removePropertyChangeListener(PropertyChangeListener l); + } + + public static class IGet2Impl implements IGet2 { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + @Override + public double[] getX() { return new double[]{X, X}; } + + @Override + public void addPropertyChangeListener(PropertyChangeListener l) {} + @Override + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + public static class ProtectedGet { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + protected double getX() { return 0.; } + } + + public static class OverrideProtectedGet extends ProtectedGet { + + final static String TESTCASE = "override protected getter"; + + @BeanProperty( + description = DESCRIPTION, + bound = BOUND, + expert = EXPERT, + hidden = HIDDEN, + preferred = PREFERRED, + required = REQUIRED, + visualUpdate = UPDATE, + enumerationValues = {V_NAME}) + @Override + public double getX() { return X; } + + public void addPropertyChangeListener(PropertyChangeListener l) {} + public void removePropertyChangeListener(PropertyChangeListener l) {} + } + + // ---------- + + // static getter - see also JDK-8154938 + public static class StaticGet { + + @BeanProperty( + description = DESCRIPTION_2, + bound = !BOUND, + expert = !EXPERT, + hidden = !HIDDEN, + preferred = !PREFERRED, + required = !REQUIRED, + visualUpdate = !UPDATE) + public static double getProp() { return 0.; } + } + + public static class HideStaticGet extends StaticGet { + + final static String TESTCASE = "hide static getter"; + + public double getX() { return X; } // add to get the "default" info + public static double getProp() { return X; } + } + + // TODO: if 8154938 is considered to be a real issue, + // create one more test case "HideStaticGet2 extends StaticGet" with an + // annotated getter and check the correctness of the corresponding bean info + + // ---------- checks ---------- + + private static boolean check(String what, boolean v, boolean ref) { + + boolean ok = (v == ref); + if (!ok) { System.out.println( + "invalid " + what + ": " + v + ", expected: " + ref); } + return ok; + } + + private static boolean checkInfo(BeanInfo i, boolean ignoreValsCheck) { + + System.out.println("checking info..."); + + PropertyDescriptor descriptors[] = i.getPropertyDescriptors(); + int nd = descriptors.length; + if (nd != 1) { + System.out.println("invalid number of descriptors: " + nd); + return false; + } + + PropertyDescriptor d = descriptors[0]; + + String descr = d.getShortDescription(); + boolean ok = descr.equals(DESCRIPTION); + if (!ok) { System.out.println("invalid description: " + descr + + ", expected: " + DESCRIPTION); } + + ok &= check("isBound", d.isBound(), BOUND); + ok &= check("isExpert", d.isExpert(), EXPERT); + ok &= check("isHidden", d.isHidden(), HIDDEN); + ok &= check("isPreferred", d.isPreferred(), PREFERRED); + ok &= check("required", (boolean) d.getValue("required"), REQUIRED); + ok &= check("visualUpdate", + (boolean) d.getValue("visualUpdate"), UPDATE); + + if (ignoreValsCheck) { return ok; } + + Object vals[] = (Object[]) d.getValue("enumerationValues"); + if (vals == null) { + System.out.println("null enumerationValues"); + return false; + } + + boolean okVals = ( + (vals.length == 3) && + vals[0].toString().equals(V_SHORT) && + vals[1].toString().equals(V) && + vals[2].toString().equals(V_NAME)); + + if (!okVals) { System.out.println("invalid enumerationValues"); } + + return (ok && okVals); + } + + private static boolean checkDefault(BeanInfo i) { + + System.out.println("checking default info..."); + + PropertyDescriptor descriptors[] = i.getPropertyDescriptors(); + int nd = descriptors.length; + if (nd != 1) { + System.out.println("invalid number of descriptors: " + nd); + return false; + } + + PropertyDescriptor d = descriptors[0]; + + String descr = d.getShortDescription(); + boolean ok = descr.equals("x"); + if (!ok) { System.out.println("invalid description: " + descr + + ", expected: x"); } + + ok &= check("isBound", d.isBound(), false); + ok &= check("isExpert", d.isExpert(), false); + ok &= check("isHidden", d.isHidden(), false); + ok &= check("isPreferred", d.isPreferred(), false); + ok &= check("required", (boolean) d.getValue("required"), false); + ok &= check("visualUpdate", + (boolean) d.getValue("visualUpdate"), false); + + Object vals[] = (Object[]) d.getValue("enumerationValues"); + if (vals != null && vals.length > 0) { + System.out.println("non-empty enumerationValues"); + ok = false; + } + + return ok; + } + + // do not check enumerationValues for these classes + private static boolean ignoreVals(Class c) { + return ( + c.equals(BoolGetIs.class) || + c.equals(BoolIsGet.class) || + c.equals(AnnotatedIs.class) || + c.equals(OverrideAnnotatedIs2.class) || + c.equals(AnnotatedIs2Ext.class) || + c.equals(OverrideAbstractIs.class) || + c.equals(OverrideAbstractIs2.class) || + c.equals(AbstractIsExt.class) || + c.equals(OverrideAbstractIs.class) || + c.equals(IIsImpl.class) || + c.equals(IIsImpl2.class) || + c.equals(IIsImpl3.class) + ); + } + + // default property descriptor data are expected for these classes + private static boolean isDefault(Class c) { + return ( + c.equals(OverrideAnnotatedGet.class) || + c.equals(OverrideAnnotatedIs.class ) || + c.equals(OverrideAnnotatedSet.class) || + c.equals(OverrideAbstractGet.class) || + c.equals(OverrideAbstractIs.class) || + c.equals(OverrideAbstractSet.class) || + c.equals(IGetImpl.class) || + c.equals(IIsImpl.class) || + c.equals(ISetImpl.class) || + c.equals(BaseGet.class) || + c.equals(BaseSet.class) || + c.equals(HideStaticGet.class) + ); + } + + + // ---------- run test ---------- + + public static void main(String[] args) throws Exception { + + Class + ic1 = ISet2Impl.class.getInterfaces()[0], + ic2 = IGet2Impl.class.getInterfaces()[0]; + + Class cases[] = { + + OverloadGet.class, + OverloadGet.class.getSuperclass(), + OverloadSet.class, + OverloadSet.class.getSuperclass(), + OverloadIGet.class, + OverloadISet.class, + + // TODO: uncomment/update after 8132565 fix + //BoolGetIs.class, + //BoolIsGet.class, + //OverrideAnnotatedGet.class, + //OverrideAnnotatedIs.class, + //OverrideAnnotatedSet.class, + //OverrideAnnotatedGet2.class, + //AnnotatedGet2Ext.class, + //OverrideAnnotatedIs2.class + //AnnotatedIs2Ext.class, + //OverrideAnnotatedSet2.class, + //AnnotatedSet2Ext.class, + + OverrideAnnotatedGet.class.getSuperclass(), + OverrideAnnotatedIs.class.getSuperclass(), + OverrideAnnotatedSet.class.getSuperclass(), + + // TODO: uncomment/update after 8132565 fix + //OverrideAbstractGet.class, + //OverrideAbstractGet2.class, + //AbstractGetExt.class, + //OverrideAbstractIs.class, + //OverrideAbstractIs2.class, + //AbstractIsExt.class + //OverrideAbstractSet.class, + //OverrideAbstractSet2.class, + //AbstractSetExt.class, + + AbstractGet2Ext.class.getSuperclass(), + IGetImpl.class, + IGetImpl2.class, + IGetImpl3.class, + IIsImpl.class, + IIsImpl2.class, + IIsImpl3.class, + ISetImpl.class, + ISetImpl2.class, + ISetImpl3.class, + ic1, + // ic2, // TODO: uncomment/update after 8155013 fix + OverrideProtectedGet.class, + HideStaticGet.class + }; + + boolean passed = true; + + for (Class c: cases) { + + java.lang.reflect.Field f = c.getDeclaredField("TESTCASE"); + f.setAccessible(true); + String descr = f.get(c).toString(); + + System.out.println("\n" + c.getSimpleName() + " (" + descr + "):"); + BeanInfo i; + try { + i = Introspector.getBeanInfo(c, + (c.equals(ic1) || c.equals(ic2)) ? null : Object.class); + } + catch (IntrospectionException e) { throw new RuntimeException(e); } + + boolean ok; + + if (isDefault(c)) { + ok = checkDefault(i); + } else { + ok = checkInfo(i, ignoreVals(c)); + } + System.out.println(ok ? "OK" : "NOK"); + passed = passed && ok; + } + + if (!passed) { throw new RuntimeException("test failed"); } + System.out.println("\ntest passed"); + } +} diff --git a/jdk/test/java/beans/XMLEncoder/Test4625418.java b/jdk/test/java/beans/XMLEncoder/Test4625418.java index 0f9203e864d..a8a23aced37 100644 --- a/jdk/test/java/beans/XMLEncoder/Test4625418.java +++ b/jdk/test/java/beans/XMLEncoder/Test4625418.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,332 +26,338 @@ * @bug 4625418 * @summary Tests XML encoding * @author Sergey Malenkov - * - * @run main Test4625418 ASCII - * @run main Test4625418 Big5 - * ?run main Test4625418 Big5-HKSCS - * ?run main Test4625418 Big5_HKSCS - * @run main Test4625418 Big5_Solaris - * ?run main Test4625418 Cp037 - * @run main Test4625418 Cp1006 - * ?run main Test4625418 Cp1025 - * -run main Test4625418 Cp1026 - * @run main Test4625418 Cp1046 - * @run main Test4625418 Cp1047 - * @run main Test4625418 Cp1097 - * @run main Test4625418 Cp1098 - * ?run main Test4625418 Cp1112 - * ?run main Test4625418 Cp1122 - * ?run main Test4625418 Cp1123 - * @run main Test4625418 Cp1124 - * ?run main Test4625418 Cp1140 - * ?run main Test4625418 Cp1141 - * ?run main Test4625418 Cp1142 - * ?run main Test4625418 Cp1143 - * ?run main Test4625418 Cp1144 - * ?run main Test4625418 Cp1145 - * ?run main Test4625418 Cp1146 - * ?run main Test4625418 Cp1147 - * ?run main Test4625418 Cp1148 - * ?run main Test4625418 Cp1149 - * @run main Test4625418 Cp1250 - * @run main Test4625418 Cp1251 - * @run main Test4625418 Cp1252 - * @run main Test4625418 Cp1253 - * @run main Test4625418 Cp1254 - * @run main Test4625418 Cp1255 - * @run main Test4625418 Cp1256 - * @run main Test4625418 Cp1257 - * @run main Test4625418 Cp1258 - * ?run main Test4625418 Cp1381 - * ?run main Test4625418 Cp1383 - * ?run main Test4625418 Cp273 - * ?run main Test4625418 Cp277 - * ?run main Test4625418 Cp278 - * ?run main Test4625418 Cp280 - * ?run main Test4625418 Cp284 - * ?run main Test4625418 Cp285 - * ?run main Test4625418 Cp297 - * ?run main Test4625418 Cp33722 - * ?run main Test4625418 Cp420 - * ?run main Test4625418 Cp424 - * @run main Test4625418 Cp437 - * ?run main Test4625418 Cp500 - * ?run main Test4625418 Cp50220 - * ?run main Test4625418 Cp50221 - * @run main Test4625418 Cp737 - * @run main Test4625418 Cp775 - * -run main Test4625418 Cp834 - * ?run main Test4625418 Cp838 - * @run main Test4625418 Cp850 - * @run main Test4625418 Cp852 - * @run main Test4625418 Cp855 - * @run main Test4625418 Cp856 - * @run main Test4625418 Cp857 - * @run main Test4625418 Cp858 - * @run main Test4625418 Cp860 - * @run main Test4625418 Cp861 - * @run main Test4625418 Cp862 - * @run main Test4625418 Cp863 - * @run main Test4625418 Cp864 - * @run main Test4625418 Cp865 - * @run main Test4625418 Cp866 - * @run main Test4625418 Cp868 - * @run main Test4625418 Cp869 - * ?run main Test4625418 Cp870 - * ?run main Test4625418 Cp871 - * @run main Test4625418 Cp874 - * ?run main Test4625418 Cp875 - * ?run main Test4625418 Cp918 - * @run main Test4625418 Cp921 - * @run main Test4625418 Cp922 - * -run main Test4625418 Cp930 - * @run main Test4625418 Cp933 - * ?run main Test4625418 Cp935 - * ?run main Test4625418 Cp937 - * ?run main Test4625418 Cp939 - * ?run main Test4625418 Cp942 - * ?run main Test4625418 Cp942C - * @run main Test4625418 Cp943 - * ?run main Test4625418 Cp943C - * @run main Test4625418 Cp948 - * @run main Test4625418 Cp949 - * ?run main Test4625418 Cp949C - * @run main Test4625418 Cp950 - * @run main Test4625418 Cp964 - * ?run main Test4625418 Cp970 - * ?run main Test4625418 EUC-JP - * @run main Test4625418 EUC-KR - * @run main Test4625418 EUC_CN - * ?run main Test4625418 EUC_JP - * ?run main Test4625418 EUC_JP_LINUX - * ?run main Test4625418 EUC_JP_Solaris - * @run main Test4625418 EUC_KR - * ?run main Test4625418 EUC_TW - * @run main Test4625418 GB18030 - * @run main Test4625418 GB2312 - * @run main Test4625418 GBK - * ?run main Test4625418 IBM-Thai - * @run main Test4625418 IBM00858 - * ?run main Test4625418 IBM01140 - * ?run main Test4625418 IBM01141 - * ?run main Test4625418 IBM01142 - * ?run main Test4625418 IBM01143 - * ?run main Test4625418 IBM01144 - * ?run main Test4625418 IBM01145 - * ?run main Test4625418 IBM01146 - * ?run main Test4625418 IBM01147 - * ?run main Test4625418 IBM01148 - * ?run main Test4625418 IBM01149 - * ?run main Test4625418 IBM037 - * -run main Test4625418 IBM1026 - * @run main Test4625418 IBM1047 - * ?run main Test4625418 IBM273 - * ?run main Test4625418 IBM277 - * ?run main Test4625418 IBM278 - * ?run main Test4625418 IBM280 - * ?run main Test4625418 IBM284 - * ?run main Test4625418 IBM285 - * ?run main Test4625418 IBM297 - * ?run main Test4625418 IBM420 - * ?run main Test4625418 IBM424 - * @run main Test4625418 IBM437 - * ?run main Test4625418 IBM500 - * @run main Test4625418 IBM775 - * @run main Test4625418 IBM850 - * @run main Test4625418 IBM852 - * @run main Test4625418 IBM855 - * @run main Test4625418 IBM857 - * @run main Test4625418 IBM860 - * @run main Test4625418 IBM861 - * @run main Test4625418 IBM862 - * @run main Test4625418 IBM863 - * @run main Test4625418 IBM864 - * @run main Test4625418 IBM865 - * @run main Test4625418 IBM866 - * @run main Test4625418 IBM868 - * @run main Test4625418 IBM869 - * ?run main Test4625418 IBM870 - * ?run main Test4625418 IBM871 - * ?run main Test4625418 IBM918 - * ?run main Test4625418 ISCII91 - * -run main Test4625418 ISO-2022-CN - * @run main Test4625418 ISO-2022-JP - * @run main Test4625418 ISO-2022-KR - * @run main Test4625418 ISO-8859-1 - * @run main Test4625418 ISO-8859-13 - * @run main Test4625418 ISO-8859-15 - * @run main Test4625418 ISO-8859-2 - * @run main Test4625418 ISO-8859-3 - * @run main Test4625418 ISO-8859-4 - * @run main Test4625418 ISO-8859-5 - * @run main Test4625418 ISO-8859-6 - * @run main Test4625418 ISO-8859-7 - * @run main Test4625418 ISO-8859-8 - * @run main Test4625418 ISO-8859-9 - * -run main Test4625418 ISO2022CN - * @run main Test4625418 ISO2022JP - * @run main Test4625418 ISO2022KR - * -run main Test4625418 ISO2022_CN_CNS - * -run main Test4625418 ISO2022_CN_GB - * @run main Test4625418 ISO8859_1 - * @run main Test4625418 ISO8859_13 - * @run main Test4625418 ISO8859_15 - * @run main Test4625418 ISO8859_2 - * @run main Test4625418 ISO8859_3 - * @run main Test4625418 ISO8859_4 - * @run main Test4625418 ISO8859_5 - * @run main Test4625418 ISO8859_6 - * @run main Test4625418 ISO8859_7 - * @run main Test4625418 ISO8859_8 - * @run main Test4625418 ISO8859_9 - * -run main Test4625418 JISAutoDetect - * ?run main Test4625418 JIS_X0201 - * -run main Test4625418 JIS_X0212-1990 - * @run main Test4625418 KOI8-R - * @run main Test4625418 KOI8-U - * @run main Test4625418 KOI8_R - * @run main Test4625418 KOI8_U - * @run main Test4625418 MS874 - * ?run main Test4625418 MS932 - * ?run main Test4625418 MS936 - * @run main Test4625418 MS949 - * @run main Test4625418 MS950 - * ?run main Test4625418 MS950_HKSCS - * @run main Test4625418 MacArabic - * @run main Test4625418 MacCentralEurope - * @run main Test4625418 MacCroatian - * @run main Test4625418 MacCyrillic - * -run main Test4625418 MacDingbat - * @run main Test4625418 MacGreek - * @run main Test4625418 MacHebrew - * @run main Test4625418 MacIceland - * @run main Test4625418 MacRoman - * @run main Test4625418 MacRomania - * -run main Test4625418 MacSymbol - * @run main Test4625418 MacThai - * @run main Test4625418 MacTurkish - * @run main Test4625418 MacUkraine - * ?run main Test4625418 PCK - * ?run main Test4625418 SJIS - * ?run main Test4625418 Shift_JIS - * @run main Test4625418 TIS-620 - * @run main Test4625418 TIS620 - * @run main Test4625418 US-ASCII - * @run main Test4625418 UTF-16 - * @run main Test4625418 UTF-16BE - * @run main Test4625418 UTF-16LE - * @run main Test4625418 UTF-32 - * @run main Test4625418 UTF-32BE - * @run main Test4625418 UTF-32LE - * @run main Test4625418 UTF-8 - * @run main Test4625418 UTF8 - * @run main Test4625418 UTF_32 - * @run main Test4625418 UTF_32BE - * -run main Test4625418 UTF_32BE_BOM - * @run main Test4625418 UTF_32LE - * -run main Test4625418 UTF_32LE_BOM - * @run main Test4625418 UnicodeBig - * @run main Test4625418 UnicodeBigUnmarked - * @run main Test4625418 UnicodeLittle - * @run main Test4625418 UnicodeLittleUnmarked - * @run main Test4625418 windows-1250 - * @run main Test4625418 windows-1251 - * @run main Test4625418 windows-1252 - * @run main Test4625418 windows-1253 - * @run main Test4625418 windows-1254 - * @run main Test4625418 windows-1255 - * @run main Test4625418 windows-1256 - * @run main Test4625418 windows-1257 - * @run main Test4625418 windows-1258 - * ?run main Test4625418 windows-31j - * -run main Test4625418 x-Big5_Solaris - * ?run main Test4625418 x-EUC-TW - * @run main Test4625418 x-IBM1006 - * ?run main Test4625418 x-IBM1025 - * @run main Test4625418 x-IBM1046 - * @run main Test4625418 x-IBM1097 - * @run main Test4625418 x-IBM1098 - * ?run main Test4625418 x-IBM1112 - * ?run main Test4625418 x-IBM1122 - * ?run main Test4625418 x-IBM1123 - * @run main Test4625418 x-IBM1124 - * ?run main Test4625418 x-IBM1381 - * ?run main Test4625418 x-IBM1383 - * ?run main Test4625418 x-IBM33722 - * @run main Test4625418 x-IBM737 - * -run main Test4625418 x-IBM834 - * @run main Test4625418 x-IBM856 - * @run main Test4625418 x-IBM874 - * ?run main Test4625418 x-IBM875 - * @run main Test4625418 x-IBM921 - * @run main Test4625418 x-IBM922 - * -run main Test4625418 x-IBM930 - * @run main Test4625418 x-IBM933 - * ?run main Test4625418 x-IBM935 - * ?run main Test4625418 x-IBM937 - * ?run main Test4625418 x-IBM939 - * ?run main Test4625418 x-IBM942 - * ?run main Test4625418 x-IBM942C - * @run main Test4625418 x-IBM943 - * ?run main Test4625418 x-IBM943C - * @run main Test4625418 x-IBM948 - * @run main Test4625418 x-IBM949 - * ?run main Test4625418 x-IBM949C - * @run main Test4625418 x-IBM950 - * @run main Test4625418 x-IBM964 - * ?run main Test4625418 x-IBM970 - * ?run main Test4625418 x-ISCII91 - * -run main Test4625418 x-ISO2022-CN-CNS - * -run main Test4625418 x-ISO2022-CN-GB - * -run main Test4625418 x-JIS0208 - * -run main Test4625418 x-JISAutoDetect - * @run main Test4625418 x-Johab - * ?run main Test4625418 x-MS950-HKSCS - * @run main Test4625418 x-MacArabic - * @run main Test4625418 x-MacCentralEurope - * @run main Test4625418 x-MacCroatian - * @run main Test4625418 x-MacCyrillic - * -run main Test4625418 x-MacDingbat - * @run main Test4625418 x-MacGreek - * @run main Test4625418 x-MacHebrew - * @run main Test4625418 x-MacIceland - * @run main Test4625418 x-MacRoman - * @run main Test4625418 x-MacRomania - * -run main Test4625418 x-MacSymbol - * @run main Test4625418 x-MacThai - * @run main Test4625418 x-MacTurkish - * @run main Test4625418 x-MacUkraine - * ?run main Test4625418 x-PCK - * @run main Test4625418 x-UTF-16LE-BOM - * -run main Test4625418 x-UTF-32BE-BOM - * -run main Test4625418 x-UTF-32LE-BOM - * ?run main Test4625418 x-euc-jp-linux - * ?run main Test4625418 x-eucJP-Open - * @run main Test4625418 x-iso-8859-11 - * @run main Test4625418 x-mswin-936 - * ?run main Test4625418 x-windows-50220 - * ?run main Test4625418 x-windows-50221 - * @run main Test4625418 x-windows-874 - * @run main Test4625418 x-windows-949 - * @run main Test4625418 x-windows-950 - * ?run main Test4625418 x-windows-iso2022jp + * @run main/timeout=360 Test4625418 */ import java.beans.ExceptionListener; import java.beans.XMLDecoder; import java.beans.XMLEncoder; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.UnsupportedCharsetException; public final class Test4625418 implements ExceptionListener { - public static void main(String[] args) { - new Test4625418(args[0]).test(createString(0x10000)); - System.out.println("Test passed: " + args[0]); + + private static final String[] encodings = { + "ASCII", + "Big5", + //"Big5-HKSCS", + //"Big5_HKSCS", + "Big5_Solaris", + //"Cp037", + "Cp1006", + //"Cp1025", + //"Cp1026", + "Cp1046", + "Cp1047", + "Cp1097", + "Cp1098", + //"Cp1112", + //"Cp1122", + //"Cp1123", + "Cp1124", + //"Cp1140", + //"Cp1141", + //"Cp1142", + //"Cp1143", + //"Cp1144", + //"Cp1145", + //"Cp1146", + //"Cp1147", + //"Cp1148", + //"Cp1149", + "Cp1250", + "Cp1251", + "Cp1252", + "Cp1253", + "Cp1254", + "Cp1255", + "Cp1256", + "Cp1257", + "Cp1258", + //"Cp1381", + //"Cp1383", + //"Cp273", + //"Cp277", + //"Cp278", + //"Cp280", + //"Cp284", + //"Cp285", + //"Cp297", + //"Cp33722", + //"Cp420", + //"Cp424", + "Cp437", + //"Cp500", + //"Cp50220", + //"Cp50221", + "Cp737", + "Cp775", + //"Cp834", + //"Cp838", + "Cp850", + "Cp852", + "Cp855", + "Cp856", + "Cp857", + "Cp858", + "Cp860", + "Cp861", + "Cp862", + "Cp863", + "Cp864", + "Cp865", + "Cp866", + "Cp868", + "Cp869", + //"Cp870", + //"Cp871", + "Cp874", + //"Cp875", + //"Cp918", + "Cp921", + "Cp922", + //"Cp930", + "Cp933", + //"Cp935", + //"Cp937", + //"Cp939", + //"Cp942", + //"Cp942C", + "Cp943", + //"Cp943C", + "Cp948", + "Cp949", + //"Cp949C", + "Cp950", + "Cp964", + //"Cp970", + //"EUC-JP", + "EUC-KR", + "EUC_CN", + //"EUC_JP", + //"EUC_JP_LINUX", + //"EUC_JP_Solaris", + "EUC_KR", + //"EUC_TW", + "GB18030", + "GB2312", + "GBK", + //"IBM-Thai", + "IBM00858", + //"IBM01140", + //"IBM01141", + //"IBM01142", + //"IBM01143", + //"IBM01144", + //"IBM01145", + //"IBM01146", + //"IBM01147", + //"IBM01148", + //"IBM01149", + //"IBM037", + //"IBM1026", + "IBM1047", + //"IBM273", + //"IBM277", + //"IBM278", + //"IBM280", + //"IBM284", + //"IBM285", + //"IBM297", + //"IBM420", + //"IBM424", + "IBM437", + //"IBM500", + "IBM775", + "IBM850", + "IBM852", + "IBM855", + "IBM857", + "IBM860", + "IBM861", + "IBM862", + "IBM863", + "IBM864", + "IBM865", + "IBM866", + "IBM868", + "IBM869", + //"IBM870", + //"IBM871", + //"IBM918", + //"ISCII91", + //"ISO-2022-CN", + "ISO-2022-JP", + "ISO-2022-KR", + "ISO-8859-1", + "ISO-8859-13", + "ISO-8859-15", + "ISO-8859-2", + "ISO-8859-3", + "ISO-8859-4", + "ISO-8859-5", + "ISO-8859-6", + "ISO-8859-7", + "ISO-8859-8", + "ISO-8859-9", + //"ISO2022CN", + "ISO2022JP", + "ISO2022KR", + //"ISO2022_CN_CNS", + //"ISO2022_CN_GB", + "ISO8859_1", + "ISO8859_13", + "ISO8859_15", + "ISO8859_2", + "ISO8859_3", + "ISO8859_4", + "ISO8859_5", + "ISO8859_6", + "ISO8859_7", + "ISO8859_8", + "ISO8859_9", + //"JISAutoDetect", + //"JIS_X0201", + //"JIS_X0212-1990", + "KOI8-R", + "KOI8-U", + "KOI8_R", + "KOI8_U", + "MS874", + //"MS932", + //"MS936", + "MS949", + "MS950", + //"MS950_HKSCS", + "MacArabic", + "MacCentralEurope", + "MacCroatian", + "MacCyrillic", + //"MacDingbat", + "MacGreek", + "MacHebrew", + "MacIceland", + "MacRoman", + "MacRomania", + //"MacSymbol", + "MacThai", + "MacTurkish", + "MacUkraine", + //"PCK", + //"SJIS", + //"Shift_JIS", + "TIS-620", + "TIS620", + "US-ASCII", + "UTF-16", + "UTF-16BE", + "UTF-16LE", + "UTF-32", + "UTF-32BE", + "UTF-32LE", + "UTF-8", + "UTF8", + "UTF_32", + "UTF_32BE", + //"UTF_32BE_BOM", + "UTF_32LE", + //"UTF_32LE_BOM", + "UnicodeBig", + "UnicodeBigUnmarked", + "UnicodeLittle", + "UnicodeLittleUnmarked", + "windows-1250", + "windows-1251", + "windows-1252", + "windows-1253", + "windows-1254", + "windows-1255", + "windows-1256", + "windows-1257", + "windows-1258", + //"windows-31j", + //"x-Big5_Solaris", + //"x-EUC-TW", + "x-IBM1006", + //"x-IBM1025", + "x-IBM1046", + "x-IBM1097", + "x-IBM1098", + //"x-IBM1112", + //"x-IBM1122", + //"x-IBM1123", + "x-IBM1124", + //"x-IBM1381", + //"x-IBM1383", + //"x-IBM33722", + "x-IBM737", + //"x-IBM834", + "x-IBM856", + "x-IBM874", + //"x-IBM875", + "x-IBM921", + "x-IBM922", + //"x-IBM930", + "x-IBM933", + //"x-IBM935", + //"x-IBM937", + //"x-IBM939", + //"x-IBM942", + //"x-IBM942C", + "x-IBM943", + //"x-IBM943C", + "x-IBM948", + "x-IBM949", + //"x-IBM949C", + "x-IBM950", + "x-IBM964", + //"x-IBM970", + //"x-ISCII91", + //"x-ISO2022-CN-CNS", + //"x-ISO2022-CN-GB", + //"x-JIS0208", + //"x-JISAutoDetect", + "x-Johab", + //"x-MS950-HKSCS", + "x-MacArabic", + "x-MacCentralEurope", + "x-MacCroatian", + "x-MacCyrillic", + //"x-MacDingbat", + "x-MacGreek", + "x-MacHebrew", + "x-MacIceland", + "x-MacRoman", + "x-MacRomania", + //"x-MacSymbol", + "x-MacThai", + "x-MacTurkish", + "x-MacUkraine", + //"x-PCK", + "x-UTF-16LE-BOM", + //"x-UTF-32BE-BOM", + //"x-UTF-32LE-BOM", + //"x-euc-jp-linux", + //"x-eucJP-Open", + "x-iso-8859-11", + "x-mswin-936", + //"x-windows-50220", + //"x-windows-50221", + "x-windows-874", + "x-windows-949", + "x-windows-950", + //"x-windows-iso2022jp", + }; + + public static void main(final String[] args) { + final String string = createString(0x10000); + for (String encoding : encodings) { + System.out.println("Test encoding: " + encoding); + new Test4625418(encoding).test(string); + } } private static String createString(int length) { @@ -364,33 +370,27 @@ public final class Test4625418 implements ExceptionListener { private final String encoding; - private Test4625418(String encoding) { + private Test4625418(final String encoding) { this.encoding = encoding; } private void test(String string) { try { - File file = new File("4625418." + this.encoding + ".xml"); - - FileOutputStream output = new FileOutputStream(file); + ByteArrayOutputStream output = new ByteArrayOutputStream(); XMLEncoder encoder = new XMLEncoder(output, this.encoding, true, 0); encoder.setExceptionListener(this); encoder.writeObject(string); encoder.close(); - FileInputStream input = new FileInputStream(file); + InputStream input = new ByteArrayInputStream(output.toByteArray()); XMLDecoder decoder = new XMLDecoder(input); decoder.setExceptionListener(this); Object object = decoder.readObject(); decoder.close(); - if (!string.equals(object)) + if (!string.equals(object)) { throw new Error(this.encoding + " - can't read properly"); - - file.delete(); - } - catch (FileNotFoundException exception) { - throw new Error(this.encoding + " - file not found", exception); + } } catch (IllegalCharsetNameException exception) { throw new Error(this.encoding + " - illegal charset name", exception); diff --git a/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java index a162debb3f8..9052737aad5 100644 --- a/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java +++ b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java @@ -228,12 +228,18 @@ public class FieldSetAccessibleTest { } static boolean test(String s, boolean addExports) { + String clsName = s.replace('/', '.').substring(0, s.length() - 6); try { + System.out.println("Loading " + clsName); final Class c = Class.forName( - s.replace('/', '.').substring(0, s.length() - 6), + clsName, false, systemClassLoader); return test(c, addExports); + } catch (VerifyError ve) { + System.err.println("VerifyError for " + clsName); + ve.printStackTrace(System.err); + failed.add(s); } catch (Exception t) { t.printStackTrace(System.err); failed.add(s); diff --git a/jdk/test/java/lang/ClassLoader/deadlock/GetResource.java b/jdk/test/java/lang/ClassLoader/deadlock/GetResource.java index a1a1b4e1730..26fbe3dd586 100644 --- a/jdk/test/java/lang/ClassLoader/deadlock/GetResource.java +++ b/jdk/test/java/lang/ClassLoader/deadlock/GetResource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2016 Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ import java.io.IOException; import java.net.URL; /* @test - * @bug 6977738 + * @bug 6977738 8029891 * @summary Test ClassLoader.getResource() that should not deadlock # if another thread is holding the system properties object * @@ -70,10 +70,6 @@ public class GetResource { go.await(); // wait until t1 holds the lock of the system properties URL u1 = Thread.currentThread().getContextClassLoader().getResource("unknownresource"); - URL u2 = Thread.currentThread().getContextClassLoader().getResource("sun/util/resources/CalendarData.class"); - if (u2 == null) { - throw new RuntimeException("Test failed: resource not found"); - } done.await(); } catch (InterruptedException e) { throw new RuntimeException(e); diff --git a/jdk/test/jdk/Version/Basic.java b/jdk/test/java/lang/Runtime/Version/Basic.java similarity index 96% rename from jdk/test/jdk/Version/Basic.java rename to jdk/test/java/lang/Runtime/Version/Basic.java index b94180c8daf..0a60ad256d6 100644 --- a/jdk/test/jdk/Version/Basic.java +++ b/jdk/test/java/lang/Runtime/Version/Basic.java @@ -23,12 +23,13 @@ /* * @test - * @summary Unit test for jdk.Version. - * @bug 8072379 + * @summary Unit test for java.lang.Runtime.Version. + * @bug 8072379 8144062 */ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.Runtime.Version; import java.math.BigInteger; import java.util.stream.Collectors; import java.util.Arrays; @@ -36,7 +37,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -import jdk.Version; import static java.lang.System.out; public class Basic { @@ -116,8 +116,8 @@ public class Basic { tryCatch("1.4142+-", IAE); tryCatch("2.9979+-%", IAE); - //// Test for current() - testCurrent(); + //// Test for Runtime.version() + testVersion(); //// Test for equals{IgnoreOpt}?(), hashCode(), compareTo{IgnoreOpt}?() // compare: after "<" == -1, equal == 0, before ">" == 1 @@ -219,18 +219,19 @@ public class Basic { pass(); } - private static void testCurrent() { - Version current = Version.current(); - String javaVer = System.getProperty("java.version"); + private static void testVersion() { + Version current = Runtime.version(); + String javaVer = System.getProperty("java.runtime.version"); - // java.version == $VNUM(\-$PRE) - String [] ver = javaVer.split("-"); + // java.runtime.version == $VNUM(\-$PRE)?(\+$BUILD)?(-$OPT)? + String [] jv = javaVer.split("\\+"); + String [] ver = jv[0].split("-"); List javaVerVNum = Arrays.stream(ver[0].split("\\.")) .map(v -> Integer.parseInt(v)) .collect(Collectors.toList()); if (!javaVerVNum.equals(current.version())) { - fail("testCurrent() version()", javaVerVNum.toString(), + fail("Runtime.version()", javaVerVNum.toString(), current.version().toString()); } else { pass(); diff --git a/jdk/test/java/lang/invoke/ArrayLengthTest.java b/jdk/test/java/lang/invoke/ArrayLengthTest.java new file mode 100644 index 00000000000..3eabf9789c2 --- /dev/null +++ b/jdk/test/java/lang/invoke/ArrayLengthTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @run testng/othervm -ea -esa test.java.lang.invoke.ArrayLengthTest + */ +package test.java.lang.invoke; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; + +import static org.testng.AssertJUnit.*; + +import org.testng.annotations.*; + +public class ArrayLengthTest { + + @DataProvider + Object[][] arrayClasses() { + return new Object[][] { + {int[].class}, + {long[].class}, + {float[].class}, + {double[].class}, + {boolean[].class}, + {byte[].class}, + {short[].class}, + {char[].class}, + {Object[].class}, + {StringBuffer[].class} + }; + } + + @Test(dataProvider = "arrayClasses") + public void testArrayLength(Class arrayClass) throws Throwable { + MethodHandle arrayLength = MethodHandles.arrayLength(arrayClass); + assertEquals(int.class, arrayLength.type().returnType()); + assertEquals(arrayClass, arrayLength.type().parameterType(0)); + Object array = MethodHandles.arrayConstructor(arrayClass).invoke(10); + assertEquals(10, arrayLength.invoke(array)); + } + + @Test(dataProvider = "arrayClasses", expectedExceptions = NullPointerException.class) + public void testArrayLengthInvokeNPE(Class arrayClass) throws Throwable { + MethodHandle arrayLength = MethodHandles.arrayLength(arrayClass); + arrayLength.invoke(null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testArrayLengthNoArray() { + MethodHandles.arrayLength(String.class); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testArrayLengthNPE() { + MethodHandles.arrayLength(null); + } + +} diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleBaseTest.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleBaseTest.java index 010f5ce551d..b8cbc17784d 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleBaseTest.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleBaseTest.java @@ -212,7 +212,6 @@ abstract class VarHandleBaseTest { } static MethodHandle findVirtual(VarHandle vh, TestAccessMode tam, MethodType mt) { - mt = vh.accessModeType(tam.toAccessMode()); MethodHandle mh; try { mh = MethodHandles.publicLookup(). @@ -222,36 +221,26 @@ abstract class VarHandleBaseTest { } catch (Exception e) { throw new RuntimeException(e); } - return bind(vh, tam, mh, mt); + return bind(vh, mh, mt); } - static MethodHandle varHandleInvokerWithAccessModeType(VarHandle vh, TestAccessMode tam, MethodType mt) { - mt = vh.accessModeType(tam.toAccessMode()); + static MethodHandle varHandleInvoker(VarHandle vh, TestAccessMode tam, MethodType mt) { MethodHandle mh = MethodHandles.varHandleInvoker( tam.toAccessMode(), mt); - return bind(vh, tam, mh, mt); + return bind(vh, mh, mt); } - static MethodHandle varHandleInvokerWithSymbolicTypeDescriptor(VarHandle vh, TestAccessMode tam, MethodType mt) { - MethodHandle mh = MethodHandles.varHandleInvoker( - tam.toAccessMode(), - mt); - - return bind(vh, tam, mh, mt); - } - - static MethodHandle varHandleExactInvokerWithAccessModeType(VarHandle vh, TestAccessMode tam, MethodType mt) { - mt = vh.accessModeType(tam.toAccessMode()); + static MethodHandle varHandleExactInvoker(VarHandle vh, TestAccessMode tam, MethodType mt) { MethodHandle mh = MethodHandles.varHandleExactInvoker( tam.toAccessMode(), mt); - return bind(vh, tam, mh, mt); + return bind(vh, mh, mt); } - private static MethodHandle bind(VarHandle vh, TestAccessMode testAccessMode, MethodHandle mh, MethodType emt) { + private static MethodHandle bind(VarHandle vh, MethodHandle mh, MethodType emt) { assertEquals(mh.type(), emt.insertParameterTypes(0, VarHandle.class), "MethodHandle type differs from access mode type"); @@ -269,33 +258,30 @@ abstract class VarHandleBaseTest { enum VarHandleToMethodHandle { VAR_HANDLE_TO_METHOD_HANDLE( "VarHandle.toMethodHandle", + true, VarHandleBaseTest::toMethodHandle), METHOD_HANDLES_LOOKUP_FIND_VIRTUAL( "Lookup.findVirtual", + false, VarHandleBaseTest::findVirtual), - METHOD_HANDLES_VAR_HANDLE_INVOKER_WITH_ACCESS_MODE_TYPE( - "MethodHandles.varHandleInvoker(accessModeType)", - VarHandleBaseTest::varHandleInvokerWithAccessModeType), - METHOD_HANDLES_VAR_HANDLE_INVOKER_WITH_SYMBOLIC_TYPE_DESCRIPTOR( - "MethodHandles.varHandleInvoker(symbolicTypeDescriptor)", - VarHandleBaseTest::varHandleInvokerWithSymbolicTypeDescriptor), - METHOD_HANDLES_VAR_HANDLE_EXACT_INVOKER_WITH_ACCESS_MODE_TYPE( - "MethodHandles.varHandleExactInvoker(accessModeType)", - VarHandleBaseTest::varHandleExactInvokerWithAccessModeType); + METHOD_HANDLES_VAR_HANDLE_INVOKER( + "MethodHandles.varHandleInvoker", + false, + VarHandleBaseTest::varHandleInvoker), + METHOD_HANDLES_VAR_HANDLE_EXACT_INVOKER( + "MethodHandles.varHandleExactInvoker", + true, + VarHandleBaseTest::varHandleExactInvoker); final String desc; + final boolean isExact; final TriFunction f; - final boolean exact; - VarHandleToMethodHandle(String desc, TriFunction f) { - this(desc, f, false); - } - - VarHandleToMethodHandle(String desc, TriFunction f, - boolean exact) { + VarHandleToMethodHandle(String desc, boolean isExact, + TriFunction f) { this.desc = desc; this.f = f; - this.exact = exact; + this.isExact = isExact; } MethodHandle apply(VarHandle vh, TestAccessMode am, MethodType mt) { @@ -364,6 +350,15 @@ abstract class VarHandleBaseTest { return amToHandle.computeIfAbsent( amt, k -> f.apply(vh, am, mt)); } + + Class getWMTEOOrOther(Class c) { + return f.isExact ? WrongMethodTypeException.class : c; + } + + void checkWMTEOrCCE(ThrowingRunnable r) { + checkWithThrowable(getWMTEOOrOther(ClassCastException.class), null, r); + } + } interface AccessTestAction { diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java index 021091484e6..9a02753d945 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java @@ -292,6 +292,10 @@ public class VarHandleTestAccessBoolean extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, true, false); }); + checkUOE(() -> { + boolean r = (boolean) vh.getAndSet(recv, true); + }); + checkUOE(() -> { boolean o = (boolean) vh.getAndAdd(recv, true); }); @@ -378,6 +382,10 @@ public class VarHandleTestAccessBoolean extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(true, false); }); + checkUOE(() -> { + boolean r = (boolean) vh.getAndSet(true); + }); + checkUOE(() -> { boolean o = (boolean) vh.getAndAdd(true); }); @@ -454,6 +462,10 @@ public class VarHandleTestAccessBoolean extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, true, false); }); + checkUOE(() -> { + boolean r = (boolean) vh.getAndSet(recv, true); + }); + checkUOE(() -> { boolean o = (boolean) vh.getAndAdd(recv, true); }); @@ -530,6 +542,10 @@ public class VarHandleTestAccessBoolean extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(true, false); }); + checkUOE(() -> { + boolean r = (boolean) vh.getAndSet(true); + }); + checkUOE(() -> { boolean o = (boolean) vh.getAndAdd(true); }); @@ -613,6 +629,10 @@ public class VarHandleTestAccessBoolean extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(array, i, true, false); }); + checkUOE(() -> { + boolean r = (boolean) vh.getAndSet(array, i, true); + }); + checkUOE(() -> { boolean o = (boolean) vh.getAndAdd(array, i, true); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java index e550815156c..17544907e8d 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java @@ -292,6 +292,10 @@ public class VarHandleTestAccessByte extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, (byte)1, (byte)2); }); + checkUOE(() -> { + byte r = (byte) vh.getAndSet(recv, (byte)1); + }); + checkUOE(() -> { byte o = (byte) vh.getAndAdd(recv, (byte)1); }); @@ -378,6 +382,10 @@ public class VarHandleTestAccessByte extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease((byte)1, (byte)2); }); + checkUOE(() -> { + byte r = (byte) vh.getAndSet((byte)1); + }); + checkUOE(() -> { byte o = (byte) vh.getAndAdd((byte)1); }); @@ -454,6 +462,10 @@ public class VarHandleTestAccessByte extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, (byte)1, (byte)2); }); + checkUOE(() -> { + byte r = (byte) vh.getAndSet(recv, (byte)1); + }); + checkUOE(() -> { byte o = (byte) vh.getAndAdd(recv, (byte)1); }); @@ -530,6 +542,10 @@ public class VarHandleTestAccessByte extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease((byte)1, (byte)2); }); + checkUOE(() -> { + byte r = (byte) vh.getAndSet((byte)1); + }); + checkUOE(() -> { byte o = (byte) vh.getAndAdd((byte)1); }); @@ -613,6 +629,10 @@ public class VarHandleTestAccessByte extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(array, i, (byte)1, (byte)2); }); + checkUOE(() -> { + byte r = (byte) vh.getAndSet(array, i, (byte)1); + }); + checkUOE(() -> { byte o = (byte) vh.getAndAdd(array, i, (byte)1); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java index 5c13c6d6677..88bad8475cb 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java @@ -292,6 +292,10 @@ public class VarHandleTestAccessChar extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, 'a', 'b'); }); + checkUOE(() -> { + char r = (char) vh.getAndSet(recv, 'a'); + }); + checkUOE(() -> { char o = (char) vh.getAndAdd(recv, 'a'); }); @@ -378,6 +382,10 @@ public class VarHandleTestAccessChar extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease('a', 'b'); }); + checkUOE(() -> { + char r = (char) vh.getAndSet('a'); + }); + checkUOE(() -> { char o = (char) vh.getAndAdd('a'); }); @@ -454,6 +462,10 @@ public class VarHandleTestAccessChar extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, 'a', 'b'); }); + checkUOE(() -> { + char r = (char) vh.getAndSet(recv, 'a'); + }); + checkUOE(() -> { char o = (char) vh.getAndAdd(recv, 'a'); }); @@ -530,6 +542,10 @@ public class VarHandleTestAccessChar extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease('a', 'b'); }); + checkUOE(() -> { + char r = (char) vh.getAndSet('a'); + }); + checkUOE(() -> { char o = (char) vh.getAndAdd('a'); }); @@ -613,6 +629,10 @@ public class VarHandleTestAccessChar extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(array, i, 'a', 'b'); }); + checkUOE(() -> { + char r = (char) vh.getAndSet(array, i, 'a'); + }); + checkUOE(() -> { char o = (char) vh.getAndAdd(array, i, 'a'); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java index 65125e3f62e..1861e5919dc 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java @@ -292,6 +292,10 @@ public class VarHandleTestAccessDouble extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, 1.0d, 2.0d); }); + checkUOE(() -> { + double r = (double) vh.getAndSet(recv, 1.0d); + }); + checkUOE(() -> { double o = (double) vh.getAndAdd(recv, 1.0d); }); @@ -378,6 +382,10 @@ public class VarHandleTestAccessDouble extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(1.0d, 2.0d); }); + checkUOE(() -> { + double r = (double) vh.getAndSet(1.0d); + }); + checkUOE(() -> { double o = (double) vh.getAndAdd(1.0d); }); @@ -454,6 +462,10 @@ public class VarHandleTestAccessDouble extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, 1.0d, 2.0d); }); + checkUOE(() -> { + double r = (double) vh.getAndSet(recv, 1.0d); + }); + checkUOE(() -> { double o = (double) vh.getAndAdd(recv, 1.0d); }); @@ -530,6 +542,10 @@ public class VarHandleTestAccessDouble extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(1.0d, 2.0d); }); + checkUOE(() -> { + double r = (double) vh.getAndSet(1.0d); + }); + checkUOE(() -> { double o = (double) vh.getAndAdd(1.0d); }); @@ -613,6 +629,10 @@ public class VarHandleTestAccessDouble extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(array, i, 1.0d, 2.0d); }); + checkUOE(() -> { + double r = (double) vh.getAndSet(array, i, 1.0d); + }); + checkUOE(() -> { double o = (double) vh.getAndAdd(array, i, 1.0d); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java index 8e7491ad45a..dce87f72755 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java @@ -292,6 +292,10 @@ public class VarHandleTestAccessFloat extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, 1.0f, 2.0f); }); + checkUOE(() -> { + float r = (float) vh.getAndSet(recv, 1.0f); + }); + checkUOE(() -> { float o = (float) vh.getAndAdd(recv, 1.0f); }); @@ -378,6 +382,10 @@ public class VarHandleTestAccessFloat extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(1.0f, 2.0f); }); + checkUOE(() -> { + float r = (float) vh.getAndSet(1.0f); + }); + checkUOE(() -> { float o = (float) vh.getAndAdd(1.0f); }); @@ -454,6 +462,10 @@ public class VarHandleTestAccessFloat extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, 1.0f, 2.0f); }); + checkUOE(() -> { + float r = (float) vh.getAndSet(recv, 1.0f); + }); + checkUOE(() -> { float o = (float) vh.getAndAdd(recv, 1.0f); }); @@ -530,6 +542,10 @@ public class VarHandleTestAccessFloat extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(1.0f, 2.0f); }); + checkUOE(() -> { + float r = (float) vh.getAndSet(1.0f); + }); + checkUOE(() -> { float o = (float) vh.getAndAdd(1.0f); }); @@ -613,6 +629,10 @@ public class VarHandleTestAccessFloat extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(array, i, 1.0f, 2.0f); }); + checkUOE(() -> { + float r = (float) vh.getAndSet(array, i, 1.0f); + }); + checkUOE(() -> { float o = (float) vh.getAndAdd(array, i, 1.0f); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java index 25683af1097..1897821dc06 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java @@ -104,6 +104,7 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); + assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); @@ -430,12 +431,22 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest { assertEquals(x, 2, "weakCompareAndSetRelease int"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetVolatile(recv, 2, 1); + } + assertEquals(success, true, "weakCompareAndSetVolatile int"); + int x = (int) vh.get(recv); + assertEquals(x, 1, "weakCompareAndSetVolatile int value"); + } + // Compare set and get { - int o = (int) vh.getAndSet(recv, 1); - assertEquals(o, 2, "getAndSet int"); + int o = (int) vh.getAndSet(recv, 2); + assertEquals(o, 1, "getAndSet int"); int x = (int) vh.get(recv); - assertEquals(x, 1, "getAndSet int value"); + assertEquals(x, 2, "getAndSet int value"); } vh.set(recv, 1); @@ -573,12 +584,22 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest { assertEquals(x, 2, "weakCompareAndSetRelease int"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetRelease(2, 1); + } + assertEquals(success, true, "weakCompareAndSetVolatile int"); + int x = (int) vh.get(); + assertEquals(x, 1, "weakCompareAndSetVolatile int"); + } + // Compare set and get { - int o = (int) vh.getAndSet( 1); - assertEquals(o, 2, "getAndSet int"); + int o = (int) vh.getAndSet(2); + assertEquals(o, 1, "getAndSet int"); int x = (int) vh.get(); - assertEquals(x, 1, "getAndSet int value"); + assertEquals(x, 2, "getAndSet int value"); } vh.set(1); @@ -719,12 +740,22 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest { assertEquals(x, 2, "weakCompareAndSetRelease int"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetVolatile(array, i, 2, 1); + } + assertEquals(success, true, "weakCompareAndSetVolatile int"); + int x = (int) vh.get(array, i); + assertEquals(x, 1, "weakCompareAndSetVolatile int"); + } + // Compare set and get { - int o = (int) vh.getAndSet(array, i, 1); - assertEquals(o, 2, "getAndSet int"); + int o = (int) vh.getAndSet(array, i, 2); + assertEquals(o, 1, "getAndSet int"); int x = (int) vh.get(array, i); - assertEquals(x, 1, "getAndSet int value"); + assertEquals(x, 2, "getAndSet int value"); } vh.set(array, i, 1); @@ -804,6 +835,10 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet(array, ci, 1, 2); }); + checkIOOBE(() -> { + boolean r = vh.weakCompareAndSetVolatile(array, ci, 1, 2); + }); + checkIOOBE(() -> { boolean r = vh.weakCompareAndSetAcquire(array, ci, 1, 2); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java index 2b44b4793f7..adea5ed82a1 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java @@ -104,6 +104,7 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); + assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); @@ -430,12 +431,22 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest { assertEquals(x, 2L, "weakCompareAndSetRelease long"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetVolatile(recv, 2L, 1L); + } + assertEquals(success, true, "weakCompareAndSetVolatile long"); + long x = (long) vh.get(recv); + assertEquals(x, 1L, "weakCompareAndSetVolatile long value"); + } + // Compare set and get { - long o = (long) vh.getAndSet(recv, 1L); - assertEquals(o, 2L, "getAndSet long"); + long o = (long) vh.getAndSet(recv, 2L); + assertEquals(o, 1L, "getAndSet long"); long x = (long) vh.get(recv); - assertEquals(x, 1L, "getAndSet long value"); + assertEquals(x, 2L, "getAndSet long value"); } vh.set(recv, 1L); @@ -573,12 +584,22 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest { assertEquals(x, 2L, "weakCompareAndSetRelease long"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetRelease(2L, 1L); + } + assertEquals(success, true, "weakCompareAndSetVolatile long"); + long x = (long) vh.get(); + assertEquals(x, 1L, "weakCompareAndSetVolatile long"); + } + // Compare set and get { - long o = (long) vh.getAndSet( 1L); - assertEquals(o, 2L, "getAndSet long"); + long o = (long) vh.getAndSet(2L); + assertEquals(o, 1L, "getAndSet long"); long x = (long) vh.get(); - assertEquals(x, 1L, "getAndSet long value"); + assertEquals(x, 2L, "getAndSet long value"); } vh.set(1L); @@ -719,12 +740,22 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest { assertEquals(x, 2L, "weakCompareAndSetRelease long"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetVolatile(array, i, 2L, 1L); + } + assertEquals(success, true, "weakCompareAndSetVolatile long"); + long x = (long) vh.get(array, i); + assertEquals(x, 1L, "weakCompareAndSetVolatile long"); + } + // Compare set and get { - long o = (long) vh.getAndSet(array, i, 1L); - assertEquals(o, 2L, "getAndSet long"); + long o = (long) vh.getAndSet(array, i, 2L); + assertEquals(o, 1L, "getAndSet long"); long x = (long) vh.get(array, i); - assertEquals(x, 1L, "getAndSet long value"); + assertEquals(x, 2L, "getAndSet long value"); } vh.set(array, i, 1L); @@ -804,6 +835,10 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet(array, ci, 1L, 2L); }); + checkIOOBE(() -> { + boolean r = vh.weakCompareAndSetVolatile(array, ci, 1L, 2L); + }); + checkIOOBE(() -> { boolean r = vh.weakCompareAndSetAcquire(array, ci, 1L, 2L); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java index 822252f7a7d..a8091a838cb 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java @@ -292,6 +292,10 @@ public class VarHandleTestAccessShort extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, (short)1, (short)2); }); + checkUOE(() -> { + short r = (short) vh.getAndSet(recv, (short)1); + }); + checkUOE(() -> { short o = (short) vh.getAndAdd(recv, (short)1); }); @@ -378,6 +382,10 @@ public class VarHandleTestAccessShort extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease((short)1, (short)2); }); + checkUOE(() -> { + short r = (short) vh.getAndSet((short)1); + }); + checkUOE(() -> { short o = (short) vh.getAndAdd((short)1); }); @@ -454,6 +462,10 @@ public class VarHandleTestAccessShort extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(recv, (short)1, (short)2); }); + checkUOE(() -> { + short r = (short) vh.getAndSet(recv, (short)1); + }); + checkUOE(() -> { short o = (short) vh.getAndAdd(recv, (short)1); }); @@ -530,6 +542,10 @@ public class VarHandleTestAccessShort extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease((short)1, (short)2); }); + checkUOE(() -> { + short r = (short) vh.getAndSet((short)1); + }); + checkUOE(() -> { short o = (short) vh.getAndAdd((short)1); }); @@ -613,6 +629,10 @@ public class VarHandleTestAccessShort extends VarHandleBaseTest { boolean r = vh.weakCompareAndSetRelease(array, i, (short)1, (short)2); }); + checkUOE(() -> { + short r = (short) vh.getAndSet(array, i, (short)1); + }); + checkUOE(() -> { short o = (short) vh.getAndAdd(array, i, (short)1); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java index 1e876059a69..405206ef22c 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java @@ -104,6 +104,7 @@ public class VarHandleTestAccessString extends VarHandleBaseTest { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); + assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); @@ -444,12 +445,22 @@ public class VarHandleTestAccessString extends VarHandleBaseTest { assertEquals(x, "bar", "weakCompareAndSetRelease String"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetVolatile(recv, "bar", "foo"); + } + assertEquals(success, true, "weakCompareAndSetVolatile String"); + String x = (String) vh.get(recv); + assertEquals(x, "foo", "weakCompareAndSetVolatile String value"); + } + // Compare set and get { - String o = (String) vh.getAndSet(recv, "foo"); - assertEquals(o, "bar", "getAndSet String"); + String o = (String) vh.getAndSet(recv, "bar"); + assertEquals(o, "foo", "getAndSet String"); String x = (String) vh.get(recv); - assertEquals(x, "foo", "getAndSet String value"); + assertEquals(x, "bar", "getAndSet String value"); } } @@ -585,12 +596,22 @@ public class VarHandleTestAccessString extends VarHandleBaseTest { assertEquals(x, "bar", "weakCompareAndSetRelease String"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetRelease("bar", "foo"); + } + assertEquals(success, true, "weakCompareAndSetVolatile String"); + String x = (String) vh.get(); + assertEquals(x, "foo", "weakCompareAndSetVolatile String"); + } + // Compare set and get { - String o = (String) vh.getAndSet( "foo"); - assertEquals(o, "bar", "getAndSet String"); + String o = (String) vh.getAndSet("bar"); + assertEquals(o, "foo", "getAndSet String"); String x = (String) vh.get(); - assertEquals(x, "foo", "getAndSet String value"); + assertEquals(x, "bar", "getAndSet String value"); } } @@ -729,12 +750,22 @@ public class VarHandleTestAccessString extends VarHandleBaseTest { assertEquals(x, "bar", "weakCompareAndSetRelease String"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetVolatile(array, i, "bar", "foo"); + } + assertEquals(success, true, "weakCompareAndSetVolatile String"); + String x = (String) vh.get(array, i); + assertEquals(x, "foo", "weakCompareAndSetVolatile String"); + } + // Compare set and get { - String o = (String) vh.getAndSet(array, i, "foo"); - assertEquals(o, "bar", "getAndSet String"); + String o = (String) vh.getAndSet(array, i, "bar"); + assertEquals(o, "foo", "getAndSet String"); String x = (String) vh.get(array, i); - assertEquals(x, "foo", "getAndSet String value"); + assertEquals(x, "bar", "getAndSet String value"); } } @@ -812,6 +843,10 @@ public class VarHandleTestAccessString extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet(array, ci, "foo", "bar"); }); + checkIOOBE(() -> { + boolean r = vh.weakCompareAndSetVolatile(array, ci, "foo", "bar"); + }); + checkIOOBE(() -> { boolean r = vh.weakCompareAndSetAcquire(array, ci, "foo", "bar"); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java index 8159e16ff62..8038315e391 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java @@ -50,7 +50,7 @@ public class VarHandleTestByteArrayAsChar extends VarHandleBaseByteArrayTest { static final char VALUE_2 = (char)0x1112; - static final char VALUE_3 = (char)0x2122; + static final char VALUE_3 = (char)0xFFFE; @Override @@ -253,6 +253,10 @@ public class VarHandleTestByteArrayAsChar extends VarHandleBaseByteArrayTest { checkROBE(() -> { vh.setOpaque(array, ci, VALUE_1); }); + checkUOE(() -> { + boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); + }); + checkUOE(() -> { char r = (char) vh.compareAndExchangeVolatile(array, ci, VALUE_2, VALUE_1); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java index 4c854a83109..53db9cd239b 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java @@ -50,7 +50,7 @@ public class VarHandleTestByteArrayAsDouble extends VarHandleBaseByteArrayTest { static final double VALUE_2 = 0x1112131415161718L; - static final double VALUE_3 = 0x2122232425262728L; + static final double VALUE_3 = 0xFFFEFDFCFBFAF9F8L; @Override @@ -254,9 +254,7 @@ public class VarHandleTestByteArrayAsDouble extends VarHandleBaseByteArrayTest { checkROBE(() -> { double o = (double) vh.getAndSet(array, ci, VALUE_1); }); - checkUOE(() -> { - boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); - }); + checkUOE(() -> { double o = (double) vh.getAndAdd(array, ci, VALUE_1); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java index 238cd0a5ca2..d2688cf925a 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java @@ -50,7 +50,7 @@ public class VarHandleTestByteArrayAsFloat extends VarHandleBaseByteArrayTest { static final float VALUE_2 = 0x11121314; - static final float VALUE_3 = 0x21222324; + static final float VALUE_3 = 0xFFFEFDFC; @Override @@ -254,9 +254,7 @@ public class VarHandleTestByteArrayAsFloat extends VarHandleBaseByteArrayTest { checkROBE(() -> { float o = (float) vh.getAndSet(array, ci, VALUE_1); }); - checkUOE(() -> { - boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); - }); + checkUOE(() -> { float o = (float) vh.getAndAdd(array, ci, VALUE_1); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java index 5049c52370f..9e47532c20b 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java @@ -50,7 +50,7 @@ public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest { static final int VALUE_2 = 0x11121314; - static final int VALUE_3 = 0x21222324; + static final int VALUE_3 = 0xFFFEFDFC; @Override @@ -247,9 +247,7 @@ public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest { checkROBE(() -> { int o = (int) vh.getAndSet(array, ci, VALUE_1); }); - checkUOE(() -> { - boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); - }); + checkROBE(() -> { int o = (int) vh.getAndAdd(array, ci, VALUE_1); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java index 7006c03d18d..f9ed92f0e07 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java @@ -50,7 +50,7 @@ public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest { static final long VALUE_2 = 0x1112131415161718L; - static final long VALUE_3 = 0x2122232425262728L; + static final long VALUE_3 = 0xFFFEFDFCFBFAF9F8L; @Override @@ -247,9 +247,7 @@ public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest { checkROBE(() -> { long o = (long) vh.getAndSet(array, ci, VALUE_1); }); - checkUOE(() -> { - boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); - }); + checkROBE(() -> { long o = (long) vh.getAndAdd(array, ci, VALUE_1); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java index 2632b00bd23..0a9aa6e871c 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java @@ -50,7 +50,7 @@ public class VarHandleTestByteArrayAsShort extends VarHandleBaseByteArrayTest { static final short VALUE_2 = (short)0x1112; - static final short VALUE_3 = (short)0x2122; + static final short VALUE_3 = (short)0xFFFE; @Override @@ -253,6 +253,10 @@ public class VarHandleTestByteArrayAsShort extends VarHandleBaseByteArrayTest { checkROBE(() -> { vh.setOpaque(array, ci, VALUE_1); }); + checkUOE(() -> { + boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); + }); + checkUOE(() -> { short r = (short) vh.compareAndExchangeVolatile(array, ci, VALUE_2, VALUE_1); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessInt.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessInt.java index 4985136f2fd..00f78a57159 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessInt.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessInt.java @@ -237,12 +237,22 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest { assertEquals(x, 2, "weakCompareAndSetRelease int"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, 2, 1); + } + assertEquals(success, true, "weakCompareAndSetVolatile int"); + int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv); + assertEquals(x, 1, "weakCompareAndSetVolatile int"); + } + // Compare set and get { - int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 1); - assertEquals(o, 2, "getAndSet int"); + int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2); + assertEquals(o, 1, "getAndSet int"); int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv); - assertEquals(x, 1, "getAndSet int value"); + assertEquals(x, 2, "getAndSet int value"); } hs.get(TestAccessMode.SET).invokeExact(recv, 1); @@ -380,12 +390,22 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest { assertEquals(x, 2, "weakCompareAndSetRelease int"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(2, 1); + } + assertEquals(success, true, "weakCompareAndSetVolatile int"); + int x = (int) hs.get(TestAccessMode.GET).invokeExact(); + assertEquals(x, 1, "weakCompareAndSetVolatile int"); + } + // Compare set and get { - int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 1); - assertEquals(o, 2, "getAndSet int"); + int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 2); + assertEquals(o, 1, "getAndSet int"); int x = (int) hs.get(TestAccessMode.GET).invokeExact(); - assertEquals(x, 1, "getAndSet int value"); + assertEquals(x, 2, "getAndSet int value"); } hs.get(TestAccessMode.SET).invokeExact(1); @@ -526,12 +546,22 @@ public class VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest { assertEquals(x, 2, "weakCompareAndSetRelease int"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, 2, 1); + } + assertEquals(success, true, "weakCompareAndSetVolatile int"); + int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i); + assertEquals(x, 1, "weakCompareAndSetVolatile int"); + } + // Compare set and get { - int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 1); - assertEquals(o, 2, "getAndSet int"); + int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2); + assertEquals(o, 1, "getAndSet int"); int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i); - assertEquals(x, 1, "getAndSet int value"); + assertEquals(x, 2, "getAndSet int value"); } hs.get(TestAccessMode.SET).invokeExact(array, i, 1); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessLong.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessLong.java index 59a3941c4db..2bb8b9a1ee8 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessLong.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessLong.java @@ -237,12 +237,22 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest { assertEquals(x, 2L, "weakCompareAndSetRelease long"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, 2L, 1L); + } + assertEquals(success, true, "weakCompareAndSetVolatile long"); + long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); + assertEquals(x, 1L, "weakCompareAndSetVolatile long"); + } + // Compare set and get { - long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 1L); - assertEquals(o, 2L, "getAndSet long"); + long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2L); + assertEquals(o, 1L, "getAndSet long"); long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv); - assertEquals(x, 1L, "getAndSet long value"); + assertEquals(x, 2L, "getAndSet long value"); } hs.get(TestAccessMode.SET).invokeExact(recv, 1L); @@ -380,12 +390,22 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest { assertEquals(x, 2L, "weakCompareAndSetRelease long"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(2L, 1L); + } + assertEquals(success, true, "weakCompareAndSetVolatile long"); + long x = (long) hs.get(TestAccessMode.GET).invokeExact(); + assertEquals(x, 1L, "weakCompareAndSetVolatile long"); + } + // Compare set and get { - long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 1L); - assertEquals(o, 2L, "getAndSet long"); + long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 2L); + assertEquals(o, 1L, "getAndSet long"); long x = (long) hs.get(TestAccessMode.GET).invokeExact(); - assertEquals(x, 1L, "getAndSet long value"); + assertEquals(x, 2L, "getAndSet long value"); } hs.get(TestAccessMode.SET).invokeExact(1L); @@ -526,12 +546,22 @@ public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest { assertEquals(x, 2L, "weakCompareAndSetRelease long"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, 2L, 1L); + } + assertEquals(success, true, "weakCompareAndSetVolatile long"); + long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); + assertEquals(x, 1L, "weakCompareAndSetVolatile long"); + } + // Compare set and get { - long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 1L); - assertEquals(o, 2L, "getAndSet long"); + long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2L); + assertEquals(o, 1L, "getAndSet long"); long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i); - assertEquals(x, 1L, "getAndSet long value"); + assertEquals(x, 2L, "getAndSet long value"); } hs.get(TestAccessMode.SET).invokeExact(array, i, 1L); diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessString.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessString.java index eb2ed9d3c08..dc6f8ec1861 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessString.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodHandleAccessString.java @@ -237,12 +237,22 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest { assertEquals(x, "bar", "weakCompareAndSetRelease String"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, "bar", "foo"); + } + assertEquals(success, true, "weakCompareAndSetVolatile String"); + String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); + assertEquals(x, "foo", "weakCompareAndSetVolatile String"); + } + // Compare set and get { - String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "foo"); - assertEquals(o, "bar", "getAndSet String"); + String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "bar"); + assertEquals(o, "foo", "getAndSet String"); String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv); - assertEquals(x, "foo", "getAndSet String value"); + assertEquals(x, "bar", "getAndSet String value"); } } @@ -376,12 +386,22 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest { assertEquals(x, "bar", "weakCompareAndSetRelease String"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact("bar", "foo"); + } + assertEquals(success, true, "weakCompareAndSetVolatile String"); + String x = (String) hs.get(TestAccessMode.GET).invokeExact(); + assertEquals(x, "foo", "weakCompareAndSetVolatile String"); + } + // Compare set and get { - String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact( "foo"); - assertEquals(o, "bar", "getAndSet String"); + String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact( "bar"); + assertEquals(o, "foo", "getAndSet String"); String x = (String) hs.get(TestAccessMode.GET).invokeExact(); - assertEquals(x, "foo", "getAndSet String value"); + assertEquals(x, "bar", "getAndSet String value"); } } @@ -518,12 +538,22 @@ public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest { assertEquals(x, "bar", "weakCompareAndSetRelease String"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, "bar", "foo"); + } + assertEquals(success, true, "weakCompareAndSetVolatile String"); + String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); + assertEquals(x, "foo", "weakCompareAndSetVolatile String"); + } + // Compare set and get { - String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "foo"); - assertEquals(o, "bar", "getAndSet String"); + String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "bar"); + assertEquals(o, "foo", "getAndSet String"); String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i); - assertEquals(x, "foo", "getAndSet String value"); + assertEquals(x, "bar", "getAndSet String value"); } } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java index 75ba7ae3dc2..df680146374 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeBoolean.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeBoolean * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeBoolean */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeBoolean extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeBoolean::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeBoolean::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeBoolean::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeBoolean::testArrayWrongMethodType, false)); } @@ -329,63 +331,63 @@ public class VarHandleTestMethodTypeBoolean extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean x = (boolean) hs.get(am, methodType(boolean.class, Void.class)). - invoke(null); + boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeBoolean.class)). + invokeExact((VarHandleTestMethodTypeBoolean) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean x = (boolean) hs.get(am, methodType(boolean.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type checkWMTE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeBoolean.class)). - invoke(recv); + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeBoolean.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeBoolean.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeBoolean.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, boolean.class)). - invoke(null, true); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeBoolean.class, boolean.class)). + invokeExact((VarHandleTestMethodTypeBoolean) null, true); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, boolean.class)). - invoke(Void.class, true); + invokeExact(Void.class, true); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeBoolean.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, boolean.class)). - invoke(0, true); + invokeExact(0, true); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeBoolean.class, boolean.class, Class.class)). - invoke(recv, true, Void.class); + invokeExact(recv, true, Void.class); }); } @@ -513,32 +515,32 @@ public class VarHandleTestMethodTypeBoolean extends VarHandleBaseTest { // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > boolean x = (boolean) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, boolean.class, Class.class)). - invoke(true, Void.class); + invokeExact(true, Void.class); }); } @@ -783,71 +785,71 @@ public class VarHandleTestMethodTypeBoolean extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - boolean x = (boolean) hs.get(am, methodType(boolean.class, Void.class, int.class)). - invoke(null, 0); + boolean x = (boolean) hs.get(am, methodType(boolean.class, boolean[].class, int.class)). + invokeExact((boolean[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class boolean x = (boolean) hs.get(am, methodType(boolean.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class boolean x = (boolean) hs.get(am, methodType(boolean.class, boolean[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, boolean[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class int x = (int) hs.get(am, methodType(int.class, boolean[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean x = (boolean) hs.get(am, methodType(boolean.class, boolean[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, boolean.class)). - invoke(null, 0, true); + hs.get(am, methodType(void.class, boolean[].class, int.class, boolean.class)). + invokeExact((boolean[]) null, 0, true); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, boolean.class)). - invoke(Void.class, 0, true); + invokeExact(Void.class, 0, true); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, boolean[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, boolean.class)). - invoke(0, 0, true); + invokeExact(0, 0, true); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, boolean[].class, Class.class, boolean.class)). - invoke(array, Void.class, true); + invokeExact(array, Void.class, true); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, boolean[].class, int.class, Class.class)). - invoke(array, 0, true, Void.class); + invokeExact(array, 0, true, Void.class); }); } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java index b212bfc9d7d..0bfddc7ad27 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeByte.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeByte * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeByte */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeByte extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeByte::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeByte::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeByte::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeByte::testArrayWrongMethodType, false)); } @@ -329,63 +331,63 @@ public class VarHandleTestMethodTypeByte extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - byte x = (byte) hs.get(am, methodType(byte.class, Void.class)). - invoke(null); + byte x = (byte) hs.get(am, methodType(byte.class, VarHandleTestMethodTypeByte.class)). + invokeExact((VarHandleTestMethodTypeByte) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class byte x = (byte) hs.get(am, methodType(byte.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class byte x = (byte) hs.get(am, methodType(byte.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type checkWMTE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(byte.class, VarHandleTestMethodTypeByte.class)). - invoke(recv); + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeByte.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeByte.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 byte x = (byte) hs.get(am, methodType(byte.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > byte x = (byte) hs.get(am, methodType(byte.class, VarHandleTestMethodTypeByte.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, byte.class)). - invoke(null, (byte)1); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeByte.class, byte.class)). + invokeExact((VarHandleTestMethodTypeByte) null, (byte)1); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, byte.class)). - invoke(Void.class, (byte)1); + invokeExact(Void.class, (byte)1); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeByte.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, byte.class)). - invoke(0, (byte)1); + invokeExact(0, (byte)1); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeByte.class, byte.class, Class.class)). - invoke(recv, (byte)1, Void.class); + invokeExact(recv, (byte)1, Void.class); }); } @@ -513,32 +515,32 @@ public class VarHandleTestMethodTypeByte extends VarHandleBaseTest { // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > byte x = (byte) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, byte.class, Class.class)). - invoke((byte)1, Void.class); + invokeExact((byte)1, Void.class); }); } @@ -783,71 +785,71 @@ public class VarHandleTestMethodTypeByte extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - byte x = (byte) hs.get(am, methodType(byte.class, Void.class, int.class)). - invoke(null, 0); + byte x = (byte) hs.get(am, methodType(byte.class, byte[].class, int.class)). + invokeExact((byte[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class byte x = (byte) hs.get(am, methodType(byte.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class byte x = (byte) hs.get(am, methodType(byte.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class byte x = (byte) hs.get(am, methodType(byte.class, byte[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, byte[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, byte[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 byte x = (byte) hs.get(am, methodType(byte.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > byte x = (byte) hs.get(am, methodType(byte.class, byte[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, byte.class)). - invoke(null, 0, (byte)1); + hs.get(am, methodType(void.class, byte[].class, int.class, byte.class)). + invokeExact((byte[]) null, 0, (byte)1); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, byte.class)). - invoke(Void.class, 0, (byte)1); + invokeExact(Void.class, 0, (byte)1); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, byte[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, byte.class)). - invoke(0, 0, (byte)1); + invokeExact(0, 0, (byte)1); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, byte[].class, Class.class, byte.class)). - invoke(array, Void.class, (byte)1); + invokeExact(array, Void.class, (byte)1); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, byte[].class, int.class, Class.class)). - invoke(array, 0, (byte)1, Void.class); + invokeExact(array, 0, (byte)1, Void.class); }); } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java index 6ac8a0fed70..8d5166d8644 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeChar.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeChar * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeChar */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeChar extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeChar::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeChar::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeChar::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeChar::testArrayWrongMethodType, false)); } @@ -329,63 +331,63 @@ public class VarHandleTestMethodTypeChar extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - char x = (char) hs.get(am, methodType(char.class, Void.class)). - invoke(null); + char x = (char) hs.get(am, methodType(char.class, VarHandleTestMethodTypeChar.class)). + invokeExact((VarHandleTestMethodTypeChar) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class char x = (char) hs.get(am, methodType(char.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class char x = (char) hs.get(am, methodType(char.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type checkWMTE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(char.class, VarHandleTestMethodTypeChar.class)). - invoke(recv); + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeChar.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeChar.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 char x = (char) hs.get(am, methodType(char.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > char x = (char) hs.get(am, methodType(char.class, VarHandleTestMethodTypeChar.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, char.class)). - invoke(null, 'a'); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeChar.class, char.class)). + invokeExact((VarHandleTestMethodTypeChar) null, 'a'); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, char.class)). - invoke(Void.class, 'a'); + invokeExact(Void.class, 'a'); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeChar.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, char.class)). - invoke(0, 'a'); + invokeExact(0, 'a'); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeChar.class, char.class, Class.class)). - invoke(recv, 'a', Void.class); + invokeExact(recv, 'a', Void.class); }); } @@ -513,32 +515,32 @@ public class VarHandleTestMethodTypeChar extends VarHandleBaseTest { // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > char x = (char) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, char.class, Class.class)). - invoke('a', Void.class); + invokeExact('a', Void.class); }); } @@ -783,71 +785,71 @@ public class VarHandleTestMethodTypeChar extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - char x = (char) hs.get(am, methodType(char.class, Void.class, int.class)). - invoke(null, 0); + char x = (char) hs.get(am, methodType(char.class, char[].class, int.class)). + invokeExact((char[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class char x = (char) hs.get(am, methodType(char.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class char x = (char) hs.get(am, methodType(char.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class char x = (char) hs.get(am, methodType(char.class, char[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, char[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, char[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 char x = (char) hs.get(am, methodType(char.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > char x = (char) hs.get(am, methodType(char.class, char[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, char.class)). - invoke(null, 0, 'a'); + hs.get(am, methodType(void.class, char[].class, int.class, char.class)). + invokeExact((char[]) null, 0, 'a'); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, char.class)). - invoke(Void.class, 0, 'a'); + invokeExact(Void.class, 0, 'a'); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, char[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, char.class)). - invoke(0, 0, 'a'); + invokeExact(0, 0, 'a'); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, char[].class, Class.class, char.class)). - invoke(array, Void.class, 'a'); + invokeExact(array, Void.class, 'a'); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, char[].class, int.class, Class.class)). - invoke(array, 0, 'a', Void.class); + invokeExact(array, 0, 'a', Void.class); }); } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java index e5fc073d191..f3531016262 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeDouble.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeDouble * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeDouble */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeDouble extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeDouble::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeDouble::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeDouble::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeDouble::testArrayWrongMethodType, false)); } @@ -329,63 +331,63 @@ public class VarHandleTestMethodTypeDouble extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - double x = (double) hs.get(am, methodType(double.class, Void.class)). - invoke(null); + double x = (double) hs.get(am, methodType(double.class, VarHandleTestMethodTypeDouble.class)). + invokeExact((VarHandleTestMethodTypeDouble) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class double x = (double) hs.get(am, methodType(double.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class double x = (double) hs.get(am, methodType(double.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type checkWMTE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(double.class, VarHandleTestMethodTypeDouble.class)). - invoke(recv); + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeDouble.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeDouble.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 double x = (double) hs.get(am, methodType(double.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > double x = (double) hs.get(am, methodType(double.class, VarHandleTestMethodTypeDouble.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, double.class)). - invoke(null, 1.0d); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeDouble.class, double.class)). + invokeExact((VarHandleTestMethodTypeDouble) null, 1.0d); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, double.class)). - invoke(Void.class, 1.0d); + invokeExact(Void.class, 1.0d); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeDouble.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, double.class)). - invoke(0, 1.0d); + invokeExact(0, 1.0d); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeDouble.class, double.class, Class.class)). - invoke(recv, 1.0d, Void.class); + invokeExact(recv, 1.0d, Void.class); }); } @@ -513,32 +515,32 @@ public class VarHandleTestMethodTypeDouble extends VarHandleBaseTest { // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > double x = (double) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, double.class, Class.class)). - invoke(1.0d, Void.class); + invokeExact(1.0d, Void.class); }); } @@ -783,71 +785,71 @@ public class VarHandleTestMethodTypeDouble extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - double x = (double) hs.get(am, methodType(double.class, Void.class, int.class)). - invoke(null, 0); + double x = (double) hs.get(am, methodType(double.class, double[].class, int.class)). + invokeExact((double[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class double x = (double) hs.get(am, methodType(double.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class double x = (double) hs.get(am, methodType(double.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class double x = (double) hs.get(am, methodType(double.class, double[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, double[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, double[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 double x = (double) hs.get(am, methodType(double.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > double x = (double) hs.get(am, methodType(double.class, double[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, double.class)). - invoke(null, 0, 1.0d); + hs.get(am, methodType(void.class, double[].class, int.class, double.class)). + invokeExact((double[]) null, 0, 1.0d); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, double.class)). - invoke(Void.class, 0, 1.0d); + invokeExact(Void.class, 0, 1.0d); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, double[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, double.class)). - invoke(0, 0, 1.0d); + invokeExact(0, 0, 1.0d); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, double[].class, Class.class, double.class)). - invoke(array, Void.class, 1.0d); + invokeExact(array, Void.class, 1.0d); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, double[].class, int.class, Class.class)). - invoke(array, 0, 1.0d, Void.class); + invokeExact(array, 0, 1.0d, Void.class); }); } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java index c1bee039b73..b07049d64b0 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeFloat.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeFloat * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeFloat */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeFloat extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeFloat::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeFloat::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeFloat::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeFloat::testArrayWrongMethodType, false)); } @@ -329,63 +331,63 @@ public class VarHandleTestMethodTypeFloat extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - float x = (float) hs.get(am, methodType(float.class, Void.class)). - invoke(null); + float x = (float) hs.get(am, methodType(float.class, VarHandleTestMethodTypeFloat.class)). + invokeExact((VarHandleTestMethodTypeFloat) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class float x = (float) hs.get(am, methodType(float.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class float x = (float) hs.get(am, methodType(float.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type checkWMTE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(float.class, VarHandleTestMethodTypeFloat.class)). - invoke(recv); + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeFloat.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeFloat.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 float x = (float) hs.get(am, methodType(float.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > float x = (float) hs.get(am, methodType(float.class, VarHandleTestMethodTypeFloat.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, float.class)). - invoke(null, 1.0f); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeFloat.class, float.class)). + invokeExact((VarHandleTestMethodTypeFloat) null, 1.0f); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, float.class)). - invoke(Void.class, 1.0f); + invokeExact(Void.class, 1.0f); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeFloat.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, float.class)). - invoke(0, 1.0f); + invokeExact(0, 1.0f); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeFloat.class, float.class, Class.class)). - invoke(recv, 1.0f, Void.class); + invokeExact(recv, 1.0f, Void.class); }); } @@ -513,32 +515,32 @@ public class VarHandleTestMethodTypeFloat extends VarHandleBaseTest { // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > float x = (float) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, float.class, Class.class)). - invoke(1.0f, Void.class); + invokeExact(1.0f, Void.class); }); } @@ -783,71 +785,71 @@ public class VarHandleTestMethodTypeFloat extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - float x = (float) hs.get(am, methodType(float.class, Void.class, int.class)). - invoke(null, 0); + float x = (float) hs.get(am, methodType(float.class, float[].class, int.class)). + invokeExact((float[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class float x = (float) hs.get(am, methodType(float.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class float x = (float) hs.get(am, methodType(float.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class float x = (float) hs.get(am, methodType(float.class, float[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, float[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, float[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 float x = (float) hs.get(am, methodType(float.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > float x = (float) hs.get(am, methodType(float.class, float[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, float.class)). - invoke(null, 0, 1.0f); + hs.get(am, methodType(void.class, float[].class, int.class, float.class)). + invokeExact((float[]) null, 0, 1.0f); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, float.class)). - invoke(Void.class, 0, 1.0f); + invokeExact(Void.class, 0, 1.0f); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, float[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, float.class)). - invoke(0, 0, 1.0f); + invokeExact(0, 0, 1.0f); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, float[].class, Class.class, float.class)). - invoke(array, Void.class, 1.0f); + invokeExact(array, Void.class, 1.0f); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, float[].class, int.class, Class.class)). - invoke(array, 0, 1.0f, Void.class); + invokeExact(array, 0, 1.0f, Void.class); }); } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java index 13b6b0607b0..67fca94c49a 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeInt.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeInt * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeInt */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeInt extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeInt::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeInt::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeInt::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeInt::testArrayWrongMethodType, false)); } @@ -644,211 +646,211 @@ public class VarHandleTestMethodTypeInt extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - int x = (int) hs.get(am, methodType(int.class, Void.class)). - invoke(null); + int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class)). + invokeExact((VarHandleTestMethodTypeInt) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class int x = (int) hs.get(am, methodType(int.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class int x = (int) hs.get(am, methodType(int.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type checkWMTE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class)). - invoke(recv); + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeInt.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeInt.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, int.class)). - invoke(null, 1); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeInt.class, int.class)). + invokeExact((VarHandleTestMethodTypeInt) null, 1); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, int.class)). - invoke(Void.class, 1); + invokeExact(Void.class, 1); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeInt.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class)). - invoke(0, 1); + invokeExact(0, 1); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeInt.class, int.class, Class.class)). - invoke(recv, 1, Void.class); + invokeExact(recv, 1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean r = (boolean) hs.get(am, methodType(boolean.class, Void.class, int.class, int.class)). - invoke(null, 1, 1); + boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeInt.class, int.class, int.class)). + invokeExact((VarHandleTestMethodTypeInt) null, 1, 1); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, int.class, int.class)). - invoke(Void.class, 1, 1); + invokeExact(Void.class, 1, 1); }); checkWMTE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeInt.class, Class.class, int.class)). - invoke(recv, Void.class, 1); + invokeExact(recv, Void.class, 1); }); checkWMTE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeInt.class, int.class, Class.class)). - invoke(recv, 1, Void.class); + invokeExact(recv, 1, Void.class); }); checkWMTE(() -> { // receiver primitive class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class , int.class, int.class)). - invoke(0, 1, 1); + invokeExact(0, 1, 1); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeInt.class, int.class, int.class, Class.class)). - invoke(recv, 1, 1, Void.class); + invokeExact(recv, 1, 1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { checkNPE(() -> { // null receiver - int x = (int) hs.get(am, methodType(int.class, Void.class, int.class, int.class)). - invoke(null, 1, 1); + int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, int.class, int.class)). + invokeExact((VarHandleTestMethodTypeInt) null, 1, 1); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class int x = (int) hs.get(am, methodType(int.class, Class.class, int.class, int.class)). - invoke(Void.class, 1, 1); + invokeExact(Void.class, 1, 1); }); checkWMTE(() -> { // expected reference class int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, Class.class, int.class)). - invoke(recv, Void.class, 1); + invokeExact(recv, Void.class, 1); }); checkWMTE(() -> { // actual reference class int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, int.class, Class.class)). - invoke(recv, 1, Void.class); + invokeExact(recv, 1, Void.class); }); checkWMTE(() -> { // reciever primitive class int x = (int) hs.get(am, methodType(int.class, int.class , int.class, int.class)). - invoke(0, 1, 1); + invokeExact(0, 1, 1); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeInt.class , int.class, int.class)). - invoke(recv, 1, 1); + invokeExact(recv, 1, 1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeInt.class , int.class, int.class)). - invoke(recv, 1, 1); + invokeExact(recv, 1, 1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, int.class, int.class, Class.class)). - invoke(recv, 1, 1, Void.class); + invokeExact(recv, 1, 1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { checkNPE(() -> { // null receiver - int x = (int) hs.get(am, methodType(int.class, Void.class, int.class)). - invoke(null, 1); + int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, int.class)). + invokeExact((VarHandleTestMethodTypeInt) null, 1); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class int x = (int) hs.get(am, methodType(int.class, Class.class, int.class)). - invoke(Void.class, 1); + invokeExact(Void.class, 1); }); checkWMTE(() -> { // value reference class int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // reciever primitive class int x = (int) hs.get(am, methodType(int.class, int.class, int.class)). - invoke(0, 1); + invokeExact(0, 1); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeInt.class, int.class)). - invoke(recv, 1); + invokeExact(recv, 1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeInt.class, int.class)). - invoke(recv, 1); + invokeExact(recv, 1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, int.class)). - invoke(recv, 1, Void.class); + invokeExact(recv, 1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { checkNPE(() -> { // null receiver - int x = (int) hs.get(am, methodType(int.class, Void.class, int.class)). - invoke(null, 1); + int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, int.class)). + invokeExact((VarHandleTestMethodTypeInt) null, 1); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class int x = (int) hs.get(am, methodType(int.class, Class.class, int.class)). - invoke(Void.class, 1); + invokeExact(Void.class, 1); }); checkWMTE(() -> { // value reference class int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // reciever primitive class int x = (int) hs.get(am, methodType(int.class, int.class, int.class)). - invoke(0, 1); + invokeExact(0, 1); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeInt.class, int.class)). - invoke(recv, 1); + invokeExact(recv, 1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeInt.class, int.class)). - invoke(recv, 1); + invokeExact(recv, 1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, VarHandleTestMethodTypeInt.class, int.class)). - invoke(recv, 1, Void.class); + invokeExact(recv, 1, Void.class); }); } } @@ -1190,52 +1192,52 @@ public class VarHandleTestMethodTypeInt extends VarHandleBaseTest { // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, int.class, Class.class)). - invoke(1, Void.class); + invokeExact(1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkWMTE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, int.class)). - invoke(Void.class, 1); + invokeExact(Void.class, 1); }); checkWMTE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class, Class.class)). - invoke(1, Void.class); + invokeExact(1, Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class, int.class, Class.class)). - invoke(1, 1, Void.class); + invokeExact(1, 1, Void.class); }); } @@ -1243,29 +1245,29 @@ public class VarHandleTestMethodTypeInt extends VarHandleBaseTest { // Incorrect argument types checkWMTE(() -> { // expected reference class int x = (int) hs.get(am, methodType(int.class, Class.class, int.class)). - invoke(Void.class, 1); + invokeExact(Void.class, 1); }); checkWMTE(() -> { // actual reference class int x = (int) hs.get(am, methodType(int.class, int.class, Class.class)). - invoke(1, Void.class); + invokeExact(1, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, int.class, int.class)). - invoke(1, 1); + invokeExact(1, 1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int.class, int.class)). - invoke(1, 1); + invokeExact(1, 1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, int.class, int.class, Class.class)). - invoke(1, 1, Void.class); + invokeExact(1, 1, Void.class); }); } @@ -1273,25 +1275,25 @@ public class VarHandleTestMethodTypeInt extends VarHandleBaseTest { // Incorrect argument types checkWMTE(() -> { // value reference class int x = (int) hs.get(am, methodType(int.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, int.class)). - invoke(1); + invokeExact(1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int.class)). - invoke(1); + invokeExact(1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, int.class, Class.class)). - invoke(1, Void.class); + invokeExact(1, Void.class); }); } @@ -1299,25 +1301,25 @@ public class VarHandleTestMethodTypeInt extends VarHandleBaseTest { // Incorrect argument types checkWMTE(() -> { // value reference class int x = (int) hs.get(am, methodType(int.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, int.class)). - invoke(1); + invokeExact(1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int.class)). - invoke(1); + invokeExact(1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, int.class, Class.class)). - invoke(1, Void.class); + invokeExact(1, Void.class); }); } } @@ -1909,237 +1911,237 @@ public class VarHandleTestMethodTypeInt extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - int x = (int) hs.get(am, methodType(int.class, Void.class, int.class)). - invoke(null, 0); + int x = (int) hs.get(am, methodType(int.class, int[].class, int.class)). + invokeExact((int[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class int x = (int) hs.get(am, methodType(int.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class int x = (int) hs.get(am, methodType(int.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class int x = (int) hs.get(am, methodType(int.class, int[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, int[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, int.class)). - invoke(null, 0, 1); + hs.get(am, methodType(void.class, int[].class, int.class, int.class)). + invokeExact((int[]) null, 0, 1); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, int.class)). - invoke(Void.class, 0, 1); + invokeExact(Void.class, 0, 1); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, int[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, int.class)). - invoke(0, 0, 1); + invokeExact(0, 0, 1); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, int[].class, Class.class, int.class)). - invoke(array, Void.class, 1); + invokeExact(array, Void.class, 1); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, int[].class, int.class, Class.class)). - invoke(array, 0, 1, Void.class); + invokeExact(array, 0, 1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean r = (boolean) hs.get(am, methodType(boolean.class, Void.class, int.class, int.class, int.class)). - invoke(null, 0, 1, 1); + boolean r = (boolean) hs.get(am, methodType(boolean.class, int[].class, int.class, int.class, int.class)). + invokeExact((int[]) null, 0, 1, 1); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, int.class, int.class, int.class)). - invoke(Void.class, 0, 1, 1); + invokeExact(Void.class, 0, 1, 1); }); checkWMTE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, int[].class, int.class, Class.class, int.class)). - invoke(array, 0, Void.class, 1); + invokeExact(array, 0, Void.class, 1); }); checkWMTE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, int[].class, int.class, int.class, Class.class)). - invoke(array, 0, 1, Void.class); + invokeExact(array, 0, 1, Void.class); }); checkWMTE(() -> { // receiver primitive class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class, int.class, int.class, int.class)). - invoke(0, 0, 1, 1); + invokeExact(0, 0, 1, 1); }); checkWMTE(() -> { // index reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, int[].class, Class.class, int.class, int.class)). - invoke(array, Void.class, 1, 1); + invokeExact(array, Void.class, 1, 1); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, int[].class, int.class, int.class, int.class, Class.class)). - invoke(array, 0, 1, 1, Void.class); + invokeExact(array, 0, 1, 1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { // Incorrect argument types checkNPE(() -> { // null receiver - int x = (int) hs.get(am, methodType(int.class, Void.class, int.class, int.class, int.class)). - invoke(null, 0, 1, 1); + int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, int.class, int.class)). + invokeExact((int[]) null, 0, 1, 1); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class int x = (int) hs.get(am, methodType(int.class, Class.class, int.class, int.class, int.class)). - invoke(Void.class, 0, 1, 1); + invokeExact(Void.class, 0, 1, 1); }); checkWMTE(() -> { // expected reference class int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, Class.class, int.class)). - invoke(array, 0, Void.class, 1); + invokeExact(array, 0, Void.class, 1); }); checkWMTE(() -> { // actual reference class int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, int.class, Class.class)). - invoke(array, 0, 1, Void.class); + invokeExact(array, 0, 1, Void.class); }); checkWMTE(() -> { // array primitive class int x = (int) hs.get(am, methodType(int.class, int.class, int.class, int.class, int.class)). - invoke(0, 0, 1, 1); + invokeExact(0, 0, 1, 1); }); checkWMTE(() -> { // index reference class int x = (int) hs.get(am, methodType(int.class, int[].class, Class.class, int.class, int.class)). - invoke(array, Void.class, 1, 1); + invokeExact(array, Void.class, 1, 1); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, int[].class, int.class, int.class, int.class)). - invoke(array, 0, 1, 1); + invokeExact(array, 0, 1, 1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int[].class, int.class, int.class, int.class)). - invoke(array, 0, 1, 1); + invokeExact(array, 0, 1, 1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, int.class, int.class, Class.class)). - invoke(array, 0, 1, 1, Void.class); + invokeExact(array, 0, 1, 1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null array - int x = (int) hs.get(am, methodType(int.class, Void.class, int.class, int.class)). - invoke(null, 0, 1); + int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, int.class)). + invokeExact((int[]) null, 0, 1); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class int x = (int) hs.get(am, methodType(int.class, Class.class, int.class, int.class)). - invoke(Void.class, 0, 1); + invokeExact(Void.class, 0, 1); }); checkWMTE(() -> { // value reference class int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // array primitive class int x = (int) hs.get(am, methodType(int.class, int.class, int.class, int.class)). - invoke(0, 0, 1); + invokeExact(0, 0, 1); }); checkWMTE(() -> { // index reference class int x = (int) hs.get(am, methodType(int.class, int[].class, Class.class, int.class)). - invoke(array, Void.class, 1); + invokeExact(array, Void.class, 1); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, int[].class, int.class, int.class)). - invoke(array, 0, 1); + invokeExact(array, 0, 1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int[].class, int.class, int.class)). - invoke(array, 0, 1); + invokeExact(array, 0, 1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, int.class, Class.class)). - invoke(array, 0, 1, Void.class); + invokeExact(array, 0, 1, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { // Incorrect argument types checkNPE(() -> { // null array - int x = (int) hs.get(am, methodType(int.class, Void.class, int.class, int.class)). - invoke(null, 0, 1); + int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, int.class)). + invokeExact((int[]) null, 0, 1); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class int x = (int) hs.get(am, methodType(int.class, Class.class, int.class, int.class)). - invoke(Void.class, 0, 1); + invokeExact(Void.class, 0, 1); }); checkWMTE(() -> { // value reference class int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // array primitive class int x = (int) hs.get(am, methodType(int.class, int.class, int.class, int.class)). - invoke(0, 0, 1); + invokeExact(0, 0, 1); }); checkWMTE(() -> { // index reference class int x = (int) hs.get(am, methodType(int.class, int[].class, Class.class, int.class)). - invoke(array, Void.class, 1); + invokeExact(array, Void.class, 1); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, int[].class, int.class, int.class)). - invoke(array, 0, 1); + invokeExact(array, 0, 1); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, int[].class, int.class, int.class)). - invoke(array, 0, 1); + invokeExact(array, 0, 1); }); // Incorrect arity checkWMTE(() -> { // 0 int x = (int) hs.get(am, methodType(int.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > int x = (int) hs.get(am, methodType(int.class, int[].class, int.class, int.class, Class.class)). - invoke(array, 0, 1, Void.class); + invokeExact(array, 0, 1, Void.class); }); } } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java index 44151683133..0972e663cc7 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeLong.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeLong * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeLong */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeLong extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeLong::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeLong::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeLong::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeLong::testArrayWrongMethodType, false)); } @@ -644,211 +646,211 @@ public class VarHandleTestMethodTypeLong extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - long x = (long) hs.get(am, methodType(long.class, Void.class)). - invoke(null); + long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class)). + invokeExact((VarHandleTestMethodTypeLong) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class long x = (long) hs.get(am, methodType(long.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class long x = (long) hs.get(am, methodType(long.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type checkWMTE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class)). - invoke(recv); + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeLong.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeLong.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, long.class)). - invoke(null, 1L); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeLong.class, long.class)). + invokeExact((VarHandleTestMethodTypeLong) null, 1L); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, long.class)). - invoke(Void.class, 1L); + invokeExact(Void.class, 1L); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeLong.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, long.class)). - invoke(0, 1L); + invokeExact(0, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeLong.class, long.class, Class.class)). - invoke(recv, 1L, Void.class); + invokeExact(recv, 1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean r = (boolean) hs.get(am, methodType(boolean.class, Void.class, long.class, long.class)). - invoke(null, 1L, 1L); + boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeLong.class, long.class, long.class)). + invokeExact((VarHandleTestMethodTypeLong) null, 1L, 1L); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, long.class, long.class)). - invoke(Void.class, 1L, 1L); + invokeExact(Void.class, 1L, 1L); }); checkWMTE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeLong.class, Class.class, long.class)). - invoke(recv, Void.class, 1L); + invokeExact(recv, Void.class, 1L); }); checkWMTE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeLong.class, long.class, Class.class)). - invoke(recv, 1L, Void.class); + invokeExact(recv, 1L, Void.class); }); checkWMTE(() -> { // receiver primitive class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class , long.class, long.class)). - invoke(0, 1L, 1L); + invokeExact(0, 1L, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeLong.class, long.class, long.class, Class.class)). - invoke(recv, 1L, 1L, Void.class); + invokeExact(recv, 1L, 1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { checkNPE(() -> { // null receiver - long x = (long) hs.get(am, methodType(long.class, Void.class, long.class, long.class)). - invoke(null, 1L, 1L); + long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, long.class, long.class)). + invokeExact((VarHandleTestMethodTypeLong) null, 1L, 1L); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class long x = (long) hs.get(am, methodType(long.class, Class.class, long.class, long.class)). - invoke(Void.class, 1L, 1L); + invokeExact(Void.class, 1L, 1L); }); checkWMTE(() -> { // expected reference class long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, Class.class, long.class)). - invoke(recv, Void.class, 1L); + invokeExact(recv, Void.class, 1L); }); checkWMTE(() -> { // actual reference class long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, long.class, Class.class)). - invoke(recv, 1L, Void.class); + invokeExact(recv, 1L, Void.class); }); checkWMTE(() -> { // reciever primitive class long x = (long) hs.get(am, methodType(long.class, int.class , long.class, long.class)). - invoke(0, 1L, 1L); + invokeExact(0, 1L, 1L); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeLong.class , long.class, long.class)). - invoke(recv, 1L, 1L); + invokeExact(recv, 1L, 1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeLong.class , long.class, long.class)). - invoke(recv, 1L, 1L); + invokeExact(recv, 1L, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, long.class, long.class, Class.class)). - invoke(recv, 1L, 1L, Void.class); + invokeExact(recv, 1L, 1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { checkNPE(() -> { // null receiver - long x = (long) hs.get(am, methodType(long.class, Void.class, long.class)). - invoke(null, 1L); + long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, long.class)). + invokeExact((VarHandleTestMethodTypeLong) null, 1L); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class long x = (long) hs.get(am, methodType(long.class, Class.class, long.class)). - invoke(Void.class, 1L); + invokeExact(Void.class, 1L); }); checkWMTE(() -> { // value reference class long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // reciever primitive class long x = (long) hs.get(am, methodType(long.class, int.class, long.class)). - invoke(0, 1L); + invokeExact(0, 1L); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeLong.class, long.class)). - invoke(recv, 1L); + invokeExact(recv, 1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeLong.class, long.class)). - invoke(recv, 1L); + invokeExact(recv, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, long.class)). - invoke(recv, 1L, Void.class); + invokeExact(recv, 1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { checkNPE(() -> { // null receiver - long x = (long) hs.get(am, methodType(long.class, Void.class, long.class)). - invoke(null, 1L); + long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, long.class)). + invokeExact((VarHandleTestMethodTypeLong) null, 1L); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class long x = (long) hs.get(am, methodType(long.class, Class.class, long.class)). - invoke(Void.class, 1L); + invokeExact(Void.class, 1L); }); checkWMTE(() -> { // value reference class long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // reciever primitive class long x = (long) hs.get(am, methodType(long.class, int.class, long.class)). - invoke(0, 1L); + invokeExact(0, 1L); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeLong.class, long.class)). - invoke(recv, 1L); + invokeExact(recv, 1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeLong.class, long.class)). - invoke(recv, 1L); + invokeExact(recv, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, VarHandleTestMethodTypeLong.class, long.class)). - invoke(recv, 1L, Void.class); + invokeExact(recv, 1L, Void.class); }); } } @@ -1190,52 +1192,52 @@ public class VarHandleTestMethodTypeLong extends VarHandleBaseTest { // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, long.class, Class.class)). - invoke(1L, Void.class); + invokeExact(1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkWMTE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, long.class)). - invoke(Void.class, 1L); + invokeExact(Void.class, 1L); }); checkWMTE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, long.class, Class.class)). - invoke(1L, Void.class); + invokeExact(1L, Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, long.class, long.class, Class.class)). - invoke(1L, 1L, Void.class); + invokeExact(1L, 1L, Void.class); }); } @@ -1243,29 +1245,29 @@ public class VarHandleTestMethodTypeLong extends VarHandleBaseTest { // Incorrect argument types checkWMTE(() -> { // expected reference class long x = (long) hs.get(am, methodType(long.class, Class.class, long.class)). - invoke(Void.class, 1L); + invokeExact(Void.class, 1L); }); checkWMTE(() -> { // actual reference class long x = (long) hs.get(am, methodType(long.class, long.class, Class.class)). - invoke(1L, Void.class); + invokeExact(1L, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, long.class, long.class)). - invoke(1L, 1L); + invokeExact(1L, 1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, long.class, long.class)). - invoke(1L, 1L); + invokeExact(1L, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, long.class, long.class, Class.class)). - invoke(1L, 1L, Void.class); + invokeExact(1L, 1L, Void.class); }); } @@ -1273,25 +1275,25 @@ public class VarHandleTestMethodTypeLong extends VarHandleBaseTest { // Incorrect argument types checkWMTE(() -> { // value reference class long x = (long) hs.get(am, methodType(long.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, long.class)). - invoke(1L); + invokeExact(1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, long.class)). - invoke(1L); + invokeExact(1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, long.class, Class.class)). - invoke(1L, Void.class); + invokeExact(1L, Void.class); }); } @@ -1299,25 +1301,25 @@ public class VarHandleTestMethodTypeLong extends VarHandleBaseTest { // Incorrect argument types checkWMTE(() -> { // value reference class long x = (long) hs.get(am, methodType(long.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, long.class)). - invoke(1L); + invokeExact(1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, long.class)). - invoke(1L); + invokeExact(1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, long.class, Class.class)). - invoke(1L, Void.class); + invokeExact(1L, Void.class); }); } } @@ -1909,237 +1911,237 @@ public class VarHandleTestMethodTypeLong extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - long x = (long) hs.get(am, methodType(long.class, Void.class, int.class)). - invoke(null, 0); + long x = (long) hs.get(am, methodType(long.class, long[].class, int.class)). + invokeExact((long[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class long x = (long) hs.get(am, methodType(long.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class long x = (long) hs.get(am, methodType(long.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class long x = (long) hs.get(am, methodType(long.class, long[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, long[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, long[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, long.class)). - invoke(null, 0, 1L); + hs.get(am, methodType(void.class, long[].class, int.class, long.class)). + invokeExact((long[]) null, 0, 1L); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, long.class)). - invoke(Void.class, 0, 1L); + invokeExact(Void.class, 0, 1L); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, long[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, long.class)). - invoke(0, 0, 1L); + invokeExact(0, 0, 1L); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, long[].class, Class.class, long.class)). - invoke(array, Void.class, 1L); + invokeExact(array, Void.class, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, long[].class, int.class, Class.class)). - invoke(array, 0, 1L, Void.class); + invokeExact(array, 0, 1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean r = (boolean) hs.get(am, methodType(boolean.class, Void.class, int.class, long.class, long.class)). - invoke(null, 0, 1L, 1L); + boolean r = (boolean) hs.get(am, methodType(boolean.class, long[].class, int.class, long.class, long.class)). + invokeExact((long[]) null, 0, 1L, 1L); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, int.class, long.class, long.class)). - invoke(Void.class, 0, 1L, 1L); + invokeExact(Void.class, 0, 1L, 1L); }); checkWMTE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, long[].class, int.class, Class.class, long.class)). - invoke(array, 0, Void.class, 1L); + invokeExact(array, 0, Void.class, 1L); }); checkWMTE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, long[].class, int.class, long.class, Class.class)). - invoke(array, 0, 1L, Void.class); + invokeExact(array, 0, 1L, Void.class); }); checkWMTE(() -> { // receiver primitive class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class, int.class, long.class, long.class)). - invoke(0, 0, 1L, 1L); + invokeExact(0, 0, 1L, 1L); }); checkWMTE(() -> { // index reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, long[].class, Class.class, long.class, long.class)). - invoke(array, Void.class, 1L, 1L); + invokeExact(array, Void.class, 1L, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, long[].class, int.class, long.class, long.class, Class.class)). - invoke(array, 0, 1L, 1L, Void.class); + invokeExact(array, 0, 1L, 1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { // Incorrect argument types checkNPE(() -> { // null receiver - long x = (long) hs.get(am, methodType(long.class, Void.class, int.class, long.class, long.class)). - invoke(null, 0, 1L, 1L); + long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, long.class, long.class)). + invokeExact((long[]) null, 0, 1L, 1L); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class long x = (long) hs.get(am, methodType(long.class, Class.class, int.class, long.class, long.class)). - invoke(Void.class, 0, 1L, 1L); + invokeExact(Void.class, 0, 1L, 1L); }); checkWMTE(() -> { // expected reference class long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, Class.class, long.class)). - invoke(array, 0, Void.class, 1L); + invokeExact(array, 0, Void.class, 1L); }); checkWMTE(() -> { // actual reference class long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, long.class, Class.class)). - invoke(array, 0, 1L, Void.class); + invokeExact(array, 0, 1L, Void.class); }); checkWMTE(() -> { // array primitive class long x = (long) hs.get(am, methodType(long.class, int.class, int.class, long.class, long.class)). - invoke(0, 0, 1L, 1L); + invokeExact(0, 0, 1L, 1L); }); checkWMTE(() -> { // index reference class long x = (long) hs.get(am, methodType(long.class, long[].class, Class.class, long.class, long.class)). - invoke(array, Void.class, 1L, 1L); + invokeExact(array, Void.class, 1L, 1L); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, long[].class, int.class, long.class, long.class)). - invoke(array, 0, 1L, 1L); + invokeExact(array, 0, 1L, 1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, long[].class, int.class, long.class, long.class)). - invoke(array, 0, 1L, 1L); + invokeExact(array, 0, 1L, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, long.class, long.class, Class.class)). - invoke(array, 0, 1L, 1L, Void.class); + invokeExact(array, 0, 1L, 1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null array - long x = (long) hs.get(am, methodType(long.class, Void.class, int.class, long.class)). - invoke(null, 0, 1L); + long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, long.class)). + invokeExact((long[]) null, 0, 1L); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class long x = (long) hs.get(am, methodType(long.class, Class.class, int.class, long.class)). - invoke(Void.class, 0, 1L); + invokeExact(Void.class, 0, 1L); }); checkWMTE(() -> { // value reference class long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // array primitive class long x = (long) hs.get(am, methodType(long.class, int.class, int.class, long.class)). - invoke(0, 0, 1L); + invokeExact(0, 0, 1L); }); checkWMTE(() -> { // index reference class long x = (long) hs.get(am, methodType(long.class, long[].class, Class.class, long.class)). - invoke(array, Void.class, 1L); + invokeExact(array, Void.class, 1L); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, long[].class, int.class, long.class)). - invoke(array, 0, 1L); + invokeExact(array, 0, 1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, long[].class, int.class, long.class)). - invoke(array, 0, 1L); + invokeExact(array, 0, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, long.class, Class.class)). - invoke(array, 0, 1L, Void.class); + invokeExact(array, 0, 1L, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { // Incorrect argument types checkNPE(() -> { // null array - long x = (long) hs.get(am, methodType(long.class, Void.class, int.class, long.class)). - invoke(null, 0, 1L); + long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, long.class)). + invokeExact((long[]) null, 0, 1L); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class long x = (long) hs.get(am, methodType(long.class, Class.class, int.class, long.class)). - invoke(Void.class, 0, 1L); + invokeExact(Void.class, 0, 1L); }); checkWMTE(() -> { // value reference class long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // array primitive class long x = (long) hs.get(am, methodType(long.class, int.class, int.class, long.class)). - invoke(0, 0, 1L); + invokeExact(0, 0, 1L); }); checkWMTE(() -> { // index reference class long x = (long) hs.get(am, methodType(long.class, long[].class, Class.class, long.class)). - invoke(array, Void.class, 1L); + invokeExact(array, Void.class, 1L); }); // Incorrect return type checkWMTE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, long[].class, int.class, long.class)). - invoke(array, 0, 1L); + invokeExact(array, 0, 1L); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, long[].class, int.class, long.class)). - invoke(array, 0, 1L); + invokeExact(array, 0, 1L); }); // Incorrect arity checkWMTE(() -> { // 0 long x = (long) hs.get(am, methodType(long.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > long x = (long) hs.get(am, methodType(long.class, long[].class, int.class, long.class, Class.class)). - invoke(array, 0, 1L, Void.class); + invokeExact(array, 0, 1L, Void.class); }); } } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java index 634646e78c1..16efabe0917 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeShort.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeShort * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeShort */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeShort extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeShort::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeShort::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeShort::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeShort::testArrayWrongMethodType, false)); } @@ -329,63 +331,63 @@ public class VarHandleTestMethodTypeShort extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - short x = (short) hs.get(am, methodType(short.class, Void.class)). - invoke(null); + short x = (short) hs.get(am, methodType(short.class, VarHandleTestMethodTypeShort.class)). + invokeExact((VarHandleTestMethodTypeShort) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class short x = (short) hs.get(am, methodType(short.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class short x = (short) hs.get(am, methodType(short.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type checkWMTE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(short.class, VarHandleTestMethodTypeShort.class)). - invoke(recv); + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeShort.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeShort.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 short x = (short) hs.get(am, methodType(short.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > short x = (short) hs.get(am, methodType(short.class, VarHandleTestMethodTypeShort.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, short.class)). - invoke(null, (short)1); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeShort.class, short.class)). + invokeExact((VarHandleTestMethodTypeShort) null, (short)1); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, short.class)). - invoke(Void.class, (short)1); + invokeExact(Void.class, (short)1); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeShort.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, short.class)). - invoke(0, (short)1); + invokeExact(0, (short)1); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeShort.class, short.class, Class.class)). - invoke(recv, (short)1, Void.class); + invokeExact(recv, (short)1, Void.class); }); } @@ -513,32 +515,32 @@ public class VarHandleTestMethodTypeShort extends VarHandleBaseTest { // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > short x = (short) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, short.class, Class.class)). - invoke((short)1, Void.class); + invokeExact((short)1, Void.class); }); } @@ -783,71 +785,71 @@ public class VarHandleTestMethodTypeShort extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - short x = (short) hs.get(am, methodType(short.class, Void.class, int.class)). - invoke(null, 0); + short x = (short) hs.get(am, methodType(short.class, short[].class, int.class)). + invokeExact((short[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class short x = (short) hs.get(am, methodType(short.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class short x = (short) hs.get(am, methodType(short.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class short x = (short) hs.get(am, methodType(short.class, short[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type checkWMTE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, short[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, short[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 short x = (short) hs.get(am, methodType(short.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > short x = (short) hs.get(am, methodType(short.class, short[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, short.class)). - invoke(null, 0, (short)1); + hs.get(am, methodType(void.class, short[].class, int.class, short.class)). + invokeExact((short[]) null, 0, (short)1); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, short.class)). - invoke(Void.class, 0, (short)1); + invokeExact(Void.class, 0, (short)1); }); checkWMTE(() -> { // value reference class hs.get(am, methodType(void.class, short[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, short.class)). - invoke(0, 0, (short)1); + invokeExact(0, 0, (short)1); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, short[].class, Class.class, short.class)). - invoke(array, Void.class, (short)1); + invokeExact(array, Void.class, (short)1); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, short[].class, int.class, Class.class)). - invoke(array, 0, (short)1, Void.class); + invokeExact(array, 0, (short)1, Void.class); }); } diff --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java index f3b58c9e2f9..2cc853349ce 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestMethodTypeString.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodTypeString * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodTypeString */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodTypeString extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodTypeString::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodTypeString::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodTypeString::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodTypeString::testArrayWrongMethodType, false)); } @@ -586,174 +588,174 @@ public class VarHandleTestMethodTypeString extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - String x = (String) hs.get(am, methodType(String.class, Void.class)). - invoke(null); + String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class)). + invokeExact((VarHandleTestMethodTypeString) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class String x = (String) hs.get(am, methodType(String.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class String x = (String) hs.get(am, methodType(String.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type - checkCCE(() -> { // reference class - Void x = (Void) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class)). - invoke(recv); + hs.checkWMTEOrCCE(() -> { // reference class + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeString.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeString.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 String x = (String) hs.get(am, methodType(String.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, String.class)). - invoke(null, "foo"); + hs.get(am, methodType(void.class, VarHandleTestMethodTypeString.class, String.class)). + invokeExact((VarHandleTestMethodTypeString) null, "foo"); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, String.class)). - invoke(Void.class, "foo"); + invokeExact(Void.class, "foo"); }); - checkCCE(() -> { // value reference class + hs.checkWMTEOrCCE(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodTypeString.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, String.class)). - invoke(0, "foo"); + invokeExact(0, "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodTypeString.class, String.class, Class.class)). - invoke(recv, "foo", Void.class); + invokeExact(recv, "foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean r = (boolean) hs.get(am, methodType(boolean.class, Void.class, String.class, String.class)). - invoke(null, "foo", "foo"); + boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeString.class, String.class, String.class)). + invokeExact((VarHandleTestMethodTypeString) null, "foo", "foo"); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, String.class, String.class)). - invoke(Void.class, "foo", "foo"); + invokeExact(Void.class, "foo", "foo"); }); - checkCCE(() -> { // expected reference class + hs.checkWMTEOrCCE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeString.class, Class.class, String.class)). - invoke(recv, Void.class, "foo"); + invokeExact(recv, Void.class, "foo"); }); - checkCCE(() -> { // actual reference class + hs.checkWMTEOrCCE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeString.class, String.class, Class.class)). - invoke(recv, "foo", Void.class); + invokeExact(recv, "foo", Void.class); }); checkWMTE(() -> { // receiver primitive class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class , String.class, String.class)). - invoke(0, "foo", "foo"); + invokeExact(0, "foo", "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeString.class, String.class, String.class, Class.class)). - invoke(recv, "foo", "foo", Void.class); + invokeExact(recv, "foo", "foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { checkNPE(() -> { // null receiver - String x = (String) hs.get(am, methodType(String.class, Void.class, String.class, String.class)). - invoke(null, "foo", "foo"); + String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class, String.class, String.class)). + invokeExact((VarHandleTestMethodTypeString) null, "foo", "foo"); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class String x = (String) hs.get(am, methodType(String.class, Class.class, String.class, String.class)). - invoke(Void.class, "foo", "foo"); + invokeExact(Void.class, "foo", "foo"); }); - checkCCE(() -> { // expected reference class + hs.checkWMTEOrCCE(() -> { // expected reference class String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class, Class.class, String.class)). - invoke(recv, Void.class, "foo"); + invokeExact(recv, Void.class, "foo"); }); - checkCCE(() -> { // actual reference class + hs.checkWMTEOrCCE(() -> { // actual reference class String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class, String.class, Class.class)). - invoke(recv, "foo", Void.class); + invokeExact(recv, "foo", Void.class); }); checkWMTE(() -> { // reciever primitive class String x = (String) hs.get(am, methodType(String.class, int.class , String.class, String.class)). - invoke(0, "foo", "foo"); + invokeExact(0, "foo", "foo"); }); // Incorrect return type - checkCCE(() -> { // reference class + hs.checkWMTEOrCCE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeString.class , String.class, String.class)). - invoke(recv, "foo", "foo"); + invokeExact(recv, "foo", "foo"); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeString.class , String.class, String.class)). - invoke(recv, "foo", "foo"); + invokeExact(recv, "foo", "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 String x = (String) hs.get(am, methodType(String.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class, String.class, String.class, Class.class)). - invoke(recv, "foo", "foo", Void.class); + invokeExact(recv, "foo", "foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { checkNPE(() -> { // null receiver - String x = (String) hs.get(am, methodType(String.class, Void.class, String.class)). - invoke(null, "foo"); + String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class, String.class)). + invokeExact((VarHandleTestMethodTypeString) null, "foo"); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class String x = (String) hs.get(am, methodType(String.class, Class.class, String.class)). - invoke(Void.class, "foo"); + invokeExact(Void.class, "foo"); }); - checkCCE(() -> { // value reference class + hs.checkWMTEOrCCE(() -> { // value reference class String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // reciever primitive class String x = (String) hs.get(am, methodType(String.class, int.class, String.class)). - invoke(0, "foo"); + invokeExact(0, "foo"); }); // Incorrect return type - checkCCE(() -> { // reference class + hs.checkWMTEOrCCE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypeString.class, String.class)). - invoke(recv, "foo"); + invokeExact(recv, "foo"); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypeString.class, String.class)). - invoke(recv, "foo"); + invokeExact(recv, "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 String x = (String) hs.get(am, methodType(String.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(String.class, VarHandleTestMethodTypeString.class, String.class)). - invoke(recv, "foo", Void.class); + invokeExact(recv, "foo", Void.class); }); } @@ -1054,110 +1056,110 @@ public class VarHandleTestMethodTypeString extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect return type - checkCCE(() -> { // reference class + hs.checkWMTEOrCCE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { - checkCCE(() -> { // value reference class + hs.checkWMTEOrCCE(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, String.class, Class.class)). - invoke("foo", Void.class); + invokeExact("foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types - checkCCE(() -> { // expected reference class + hs.checkWMTEOrCCE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, String.class)). - invoke(Void.class, "foo"); + invokeExact(Void.class, "foo"); }); - checkCCE(() -> { // actual reference class + hs.checkWMTEOrCCE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, String.class, Class.class)). - invoke("foo", Void.class); + invokeExact("foo", Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, String.class, String.class, Class.class)). - invoke("foo", "foo", Void.class); + invokeExact("foo", "foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { // Incorrect argument types - checkCCE(() -> { // expected reference class + hs.checkWMTEOrCCE(() -> { // expected reference class String x = (String) hs.get(am, methodType(String.class, Class.class, String.class)). - invoke(Void.class, "foo"); + invokeExact(Void.class, "foo"); }); - checkCCE(() -> { // actual reference class + hs.checkWMTEOrCCE(() -> { // actual reference class String x = (String) hs.get(am, methodType(String.class, String.class, Class.class)). - invoke("foo", Void.class); + invokeExact("foo", Void.class); }); // Incorrect return type - checkCCE(() -> { // reference class + hs.checkWMTEOrCCE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, String.class, String.class)). - invoke("foo", "foo"); + invokeExact("foo", "foo"); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, String.class, String.class)). - invoke("foo", "foo"); + invokeExact("foo", "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 String x = (String) hs.get(am, methodType(String.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(String.class, String.class, String.class, Class.class)). - invoke("foo", "foo", Void.class); + invokeExact("foo", "foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { // Incorrect argument types - checkCCE(() -> { // value reference class + hs.checkWMTEOrCCE(() -> { // value reference class String x = (String) hs.get(am, methodType(String.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect return type - checkCCE(() -> { // reference class + hs.checkWMTEOrCCE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, String.class)). - invoke("foo"); + invokeExact("foo"); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, String.class)). - invoke("foo"); + invokeExact("foo"); }); // Incorrect arity checkWMTE(() -> { // 0 String x = (String) hs.get(am, methodType(String.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(String.class, String.class, Class.class)). - invoke("foo", Void.class); + invokeExact("foo", Void.class); }); } @@ -1686,195 +1688,195 @@ public class VarHandleTestMethodTypeString extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - String x = (String) hs.get(am, methodType(String.class, Void.class, int.class)). - invoke(null, 0); + String x = (String) hs.get(am, methodType(String.class, String[].class, int.class)). + invokeExact((String[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class String x = (String) hs.get(am, methodType(String.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class String x = (String) hs.get(am, methodType(String.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class String x = (String) hs.get(am, methodType(String.class, String[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type - checkCCE(() -> { // reference class + hs.checkWMTEOrCCE(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, String[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, String[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 String x = (String) hs.get(am, methodType(String.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(String.class, String[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, String.class)). - invoke(null, 0, "foo"); + hs.get(am, methodType(void.class, String[].class, int.class, String.class)). + invokeExact((String[]) null, 0, "foo"); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, String.class)). - invoke(Void.class, 0, "foo"); + invokeExact(Void.class, 0, "foo"); }); - checkCCE(() -> { // value reference class + hs.checkWMTEOrCCE(() -> { // value reference class hs.get(am, methodType(void.class, String[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, String.class)). - invoke(0, 0, "foo"); + invokeExact(0, 0, "foo"); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, String[].class, Class.class, String.class)). - invoke(array, Void.class, "foo"); + invokeExact(array, Void.class, "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, String[].class, int.class, Class.class)). - invoke(array, 0, "foo", Void.class); + invokeExact(array, 0, "foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean r = (boolean) hs.get(am, methodType(boolean.class, Void.class, int.class, String.class, String.class)). - invoke(null, 0, "foo", "foo"); + boolean r = (boolean) hs.get(am, methodType(boolean.class, String[].class, int.class, String.class, String.class)). + invokeExact((String[]) null, 0, "foo", "foo"); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, int.class, String.class, String.class)). - invoke(Void.class, 0, "foo", "foo"); + invokeExact(Void.class, 0, "foo", "foo"); }); - checkCCE(() -> { // expected reference class + hs.checkWMTEOrCCE(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, String[].class, int.class, Class.class, String.class)). - invoke(array, 0, Void.class, "foo"); + invokeExact(array, 0, Void.class, "foo"); }); - checkCCE(() -> { // actual reference class + hs.checkWMTEOrCCE(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, String[].class, int.class, String.class, Class.class)). - invoke(array, 0, "foo", Void.class); + invokeExact(array, 0, "foo", Void.class); }); checkWMTE(() -> { // receiver primitive class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class, int.class, String.class, String.class)). - invoke(0, 0, "foo", "foo"); + invokeExact(0, 0, "foo", "foo"); }); checkWMTE(() -> { // index reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, String[].class, Class.class, String.class, String.class)). - invoke(array, Void.class, "foo", "foo"); + invokeExact(array, Void.class, "foo", "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, String[].class, int.class, String.class, String.class, Class.class)). - invoke(array, 0, "foo", "foo", Void.class); + invokeExact(array, 0, "foo", "foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { // Incorrect argument types checkNPE(() -> { // null receiver - String x = (String) hs.get(am, methodType(String.class, Void.class, int.class, String.class, String.class)). - invoke(null, 0, "foo", "foo"); + String x = (String) hs.get(am, methodType(String.class, String[].class, int.class, String.class, String.class)). + invokeExact((String[]) null, 0, "foo", "foo"); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class String x = (String) hs.get(am, methodType(String.class, Class.class, int.class, String.class, String.class)). - invoke(Void.class, 0, "foo", "foo"); + invokeExact(Void.class, 0, "foo", "foo"); }); - checkCCE(() -> { // expected reference class + hs.checkWMTEOrCCE(() -> { // expected reference class String x = (String) hs.get(am, methodType(String.class, String[].class, int.class, Class.class, String.class)). - invoke(array, 0, Void.class, "foo"); + invokeExact(array, 0, Void.class, "foo"); }); - checkCCE(() -> { // actual reference class + hs.checkWMTEOrCCE(() -> { // actual reference class String x = (String) hs.get(am, methodType(String.class, String[].class, int.class, String.class, Class.class)). - invoke(array, 0, "foo", Void.class); + invokeExact(array, 0, "foo", Void.class); }); checkWMTE(() -> { // array primitive class String x = (String) hs.get(am, methodType(String.class, int.class, int.class, String.class, String.class)). - invoke(0, 0, "foo", "foo"); + invokeExact(0, 0, "foo", "foo"); }); checkWMTE(() -> { // index reference class String x = (String) hs.get(am, methodType(String.class, String[].class, Class.class, String.class, String.class)). - invoke(array, Void.class, "foo", "foo"); + invokeExact(array, Void.class, "foo", "foo"); }); // Incorrect return type - checkCCE(() -> { // reference class + hs.checkWMTEOrCCE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, String[].class, int.class, String.class, String.class)). - invoke(array, 0, "foo", "foo"); + invokeExact(array, 0, "foo", "foo"); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, String[].class, int.class, String.class, String.class)). - invoke(array, 0, "foo", "foo"); + invokeExact(array, 0, "foo", "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 String x = (String) hs.get(am, methodType(String.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(String.class, String[].class, int.class, String.class, String.class, Class.class)). - invoke(array, 0, "foo", "foo", Void.class); + invokeExact(array, 0, "foo", "foo", Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null array - String x = (String) hs.get(am, methodType(String.class, Void.class, int.class, String.class)). - invoke(null, 0, "foo"); + String x = (String) hs.get(am, methodType(String.class, String[].class, int.class, String.class)). + invokeExact((String[]) null, 0, "foo"); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class String x = (String) hs.get(am, methodType(String.class, Class.class, int.class, String.class)). - invoke(Void.class, 0, "foo"); + invokeExact(Void.class, 0, "foo"); }); - checkCCE(() -> { // value reference class + hs.checkWMTEOrCCE(() -> { // value reference class String x = (String) hs.get(am, methodType(String.class, String[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // array primitive class String x = (String) hs.get(am, methodType(String.class, int.class, int.class, String.class)). - invoke(0, 0, "foo"); + invokeExact(0, 0, "foo"); }); checkWMTE(() -> { // index reference class String x = (String) hs.get(am, methodType(String.class, String[].class, Class.class, String.class)). - invoke(array, Void.class, "foo"); + invokeExact(array, Void.class, "foo"); }); // Incorrect return type - checkCCE(() -> { // reference class + hs.checkWMTEOrCCE(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, String[].class, int.class, String.class)). - invoke(array, 0, "foo"); + invokeExact(array, 0, "foo"); }); checkWMTE(() -> { // primitive class boolean x = (boolean) hs.get(am, methodType(boolean.class, String[].class, int.class, String.class)). - invoke(array, 0, "foo"); + invokeExact(array, 0, "foo"); }); // Incorrect arity checkWMTE(() -> { // 0 String x = (String) hs.get(am, methodType(String.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > String x = (String) hs.get(am, methodType(String.class, String[].class, int.class, String.class, Class.class)). - invoke(array, 0, "foo", Void.class); + invokeExact(array, 0, "foo", Void.class); }); } diff --git a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template index dbee4cbb347..5dfd82f6cd7 100644 --- a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template +++ b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template @@ -105,6 +105,7 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); + assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); @@ -114,6 +115,7 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); + assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); @@ -296,6 +298,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$); }); + checkUOE(() -> { + boolean r = vh.weakCompareAndSetVolatile(recv, $value1$, $value2$); + }); + checkUOE(() -> { boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$); }); @@ -303,6 +309,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { checkUOE(() -> { boolean r = vh.weakCompareAndSetRelease(recv, $value1$, $value2$); }); + + checkUOE(() -> { + $type$ r = ($type$) vh.getAndSet(recv, $value1$); + }); #end[CAS] #if[!AtomicAdd] @@ -382,6 +392,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet($value1$, $value2$); }); + checkUOE(() -> { + boolean r = vh.weakCompareAndSetVolatile($value1$, $value2$); + }); + checkUOE(() -> { boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$); }); @@ -389,6 +403,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { checkUOE(() -> { boolean r = vh.weakCompareAndSetRelease($value1$, $value2$); }); + + checkUOE(() -> { + $type$ r = ($type$) vh.getAndSet($value1$); + }); #end[CAS] #if[!AtomicAdd] @@ -523,12 +541,22 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { assertEquals(x, $value2$, "weakCompareAndSetRelease $type$"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetVolatile(recv, $value2$, $value1$); + } + assertEquals(success, true, "weakCompareAndSetVolatile $type$"); + $type$ x = ($type$) vh.get(recv); + assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$ value"); + } + // Compare set and get { - $type$ o = ($type$) vh.getAndSet(recv, $value1$); - assertEquals(o, $value2$, "getAndSet $type$"); + $type$ o = ($type$) vh.getAndSet(recv, $value2$); + assertEquals(o, $value1$, "getAndSet $type$"); $type$ x = ($type$) vh.get(recv); - assertEquals(x, $value1$, "getAndSet $type$ value"); + assertEquals(x, $value2$, "getAndSet $type$ value"); } #end[CAS] @@ -567,6 +595,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet(recv, $value1$, $value2$); }); + checkUOE(() -> { + boolean r = vh.weakCompareAndSetVolatile(recv, $value1$, $value2$); + }); + checkUOE(() -> { boolean r = vh.weakCompareAndSetAcquire(recv, $value1$, $value2$); }); @@ -574,6 +606,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { checkUOE(() -> { boolean r = vh.weakCompareAndSetRelease(recv, $value1$, $value2$); }); + + checkUOE(() -> { + $type$ r = ($type$) vh.getAndSet(recv, $value1$); + }); #end[CAS] #if[!AtomicAdd] @@ -708,12 +744,22 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { assertEquals(x, $value2$, "weakCompareAndSetRelease $type$"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetRelease($value2$, $value1$); + } + assertEquals(success, true, "weakCompareAndSetVolatile $type$"); + $type$ x = ($type$) vh.get(); + assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$"); + } + // Compare set and get { - $type$ o = ($type$) vh.getAndSet( $value1$); - assertEquals(o, $value2$, "getAndSet $type$"); + $type$ o = ($type$) vh.getAndSet($value2$); + assertEquals(o, $value1$, "getAndSet $type$"); $type$ x = ($type$) vh.get(); - assertEquals(x, $value1$, "getAndSet $type$ value"); + assertEquals(x, $value2$, "getAndSet $type$ value"); } #end[CAS] @@ -752,6 +798,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet($value1$, $value2$); }); + checkUOE(() -> { + boolean r = vh.weakCompareAndSetVolatile($value1$, $value2$); + }); + checkUOE(() -> { boolean r = vh.weakCompareAndSetAcquire($value1$, $value2$); }); @@ -759,6 +809,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { checkUOE(() -> { boolean r = vh.weakCompareAndSetRelease($value1$, $value2$); }); + + checkUOE(() -> { + $type$ r = ($type$) vh.getAndSet($value1$); + }); #end[CAS] #if[!AtomicAdd] @@ -896,12 +950,22 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { assertEquals(x, $value2$, "weakCompareAndSetRelease $type$"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = vh.weakCompareAndSetVolatile(array, i, $value2$, $value1$); + } + assertEquals(success, true, "weakCompareAndSetVolatile $type$"); + $type$ x = ($type$) vh.get(array, i); + assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$"); + } + // Compare set and get { - $type$ o = ($type$) vh.getAndSet(array, i, $value1$); - assertEquals(o, $value2$, "getAndSet $type$"); + $type$ o = ($type$) vh.getAndSet(array, i, $value2$); + assertEquals(o, $value1$, "getAndSet $type$"); $type$ x = ($type$) vh.get(array, i); - assertEquals(x, $value1$, "getAndSet $type$ value"); + assertEquals(x, $value2$, "getAndSet $type$ value"); } #end[CAS] @@ -944,6 +1008,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet(array, i, $value1$, $value2$); }); + checkUOE(() -> { + boolean r = vh.weakCompareAndSetVolatile(array, i, $value1$, $value2$); + }); + checkUOE(() -> { boolean r = vh.weakCompareAndSetAcquire(array, i, $value1$, $value2$); }); @@ -951,6 +1019,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { checkUOE(() -> { boolean r = vh.weakCompareAndSetRelease(array, i, $value1$, $value2$); }); + + checkUOE(() -> { + $type$ r = ($type$) vh.getAndSet(array, i, $value1$); + }); #end[CAS] #if[!AtomicAdd] @@ -1023,6 +1095,10 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { boolean r = vh.weakCompareAndSet(array, ci, $value1$, $value2$); }); + checkIOOBE(() -> { + boolean r = vh.weakCompareAndSetVolatile(array, ci, $value1$, $value2$); + }); + checkIOOBE(() -> { boolean r = vh.weakCompareAndSetAcquire(array, ci, $value1$, $value2$); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template index fba7a192a70..615bb528e06 100644 --- a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template +++ b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template @@ -311,10 +311,12 @@ public class VarHandleTestByteArrayAs$Type$ extends VarHandleBaseByteArrayTest { checkROBE(() -> { $type$ o = ($type$) vh.getAndSet(array, ci, VALUE_1); }); + +#else[CAS] checkUOE(() -> { boolean r = vh.compareAndSet(array, ci, VALUE_1, VALUE_2); }); -#else[CAS] + checkUOE(() -> { $type$ r = ($type$) vh.compareAndExchangeVolatile(array, ci, VALUE_2, VALUE_1); }); diff --git a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodHandleAccess.java.template b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodHandleAccess.java.template index a3b3aa5c43f..e4bd78e8f45 100644 --- a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodHandleAccess.java.template +++ b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodHandleAccess.java.template @@ -238,12 +238,22 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest { assertEquals(x, $value2$, "weakCompareAndSetRelease $type$"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, $value2$, $value1$); + } + assertEquals(success, true, "weakCompareAndSetVolatile $type$"); + $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv); + assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$"); + } + // Compare set and get { - $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, $value1$); - assertEquals(o, $value2$, "getAndSet $type$"); + $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, $value2$); + assertEquals(o, $value1$, "getAndSet $type$"); $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv); - assertEquals(x, $value1$, "getAndSet $type$ value"); + assertEquals(x, $value2$, "getAndSet $type$ value"); } #end[CAS] @@ -411,12 +421,22 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest { assertEquals(x, $value2$, "weakCompareAndSetRelease $type$"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact($value2$, $value1$); + } + assertEquals(success, true, "weakCompareAndSetVolatile $type$"); + $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(); + assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$"); + } + // Compare set and get { - $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact( $value1$); - assertEquals(o, $value2$, "getAndSet $type$"); + $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact( $value2$); + assertEquals(o, $value1$, "getAndSet $type$"); $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(); - assertEquals(x, $value1$, "getAndSet $type$ value"); + assertEquals(x, $value2$, "getAndSet $type$ value"); } #end[CAS] @@ -587,12 +607,22 @@ public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest { assertEquals(x, $value2$, "weakCompareAndSetRelease $type$"); } + { + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, $value2$, $value1$); + } + assertEquals(success, true, "weakCompareAndSetVolatile $type$"); + $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i); + assertEquals(x, $value1$, "weakCompareAndSetVolatile $type$"); + } + // Compare set and get { - $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, $value1$); - assertEquals(o, $value2$, "getAndSet $type$"); + $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, $value2$); + assertEquals(o, $value1$, "getAndSet $type$"); $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i); - assertEquals(x, $value1$, "getAndSet $type$ value"); + assertEquals(x, $value2$, "getAndSet $type$ value"); } #end[CAS] diff --git a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodType.java.template b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodType.java.template index fe504902f10..5bec8b46a10 100644 --- a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodType.java.template +++ b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestMethodType.java.template @@ -23,6 +23,7 @@ /* * @test + * @bug 8156486 * @run testng/othervm VarHandleTestMethodType$Type$ * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestMethodType$Type$ */ @@ -81,27 +82,28 @@ public class VarHandleTestMethodType$Type$ extends VarHandleBaseTest { public Object[][] accessTestCaseProvider() throws Exception { List> cases = new ArrayList<>(); - cases.add(new VarHandleAccessTestCase("Instance field wrong method type", + cases.add(new VarHandleAccessTestCase("Instance field", vhField, vh -> testInstanceFieldWrongMethodType(this, vh), false)); - cases.add(new VarHandleAccessTestCase("Static field wrong method type", + cases.add(new VarHandleAccessTestCase("Static field", vhStaticField, VarHandleTestMethodType$Type$::testStaticFieldWrongMethodType, false)); - cases.add(new VarHandleAccessTestCase("Array wrong method type", + cases.add(new VarHandleAccessTestCase("Array", vhArray, VarHandleTestMethodType$Type$::testArrayWrongMethodType, false)); + for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { - cases.add(new MethodHandleAccessTestCase("Instance field wrong method type", + cases.add(new MethodHandleAccessTestCase("Instance field", vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs), false)); - cases.add(new MethodHandleAccessTestCase("Static field wrong method type", + cases.add(new MethodHandleAccessTestCase("Static field", vhStaticField, f, VarHandleTestMethodType$Type$::testStaticFieldWrongMethodType, false)); - cases.add(new MethodHandleAccessTestCase("Array wrong method type", + cases.add(new MethodHandleAccessTestCase("Array", vhArray, f, VarHandleTestMethodType$Type$::testArrayWrongMethodType, false)); } @@ -648,63 +650,63 @@ public class VarHandleTestMethodType$Type$ extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null receiver - $type$ x = ($type$) hs.get(am, methodType($type$.class, Void.class)). - invoke(null); + $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class)). + invokeExact((VarHandleTestMethodType$Type$) null); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); checkWMTE(() -> { // receiver primitive class $type$ x = ($type$) hs.get(am, methodType($type$.class, int.class)). - invoke(0); + invokeExact(0); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class - Void x = (Void) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class)). - invoke(recv); + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class + Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodType$Type$.class)). + invokeExact(recv); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, VarHandleTestMethodType$Type$.class)). - invoke(recv); + invokeExact(recv); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - hs.get(am, methodType(void.class, Void.class, $type$.class)). - invoke(null, $value1$); + hs.get(am, methodType(void.class, VarHandleTestMethodType$Type$.class, $type$.class)). + invokeExact((VarHandleTestMethodType$Type$) null, $value1$); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class hs.get(am, methodType(void.class, Class.class, $type$.class)). - invoke(Void.class, $value1$); + invokeExact(Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // value reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // value reference class hs.get(am, methodType(void.class, VarHandleTestMethodType$Type$.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, $type$.class)). - invoke(0, $value1$); + invokeExact(0, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, VarHandleTestMethodType$Type$.class, $type$.class, Class.class)). - invoke(recv, $value1$, Void.class); + invokeExact(recv, $value1$, Void.class); }); } @@ -712,111 +714,111 @@ public class VarHandleTestMethodType$Type$ extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean r = (boolean) hs.get(am, methodType(boolean.class, Void.class, $type$.class, $type$.class)). - invoke(null, $value1$, $value1$); + boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodType$Type$.class, $type$.class, $type$.class)). + invokeExact((VarHandleTestMethodType$Type$) null, $value1$, $value1$); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, $type$.class, $type$.class)). - invoke(Void.class, $value1$, $value1$); + invokeExact(Void.class, $value1$, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // expected reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodType$Type$.class, Class.class, $type$.class)). - invoke(recv, Void.class, $value1$); + invokeExact(recv, Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // actual reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodType$Type$.class, $type$.class, Class.class)). - invoke(recv, $value1$, Void.class); + invokeExact(recv, $value1$, Void.class); }); checkWMTE(() -> { // receiver primitive class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class , $type$.class, $type$.class)). - invoke(0, $value1$, $value1$); + invokeExact(0, $value1$, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodType$Type$.class, $type$.class, $type$.class, Class.class)). - invoke(recv, $value1$, $value1$, Void.class); + invokeExact(recv, $value1$, $value1$, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { checkNPE(() -> { // null receiver - $type$ x = ($type$) hs.get(am, methodType($type$.class, Void.class, $type$.class, $type$.class)). - invoke(null, $value1$, $value1$); + $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, $type$.class, $type$.class)). + invokeExact((VarHandleTestMethodType$Type$) null, $value1$, $value1$); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class, $type$.class, $type$.class)). - invoke(Void.class, $value1$, $value1$); + invokeExact(Void.class, $value1$, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // expected reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // expected reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, Class.class, $type$.class)). - invoke(recv, Void.class, $value1$); + invokeExact(recv, Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // actual reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // actual reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, $type$.class, Class.class)). - invoke(recv, $value1$, Void.class); + invokeExact(recv, $value1$, Void.class); }); checkWMTE(() -> { // reciever primitive class $type$ x = ($type$) hs.get(am, methodType($type$.class, int.class , $type$.class, $type$.class)). - invoke(0, $value1$, $value1$); + invokeExact(0, $value1$, $value1$); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodType$Type$.class , $type$.class, $type$.class)). - invoke(recv, $value1$, $value1$); + invokeExact(recv, $value1$, $value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, VarHandleTestMethodType$Type$.class , $type$.class, $type$.class)). - invoke(recv, $value1$, $value1$); + invokeExact(recv, $value1$, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, $type$.class, $type$.class, Class.class)). - invoke(recv, $value1$, $value1$, Void.class); + invokeExact(recv, $value1$, $value1$, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { checkNPE(() -> { // null receiver - $type$ x = ($type$) hs.get(am, methodType($type$.class, Void.class, $type$.class)). - invoke(null, $value1$); + $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, $type$.class)). + invokeExact((VarHandleTestMethodType$Type$) null, $value1$); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class, $type$.class)). - invoke(Void.class, $value1$); + invokeExact(Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // value reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // value reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // reciever primitive class $type$ x = ($type$) hs.get(am, methodType($type$.class, int.class, $type$.class)). - invoke(0, $value1$); + invokeExact(0, $value1$); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodType$Type$.class, $type$.class)). - invoke(recv, $value1$); + invokeExact(recv, $value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, VarHandleTestMethodType$Type$.class, $type$.class)). - invoke(recv, $value1$); + invokeExact(recv, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, $type$.class)). - invoke(recv, $value1$, Void.class); + invokeExact(recv, $value1$, Void.class); }); } #end[CAS] @@ -824,38 +826,38 @@ public class VarHandleTestMethodType$Type$ extends VarHandleBaseTest { #if[AtomicAdd] for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { checkNPE(() -> { // null receiver - $type$ x = ($type$) hs.get(am, methodType($type$.class, Void.class, $type$.class)). - invoke(null, $value1$); + $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, $type$.class)). + invokeExact((VarHandleTestMethodType$Type$) null, $value1$); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class, $type$.class)). - invoke(Void.class, $value1$); + invokeExact(Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // value reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // value reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, Class.class)). - invoke(recv, Void.class); + invokeExact(recv, Void.class); }); checkWMTE(() -> { // reciever primitive class $type$ x = ($type$) hs.get(am, methodType($type$.class, int.class, $type$.class)). - invoke(0, $value1$); + invokeExact(0, $value1$); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodType$Type$.class, $type$.class)). - invoke(recv, $value1$); + invokeExact(recv, $value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, VarHandleTestMethodType$Type$.class, $type$.class)). - invoke(recv, $value1$); + invokeExact(recv, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, VarHandleTestMethodType$Type$.class, $type$.class)). - invoke(recv, $value1$, Void.class); + invokeExact(recv, $value1$, Void.class); }); } #end[AtomicAdd] @@ -1200,111 +1202,111 @@ public class VarHandleTestMethodType$Type$ extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class)). - invoke(); + invokeExact(); }); // Incorrect arity checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType(Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { - check{#if[String]?CCE:WMTE}(() -> { // value reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // value reference class hs.get(am, methodType(void.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, $type$.class, Class.class)). - invoke($value1$, Void.class); + invokeExact($value1$, Void.class); }); } #if[CAS] for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types - check{#if[String]?CCE:WMTE}(() -> { // expected reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, $type$.class)). - invoke(Void.class, $value1$); + invokeExact(Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // actual reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, $type$.class, Class.class)). - invoke($value1$, Void.class); + invokeExact($value1$, Void.class); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, $type$.class, $type$.class, Class.class)). - invoke($value1$, $value1$, Void.class); + invokeExact($value1$, $value1$, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { // Incorrect argument types - check{#if[String]?CCE:WMTE}(() -> { // expected reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // expected reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class, $type$.class)). - invoke(Void.class, $value1$); + invokeExact(Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // actual reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // actual reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$.class, Class.class)). - invoke($value1$, Void.class); + invokeExact($value1$, Void.class); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, $type$.class, $type$.class)). - invoke($value1$, $value1$); + invokeExact($value1$, $value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, $type$.class, $type$.class)). - invoke($value1$, $value1$); + invokeExact($value1$, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$.class, $type$.class, Class.class)). - invoke($value1$, $value1$, Void.class); + invokeExact($value1$, $value1$, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { // Incorrect argument types - check{#if[String]?CCE:WMTE}(() -> { // value reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // value reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, $type$.class)). - invoke($value1$); + invokeExact($value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, $type$.class)). - invoke($value1$); + invokeExact($value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$.class, Class.class)). - invoke($value1$, Void.class); + invokeExact($value1$, Void.class); }); } #end[CAS] @@ -1314,25 +1316,25 @@ public class VarHandleTestMethodType$Type$ extends VarHandleBaseTest { // Incorrect argument types check{#if[String]?CCE:WMTE}(() -> { // value reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class)). - invoke(Void.class); + invokeExact(Void.class); }); // Incorrect return type check{#if[String]?CCE:WMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, $type$.class)). - invoke($value1$); + invokeExact($value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, $type$.class)). - invoke($value1$); + invokeExact($value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$.class, Class.class)). - invoke($value1$, Void.class); + invokeExact($value1$, Void.class); }); } #end[AtomicAdd] @@ -1929,196 +1931,196 @@ public class VarHandleTestMethodType$Type$ extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { // Incorrect argument types checkNPE(() -> { // null array - $type$ x = ($type$) hs.get(am, methodType($type$.class, Void.class, int.class)). - invoke(null, 0); + $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class)). + invokeExact(($type$[]) null, 0); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class, int.class)). - invoke(Void.class, 0); + invokeExact(Void.class, 0); }); checkWMTE(() -> { // array primitive class $type$ x = ($type$) hs.get(am, methodType($type$.class, int.class, int.class)). - invoke(0, 0); + invokeExact(0, 0); }); checkWMTE(() -> { // index reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, Class.class)). - invoke(array, Void.class); + invokeExact(array, Void.class); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void x = (Void) hs.get(am, methodType(Void.class, $type$[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, $type$[].class, int.class)). - invoke(array, 0); + invokeExact(array, 0); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { // Incorrect argument types checkNPE(() -> { // null array - hs.get(am, methodType(void.class, Void.class, int.class, $type$.class)). - invoke(null, 0, $value1$); + hs.get(am, methodType(void.class, $type$[].class, int.class, $type$.class)). + invokeExact(($type$[]) null, 0, $value1$); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class hs.get(am, methodType(void.class, Class.class, int.class, $type$.class)). - invoke(Void.class, 0, $value1$); + invokeExact(Void.class, 0, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // value reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // value reference class hs.get(am, methodType(void.class, $type$[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // receiver primitive class hs.get(am, methodType(void.class, int.class, int.class, $type$.class)). - invoke(0, 0, $value1$); + invokeExact(0, 0, $value1$); }); checkWMTE(() -> { // index reference class hs.get(am, methodType(void.class, $type$[].class, Class.class, $type$.class)). - invoke(array, Void.class, $value1$); + invokeExact(array, Void.class, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 hs.get(am, methodType(void.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > hs.get(am, methodType(void.class, $type$[].class, int.class, Class.class)). - invoke(array, 0, $value1$, Void.class); + invokeExact(array, 0, $value1$, Void.class); }); } #if[CAS] for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null receiver - boolean r = (boolean) hs.get(am, methodType(boolean.class, Void.class, int.class, $type$.class, $type$.class)). - invoke(null, 0, $value1$, $value1$); + boolean r = (boolean) hs.get(am, methodType(boolean.class, $type$[].class, int.class, $type$.class, $type$.class)). + invokeExact(($type$[]) null, 0, $value1$, $value1$); }); - checkCCE(() -> { // receiver reference class + hs.checkWMTEOrCCE(() -> { // receiver reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, int.class, $type$.class, $type$.class)). - invoke(Void.class, 0, $value1$, $value1$); + invokeExact(Void.class, 0, $value1$, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // expected reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // expected reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, $type$[].class, int.class, Class.class, $type$.class)). - invoke(array, 0, Void.class, $value1$); + invokeExact(array, 0, Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // actual reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // actual reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, $type$[].class, int.class, $type$.class, Class.class)). - invoke(array, 0, $value1$, Void.class); + invokeExact(array, 0, $value1$, Void.class); }); checkWMTE(() -> { // receiver primitive class boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class, int.class, $type$.class, $type$.class)). - invoke(0, 0, $value1$, $value1$); + invokeExact(0, 0, $value1$, $value1$); }); checkWMTE(() -> { // index reference class boolean r = (boolean) hs.get(am, methodType(boolean.class, $type$[].class, Class.class, $type$.class, $type$.class)). - invoke(array, Void.class, $value1$, $value1$); + invokeExact(array, Void.class, $value1$, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 boolean r = (boolean) hs.get(am, methodType(boolean.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > boolean r = (boolean) hs.get(am, methodType(boolean.class, $type$[].class, int.class, $type$.class, $type$.class, Class.class)). - invoke(array, 0, $value1$, $value1$, Void.class); + invokeExact(array, 0, $value1$, $value1$, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { // Incorrect argument types checkNPE(() -> { // null receiver - $type$ x = ($type$) hs.get(am, methodType($type$.class, Void.class, int.class, $type$.class, $type$.class)). - invoke(null, 0, $value1$, $value1$); + $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, $type$.class, $type$.class)). + invokeExact(($type$[]) null, 0, $value1$, $value1$); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class, int.class, $type$.class, $type$.class)). - invoke(Void.class, 0, $value1$, $value1$); + invokeExact(Void.class, 0, $value1$, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // expected reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // expected reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, Class.class, $type$.class)). - invoke(array, 0, Void.class, $value1$); + invokeExact(array, 0, Void.class, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // actual reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // actual reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, $type$.class, Class.class)). - invoke(array, 0, $value1$, Void.class); + invokeExact(array, 0, $value1$, Void.class); }); checkWMTE(() -> { // array primitive class $type$ x = ($type$) hs.get(am, methodType($type$.class, int.class, int.class, $type$.class, $type$.class)). - invoke(0, 0, $value1$, $value1$); + invokeExact(0, 0, $value1$, $value1$); }); checkWMTE(() -> { // index reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, Class.class, $type$.class, $type$.class)). - invoke(array, Void.class, $value1$, $value1$); + invokeExact(array, Void.class, $value1$, $value1$); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, $type$[].class, int.class, $type$.class, $type$.class)). - invoke(array, 0, $value1$, $value1$); + invokeExact(array, 0, $value1$, $value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, $type$[].class, int.class, $type$.class, $type$.class)). - invoke(array, 0, $value1$, $value1$); + invokeExact(array, 0, $value1$, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, $type$.class, $type$.class, Class.class)). - invoke(array, 0, $value1$, $value1$, Void.class); + invokeExact(array, 0, $value1$, $value1$, Void.class); }); } for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { // Incorrect argument types checkNPE(() -> { // null array - $type$ x = ($type$) hs.get(am, methodType($type$.class, Void.class, int.class, $type$.class)). - invoke(null, 0, $value1$); + $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, $type$.class)). + invokeExact(($type$[]) null, 0, $value1$); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class, int.class, $type$.class)). - invoke(Void.class, 0, $value1$); + invokeExact(Void.class, 0, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // value reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // value reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // array primitive class $type$ x = ($type$) hs.get(am, methodType($type$.class, int.class, int.class, $type$.class)). - invoke(0, 0, $value1$); + invokeExact(0, 0, $value1$); }); checkWMTE(() -> { // index reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, Class.class, $type$.class)). - invoke(array, Void.class, $value1$); + invokeExact(array, Void.class, $value1$); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, $type$[].class, int.class, $type$.class)). - invoke(array, 0, $value1$); + invokeExact(array, 0, $value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, $type$[].class, int.class, $type$.class)). - invoke(array, 0, $value1$); + invokeExact(array, 0, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, $type$.class, Class.class)). - invoke(array, 0, $value1$, Void.class); + invokeExact(array, 0, $value1$, Void.class); }); } #end[CAS] @@ -2127,42 +2129,42 @@ public class VarHandleTestMethodType$Type$ extends VarHandleBaseTest { for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { // Incorrect argument types checkNPE(() -> { // null array - $type$ x = ($type$) hs.get(am, methodType($type$.class, Void.class, int.class, $type$.class)). - invoke(null, 0, $value1$); + $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, $type$.class)). + invokeExact(($type$[]) null, 0, $value1$); }); - checkCCE(() -> { // array reference class + hs.checkWMTEOrCCE(() -> { // array reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, Class.class, int.class, $type$.class)). - invoke(Void.class, 0, $value1$); + invokeExact(Void.class, 0, $value1$); }); - check{#if[String]?CCE:WMTE}(() -> { // value reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // value reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, Class.class)). - invoke(array, 0, Void.class); + invokeExact(array, 0, Void.class); }); checkWMTE(() -> { // array primitive class $type$ x = ($type$) hs.get(am, methodType($type$.class, int.class, int.class, $type$.class)). - invoke(0, 0, $value1$); + invokeExact(0, 0, $value1$); }); checkWMTE(() -> { // index reference class $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, Class.class, $type$.class)). - invoke(array, Void.class, $value1$); + invokeExact(array, Void.class, $value1$); }); // Incorrect return type - check{#if[String]?CCE:WMTE}(() -> { // reference class + {#if[String]?hs.checkWMTEOrCCE:checkWMTE}(() -> { // reference class Void r = (Void) hs.get(am, methodType(Void.class, $type$[].class, int.class, $type$.class)). - invoke(array, 0, $value1$); + invokeExact(array, 0, $value1$); }); checkWMTE(() -> { // primitive class $wrong_primitive_type$ x = ($wrong_primitive_type$) hs.get(am, methodType($wrong_primitive_type$.class, $type$[].class, int.class, $type$.class)). - invoke(array, 0, $value1$); + invokeExact(array, 0, $value1$); }); // Incorrect arity checkWMTE(() -> { // 0 $type$ x = ($type$) hs.get(am, methodType($type$.class)). - invoke(); + invokeExact(); }); checkWMTE(() -> { // > $type$ x = ($type$) hs.get(am, methodType($type$.class, $type$[].class, int.class, $type$.class, Class.class)). - invoke(array, 0, $value1$, Void.class); + invokeExact(array, 0, $value1$, Void.class); }); } #end[AtomicAdd] diff --git a/jdk/test/java/lang/invoke/VarHandles/generate-vh-tests.sh b/jdk/test/java/lang/invoke/VarHandles/generate-vh-tests.sh index 7d6afc7b206..436d2d371d9 100644 --- a/jdk/test/java/lang/invoke/VarHandles/generate-vh-tests.sh +++ b/jdk/test/java/lang/invoke/VarHandles/generate-vh-tests.sh @@ -113,36 +113,40 @@ do ;; esac + # The value of `value3` is chosen such that when added to `value1` or `value2` + # it will result in carrying of bits over to the next byte, thereby detecting + # possible errors in endianness conversion e.g. if say for atomic addition the + # augend is incorrectly processed case $type in short) value1=(short)0x0102 value2=(short)0x1112 - value3=(short)0x2122 + value3=(short)0xFFFE ;; char) value1=(char)0x0102 value2=(char)0x1112 - value3=(char)0x2122 + value3=(char)0xFFFE ;; int) value1=0x01020304 value2=0x11121314 - value3=0x21222324 + value3=0xFFFEFDFC ;; long) value1=0x0102030405060708L value2=0x1112131415161718L - value3=0x2122232425262728L + value3=0xFFFEFDFCFBFAF9F8L ;; float) value1=0x01020304 value2=0x11121314 - value3=0x21222324 + value3=0xFFFEFDFC ;; double) value1=0x0102030405060708L value2=0x1112131415161718L - value3=0x2122232425262728L + value3=0xFFFEFDFCFBFAF9F8L ;; esac diff --git a/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java b/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java index ac0bc89f98c..63f5c5fbc31 100644 --- a/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java +++ b/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java @@ -270,8 +270,7 @@ public class PlatformLoggingMXBeanTest // Calling getMBeanInfo will throw exception if not found. platformMBS.getMBeanInfo(objName); - if (!platformMBS.isInstanceOf(objName, "java.lang.management.PlatformLoggingMXBean") || - !platformMBS.isInstanceOf(objName, "java.util.logging.LoggingMXBean")) { + if (!platformMBS.isInstanceOf(objName, "java.lang.management.PlatformLoggingMXBean")) { throw new RuntimeException(objName + " is of unexpected type"); } diff --git a/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java b/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java index b37813fd290..6a0cd78a241 100644 --- a/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java +++ b/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java @@ -24,6 +24,7 @@ /** * @test * @library /lib/testlibrary + * @modules jdk.compiler * @build LayerAndLoadersTest CompilerUtils ModuleUtils * @run testng LayerAndLoadersTest * @summary Tests for java.lang.reflect.Layer@createWithXXX methods diff --git a/jdk/test/java/net/httpclient/http2/TLSConnection.java b/jdk/test/java/net/httpclient/http2/TLSConnection.java new file mode 100644 index 00000000000..f2721eb268e --- /dev/null +++ b/jdk/test/java/net/httpclient/http2/TLSConnection.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.Http2Handler; +import java.net.http.Http2TestExchange; +import java.net.http.Http2TestServer; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import javax.net.ssl.SSLParameters; +import javax.net.ssl.SSLSession; + +/* + * @test + * @bug 8150769 8157107 + * @summary Checks that SSL parameters can be set for HTTP/2 connection + * @modules java.httpclient + * @compile/module=java.httpclient java/net/http/Http2Handler.java + * @compile/module=java.httpclient java/net/http/Http2TestExchange.java + * @compile/module=java.httpclient java/net/http/Http2TestServer.java + * @run main/othervm TLSConnection + */ +public class TLSConnection { + + private static final String KEYSTORE = System.getProperty("test.src") + + File.separator + "keystore.p12"; + private static final String PASSWORD = "password"; + + public static void main(String[] args) throws Exception { + + // enable all logging + System.setProperty("java.net.http.HttpClient.log", "all,frames:all"); + + // initialize JSSE + System.setProperty("javax.net.ssl.keyStore", KEYSTORE); + System.setProperty("javax.net.ssl.keyStorePassword", PASSWORD); + System.setProperty("javax.net.ssl.trustStore", KEYSTORE); + System.setProperty("javax.net.ssl.trustStorePassword", PASSWORD); + + Handler handler = new Handler(); + + try (Http2TestServer server = new Http2TestServer(true, 0, handler)) { + server.start(); + + int port = server.getAddress().getPort(); + String uriString = "https://127.0.0.1:" + Integer.toString(port); + + // run test cases + boolean success = true; + + SSLParameters parameters = null; + success &= expectFailure( + "Test #1: SSL parameters is null, expect NPE", + () -> connect(uriString, parameters), + NullPointerException.class); + + success &= expectSuccess( + "Test #2: default SSL parameters, " + + "expect successful connection", + () -> connect(uriString, new SSLParameters())); + success &= checkProtocol(handler.getSSLSession(), "TLSv1.2"); + + // set SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA cipher suite + // which has less priority in default cipher suite list + success &= expectSuccess( + "Test #3: SSL parameters with " + + "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA cipher suite, " + + "expect successful connection", + () -> connect(uriString, new SSLParameters( + new String[] { "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA" }))); + success &= checkProtocol(handler.getSSLSession(), "TLSv1.2"); + success &= checkCipherSuite(handler.getSSLSession(), + "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA"); + + // set TLS_RSA_WITH_AES_128_CBC_SHA cipher suite + // which has less priority in default cipher suite list + // also set TLSv11 protocol + success &= expectSuccess( + "Test #4: SSL parameters with " + + "TLS_RSA_WITH_AES_128_CBC_SHA cipher suite," + + " expect successful connection", + () -> connect(uriString, new SSLParameters( + new String[] { "TLS_RSA_WITH_AES_128_CBC_SHA" }, + new String[] { "TLSv1.1" }))); + success &= checkProtocol(handler.getSSLSession(), "TLSv1.1"); + success &= checkCipherSuite(handler.getSSLSession(), + "TLS_RSA_WITH_AES_128_CBC_SHA"); + + if (success) { + System.out.println("Test passed"); + } else { + throw new RuntimeException("At least one test case failed"); + } + } + } + + private static interface Test { + + public void run() throws Exception; + } + + private static class Handler implements Http2Handler { + + private static final byte[] BODY = "Test response".getBytes(); + + private volatile SSLSession sslSession; + + @Override + public void handle(Http2TestExchange t) throws IOException { + System.out.println("Handler: received request to " + + t.getRequestURI()); + + try (InputStream is = t.getRequestBody()) { + byte[] body = is.readAllBytes(); + System.out.println("Handler: read " + body.length + + " bytes of body: "); + System.out.println(new String(body)); + } + + try (OutputStream os = t.getResponseBody()) { + t.sendResponseHeaders(200, BODY.length); + os.write(BODY); + } + + sslSession = t.getSSLSession(); + } + + SSLSession getSSLSession() { + return sslSession; + } + } + + private static void connect(String uriString, SSLParameters sslParameters) + throws URISyntaxException, IOException, InterruptedException { + + String body = HttpClient.create() + .sslParameters(sslParameters) + .version(HttpClient.Version.HTTP_2) + .build() + .request(new URI(uriString)) + .body(HttpRequest.fromString("body")) + .GET() + .response() + .body(HttpResponse.asString()); + + System.out.println("Response: " + body); + } + + private static boolean checkProtocol(SSLSession session, String protocol) { + if (session == null) { + System.out.println("Check protocol: no session provided"); + return false; + } + + System.out.println("Check protocol: negotiated protocol: " + + session.getProtocol()); + System.out.println("Check protocol: expected protocol: " + + protocol); + if (!protocol.equals(session.getProtocol())) { + System.out.println("Check protocol: unexpected negotiated protocol"); + return false; + } + + return true; + } + + private static boolean checkCipherSuite(SSLSession session, String ciphersuite) { + if (session == null) { + System.out.println("Check protocol: no session provided"); + return false; + } + + System.out.println("Check protocol: negotiated ciphersuite: " + + session.getCipherSuite()); + System.out.println("Check protocol: expected ciphersuite: " + + ciphersuite); + if (!ciphersuite.equals(session.getCipherSuite())) { + System.out.println("Check protocol: unexpected negotiated ciphersuite"); + return false; + } + + return true; + } + + private static boolean expectSuccess(String message, Test test) { + System.out.println(message); + try { + test.run(); + System.out.println("Passed"); + return true; + } catch (Exception e) { + System.out.println("Failed: unexpected exception:"); + e.printStackTrace(System.out); + return false; + } + } + + private static boolean expectFailure(String message, Test test, + Class expectedException) { + + System.out.println(message); + try { + test.run(); + System.out.println("Failed: unexpected successful connection"); + return false; + } catch (Exception e) { + System.out.println("Got an exception:"); + e.printStackTrace(System.out); + if (expectedException != null + && !expectedException.isAssignableFrom(e.getClass())) { + System.out.printf("Failed: expected %s, but got %s%n", + expectedException.getName(), + e.getClass().getName()); + return false; + } + System.out.println("Passed: expected exception"); + return true; + } + } + +} diff --git a/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestServer.java b/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestServer.java index 667a1d6ec55..3baefe142bb 100644 --- a/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestServer.java +++ b/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestServer.java @@ -42,7 +42,7 @@ import javax.net.ssl.SSLServerSocketFactory; * Http2Handler on additional threads. All threads * obtained from the supplied ExecutorService. */ -public class Http2TestServer { +public class Http2TestServer implements AutoCloseable { final ServerSocket server; boolean secure; SettingsFrame serverSettings, clientSettings; @@ -156,4 +156,9 @@ public class Http2TestServer { }); } + @Override + public void close() throws Exception { + stop(); + } + } diff --git a/jdk/test/java/nio/Buffer/Basic-X.java.template b/jdk/test/java/nio/Buffer/Basic-X.java.template index 5e96b454b1b..d578b1366d3 100644 --- a/jdk/test/java/nio/Buffer/Basic-X.java.template +++ b/jdk/test/java/nio/Buffer/Basic-X.java.template @@ -31,7 +31,6 @@ #warn This file is preprocessed before being compiled import java.nio.*; -import java.lang.reflect.Method; public class Basic$Type$ @@ -60,7 +59,6 @@ public class Basic$Type$ private static void relGet($Type$Buffer b) { int n = b.capacity(); - $type$ v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)(($type$)ic(i))); b.rewind(); @@ -68,7 +66,6 @@ public class Basic$Type$ private static void relGet($Type$Buffer b, int start) { int n = b.remaining(); - $type$ v; for (int i = start; i < n; i++) ck(b, (long)b.get(), (long)(($type$)ic(i))); b.rewind(); @@ -76,7 +73,6 @@ public class Basic$Type$ private static void absGet($Type$Buffer b) { int n = b.capacity(); - $type$ v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)(($type$)ic(i))); b.rewind(); @@ -86,8 +82,9 @@ public class Basic$Type$ int n = b.capacity(); $type$[] a = new $type$[n + 7]; b.get(a, 7, n); - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, (long)a[i + 7], (long)(($type$)ic(i))); + } } private static void relPut($Type$Buffer b) { @@ -178,7 +175,7 @@ public class Basic$Type$ private static void bulkPutString($Type$Buffer b) { int n = b.capacity(); b.clear(); - StringBuffer sb = new StringBuffer(n + 7); + StringBuilder sb = new StringBuilder(n + 7); sb.append("1234567"); for (int i = 0; i < n; i++) sb.append((char)ic(i)); @@ -203,13 +200,14 @@ public class Basic$Type$ private static void checkBytes(ByteBuffer b, byte[] bs) { int n = bs.length; int p = b.position(); - byte v; if (b.order() == ByteOrder.BIG_ENDIAN) { - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, b.get(), bs[i]); + } } else { - for (int i = n - 1; i >= 0; i--) + for (int i = n - 1; i >= 0; i--) { ck(b, b.get(), bs[i]); + } } b.position(p); } @@ -217,7 +215,7 @@ public class Basic$Type$ private static void compact(Buffer b) { try { Class cl = b.getClass(); - Method m = cl.getDeclaredMethod("compact"); + java.lang.reflect.Method m = cl.getDeclaredMethod("compact"); m.setAccessible(true); m.invoke(b); } catch (Exception e) { @@ -226,12 +224,11 @@ public class Basic$Type$ } private static void checkInvalidMarkException(final Buffer b) { - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { + tryCatch(b, InvalidMarkException.class, () -> { b.mark(); compact(b); b.reset(); - }}); + }); } private static void testViews(int level, ByteBuffer b, boolean direct) { @@ -338,41 +335,50 @@ public class Basic$Type$ private static void testAlign(final ByteBuffer b, boolean direct) { // index out-of bounds - tryCatch(b, IllegalArgumentException.class, () -> b.alignmentOffset(-1, (short) 1)); + catchIllegalArgument(b, () -> b.alignmentOffset(-1, (short) 1)); // unit size values - tryCatch(b, IllegalArgumentException.class, () -> b.alignmentOffset(0, (short) 0)); + catchIllegalArgument(b, () -> b.alignmentOffset(0, (short) 0)); for (int us = 1; us < 65; us++) { int _us = us; if ((us & (us - 1)) != 0) { // unit size not a power of two - tryCatch(b, IllegalArgumentException.class, () -> b.alignmentOffset(0, _us)); + catchIllegalArgument(b, () -> b.alignmentOffset(0, _us)); } else { if (direct || us <= 8) { b.alignmentOffset(0, us); } else { // unit size > 8 with non-direct buffer - tryCatch(b, UnsupportedOperationException.class, () -> b.alignmentOffset(0, _us)); + tryCatch(b, UnsupportedOperationException.class, + () -> b.alignmentOffset(0, _us)); } } } // Probe for long misalignment at index zero for a newly created buffer - ByteBuffer empty = direct ? ByteBuffer.allocateDirect(0) : ByteBuffer.allocate(0); + ByteBuffer empty = + direct ? ByteBuffer.allocateDirect(0) : ByteBuffer.allocate(0); int longMisalignmentAtZero = empty.alignmentOffset(0, 8); if (direct) { // Freshly created direct byte buffers should be aligned at index 0 // for ref and primitive values (see Unsafe.allocateMemory) - if (longMisalignmentAtZero != 0) - fail("Direct byte buffer misalligned at index 0 for ref and primitive values " + longMisalignmentAtZero); + if (longMisalignmentAtZero != 0) { + fail("Direct byte buffer misaligned at index 0" + + " for ref and primitive values " + + longMisalignmentAtZero); + } } else { // For heap byte buffers misalignment may occur on 32-bit systems // where Unsafe.ARRAY_BYTE_BASE_OFFSET % 8 == 4 and not 0 // Note the GC will preserve alignment of the base address of the // array - if (jdk.internal.misc.Unsafe.ARRAY_BYTE_BASE_OFFSET % 8 != longMisalignmentAtZero) - fail("Heap byte buffer misalligned at index 0 for ref and primitive values " + longMisalignmentAtZero); + if (jdk.internal.misc.Unsafe.ARRAY_BYTE_BASE_OFFSET % 8 + != longMisalignmentAtZero) { + fail("Heap byte buffer misaligned at index 0" + + " for ref and primitive values " + + longMisalignmentAtZero); + } } // Ensure test buffer is correctly aligned at index 0 @@ -385,8 +391,10 @@ public class Basic$Type$ int am = b.alignmentOffset(i, us); int expectedAm = (longMisalignmentAtZero + i) % us; - if (am != expectedAm) - fail(String.format("b.alignmentOffset(%d, %d) == %d incorrect, expected %d", i, us, am, expectedAm)); + if (am != expectedAm) { + String f = "b.alignmentOffset(%d, %d) == %d incorrect, expected %d"; + fail(String.format(f, i, us, am, expectedAm)); + } } } @@ -395,8 +403,10 @@ public class Basic$Type$ int al = b.limit() - b.alignmentOffset(b.limit(), 8); ByteBuffer ab = b.position(ap).limit(al). slice(); - if (ab.limit() == 0) - fail("Test input buffer not sufficiently sized to cover an aligned region for all values", b); + if (ab.limit() == 0) { + fail("Test input buffer not sufficiently sized to cover" + + " an aligned region for all values", b); + } if (ab.alignmentOffset(0, 8) != 0) fail("Aligned test input buffer not correctly aligned at index 0", ab); @@ -428,8 +438,9 @@ public class Basic$Type$ l = l - l_mod; int ec = l - p; - if (as.limit() != ec) + if (as.limit() != ec) { fail("Buffer capacity incorrect, expected: " + ec, as); + } } } } @@ -441,6 +452,22 @@ public class Basic$Type$ fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } + private static void catchIllegalArgument(Buffer b, Runnable thunk) { + tryCatch(b, IllegalArgumentException.class, thunk); + } + + private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) { + tryCatch(b, ReadOnlyBufferException.class, thunk); + } + + private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) { + tryCatch(b, IndexOutOfBoundsException.class, thunk); + } + + private static void catchIndexOutOfBounds($type$[] t, Runnable thunk) { + tryCatch(t, IndexOutOfBoundsException.class, thunk); + } + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { @@ -452,11 +479,12 @@ public class Basic$Type$ fail(x.getMessage() + " not expected"); } } - if (!caught) + if (!caught) { fail(ex.getName() + " not thrown", b); + } } - private static void tryCatch($type$ [] t, Class ex, Runnable thunk) { + private static void tryCatch($type$[] t, Class ex, Runnable thunk) { tryCatch($Type$Buffer.wrap(t), ex, thunk); } @@ -513,11 +541,9 @@ public class Basic$Type$ // 7190219 b.clear(); int pos = b.position(); - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put(String.valueOf(new char[b.capacity() + 1]), 0, - b.capacity() + 1); - }}); + tryCatch(b, BufferOverflowException.class, () -> + b.put(String.valueOf(new char[b.capacity() + 1]), 0, b.capacity() + 1) + ); ck(b, b.position(), pos); relGet(b); @@ -537,38 +563,14 @@ public class Basic$Type$ b.limit(b.capacity() / 2); b.position(b.limit()); - tryCatch(b, BufferUnderflowException.class, new Runnable() { - public void run() { - b.get(); - }}); - - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put(($type$)42); - }}); - - // The index must be non-negative and lesss than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.put(b.limit(), ($type$)42); - }}); - - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { - b.position(0); - b.mark(); - b.compact(); - b.reset(); - }}); + tryCatch(b, BufferUnderflowException.class, () -> b.get()); + tryCatch(b, BufferOverflowException.class, () -> b.put(($type$)42)); + // The index must be non-negative and less than the buffer's limit. + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); + catchIndexOutOfBounds(b, () -> b.put(b.limit(), ($type$)42)); + tryCatch(b, InvalidMarkException.class, + () -> b.position(0).mark().compact().reset()); try { b.position(b.limit() + 1); @@ -635,7 +637,6 @@ public class Basic$Type$ b.put(0.5121609353879392); // Changes value if incorrectly swapped #end[double] - $type$ v; b.flip(); ck(b, b.get(), 0); ck(b, b.get(), ($type$)-1); @@ -644,23 +645,27 @@ public class Basic$Type$ ck(b, b.get(), $Fulltype$.MIN_VALUE); #if[float] + $type$ v; ck(b, b.get(), -Float.MAX_VALUE); ck(b, b.get(), -Float.MIN_VALUE); ck(b, b.get(), Float.NEGATIVE_INFINITY); ck(b, b.get(), Float.POSITIVE_INFINITY); if (Float.floatToRawIntBits(v = b.get()) != - Float.floatToRawIntBits(Float.NaN)) + Float.floatToRawIntBits(Float.NaN)) { fail(b, (long)Float.NaN, (long)v); + } ck(b, b.get(), 0.91697687f); #end[float] #if[double] + $type$ v; ck(b, b.get(), -Double.MAX_VALUE); ck(b, b.get(), -Double.MIN_VALUE); ck(b, b.get(), Double.NEGATIVE_INFINITY); ck(b, b.get(), Double.POSITIVE_INFINITY); if (Double.doubleToRawLongBits(v = b.get()) - != Double.doubleToRawLongBits(Double.NaN)) + != Double.doubleToRawLongBits(Double.NaN)) { fail(b, (long)Double.NaN, (long)v); + } ck(b, b.get(), 0.5121609353879392); #end[double] @@ -683,14 +688,15 @@ public class Basic$Type$ #if[float] || Float.compare(x, y) != 0 #end[float] - ) + ) { out.println("[" + i + "] " + x + " != " + y); + } } fail("Identical buffers not equal", b, b2); } - if (b.compareTo(b2) != 0) + if (b.compareTo(b2) != 0) { fail("Comparison to identical buffer != 0", b, b2); - + } b.limit(b.limit() + 1); b.position(b.limit() - 1); b.put(($type$)99); @@ -714,7 +720,7 @@ public class Basic$Type$ if (xb.compareTo(xb) != 0) { fail("compareTo not reflexive", xb, xb, x, x); } - if (! xb.equals(xb)) { + if (!xb.equals(xb)) { fail("equals not reflexive", xb, xb, x, x); } for ($type$ y : VALUES) { @@ -765,9 +771,10 @@ public class Basic$Type$ if (!sb.equals(sb2)) fail("Sliced slices do not match", sb, sb2); - if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) + if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) { fail("Array offsets do not match: " + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2); + } #if[byte] @@ -808,129 +815,49 @@ public class Basic$Type$ fail("Buffer not equal to read-only view", b, rb); show(level + 1, rb); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - relPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - absPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutArray(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutBuffer(rb); - }}); + catchReadOnlyBuffer(b, () -> relPut(rb)); + catchReadOnlyBuffer(b, () -> absPut(rb)); + catchReadOnlyBuffer(b, () -> bulkPutArray(rb)); + catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb)); // put($Type$Buffer) should not change source position final $Type$Buffer src = $Type$Buffer.allocate(1); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.put(src); - }}); + catchReadOnlyBuffer(b, () -> rb.put(src)); ck(src, src.position(), 0); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.compact(); - }}); + catchReadOnlyBuffer(b, () -> rb.compact()); #if[byte] - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putChar((char)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putChar(0, (char)1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putShort((short)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putShort(0, (short)1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putInt(1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putInt(0, 1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putLong((long)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putLong(0, (long)1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putFloat((float)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putFloat(0, (float)1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putDouble((double)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putDouble(0, (double)1); - }}); + catchReadOnlyBuffer(b, () -> rb.putChar((char)1)); + catchReadOnlyBuffer(b, () -> rb.putChar(0, (char)1)); + catchReadOnlyBuffer(b, () -> rb.putShort((short)1)); + catchReadOnlyBuffer(b, () -> rb.putShort(0, (short)1)); + catchReadOnlyBuffer(b, () -> rb.putInt(1)); + catchReadOnlyBuffer(b, () -> rb.putInt(0, 1)); + catchReadOnlyBuffer(b, () -> rb.putLong((long)1)); + catchReadOnlyBuffer(b, () -> rb.putLong(0, (long)1)); + catchReadOnlyBuffer(b, () -> rb.putFloat((float)1)); + catchReadOnlyBuffer(b, () -> rb.putFloat(0, (float)1)); + catchReadOnlyBuffer(b, () -> rb.putDouble((double)1)); + catchReadOnlyBuffer(b, () -> rb.putDouble(0, (double)1)); #end[byte] #if[char] // 7199551 - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - String s = new String(new char[rb.remaining() + 1]); - rb.put(s); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - String s = new String(new char[rb.remaining() + 1]); - rb.append(s); - }}); + catchReadOnlyBuffer(b, () -> rb.put(new String(new char[rb.remaining() + 1]))); + catchReadOnlyBuffer(b, () -> rb.append(new String(new char[rb.remaining() + 1]))); #end[char] if (rb.getClass().getName().startsWith("java.nio.Heap")) { - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.array(); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.arrayOffset(); - }}); - - if (rb.hasArray()) - fail("Read-only heap buffer's backing array is accessible", - rb); - + catchReadOnlyBuffer(b, () -> rb.array()); + catchReadOnlyBuffer(b, () -> rb.arrayOffset()); + if (rb.hasArray()) { + fail("Read-only heap buffer's backing array is accessible", rb); + } } // Bulk puts from read-only buffers @@ -969,10 +896,7 @@ public class Basic$Type$ ck(b, b.toString().equals(s.substring(start, end))); ck(b, b.toString().equals("defghi")); ck(b, b.isReadOnly()); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - b.put('x'); - }}); + catchReadOnlyBuffer(b, () -> b.put('x')); ck(b, start, b.position()); ck(b, end, b.limit()); ck(b, s.length(), b.capacity()); @@ -981,63 +905,25 @@ public class Basic$Type$ // The index, relative to the position, must be non-negative and // smaller than remaining(). - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.charAt(-1); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.charAt(b.remaining()); - }}); - + catchIndexOutOfBounds(b, () -> b.charAt(-1)); + catchIndexOutOfBounds(b, () -> b.charAt(b.remaining())); // The index must be non-negative and less than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); // The start must be non-negative and no larger than remaining(). - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.subSequence(-1, b.remaining()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.subSequence(b.remaining() + 1, b.remaining()); - }}); + catchIndexOutOfBounds(b, () -> b.subSequence(-1, b.remaining())); + catchIndexOutOfBounds(b, () -> b.subSequence(b.remaining() + 1, b.remaining())); // The end must be no smaller than start and no larger than // remaining(). - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.subSequence(2, 1); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.subSequence(0, b.remaining() + 1); - }}); + catchIndexOutOfBounds(b, () -> b.subSequence(2, 1)); + catchIndexOutOfBounds(b, () -> b.subSequence(0, b.remaining() + 1)); // The offset must be non-negative and no larger than . - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(s, -1, s.length()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(s, s.length() + 1, s.length()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(s, 1, 0); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(s, 0, s.length() + 1); - }}); + catchIndexOutOfBounds(b, () -> $Type$Buffer.wrap(s, -1, s.length())); + catchIndexOutOfBounds(b, () -> $Type$Buffer.wrap(s, s.length() + 1, s.length())); + catchIndexOutOfBounds(b, () -> $Type$Buffer.wrap(s, 1, 0)); + catchIndexOutOfBounds(b, () -> $Type$Buffer.wrap(s, 0, s.length() + 1)); } #end[char] @@ -1052,40 +938,21 @@ public class Basic$Type$ ck(b, b.limit(), offset + length); // The offset must be non-negative and no larger than . - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(ba, -1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(ba, ba.length + 1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(ba, 0, -1); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(ba, 0, ba.length + 1); - }}); + catchIndexOutOfBounds(ba, () -> $Type$Buffer.wrap(ba, -1, ba.length)); + catchIndexOutOfBounds(ba, () -> $Type$Buffer.wrap(ba, ba.length + 1, ba.length)); + catchIndexOutOfBounds(ba, () -> $Type$Buffer.wrap(ba, 0, -1)); + catchIndexOutOfBounds(ba, () -> $Type$Buffer.wrap(ba, 0, ba.length + 1)); // A NullPointerException will be thrown if the array is null. - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(($type$ []) null, 0, 5); - }}); - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - $Type$Buffer.wrap(($type$ []) null); - }}); + tryCatch(ba, NullPointerException.class, + () -> $Type$Buffer.wrap(($type$ []) null, 0, 5)); + tryCatch(ba, NullPointerException.class, + () -> $Type$Buffer.wrap(($type$ []) null)); } private static void testAllocate() { // An IllegalArgumentException will be thrown for negative capacities. - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - $Type$Buffer.allocate(-1); - }}); + catchIllegalArgument((Buffer) null, () -> $Type$Buffer.allocate(-1)); try { $Type$Buffer.allocate(-1); } catch (IllegalArgumentException e) { @@ -1095,10 +962,7 @@ public class Basic$Type$ } } #if[byte] - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - $Type$Buffer.allocateDirect(-1); - }}); + catchIllegalArgument((Buffer) null, () -> $Type$Buffer.allocateDirect(-1)); try { $Type$Buffer.allocateDirect(-1); } catch (IllegalArgumentException e) { diff --git a/jdk/test/java/nio/Buffer/BasicByte.java b/jdk/test/java/nio/Buffer/BasicByte.java index 2d165449fa6..039dde39eb0 100644 --- a/jdk/test/java/nio/Buffer/BasicByte.java +++ b/jdk/test/java/nio/Buffer/BasicByte.java @@ -31,7 +31,6 @@ // -- This file was mechanically generated: Do not edit! -- // import java.nio.*; -import java.lang.reflect.Method; public class BasicByte @@ -60,7 +59,6 @@ public class BasicByte private static void relGet(ByteBuffer b) { int n = b.capacity(); - byte v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((byte)ic(i))); b.rewind(); @@ -68,7 +66,6 @@ public class BasicByte private static void relGet(ByteBuffer b, int start) { int n = b.remaining(); - byte v; for (int i = start; i < n; i++) ck(b, (long)b.get(), (long)((byte)ic(i))); b.rewind(); @@ -76,7 +73,6 @@ public class BasicByte private static void absGet(ByteBuffer b) { int n = b.capacity(); - byte v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((byte)ic(i))); b.rewind(); @@ -86,8 +82,9 @@ public class BasicByte int n = b.capacity(); byte[] a = new byte[n + 7]; b.get(a, 7, n); - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, (long)a[i + 7], (long)((byte)ic(i))); + } } private static void relPut(ByteBuffer b) { @@ -203,13 +200,14 @@ public class BasicByte private static void checkBytes(ByteBuffer b, byte[] bs) { int n = bs.length; int p = b.position(); - byte v; if (b.order() == ByteOrder.BIG_ENDIAN) { - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, b.get(), bs[i]); + } } else { - for (int i = n - 1; i >= 0; i--) + for (int i = n - 1; i >= 0; i--) { ck(b, b.get(), bs[i]); + } } b.position(p); } @@ -217,7 +215,7 @@ public class BasicByte private static void compact(Buffer b) { try { Class cl = b.getClass(); - Method m = cl.getDeclaredMethod("compact"); + java.lang.reflect.Method m = cl.getDeclaredMethod("compact"); m.setAccessible(true); m.invoke(b); } catch (Exception e) { @@ -226,12 +224,11 @@ public class BasicByte } private static void checkInvalidMarkException(final Buffer b) { - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { + tryCatch(b, InvalidMarkException.class, () -> { b.mark(); compact(b); b.reset(); - }}); + }); } private static void testViews(int level, ByteBuffer b, boolean direct) { @@ -338,41 +335,50 @@ public class BasicByte private static void testAlign(final ByteBuffer b, boolean direct) { // index out-of bounds - tryCatch(b, IllegalArgumentException.class, () -> b.alignmentOffset(-1, (short) 1)); + catchIllegalArgument(b, () -> b.alignmentOffset(-1, (short) 1)); // unit size values - tryCatch(b, IllegalArgumentException.class, () -> b.alignmentOffset(0, (short) 0)); + catchIllegalArgument(b, () -> b.alignmentOffset(0, (short) 0)); for (int us = 1; us < 65; us++) { int _us = us; if ((us & (us - 1)) != 0) { // unit size not a power of two - tryCatch(b, IllegalArgumentException.class, () -> b.alignmentOffset(0, _us)); + catchIllegalArgument(b, () -> b.alignmentOffset(0, _us)); } else { if (direct || us <= 8) { b.alignmentOffset(0, us); } else { // unit size > 8 with non-direct buffer - tryCatch(b, UnsupportedOperationException.class, () -> b.alignmentOffset(0, _us)); + tryCatch(b, UnsupportedOperationException.class, + () -> b.alignmentOffset(0, _us)); } } } // Probe for long misalignment at index zero for a newly created buffer - ByteBuffer empty = direct ? ByteBuffer.allocateDirect(0) : ByteBuffer.allocate(0); + ByteBuffer empty = + direct ? ByteBuffer.allocateDirect(0) : ByteBuffer.allocate(0); int longMisalignmentAtZero = empty.alignmentOffset(0, 8); if (direct) { // Freshly created direct byte buffers should be aligned at index 0 // for ref and primitive values (see Unsafe.allocateMemory) - if (longMisalignmentAtZero != 0) - fail("Direct byte buffer misalligned at index 0 for ref and primitive values " + longMisalignmentAtZero); + if (longMisalignmentAtZero != 0) { + fail("Direct byte buffer misaligned at index 0" + + " for ref and primitive values " + + longMisalignmentAtZero); + } } else { // For heap byte buffers misalignment may occur on 32-bit systems // where Unsafe.ARRAY_BYTE_BASE_OFFSET % 8 == 4 and not 0 // Note the GC will preserve alignment of the base address of the // array - if (jdk.internal.misc.Unsafe.ARRAY_BYTE_BASE_OFFSET % 8 != longMisalignmentAtZero) - fail("Heap byte buffer misalligned at index 0 for ref and primitive values " + longMisalignmentAtZero); + if (jdk.internal.misc.Unsafe.ARRAY_BYTE_BASE_OFFSET % 8 + != longMisalignmentAtZero) { + fail("Heap byte buffer misaligned at index 0" + + " for ref and primitive values " + + longMisalignmentAtZero); + } } // Ensure test buffer is correctly aligned at index 0 @@ -385,8 +391,10 @@ public class BasicByte int am = b.alignmentOffset(i, us); int expectedAm = (longMisalignmentAtZero + i) % us; - if (am != expectedAm) - fail(String.format("b.alignmentOffset(%d, %d) == %d incorrect, expected %d", i, us, am, expectedAm)); + if (am != expectedAm) { + String f = "b.alignmentOffset(%d, %d) == %d incorrect, expected %d"; + fail(String.format(f, i, us, am, expectedAm)); + } } } @@ -395,8 +403,10 @@ public class BasicByte int al = b.limit() - b.alignmentOffset(b.limit(), 8); ByteBuffer ab = b.position(ap).limit(al). slice(); - if (ab.limit() == 0) - fail("Test input buffer not sufficiently sized to cover an aligned region for all values", b); + if (ab.limit() == 0) { + fail("Test input buffer not sufficiently sized to cover" + + " an aligned region for all values", b); + } if (ab.alignmentOffset(0, 8) != 0) fail("Aligned test input buffer not correctly aligned at index 0", ab); @@ -428,8 +438,9 @@ public class BasicByte l = l - l_mod; int ec = l - p; - if (as.limit() != ec) + if (as.limit() != ec) { fail("Buffer capacity incorrect, expected: " + ec, as); + } } } } @@ -441,6 +452,22 @@ public class BasicByte fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } + private static void catchIllegalArgument(Buffer b, Runnable thunk) { + tryCatch(b, IllegalArgumentException.class, thunk); + } + + private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) { + tryCatch(b, ReadOnlyBufferException.class, thunk); + } + + private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) { + tryCatch(b, IndexOutOfBoundsException.class, thunk); + } + + private static void catchIndexOutOfBounds(byte[] t, Runnable thunk) { + tryCatch(t, IndexOutOfBoundsException.class, thunk); + } + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { @@ -452,11 +479,12 @@ public class BasicByte fail(x.getMessage() + " not expected"); } } - if (!caught) + if (!caught) { fail(ex.getName() + " not thrown", b); + } } - private static void tryCatch(byte [] t, Class ex, Runnable thunk) { + private static void tryCatch(byte[] t, Class ex, Runnable thunk) { tryCatch(ByteBuffer.wrap(t), ex, thunk); } @@ -518,8 +546,6 @@ public class BasicByte - - @@ -537,38 +563,14 @@ public class BasicByte b.limit(b.capacity() / 2); b.position(b.limit()); - tryCatch(b, BufferUnderflowException.class, new Runnable() { - public void run() { - b.get(); - }}); - - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put((byte)42); - }}); - - // The index must be non-negative and lesss than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.put(b.limit(), (byte)42); - }}); - - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { - b.position(0); - b.mark(); - b.compact(); - b.reset(); - }}); + tryCatch(b, BufferUnderflowException.class, () -> b.get()); + tryCatch(b, BufferOverflowException.class, () -> b.put((byte)42)); + // The index must be non-negative and less than the buffer's limit. + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); + catchIndexOutOfBounds(b, () -> b.put(b.limit(), (byte)42)); + tryCatch(b, InvalidMarkException.class, + () -> b.position(0).mark().compact().reset()); try { b.position(b.limit() + 1); @@ -635,7 +637,6 @@ public class BasicByte - byte v; b.flip(); ck(b, b.get(), 0); ck(b, b.get(), (byte)-1); @@ -660,6 +661,10 @@ public class BasicByte + + + + @@ -683,14 +688,15 @@ public class BasicByte - ) + ) { out.println("[" + i + "] " + x + " != " + y); + } } fail("Identical buffers not equal", b, b2); } - if (b.compareTo(b2) != 0) + if (b.compareTo(b2) != 0) { fail("Comparison to identical buffer != 0", b, b2); - + } b.limit(b.limit() + 1); b.position(b.limit() - 1); b.put((byte)99); @@ -714,7 +720,7 @@ public class BasicByte if (xb.compareTo(xb) != 0) { fail("compareTo not reflexive", xb, xb, x, x); } - if (! xb.equals(xb)) { + if (!xb.equals(xb)) { fail("equals not reflexive", xb, xb, x, x); } for (byte y : VALUES) { @@ -765,9 +771,10 @@ public class BasicByte if (!sb.equals(sb2)) fail("Sliced slices do not match", sb, sb2); - if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) + if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) { fail("Array offsets do not match: " + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2); + } @@ -808,102 +815,32 @@ public class BasicByte fail("Buffer not equal to read-only view", b, rb); show(level + 1, rb); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - relPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - absPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutArray(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutBuffer(rb); - }}); + catchReadOnlyBuffer(b, () -> relPut(rb)); + catchReadOnlyBuffer(b, () -> absPut(rb)); + catchReadOnlyBuffer(b, () -> bulkPutArray(rb)); + catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb)); // put(ByteBuffer) should not change source position final ByteBuffer src = ByteBuffer.allocate(1); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.put(src); - }}); + catchReadOnlyBuffer(b, () -> rb.put(src)); ck(src, src.position(), 0); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.compact(); - }}); - - - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putChar((char)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putChar(0, (char)1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putShort((short)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putShort(0, (short)1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putInt(1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putInt(0, 1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putLong((long)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putLong(0, (long)1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putFloat((float)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putFloat(0, (float)1); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putDouble((double)1); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.putDouble(0, (double)1); - }}); - - - - - + catchReadOnlyBuffer(b, () -> rb.compact()); + catchReadOnlyBuffer(b, () -> rb.putChar((char)1)); + catchReadOnlyBuffer(b, () -> rb.putChar(0, (char)1)); + catchReadOnlyBuffer(b, () -> rb.putShort((short)1)); + catchReadOnlyBuffer(b, () -> rb.putShort(0, (short)1)); + catchReadOnlyBuffer(b, () -> rb.putInt(1)); + catchReadOnlyBuffer(b, () -> rb.putInt(0, 1)); + catchReadOnlyBuffer(b, () -> rb.putLong((long)1)); + catchReadOnlyBuffer(b, () -> rb.putLong(0, (long)1)); + catchReadOnlyBuffer(b, () -> rb.putFloat((float)1)); + catchReadOnlyBuffer(b, () -> rb.putFloat(0, (float)1)); + catchReadOnlyBuffer(b, () -> rb.putDouble((double)1)); + catchReadOnlyBuffer(b, () -> rb.putDouble(0, (double)1)); @@ -916,21 +853,11 @@ public class BasicByte if (rb.getClass().getName().startsWith("java.nio.Heap")) { - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.array(); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.arrayOffset(); - }}); - - if (rb.hasArray()) - fail("Read-only heap buffer's backing array is accessible", - rb); - + catchReadOnlyBuffer(b, () -> rb.array()); + catchReadOnlyBuffer(b, () -> rb.arrayOffset()); + if (rb.hasArray()) { + fail("Read-only heap buffer's backing array is accessible", rb); + } } // Bulk puts from read-only buffers @@ -980,47 +907,6 @@ public class BasicByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1052,40 +938,21 @@ public class BasicByte ck(b, b.limit(), offset + length); // The offset must be non-negative and no larger than . - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - ByteBuffer.wrap(ba, -1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - ByteBuffer.wrap(ba, ba.length + 1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - ByteBuffer.wrap(ba, 0, -1); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - ByteBuffer.wrap(ba, 0, ba.length + 1); - }}); + catchIndexOutOfBounds(ba, () -> ByteBuffer.wrap(ba, -1, ba.length)); + catchIndexOutOfBounds(ba, () -> ByteBuffer.wrap(ba, ba.length + 1, ba.length)); + catchIndexOutOfBounds(ba, () -> ByteBuffer.wrap(ba, 0, -1)); + catchIndexOutOfBounds(ba, () -> ByteBuffer.wrap(ba, 0, ba.length + 1)); // A NullPointerException will be thrown if the array is null. - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - ByteBuffer.wrap((byte []) null, 0, 5); - }}); - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - ByteBuffer.wrap((byte []) null); - }}); + tryCatch(ba, NullPointerException.class, + () -> ByteBuffer.wrap((byte []) null, 0, 5)); + tryCatch(ba, NullPointerException.class, + () -> ByteBuffer.wrap((byte []) null)); } private static void testAllocate() { // An IllegalArgumentException will be thrown for negative capacities. - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - ByteBuffer.allocate(-1); - }}); + catchIllegalArgument((Buffer) null, () -> ByteBuffer.allocate(-1)); try { ByteBuffer.allocate(-1); } catch (IllegalArgumentException e) { @@ -1095,10 +962,7 @@ public class BasicByte } } - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - ByteBuffer.allocateDirect(-1); - }}); + catchIllegalArgument((Buffer) null, () -> ByteBuffer.allocateDirect(-1)); try { ByteBuffer.allocateDirect(-1); } catch (IllegalArgumentException e) { diff --git a/jdk/test/java/nio/Buffer/BasicChar.java b/jdk/test/java/nio/Buffer/BasicChar.java index b8dc950b68c..a059aa9c3bb 100644 --- a/jdk/test/java/nio/Buffer/BasicChar.java +++ b/jdk/test/java/nio/Buffer/BasicChar.java @@ -31,7 +31,6 @@ // -- This file was mechanically generated: Do not edit! -- // import java.nio.*; -import java.lang.reflect.Method; public class BasicChar @@ -60,7 +59,6 @@ public class BasicChar private static void relGet(CharBuffer b) { int n = b.capacity(); - char v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((char)ic(i))); b.rewind(); @@ -68,7 +66,6 @@ public class BasicChar private static void relGet(CharBuffer b, int start) { int n = b.remaining(); - char v; for (int i = start; i < n; i++) ck(b, (long)b.get(), (long)((char)ic(i))); b.rewind(); @@ -76,7 +73,6 @@ public class BasicChar private static void absGet(CharBuffer b) { int n = b.capacity(); - char v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((char)ic(i))); b.rewind(); @@ -86,8 +82,9 @@ public class BasicChar int n = b.capacity(); char[] a = new char[n + 7]; b.get(a, 7, n); - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, (long)a[i + 7], (long)((char)ic(i))); + } } private static void relPut(CharBuffer b) { @@ -178,7 +175,7 @@ public class BasicChar private static void bulkPutString(CharBuffer b) { int n = b.capacity(); b.clear(); - StringBuffer sb = new StringBuffer(n + 7); + StringBuilder sb = new StringBuilder(n + 7); sb.append("1234567"); for (int i = 0; i < n; i++) sb.append((char)ic(i)); @@ -420,6 +417,20 @@ public class BasicChar + + + + + + + + + + + + + + @@ -441,6 +452,22 @@ public class BasicChar fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } + private static void catchIllegalArgument(Buffer b, Runnable thunk) { + tryCatch(b, IllegalArgumentException.class, thunk); + } + + private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) { + tryCatch(b, ReadOnlyBufferException.class, thunk); + } + + private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) { + tryCatch(b, IndexOutOfBoundsException.class, thunk); + } + + private static void catchIndexOutOfBounds(char[] t, Runnable thunk) { + tryCatch(t, IndexOutOfBoundsException.class, thunk); + } + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { @@ -452,11 +479,12 @@ public class BasicChar fail(x.getMessage() + " not expected"); } } - if (!caught) + if (!caught) { fail(ex.getName() + " not thrown", b); + } } - private static void tryCatch(char [] t, Class ex, Runnable thunk) { + private static void tryCatch(char[] t, Class ex, Runnable thunk) { tryCatch(CharBuffer.wrap(t), ex, thunk); } @@ -513,11 +541,9 @@ public class BasicChar // 7190219 b.clear(); int pos = b.position(); - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put(String.valueOf(new char[b.capacity() + 1]), 0, - b.capacity() + 1); - }}); + tryCatch(b, BufferOverflowException.class, () -> + b.put(String.valueOf(new char[b.capacity() + 1]), 0, b.capacity() + 1) + ); ck(b, b.position(), pos); relGet(b); @@ -537,38 +563,14 @@ public class BasicChar b.limit(b.capacity() / 2); b.position(b.limit()); - tryCatch(b, BufferUnderflowException.class, new Runnable() { - public void run() { - b.get(); - }}); - - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put((char)42); - }}); - - // The index must be non-negative and lesss than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.put(b.limit(), (char)42); - }}); - - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { - b.position(0); - b.mark(); - b.compact(); - b.reset(); - }}); + tryCatch(b, BufferUnderflowException.class, () -> b.get()); + tryCatch(b, BufferOverflowException.class, () -> b.put((char)42)); + // The index must be non-negative and less than the buffer's limit. + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); + catchIndexOutOfBounds(b, () -> b.put(b.limit(), (char)42)); + tryCatch(b, InvalidMarkException.class, + () -> b.position(0).mark().compact().reset()); try { b.position(b.limit() + 1); @@ -635,7 +637,6 @@ public class BasicChar - char v; b.flip(); ck(b, b.get(), 0); ck(b, b.get(), (char)-1); @@ -660,6 +661,10 @@ public class BasicChar + + + + @@ -683,14 +688,15 @@ public class BasicChar - ) + ) { out.println("[" + i + "] " + x + " != " + y); + } } fail("Identical buffers not equal", b, b2); } - if (b.compareTo(b2) != 0) + if (b.compareTo(b2) != 0) { fail("Comparison to identical buffer != 0", b, b2); - + } b.limit(b.limit() + 1); b.position(b.limit() - 1); b.put((char)99); @@ -714,7 +720,7 @@ public class BasicChar if (xb.compareTo(xb) != 0) { fail("compareTo not reflexive", xb, xb, x, x); } - if (! xb.equals(xb)) { + if (!xb.equals(xb)) { fail("equals not reflexive", xb, xb, x, x); } for (char y : VALUES) { @@ -765,9 +771,10 @@ public class BasicChar if (!sb.equals(sb2)) fail("Sliced slices do not match", sb, sb2); - if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) + if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) { fail("Array offsets do not match: " + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2); + } @@ -808,79 +815,17 @@ public class BasicChar fail("Buffer not equal to read-only view", b, rb); show(level + 1, rb); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - relPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - absPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutArray(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutBuffer(rb); - }}); + catchReadOnlyBuffer(b, () -> relPut(rb)); + catchReadOnlyBuffer(b, () -> absPut(rb)); + catchReadOnlyBuffer(b, () -> bulkPutArray(rb)); + catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb)); // put(CharBuffer) should not change source position final CharBuffer src = CharBuffer.allocate(1); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.put(src); - }}); + catchReadOnlyBuffer(b, () -> rb.put(src)); ck(src, src.position(), 0); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.compact(); - }}); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + catchReadOnlyBuffer(b, () -> rb.compact()); @@ -902,35 +847,17 @@ public class BasicChar // 7199551 - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - String s = new String(new char[rb.remaining() + 1]); - rb.put(s); - }}); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - String s = new String(new char[rb.remaining() + 1]); - rb.append(s); - }}); + catchReadOnlyBuffer(b, () -> rb.put(new String(new char[rb.remaining() + 1]))); + catchReadOnlyBuffer(b, () -> rb.append(new String(new char[rb.remaining() + 1]))); if (rb.getClass().getName().startsWith("java.nio.Heap")) { - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.array(); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.arrayOffset(); - }}); - - if (rb.hasArray()) - fail("Read-only heap buffer's backing array is accessible", - rb); - + catchReadOnlyBuffer(b, () -> rb.array()); + catchReadOnlyBuffer(b, () -> rb.arrayOffset()); + if (rb.hasArray()) { + fail("Read-only heap buffer's backing array is accessible", rb); + } } // Bulk puts from read-only buffers @@ -969,10 +896,7 @@ public class BasicChar ck(b, b.toString().equals(s.substring(start, end))); ck(b, b.toString().equals("defghi")); ck(b, b.isReadOnly()); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - b.put('x'); - }}); + catchReadOnlyBuffer(b, () -> b.put('x')); ck(b, start, b.position()); ck(b, end, b.limit()); ck(b, s.length(), b.capacity()); @@ -981,63 +905,25 @@ public class BasicChar // The index, relative to the position, must be non-negative and // smaller than remaining(). - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.charAt(-1); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.charAt(b.remaining()); - }}); - + catchIndexOutOfBounds(b, () -> b.charAt(-1)); + catchIndexOutOfBounds(b, () -> b.charAt(b.remaining())); // The index must be non-negative and less than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); // The start must be non-negative and no larger than remaining(). - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.subSequence(-1, b.remaining()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.subSequence(b.remaining() + 1, b.remaining()); - }}); + catchIndexOutOfBounds(b, () -> b.subSequence(-1, b.remaining())); + catchIndexOutOfBounds(b, () -> b.subSequence(b.remaining() + 1, b.remaining())); // The end must be no smaller than start and no larger than // remaining(). - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.subSequence(2, 1); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.subSequence(0, b.remaining() + 1); - }}); + catchIndexOutOfBounds(b, () -> b.subSequence(2, 1)); + catchIndexOutOfBounds(b, () -> b.subSequence(0, b.remaining() + 1)); // The offset must be non-negative and no larger than . - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - CharBuffer.wrap(s, -1, s.length()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - CharBuffer.wrap(s, s.length() + 1, s.length()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - CharBuffer.wrap(s, 1, 0); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - CharBuffer.wrap(s, 0, s.length() + 1); - }}); + catchIndexOutOfBounds(b, () -> CharBuffer.wrap(s, -1, s.length())); + catchIndexOutOfBounds(b, () -> CharBuffer.wrap(s, s.length() + 1, s.length())); + catchIndexOutOfBounds(b, () -> CharBuffer.wrap(s, 1, 0)); + catchIndexOutOfBounds(b, () -> CharBuffer.wrap(s, 0, s.length() + 1)); } @@ -1052,40 +938,21 @@ public class BasicChar ck(b, b.limit(), offset + length); // The offset must be non-negative and no larger than . - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - CharBuffer.wrap(ba, -1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - CharBuffer.wrap(ba, ba.length + 1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - CharBuffer.wrap(ba, 0, -1); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - CharBuffer.wrap(ba, 0, ba.length + 1); - }}); + catchIndexOutOfBounds(ba, () -> CharBuffer.wrap(ba, -1, ba.length)); + catchIndexOutOfBounds(ba, () -> CharBuffer.wrap(ba, ba.length + 1, ba.length)); + catchIndexOutOfBounds(ba, () -> CharBuffer.wrap(ba, 0, -1)); + catchIndexOutOfBounds(ba, () -> CharBuffer.wrap(ba, 0, ba.length + 1)); // A NullPointerException will be thrown if the array is null. - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - CharBuffer.wrap((char []) null, 0, 5); - }}); - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - CharBuffer.wrap((char []) null); - }}); + tryCatch(ba, NullPointerException.class, + () -> CharBuffer.wrap((char []) null, 0, 5)); + tryCatch(ba, NullPointerException.class, + () -> CharBuffer.wrap((char []) null)); } private static void testAllocate() { // An IllegalArgumentException will be thrown for negative capacities. - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - CharBuffer.allocate(-1); - }}); + catchIllegalArgument((Buffer) null, () -> CharBuffer.allocate(-1)); try { CharBuffer.allocate(-1); } catch (IllegalArgumentException e) { @@ -1105,9 +972,6 @@ public class BasicChar - - - } public static void test() { diff --git a/jdk/test/java/nio/Buffer/BasicDouble.java b/jdk/test/java/nio/Buffer/BasicDouble.java index b25fe15aa52..41dc5379057 100644 --- a/jdk/test/java/nio/Buffer/BasicDouble.java +++ b/jdk/test/java/nio/Buffer/BasicDouble.java @@ -31,7 +31,6 @@ // -- This file was mechanically generated: Do not edit! -- // import java.nio.*; -import java.lang.reflect.Method; public class BasicDouble @@ -60,7 +59,6 @@ public class BasicDouble private static void relGet(DoubleBuffer b) { int n = b.capacity(); - double v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((double)ic(i))); b.rewind(); @@ -68,7 +66,6 @@ public class BasicDouble private static void relGet(DoubleBuffer b, int start) { int n = b.remaining(); - double v; for (int i = start; i < n; i++) ck(b, (long)b.get(), (long)((double)ic(i))); b.rewind(); @@ -76,7 +73,6 @@ public class BasicDouble private static void absGet(DoubleBuffer b) { int n = b.capacity(); - double v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((double)ic(i))); b.rewind(); @@ -86,8 +82,9 @@ public class BasicDouble int n = b.capacity(); double[] a = new double[n + 7]; b.get(a, 7, n); - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, (long)a[i + 7], (long)((double)ic(i))); + } } private static void relPut(DoubleBuffer b) { @@ -420,6 +417,20 @@ public class BasicDouble + + + + + + + + + + + + + + @@ -441,6 +452,22 @@ public class BasicDouble fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } + private static void catchIllegalArgument(Buffer b, Runnable thunk) { + tryCatch(b, IllegalArgumentException.class, thunk); + } + + private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) { + tryCatch(b, ReadOnlyBufferException.class, thunk); + } + + private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) { + tryCatch(b, IndexOutOfBoundsException.class, thunk); + } + + private static void catchIndexOutOfBounds(double[] t, Runnable thunk) { + tryCatch(t, IndexOutOfBoundsException.class, thunk); + } + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { @@ -452,11 +479,12 @@ public class BasicDouble fail(x.getMessage() + " not expected"); } } - if (!caught) + if (!caught) { fail(ex.getName() + " not thrown", b); + } } - private static void tryCatch(double [] t, Class ex, Runnable thunk) { + private static void tryCatch(double[] t, Class ex, Runnable thunk) { tryCatch(DoubleBuffer.wrap(t), ex, thunk); } @@ -518,8 +546,6 @@ public class BasicDouble - - @@ -537,38 +563,14 @@ public class BasicDouble b.limit(b.capacity() / 2); b.position(b.limit()); - tryCatch(b, BufferUnderflowException.class, new Runnable() { - public void run() { - b.get(); - }}); - - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put((double)42); - }}); - - // The index must be non-negative and lesss than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.put(b.limit(), (double)42); - }}); - - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { - b.position(0); - b.mark(); - b.compact(); - b.reset(); - }}); + tryCatch(b, BufferUnderflowException.class, () -> b.get()); + tryCatch(b, BufferOverflowException.class, () -> b.put((double)42)); + // The index must be non-negative and less than the buffer's limit. + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); + catchIndexOutOfBounds(b, () -> b.put(b.limit(), (double)42)); + tryCatch(b, InvalidMarkException.class, + () -> b.position(0).mark().compact().reset()); try { b.position(b.limit() + 1); @@ -635,7 +637,6 @@ public class BasicDouble b.put(0.5121609353879392); // Changes value if incorrectly swapped - double v; b.flip(); ck(b, b.get(), 0); ck(b, b.get(), (double)-1); @@ -654,13 +655,17 @@ public class BasicDouble + + + double v; ck(b, b.get(), -Double.MAX_VALUE); ck(b, b.get(), -Double.MIN_VALUE); ck(b, b.get(), Double.NEGATIVE_INFINITY); ck(b, b.get(), Double.POSITIVE_INFINITY); if (Double.doubleToRawLongBits(v = b.get()) - != Double.doubleToRawLongBits(Double.NaN)) + != Double.doubleToRawLongBits(Double.NaN)) { fail(b, (long)Double.NaN, (long)v); + } ck(b, b.get(), 0.5121609353879392); @@ -683,14 +688,15 @@ public class BasicDouble - ) + ) { out.println("[" + i + "] " + x + " != " + y); + } } fail("Identical buffers not equal", b, b2); } - if (b.compareTo(b2) != 0) + if (b.compareTo(b2) != 0) { fail("Comparison to identical buffer != 0", b, b2); - + } b.limit(b.limit() + 1); b.position(b.limit() - 1); b.put((double)99); @@ -714,7 +720,7 @@ public class BasicDouble if (xb.compareTo(xb) != 0) { fail("compareTo not reflexive", xb, xb, x, x); } - if (! xb.equals(xb)) { + if (!xb.equals(xb)) { fail("equals not reflexive", xb, xb, x, x); } for (double y : VALUES) { @@ -765,9 +771,10 @@ public class BasicDouble if (!sb.equals(sb2)) fail("Sliced slices do not match", sb, sb2); - if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) + if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) { fail("Array offsets do not match: " + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2); + } @@ -808,87 +815,17 @@ public class BasicDouble fail("Buffer not equal to read-only view", b, rb); show(level + 1, rb); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - relPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - absPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutArray(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutBuffer(rb); - }}); + catchReadOnlyBuffer(b, () -> relPut(rb)); + catchReadOnlyBuffer(b, () -> absPut(rb)); + catchReadOnlyBuffer(b, () -> bulkPutArray(rb)); + catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb)); // put(DoubleBuffer) should not change source position final DoubleBuffer src = DoubleBuffer.allocate(1); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.put(src); - }}); + catchReadOnlyBuffer(b, () -> rb.put(src)); ck(src, src.position(), 0); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.compact(); - }}); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + catchReadOnlyBuffer(b, () -> rb.compact()); @@ -916,21 +853,11 @@ public class BasicDouble if (rb.getClass().getName().startsWith("java.nio.Heap")) { - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.array(); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.arrayOffset(); - }}); - - if (rb.hasArray()) - fail("Read-only heap buffer's backing array is accessible", - rb); - + catchReadOnlyBuffer(b, () -> rb.array()); + catchReadOnlyBuffer(b, () -> rb.arrayOffset()); + if (rb.hasArray()) { + fail("Read-only heap buffer's backing array is accessible", rb); + } } // Bulk puts from read-only buffers @@ -980,47 +907,6 @@ public class BasicDouble - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1052,40 +938,21 @@ public class BasicDouble ck(b, b.limit(), offset + length); // The offset must be non-negative and no larger than . - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - DoubleBuffer.wrap(ba, -1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - DoubleBuffer.wrap(ba, ba.length + 1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - DoubleBuffer.wrap(ba, 0, -1); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - DoubleBuffer.wrap(ba, 0, ba.length + 1); - }}); + catchIndexOutOfBounds(ba, () -> DoubleBuffer.wrap(ba, -1, ba.length)); + catchIndexOutOfBounds(ba, () -> DoubleBuffer.wrap(ba, ba.length + 1, ba.length)); + catchIndexOutOfBounds(ba, () -> DoubleBuffer.wrap(ba, 0, -1)); + catchIndexOutOfBounds(ba, () -> DoubleBuffer.wrap(ba, 0, ba.length + 1)); // A NullPointerException will be thrown if the array is null. - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - DoubleBuffer.wrap((double []) null, 0, 5); - }}); - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - DoubleBuffer.wrap((double []) null); - }}); + tryCatch(ba, NullPointerException.class, + () -> DoubleBuffer.wrap((double []) null, 0, 5)); + tryCatch(ba, NullPointerException.class, + () -> DoubleBuffer.wrap((double []) null)); } private static void testAllocate() { // An IllegalArgumentException will be thrown for negative capacities. - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - DoubleBuffer.allocate(-1); - }}); + catchIllegalArgument((Buffer) null, () -> DoubleBuffer.allocate(-1)); try { DoubleBuffer.allocate(-1); } catch (IllegalArgumentException e) { @@ -1105,9 +972,6 @@ public class BasicDouble - - - } public static void test() { diff --git a/jdk/test/java/nio/Buffer/BasicFloat.java b/jdk/test/java/nio/Buffer/BasicFloat.java index c4d42867b2b..8f1d950d19c 100644 --- a/jdk/test/java/nio/Buffer/BasicFloat.java +++ b/jdk/test/java/nio/Buffer/BasicFloat.java @@ -31,7 +31,6 @@ // -- This file was mechanically generated: Do not edit! -- // import java.nio.*; -import java.lang.reflect.Method; public class BasicFloat @@ -60,7 +59,6 @@ public class BasicFloat private static void relGet(FloatBuffer b) { int n = b.capacity(); - float v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((float)ic(i))); b.rewind(); @@ -68,7 +66,6 @@ public class BasicFloat private static void relGet(FloatBuffer b, int start) { int n = b.remaining(); - float v; for (int i = start; i < n; i++) ck(b, (long)b.get(), (long)((float)ic(i))); b.rewind(); @@ -76,7 +73,6 @@ public class BasicFloat private static void absGet(FloatBuffer b) { int n = b.capacity(); - float v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((float)ic(i))); b.rewind(); @@ -86,8 +82,9 @@ public class BasicFloat int n = b.capacity(); float[] a = new float[n + 7]; b.get(a, 7, n); - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, (long)a[i + 7], (long)((float)ic(i))); + } } private static void relPut(FloatBuffer b) { @@ -420,6 +417,20 @@ public class BasicFloat + + + + + + + + + + + + + + @@ -441,6 +452,22 @@ public class BasicFloat fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } + private static void catchIllegalArgument(Buffer b, Runnable thunk) { + tryCatch(b, IllegalArgumentException.class, thunk); + } + + private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) { + tryCatch(b, ReadOnlyBufferException.class, thunk); + } + + private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) { + tryCatch(b, IndexOutOfBoundsException.class, thunk); + } + + private static void catchIndexOutOfBounds(float[] t, Runnable thunk) { + tryCatch(t, IndexOutOfBoundsException.class, thunk); + } + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { @@ -452,11 +479,12 @@ public class BasicFloat fail(x.getMessage() + " not expected"); } } - if (!caught) + if (!caught) { fail(ex.getName() + " not thrown", b); + } } - private static void tryCatch(float [] t, Class ex, Runnable thunk) { + private static void tryCatch(float[] t, Class ex, Runnable thunk) { tryCatch(FloatBuffer.wrap(t), ex, thunk); } @@ -518,8 +546,6 @@ public class BasicFloat - - @@ -537,38 +563,14 @@ public class BasicFloat b.limit(b.capacity() / 2); b.position(b.limit()); - tryCatch(b, BufferUnderflowException.class, new Runnable() { - public void run() { - b.get(); - }}); - - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put((float)42); - }}); - - // The index must be non-negative and lesss than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.put(b.limit(), (float)42); - }}); - - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { - b.position(0); - b.mark(); - b.compact(); - b.reset(); - }}); + tryCatch(b, BufferUnderflowException.class, () -> b.get()); + tryCatch(b, BufferOverflowException.class, () -> b.put((float)42)); + // The index must be non-negative and less than the buffer's limit. + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); + catchIndexOutOfBounds(b, () -> b.put(b.limit(), (float)42)); + tryCatch(b, InvalidMarkException.class, + () -> b.position(0).mark().compact().reset()); try { b.position(b.limit() + 1); @@ -635,7 +637,6 @@ public class BasicFloat - float v; b.flip(); ck(b, b.get(), 0); ck(b, b.get(), (float)-1); @@ -644,13 +645,15 @@ public class BasicFloat ck(b, b.get(), Float.MIN_VALUE); + float v; ck(b, b.get(), -Float.MAX_VALUE); ck(b, b.get(), -Float.MIN_VALUE); ck(b, b.get(), Float.NEGATIVE_INFINITY); ck(b, b.get(), Float.POSITIVE_INFINITY); if (Float.floatToRawIntBits(v = b.get()) != - Float.floatToRawIntBits(Float.NaN)) + Float.floatToRawIntBits(Float.NaN)) { fail(b, (long)Float.NaN, (long)v); + } ck(b, b.get(), 0.91697687f); @@ -665,6 +668,8 @@ public class BasicFloat + + // Comparison b.rewind(); FloatBuffer b2 = FloatBuffer.allocate(b.capacity()); @@ -683,14 +688,15 @@ public class BasicFloat || Float.compare(x, y) != 0 - ) + ) { out.println("[" + i + "] " + x + " != " + y); + } } fail("Identical buffers not equal", b, b2); } - if (b.compareTo(b2) != 0) + if (b.compareTo(b2) != 0) { fail("Comparison to identical buffer != 0", b, b2); - + } b.limit(b.limit() + 1); b.position(b.limit() - 1); b.put((float)99); @@ -714,7 +720,7 @@ public class BasicFloat if (xb.compareTo(xb) != 0) { fail("compareTo not reflexive", xb, xb, x, x); } - if (! xb.equals(xb)) { + if (!xb.equals(xb)) { fail("equals not reflexive", xb, xb, x, x); } for (float y : VALUES) { @@ -765,9 +771,10 @@ public class BasicFloat if (!sb.equals(sb2)) fail("Sliced slices do not match", sb, sb2); - if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) + if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) { fail("Array offsets do not match: " + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2); + } @@ -808,87 +815,17 @@ public class BasicFloat fail("Buffer not equal to read-only view", b, rb); show(level + 1, rb); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - relPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - absPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutArray(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutBuffer(rb); - }}); + catchReadOnlyBuffer(b, () -> relPut(rb)); + catchReadOnlyBuffer(b, () -> absPut(rb)); + catchReadOnlyBuffer(b, () -> bulkPutArray(rb)); + catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb)); // put(FloatBuffer) should not change source position final FloatBuffer src = FloatBuffer.allocate(1); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.put(src); - }}); + catchReadOnlyBuffer(b, () -> rb.put(src)); ck(src, src.position(), 0); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.compact(); - }}); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + catchReadOnlyBuffer(b, () -> rb.compact()); @@ -916,21 +853,11 @@ public class BasicFloat if (rb.getClass().getName().startsWith("java.nio.Heap")) { - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.array(); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.arrayOffset(); - }}); - - if (rb.hasArray()) - fail("Read-only heap buffer's backing array is accessible", - rb); - + catchReadOnlyBuffer(b, () -> rb.array()); + catchReadOnlyBuffer(b, () -> rb.arrayOffset()); + if (rb.hasArray()) { + fail("Read-only heap buffer's backing array is accessible", rb); + } } // Bulk puts from read-only buffers @@ -980,47 +907,6 @@ public class BasicFloat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1052,40 +938,21 @@ public class BasicFloat ck(b, b.limit(), offset + length); // The offset must be non-negative and no larger than . - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - FloatBuffer.wrap(ba, -1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - FloatBuffer.wrap(ba, ba.length + 1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - FloatBuffer.wrap(ba, 0, -1); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - FloatBuffer.wrap(ba, 0, ba.length + 1); - }}); + catchIndexOutOfBounds(ba, () -> FloatBuffer.wrap(ba, -1, ba.length)); + catchIndexOutOfBounds(ba, () -> FloatBuffer.wrap(ba, ba.length + 1, ba.length)); + catchIndexOutOfBounds(ba, () -> FloatBuffer.wrap(ba, 0, -1)); + catchIndexOutOfBounds(ba, () -> FloatBuffer.wrap(ba, 0, ba.length + 1)); // A NullPointerException will be thrown if the array is null. - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - FloatBuffer.wrap((float []) null, 0, 5); - }}); - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - FloatBuffer.wrap((float []) null); - }}); + tryCatch(ba, NullPointerException.class, + () -> FloatBuffer.wrap((float []) null, 0, 5)); + tryCatch(ba, NullPointerException.class, + () -> FloatBuffer.wrap((float []) null)); } private static void testAllocate() { // An IllegalArgumentException will be thrown for negative capacities. - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - FloatBuffer.allocate(-1); - }}); + catchIllegalArgument((Buffer) null, () -> FloatBuffer.allocate(-1)); try { FloatBuffer.allocate(-1); } catch (IllegalArgumentException e) { @@ -1105,9 +972,6 @@ public class BasicFloat - - - } public static void test() { diff --git a/jdk/test/java/nio/Buffer/BasicInt.java b/jdk/test/java/nio/Buffer/BasicInt.java index 46ad7578d24..71632f407ef 100644 --- a/jdk/test/java/nio/Buffer/BasicInt.java +++ b/jdk/test/java/nio/Buffer/BasicInt.java @@ -31,7 +31,6 @@ // -- This file was mechanically generated: Do not edit! -- // import java.nio.*; -import java.lang.reflect.Method; public class BasicInt @@ -60,7 +59,6 @@ public class BasicInt private static void relGet(IntBuffer b) { int n = b.capacity(); - int v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((int)ic(i))); b.rewind(); @@ -68,7 +66,6 @@ public class BasicInt private static void relGet(IntBuffer b, int start) { int n = b.remaining(); - int v; for (int i = start; i < n; i++) ck(b, (long)b.get(), (long)((int)ic(i))); b.rewind(); @@ -76,7 +73,6 @@ public class BasicInt private static void absGet(IntBuffer b) { int n = b.capacity(); - int v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((int)ic(i))); b.rewind(); @@ -86,8 +82,9 @@ public class BasicInt int n = b.capacity(); int[] a = new int[n + 7]; b.get(a, 7, n); - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, (long)a[i + 7], (long)((int)ic(i))); + } } private static void relPut(IntBuffer b) { @@ -420,6 +417,20 @@ public class BasicInt + + + + + + + + + + + + + + @@ -441,6 +452,22 @@ public class BasicInt fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } + private static void catchIllegalArgument(Buffer b, Runnable thunk) { + tryCatch(b, IllegalArgumentException.class, thunk); + } + + private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) { + tryCatch(b, ReadOnlyBufferException.class, thunk); + } + + private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) { + tryCatch(b, IndexOutOfBoundsException.class, thunk); + } + + private static void catchIndexOutOfBounds(int[] t, Runnable thunk) { + tryCatch(t, IndexOutOfBoundsException.class, thunk); + } + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { @@ -452,11 +479,12 @@ public class BasicInt fail(x.getMessage() + " not expected"); } } - if (!caught) + if (!caught) { fail(ex.getName() + " not thrown", b); + } } - private static void tryCatch(int [] t, Class ex, Runnable thunk) { + private static void tryCatch(int[] t, Class ex, Runnable thunk) { tryCatch(IntBuffer.wrap(t), ex, thunk); } @@ -518,8 +546,6 @@ public class BasicInt - - @@ -537,38 +563,14 @@ public class BasicInt b.limit(b.capacity() / 2); b.position(b.limit()); - tryCatch(b, BufferUnderflowException.class, new Runnable() { - public void run() { - b.get(); - }}); - - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put((int)42); - }}); - - // The index must be non-negative and lesss than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.put(b.limit(), (int)42); - }}); - - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { - b.position(0); - b.mark(); - b.compact(); - b.reset(); - }}); + tryCatch(b, BufferUnderflowException.class, () -> b.get()); + tryCatch(b, BufferOverflowException.class, () -> b.put((int)42)); + // The index must be non-negative and less than the buffer's limit. + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); + catchIndexOutOfBounds(b, () -> b.put(b.limit(), (int)42)); + tryCatch(b, InvalidMarkException.class, + () -> b.position(0).mark().compact().reset()); try { b.position(b.limit() + 1); @@ -635,7 +637,6 @@ public class BasicInt - int v; b.flip(); ck(b, b.get(), 0); ck(b, b.get(), (int)-1); @@ -660,6 +661,10 @@ public class BasicInt + + + + @@ -683,14 +688,15 @@ public class BasicInt - ) + ) { out.println("[" + i + "] " + x + " != " + y); + } } fail("Identical buffers not equal", b, b2); } - if (b.compareTo(b2) != 0) + if (b.compareTo(b2) != 0) { fail("Comparison to identical buffer != 0", b, b2); - + } b.limit(b.limit() + 1); b.position(b.limit() - 1); b.put((int)99); @@ -714,7 +720,7 @@ public class BasicInt if (xb.compareTo(xb) != 0) { fail("compareTo not reflexive", xb, xb, x, x); } - if (! xb.equals(xb)) { + if (!xb.equals(xb)) { fail("equals not reflexive", xb, xb, x, x); } for (int y : VALUES) { @@ -765,9 +771,10 @@ public class BasicInt if (!sb.equals(sb2)) fail("Sliced slices do not match", sb, sb2); - if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) + if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) { fail("Array offsets do not match: " + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2); + } @@ -808,87 +815,17 @@ public class BasicInt fail("Buffer not equal to read-only view", b, rb); show(level + 1, rb); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - relPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - absPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutArray(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutBuffer(rb); - }}); + catchReadOnlyBuffer(b, () -> relPut(rb)); + catchReadOnlyBuffer(b, () -> absPut(rb)); + catchReadOnlyBuffer(b, () -> bulkPutArray(rb)); + catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb)); // put(IntBuffer) should not change source position final IntBuffer src = IntBuffer.allocate(1); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.put(src); - }}); + catchReadOnlyBuffer(b, () -> rb.put(src)); ck(src, src.position(), 0); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.compact(); - }}); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + catchReadOnlyBuffer(b, () -> rb.compact()); @@ -916,21 +853,11 @@ public class BasicInt if (rb.getClass().getName().startsWith("java.nio.Heap")) { - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.array(); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.arrayOffset(); - }}); - - if (rb.hasArray()) - fail("Read-only heap buffer's backing array is accessible", - rb); - + catchReadOnlyBuffer(b, () -> rb.array()); + catchReadOnlyBuffer(b, () -> rb.arrayOffset()); + if (rb.hasArray()) { + fail("Read-only heap buffer's backing array is accessible", rb); + } } // Bulk puts from read-only buffers @@ -980,47 +907,6 @@ public class BasicInt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1052,40 +938,21 @@ public class BasicInt ck(b, b.limit(), offset + length); // The offset must be non-negative and no larger than . - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - IntBuffer.wrap(ba, -1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - IntBuffer.wrap(ba, ba.length + 1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - IntBuffer.wrap(ba, 0, -1); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - IntBuffer.wrap(ba, 0, ba.length + 1); - }}); + catchIndexOutOfBounds(ba, () -> IntBuffer.wrap(ba, -1, ba.length)); + catchIndexOutOfBounds(ba, () -> IntBuffer.wrap(ba, ba.length + 1, ba.length)); + catchIndexOutOfBounds(ba, () -> IntBuffer.wrap(ba, 0, -1)); + catchIndexOutOfBounds(ba, () -> IntBuffer.wrap(ba, 0, ba.length + 1)); // A NullPointerException will be thrown if the array is null. - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - IntBuffer.wrap((int []) null, 0, 5); - }}); - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - IntBuffer.wrap((int []) null); - }}); + tryCatch(ba, NullPointerException.class, + () -> IntBuffer.wrap((int []) null, 0, 5)); + tryCatch(ba, NullPointerException.class, + () -> IntBuffer.wrap((int []) null)); } private static void testAllocate() { // An IllegalArgumentException will be thrown for negative capacities. - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - IntBuffer.allocate(-1); - }}); + catchIllegalArgument((Buffer) null, () -> IntBuffer.allocate(-1)); try { IntBuffer.allocate(-1); } catch (IllegalArgumentException e) { @@ -1105,9 +972,6 @@ public class BasicInt - - - } public static void test() { diff --git a/jdk/test/java/nio/Buffer/BasicLong.java b/jdk/test/java/nio/Buffer/BasicLong.java index d3a0ff98c10..a7310c3c66d 100644 --- a/jdk/test/java/nio/Buffer/BasicLong.java +++ b/jdk/test/java/nio/Buffer/BasicLong.java @@ -31,7 +31,6 @@ // -- This file was mechanically generated: Do not edit! -- // import java.nio.*; -import java.lang.reflect.Method; public class BasicLong @@ -60,7 +59,6 @@ public class BasicLong private static void relGet(LongBuffer b) { int n = b.capacity(); - long v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((long)ic(i))); b.rewind(); @@ -68,7 +66,6 @@ public class BasicLong private static void relGet(LongBuffer b, int start) { int n = b.remaining(); - long v; for (int i = start; i < n; i++) ck(b, (long)b.get(), (long)((long)ic(i))); b.rewind(); @@ -76,7 +73,6 @@ public class BasicLong private static void absGet(LongBuffer b) { int n = b.capacity(); - long v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((long)ic(i))); b.rewind(); @@ -86,8 +82,9 @@ public class BasicLong int n = b.capacity(); long[] a = new long[n + 7]; b.get(a, 7, n); - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, (long)a[i + 7], (long)((long)ic(i))); + } } private static void relPut(LongBuffer b) { @@ -420,6 +417,20 @@ public class BasicLong + + + + + + + + + + + + + + @@ -441,6 +452,22 @@ public class BasicLong fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } + private static void catchIllegalArgument(Buffer b, Runnable thunk) { + tryCatch(b, IllegalArgumentException.class, thunk); + } + + private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) { + tryCatch(b, ReadOnlyBufferException.class, thunk); + } + + private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) { + tryCatch(b, IndexOutOfBoundsException.class, thunk); + } + + private static void catchIndexOutOfBounds(long[] t, Runnable thunk) { + tryCatch(t, IndexOutOfBoundsException.class, thunk); + } + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { @@ -452,11 +479,12 @@ public class BasicLong fail(x.getMessage() + " not expected"); } } - if (!caught) + if (!caught) { fail(ex.getName() + " not thrown", b); + } } - private static void tryCatch(long [] t, Class ex, Runnable thunk) { + private static void tryCatch(long[] t, Class ex, Runnable thunk) { tryCatch(LongBuffer.wrap(t), ex, thunk); } @@ -518,8 +546,6 @@ public class BasicLong - - @@ -537,38 +563,14 @@ public class BasicLong b.limit(b.capacity() / 2); b.position(b.limit()); - tryCatch(b, BufferUnderflowException.class, new Runnable() { - public void run() { - b.get(); - }}); - - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put((long)42); - }}); - - // The index must be non-negative and lesss than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.put(b.limit(), (long)42); - }}); - - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { - b.position(0); - b.mark(); - b.compact(); - b.reset(); - }}); + tryCatch(b, BufferUnderflowException.class, () -> b.get()); + tryCatch(b, BufferOverflowException.class, () -> b.put((long)42)); + // The index must be non-negative and less than the buffer's limit. + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); + catchIndexOutOfBounds(b, () -> b.put(b.limit(), (long)42)); + tryCatch(b, InvalidMarkException.class, + () -> b.position(0).mark().compact().reset()); try { b.position(b.limit() + 1); @@ -635,7 +637,6 @@ public class BasicLong - long v; b.flip(); ck(b, b.get(), 0); ck(b, b.get(), (long)-1); @@ -660,6 +661,10 @@ public class BasicLong + + + + @@ -683,14 +688,15 @@ public class BasicLong - ) + ) { out.println("[" + i + "] " + x + " != " + y); + } } fail("Identical buffers not equal", b, b2); } - if (b.compareTo(b2) != 0) + if (b.compareTo(b2) != 0) { fail("Comparison to identical buffer != 0", b, b2); - + } b.limit(b.limit() + 1); b.position(b.limit() - 1); b.put((long)99); @@ -714,7 +720,7 @@ public class BasicLong if (xb.compareTo(xb) != 0) { fail("compareTo not reflexive", xb, xb, x, x); } - if (! xb.equals(xb)) { + if (!xb.equals(xb)) { fail("equals not reflexive", xb, xb, x, x); } for (long y : VALUES) { @@ -765,9 +771,10 @@ public class BasicLong if (!sb.equals(sb2)) fail("Sliced slices do not match", sb, sb2); - if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) + if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) { fail("Array offsets do not match: " + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2); + } @@ -808,87 +815,17 @@ public class BasicLong fail("Buffer not equal to read-only view", b, rb); show(level + 1, rb); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - relPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - absPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutArray(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutBuffer(rb); - }}); + catchReadOnlyBuffer(b, () -> relPut(rb)); + catchReadOnlyBuffer(b, () -> absPut(rb)); + catchReadOnlyBuffer(b, () -> bulkPutArray(rb)); + catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb)); // put(LongBuffer) should not change source position final LongBuffer src = LongBuffer.allocate(1); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.put(src); - }}); + catchReadOnlyBuffer(b, () -> rb.put(src)); ck(src, src.position(), 0); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.compact(); - }}); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + catchReadOnlyBuffer(b, () -> rb.compact()); @@ -916,21 +853,11 @@ public class BasicLong if (rb.getClass().getName().startsWith("java.nio.Heap")) { - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.array(); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.arrayOffset(); - }}); - - if (rb.hasArray()) - fail("Read-only heap buffer's backing array is accessible", - rb); - + catchReadOnlyBuffer(b, () -> rb.array()); + catchReadOnlyBuffer(b, () -> rb.arrayOffset()); + if (rb.hasArray()) { + fail("Read-only heap buffer's backing array is accessible", rb); + } } // Bulk puts from read-only buffers @@ -980,47 +907,6 @@ public class BasicLong - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1052,40 +938,21 @@ public class BasicLong ck(b, b.limit(), offset + length); // The offset must be non-negative and no larger than . - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - LongBuffer.wrap(ba, -1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - LongBuffer.wrap(ba, ba.length + 1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - LongBuffer.wrap(ba, 0, -1); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - LongBuffer.wrap(ba, 0, ba.length + 1); - }}); + catchIndexOutOfBounds(ba, () -> LongBuffer.wrap(ba, -1, ba.length)); + catchIndexOutOfBounds(ba, () -> LongBuffer.wrap(ba, ba.length + 1, ba.length)); + catchIndexOutOfBounds(ba, () -> LongBuffer.wrap(ba, 0, -1)); + catchIndexOutOfBounds(ba, () -> LongBuffer.wrap(ba, 0, ba.length + 1)); // A NullPointerException will be thrown if the array is null. - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - LongBuffer.wrap((long []) null, 0, 5); - }}); - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - LongBuffer.wrap((long []) null); - }}); + tryCatch(ba, NullPointerException.class, + () -> LongBuffer.wrap((long []) null, 0, 5)); + tryCatch(ba, NullPointerException.class, + () -> LongBuffer.wrap((long []) null)); } private static void testAllocate() { // An IllegalArgumentException will be thrown for negative capacities. - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - LongBuffer.allocate(-1); - }}); + catchIllegalArgument((Buffer) null, () -> LongBuffer.allocate(-1)); try { LongBuffer.allocate(-1); } catch (IllegalArgumentException e) { @@ -1105,9 +972,6 @@ public class BasicLong - - - } public static void test() { diff --git a/jdk/test/java/nio/Buffer/BasicShort.java b/jdk/test/java/nio/Buffer/BasicShort.java index eef47f23e21..5d94bf2b15f 100644 --- a/jdk/test/java/nio/Buffer/BasicShort.java +++ b/jdk/test/java/nio/Buffer/BasicShort.java @@ -31,7 +31,6 @@ // -- This file was mechanically generated: Do not edit! -- // import java.nio.*; -import java.lang.reflect.Method; public class BasicShort @@ -60,7 +59,6 @@ public class BasicShort private static void relGet(ShortBuffer b) { int n = b.capacity(); - short v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((short)ic(i))); b.rewind(); @@ -68,7 +66,6 @@ public class BasicShort private static void relGet(ShortBuffer b, int start) { int n = b.remaining(); - short v; for (int i = start; i < n; i++) ck(b, (long)b.get(), (long)((short)ic(i))); b.rewind(); @@ -76,7 +73,6 @@ public class BasicShort private static void absGet(ShortBuffer b) { int n = b.capacity(); - short v; for (int i = 0; i < n; i++) ck(b, (long)b.get(), (long)((short)ic(i))); b.rewind(); @@ -86,8 +82,9 @@ public class BasicShort int n = b.capacity(); short[] a = new short[n + 7]; b.get(a, 7, n); - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { ck(b, (long)a[i + 7], (long)((short)ic(i))); + } } private static void relPut(ShortBuffer b) { @@ -420,6 +417,20 @@ public class BasicShort + + + + + + + + + + + + + + @@ -441,6 +452,22 @@ public class BasicShort fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } + private static void catchIllegalArgument(Buffer b, Runnable thunk) { + tryCatch(b, IllegalArgumentException.class, thunk); + } + + private static void catchReadOnlyBuffer(Buffer b, Runnable thunk) { + tryCatch(b, ReadOnlyBufferException.class, thunk); + } + + private static void catchIndexOutOfBounds(Buffer b, Runnable thunk) { + tryCatch(b, IndexOutOfBoundsException.class, thunk); + } + + private static void catchIndexOutOfBounds(short[] t, Runnable thunk) { + tryCatch(t, IndexOutOfBoundsException.class, thunk); + } + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { @@ -452,11 +479,12 @@ public class BasicShort fail(x.getMessage() + " not expected"); } } - if (!caught) + if (!caught) { fail(ex.getName() + " not thrown", b); + } } - private static void tryCatch(short [] t, Class ex, Runnable thunk) { + private static void tryCatch(short[] t, Class ex, Runnable thunk) { tryCatch(ShortBuffer.wrap(t), ex, thunk); } @@ -518,8 +546,6 @@ public class BasicShort - - @@ -537,38 +563,14 @@ public class BasicShort b.limit(b.capacity() / 2); b.position(b.limit()); - tryCatch(b, BufferUnderflowException.class, new Runnable() { - public void run() { - b.get(); - }}); - - tryCatch(b, BufferOverflowException.class, new Runnable() { - public void run() { - b.put((short)42); - }}); - - // The index must be non-negative and lesss than the buffer's limit. - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(b.limit()); - }}); - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.get(-1); - }}); - - tryCatch(b, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - b.put(b.limit(), (short)42); - }}); - - tryCatch(b, InvalidMarkException.class, new Runnable() { - public void run() { - b.position(0); - b.mark(); - b.compact(); - b.reset(); - }}); + tryCatch(b, BufferUnderflowException.class, () -> b.get()); + tryCatch(b, BufferOverflowException.class, () -> b.put((short)42)); + // The index must be non-negative and less than the buffer's limit. + catchIndexOutOfBounds(b, () -> b.get(b.limit())); + catchIndexOutOfBounds(b, () -> b.get(-1)); + catchIndexOutOfBounds(b, () -> b.put(b.limit(), (short)42)); + tryCatch(b, InvalidMarkException.class, + () -> b.position(0).mark().compact().reset()); try { b.position(b.limit() + 1); @@ -635,7 +637,6 @@ public class BasicShort - short v; b.flip(); ck(b, b.get(), 0); ck(b, b.get(), (short)-1); @@ -660,6 +661,10 @@ public class BasicShort + + + + @@ -683,14 +688,15 @@ public class BasicShort - ) + ) { out.println("[" + i + "] " + x + " != " + y); + } } fail("Identical buffers not equal", b, b2); } - if (b.compareTo(b2) != 0) + if (b.compareTo(b2) != 0) { fail("Comparison to identical buffer != 0", b, b2); - + } b.limit(b.limit() + 1); b.position(b.limit() - 1); b.put((short)99); @@ -714,7 +720,7 @@ public class BasicShort if (xb.compareTo(xb) != 0) { fail("compareTo not reflexive", xb, xb, x, x); } - if (! xb.equals(xb)) { + if (!xb.equals(xb)) { fail("equals not reflexive", xb, xb, x, x); } for (short y : VALUES) { @@ -765,9 +771,10 @@ public class BasicShort if (!sb.equals(sb2)) fail("Sliced slices do not match", sb, sb2); - if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) + if ((sb.hasArray()) && (sb.arrayOffset() != sb2.arrayOffset())) { fail("Array offsets do not match: " + sb.arrayOffset() + " != " + sb2.arrayOffset(), sb, sb2); + } @@ -808,87 +815,17 @@ public class BasicShort fail("Buffer not equal to read-only view", b, rb); show(level + 1, rb); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - relPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - absPut(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutArray(rb); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - bulkPutBuffer(rb); - }}); + catchReadOnlyBuffer(b, () -> relPut(rb)); + catchReadOnlyBuffer(b, () -> absPut(rb)); + catchReadOnlyBuffer(b, () -> bulkPutArray(rb)); + catchReadOnlyBuffer(b, () -> bulkPutBuffer(rb)); // put(ShortBuffer) should not change source position final ShortBuffer src = ShortBuffer.allocate(1); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.put(src); - }}); + catchReadOnlyBuffer(b, () -> rb.put(src)); ck(src, src.position(), 0); - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.compact(); - }}); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + catchReadOnlyBuffer(b, () -> rb.compact()); @@ -916,21 +853,11 @@ public class BasicShort if (rb.getClass().getName().startsWith("java.nio.Heap")) { - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.array(); - }}); - - tryCatch(b, ReadOnlyBufferException.class, new Runnable() { - public void run() { - rb.arrayOffset(); - }}); - - if (rb.hasArray()) - fail("Read-only heap buffer's backing array is accessible", - rb); - + catchReadOnlyBuffer(b, () -> rb.array()); + catchReadOnlyBuffer(b, () -> rb.arrayOffset()); + if (rb.hasArray()) { + fail("Read-only heap buffer's backing array is accessible", rb); + } } // Bulk puts from read-only buffers @@ -980,47 +907,6 @@ public class BasicShort - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1052,40 +938,21 @@ public class BasicShort ck(b, b.limit(), offset + length); // The offset must be non-negative and no larger than . - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - ShortBuffer.wrap(ba, -1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - ShortBuffer.wrap(ba, ba.length + 1, ba.length); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - ShortBuffer.wrap(ba, 0, -1); - }}); - tryCatch(ba, IndexOutOfBoundsException.class, new Runnable() { - public void run() { - ShortBuffer.wrap(ba, 0, ba.length + 1); - }}); + catchIndexOutOfBounds(ba, () -> ShortBuffer.wrap(ba, -1, ba.length)); + catchIndexOutOfBounds(ba, () -> ShortBuffer.wrap(ba, ba.length + 1, ba.length)); + catchIndexOutOfBounds(ba, () -> ShortBuffer.wrap(ba, 0, -1)); + catchIndexOutOfBounds(ba, () -> ShortBuffer.wrap(ba, 0, ba.length + 1)); // A NullPointerException will be thrown if the array is null. - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - ShortBuffer.wrap((short []) null, 0, 5); - }}); - tryCatch(ba, NullPointerException.class, new Runnable() { - public void run() { - ShortBuffer.wrap((short []) null); - }}); + tryCatch(ba, NullPointerException.class, + () -> ShortBuffer.wrap((short []) null, 0, 5)); + tryCatch(ba, NullPointerException.class, + () -> ShortBuffer.wrap((short []) null)); } private static void testAllocate() { // An IllegalArgumentException will be thrown for negative capacities. - tryCatch((Buffer) null, IllegalArgumentException.class, new Runnable() { - public void run() { - ShortBuffer.allocate(-1); - }}); + catchIllegalArgument((Buffer) null, () -> ShortBuffer.allocate(-1)); try { ShortBuffer.allocate(-1); } catch (IllegalArgumentException e) { @@ -1105,9 +972,6 @@ public class BasicShort - - - } public static void test() { diff --git a/jdk/test/java/nio/Buffer/LimitDirectMemory.java b/jdk/test/java/nio/Buffer/LimitDirectMemory.java index 597e4d9c093..e8a22b4b89c 100644 --- a/jdk/test/java/nio/Buffer/LimitDirectMemory.java +++ b/jdk/test/java/nio/Buffer/LimitDirectMemory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ import java.nio.ByteBuffer; import java.util.Properties; public class LimitDirectMemory { - private static int K = 1024; + private static final int K = 1024; public static void main(String [] args) throws Exception { if (args.length < 2) @@ -83,7 +83,7 @@ public class LimitDirectMemory { int idx = 0, len = size.length(); - int result = 1; + for (int i = 0; i < len; i++) { if (Character.isDigit(size.charAt(i))) idx++; else break; @@ -92,7 +92,7 @@ public class LimitDirectMemory { if (idx == 0) throw new RuntimeException("No digits detected: " + size); - result = Integer.parseInt(size.substring(0, idx)); + int result = Integer.parseInt(size.substring(0, idx)); if (idx < len) { for (int i = idx; i < len; i++) { diff --git a/jdk/test/java/nio/Buffer/Order-X.java.template b/jdk/test/java/nio/Buffer/Order-X.java.template index a8753a5f8a9..97313a841f6 100644 --- a/jdk/test/java/nio/Buffer/Order-X.java.template +++ b/jdk/test/java/nio/Buffer/Order-X.java.template @@ -52,8 +52,5 @@ public class Order$Type$ extends Order { buf = $Type$Buffer.allocate(LENGTH); ck(buf.order(), nord); ck$Type$Buffer(buf, nord); - - ck$Type$Buffer(ByteBuffer.allocate(LENGTH).as$Type$Buffer(), be); - ck$Type$Buffer(ByteBuffer.allocateDirect(LENGTH).as$Type$Buffer(), be); } } diff --git a/jdk/test/java/nio/Buffer/Order.java b/jdk/test/java/nio/Buffer/Order.java index 768fecb8b8a..33ae418bb56 100644 --- a/jdk/test/java/nio/Buffer/Order.java +++ b/jdk/test/java/nio/Buffer/Order.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,41 +39,49 @@ public class Order { static void ck(ByteOrder ord, ByteOrder expected) { if (ord != expected) - throw new RuntimeException("Got " + ord - + ", expected " + expected); + throw new RuntimeException("Got " + ord + ", expected " + expected); } - static void ckViews(ByteBuffer bb, ByteOrder ord) { + private static void ckViews(ByteBuffer bb) { ck(bb.asCharBuffer().order(), bb.order()); + ck(bb.asShortBuffer().order(), bb.order()); ck(bb.asIntBuffer().order(), bb.order()); ck(bb.asLongBuffer().order(), bb.order()); ck(bb.asFloatBuffer().order(), bb.order()); ck(bb.asDoubleBuffer().order(), bb.order()); } - static void ckByteBuffer(ByteBuffer bb) { - ckViews(bb, bb.order()); - bb.order(be); - ckViews(bb, be); - bb.order(le); - ckViews(bb, le); + private static void ckCopyViews(ByteBuffer bb) { + ck(bb.asReadOnlyBuffer().order(), be); + ck(bb.duplicate().order(), be); + ck(bb.slice().order(), be); + } - if (bb.hasArray()) { - byte[] array = bb.array(); - ck(ByteBuffer.wrap(array, LENGTH/2, LENGTH/2).order(), be); - ck(ByteBuffer.wrap(array).order(), be); - ck(bb.asReadOnlyBuffer().order(), be); - ck(bb.duplicate().order(), be); - ck(bb.slice().order(), be); - } + private static void ckByteBuffer(ByteBuffer bb) { + ckViews(bb); + ckCopyViews(bb); + bb.order(be); + ckViews(bb); + ckCopyViews(bb); + bb.order(le); + ckViews(bb); + ckCopyViews(bb); } public static void main(String args[]) throws Exception { + ck(ByteBuffer.wrap(new byte[LENGTH], LENGTH/2, LENGTH/2).order(), be); + ck(ByteBuffer.wrap(new byte[LENGTH]).order(), be); + ck(ByteBuffer.wrap(new byte[LENGTH], LENGTH/2, LENGTH/2).order(be).order(), be); + ck(ByteBuffer.wrap(new byte[LENGTH]).order(be).order(), be); + ck(ByteBuffer.wrap(new byte[LENGTH], LENGTH/2, LENGTH/2).order(le).order(), le); + ck(ByteBuffer.wrap(new byte[LENGTH]).order(le).order(), le); ck(ByteBuffer.allocate(LENGTH).order(), be); ck(ByteBuffer.allocateDirect(LENGTH).order(), be); ck(ByteBuffer.allocate(LENGTH).order(be).order(), be); ck(ByteBuffer.allocate(LENGTH).order(le).order(), le); + ck(ByteBuffer.allocateDirect(LENGTH).order(be).order(), be); + ck(ByteBuffer.allocateDirect(LENGTH).order(le).order(), le); ckByteBuffer(ByteBuffer.allocate(LENGTH)); ckByteBuffer(ByteBuffer.allocateDirect(LENGTH)); @@ -85,5 +93,4 @@ public class Order { OrderFloat.ckFloatBuffer(); OrderDouble.ckDoubleBuffer(); } - } diff --git a/jdk/test/java/nio/Buffer/OrderChar.java b/jdk/test/java/nio/Buffer/OrderChar.java index ebf9faad79c..f72828bd0de 100644 --- a/jdk/test/java/nio/Buffer/OrderChar.java +++ b/jdk/test/java/nio/Buffer/OrderChar.java @@ -52,8 +52,5 @@ public class OrderChar extends Order { buf = CharBuffer.allocate(LENGTH); ck(buf.order(), nord); ckCharBuffer(buf, nord); - - ckCharBuffer(ByteBuffer.allocate(LENGTH).asCharBuffer(), be); - ckCharBuffer(ByteBuffer.allocateDirect(LENGTH).asCharBuffer(), be); } } diff --git a/jdk/test/java/nio/Buffer/OrderDouble.java b/jdk/test/java/nio/Buffer/OrderDouble.java index deaa6a3eb27..4100695cab5 100644 --- a/jdk/test/java/nio/Buffer/OrderDouble.java +++ b/jdk/test/java/nio/Buffer/OrderDouble.java @@ -52,8 +52,5 @@ public class OrderDouble extends Order { buf = DoubleBuffer.allocate(LENGTH); ck(buf.order(), nord); ckDoubleBuffer(buf, nord); - - ckDoubleBuffer(ByteBuffer.allocate(LENGTH).asDoubleBuffer(), be); - ckDoubleBuffer(ByteBuffer.allocateDirect(LENGTH).asDoubleBuffer(), be); } } diff --git a/jdk/test/java/nio/Buffer/OrderFloat.java b/jdk/test/java/nio/Buffer/OrderFloat.java index 6a65eaa8e4f..905d531d434 100644 --- a/jdk/test/java/nio/Buffer/OrderFloat.java +++ b/jdk/test/java/nio/Buffer/OrderFloat.java @@ -52,8 +52,5 @@ public class OrderFloat extends Order { buf = FloatBuffer.allocate(LENGTH); ck(buf.order(), nord); ckFloatBuffer(buf, nord); - - ckFloatBuffer(ByteBuffer.allocate(LENGTH).asFloatBuffer(), be); - ckFloatBuffer(ByteBuffer.allocateDirect(LENGTH).asFloatBuffer(), be); } } diff --git a/jdk/test/java/nio/Buffer/OrderInt.java b/jdk/test/java/nio/Buffer/OrderInt.java index 5d3843ffec7..700fc07110a 100644 --- a/jdk/test/java/nio/Buffer/OrderInt.java +++ b/jdk/test/java/nio/Buffer/OrderInt.java @@ -52,8 +52,5 @@ public class OrderInt extends Order { buf = IntBuffer.allocate(LENGTH); ck(buf.order(), nord); ckIntBuffer(buf, nord); - - ckIntBuffer(ByteBuffer.allocate(LENGTH).asIntBuffer(), be); - ckIntBuffer(ByteBuffer.allocateDirect(LENGTH).asIntBuffer(), be); } } diff --git a/jdk/test/java/nio/Buffer/OrderLong.java b/jdk/test/java/nio/Buffer/OrderLong.java index abda8b22932..9e507ffc18e 100644 --- a/jdk/test/java/nio/Buffer/OrderLong.java +++ b/jdk/test/java/nio/Buffer/OrderLong.java @@ -52,8 +52,5 @@ public class OrderLong extends Order { buf = LongBuffer.allocate(LENGTH); ck(buf.order(), nord); ckLongBuffer(buf, nord); - - ckLongBuffer(ByteBuffer.allocate(LENGTH).asLongBuffer(), be); - ckLongBuffer(ByteBuffer.allocateDirect(LENGTH).asLongBuffer(), be); } } diff --git a/jdk/test/java/nio/Buffer/OrderShort.java b/jdk/test/java/nio/Buffer/OrderShort.java index d19b43a1b60..f385b62d6dd 100644 --- a/jdk/test/java/nio/Buffer/OrderShort.java +++ b/jdk/test/java/nio/Buffer/OrderShort.java @@ -52,8 +52,5 @@ public class OrderShort extends Order { buf = ShortBuffer.allocate(LENGTH); ck(buf.order(), nord); ckShortBuffer(buf, nord); - - ckShortBuffer(ByteBuffer.allocate(LENGTH).asShortBuffer(), be); - ckShortBuffer(ByteBuffer.allocateDirect(LENGTH).asShortBuffer(), be); } } diff --git a/jdk/test/java/nio/Buffer/SwapMicroBenchmark.java b/jdk/test/java/nio/Buffer/SwapMicroBenchmark.java index 1942639a460..31bbe908c20 100644 --- a/jdk/test/java/nio/Buffer/SwapMicroBenchmark.java +++ b/jdk/test/java/nio/Buffer/SwapMicroBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,6 @@ import java.util.*; import java.nio.*; -import java.util.concurrent.*; import java.util.regex.Pattern; public class SwapMicroBenchmark { diff --git a/jdk/test/java/security/SecureRandom/ApiTest.java b/jdk/test/java/security/SecureRandom/ApiTest.java new file mode 100644 index 00000000000..e48ee4a90de --- /dev/null +++ b/jdk/test/java/security/SecureRandom/ApiTest.java @@ -0,0 +1,366 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8141039 + * @library /lib/testlibrary + * @summary This test do API coverage for SecureRandom. It covers most of + * supported operations along with possible positive and negative + * parameters for DRBG mechanism. + * @run main/othervm ApiTest Hash_DRBG + * @run main/othervm ApiTest HMAC_DRBG + * @run main/othervm ApiTest CTR_DRBG + * @run main/othervm ApiTest SHA1PRNG + * @run main/othervm ApiTest NATIVE + */ +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.Security; +import java.security.SecureRandomParameters; +import java.security.DrbgParameters; +import java.security.DrbgParameters.Instantiation; +import java.security.DrbgParameters.Capability; +import javax.crypto.Cipher; + +public class ApiTest { + + private static final boolean SHOULD_PASS = true; + private static final long SEED = 1l; + private static final String INVALID_ALGO = "INVALID"; + private static final String DRBG_CONFIG = "securerandom.drbg.config"; + private static final String DRBG_CONFIG_VALUE + = Security.getProperty(DRBG_CONFIG); + + public static void main(String[] args) throws Exception { + System.setProperty("java.security.egd", "file:/dev/urandom"); + + if (args == null || args.length < 1) { + throw new RuntimeException("No mechanism available to run test."); + } + String mech + = "NATIVE".equals(args[0]) ? supportedNativeAlgo() : args[0]; + String[] algs = null; + boolean success = true; + + try { + if (!isDRBG(mech)) { + SecureRandom random = SecureRandom.getInstance(mech); + verifyAPI(random, mech); + return; + } else if (mech.equals("CTR_DRBG")) { + algs = new String[]{"AES-128", "AES-192", "AES-256", + INVALID_ALGO}; + } else if (mech.equals("Hash_DRBG") || mech.equals("HMAC_DRBG")) { + algs = new String[]{"SHA-224", "SHA-256", "SHA-512/224", + "SHA-512/256", "SHA-384", "SHA-512", INVALID_ALGO}; + } else { + throw new RuntimeException( + String.format("Not a valid mechanism '%s'", mech)); + } + runForEachMech(mech, algs); + } catch (Exception e) { + e.printStackTrace(System.out); + success = false; + } + + if (!success) { + throw new RuntimeException("At least one test failed."); + } + } + + /** + * Run the test for a DRBG mechanism with a possible set of parameter + * combination. + * @param mech DRBG mechanism name + * @param algs Algorithm supported by each mechanism + * @throws Exception + */ + private static void runForEachMech(String mech, String[] algs) + throws Exception { + for (String alg : algs) { + runForEachAlg(mech, alg); + } + } + + private static void runForEachAlg(String mech, String alg) + throws Exception { + for (int strength : new int[]{Integer.MIN_VALUE, -1, 0, 1, 223, 224, + 192, 255, 256}) { + for (Capability cp : Capability.values()) { + for (byte[] pr : new byte[][]{null, new byte[]{}, + "personal".getBytes()}) { + SecureRandomParameters param + = DrbgParameters.instantiation(strength, cp, pr); + runForEachParam(mech, alg, param); + } + } + } + } + + private static void runForEachParam(String mech, String alg, + SecureRandomParameters param) throws Exception { + + for (boolean df : new Boolean[]{true, false}) { + try { + Security.setProperty(DRBG_CONFIG, mech + "," + alg + "," + + (df ? "use_df" : "no_df")); + System.out.printf("%nParameter for SecureRandom " + + "mechanism: %s is (param:%s, algo:%s, df:%s)", + mech, param, alg, df); + SecureRandom sr = SecureRandom.getInstance("DRBG", param); + verifyAPI(sr, mech); + } catch (NoSuchAlgorithmException e) { + // Verify exception status for current test. + checkException(getDefaultAlg(mech, alg), param, e); + } finally { + Security.setProperty(DRBG_CONFIG, DRBG_CONFIG_VALUE); + } + } + } + + /** + * Returns the algorithm supported for input mechanism. + * @param mech Mechanism name + * @param alg Algorithm name + * @return Algorithm name + */ + private static String getDefaultAlg(String mech, String alg) + throws NoSuchAlgorithmException { + if (alg == null) { + switch (mech) { + case "Hash_DRBG": + case "HMAC_DRBG": + return "SHA-256"; + case "CTR_DRBG": + return (Cipher.getMaxAllowedKeyLength("AES") < 256) + ? "AES-128" : "AES-256"; + default: + throw new RuntimeException("Mechanism not supported"); + } + } + return alg; + } + + /** + * Verify the exception type either it is expected to occur or not. + * @param alg Algorithm name + * @param param DRBG parameter + * @param e Exception to verify + * @throws NoSuchAlgorithmException + */ + private static void checkException(String alg, SecureRandomParameters param, + NoSuchAlgorithmException e) throws NoSuchAlgorithmException { + + int strength = ((Instantiation) param).getStrength(); + boolean error = true; + switch (alg) { + case INVALID_ALGO: + error = false; + break; + case "SHA-224": + case "SHA-512/224": + if (strength > 192) { + error = false; + } + break; + case "SHA-256": + case "SHA-512/256": + case "SHA-384": + case "SHA-512": + if (strength > 256) { + error = false; + } + break; + case "AES-128": + case "AES-192": + case "AES-256": + int algoStrength = Integer.parseInt(alg.replaceAll("AES-", "")); + int maxStrengthSupported = Cipher.getMaxAllowedKeyLength("AES"); + if (strength > maxStrengthSupported + || algoStrength > maxStrengthSupported) { + error = false; + } + break; + } + if (error) { + throw new RuntimeException("Unknown :", e); + } + } + + /** + * Find if the mechanism is a DRBG mechanism. + * @param mech Mechanism name + * @return True for DRBG mechanism else False + */ + private static boolean isDRBG(String mech) { + return mech.contains("_DRBG"); + } + + /** + * Find the name of supported native mechanism name for current platform. + */ + private static String supportedNativeAlgo() { + String nativeSr = "Windows-PRNG"; + try { + SecureRandom.getInstance(nativeSr); + } catch (NoSuchAlgorithmException e) { + nativeSr = "NativePRNG"; + } + return nativeSr; + } + + /** + * Test a possible set of SecureRandom API for a SecureRandom instance. + * @param random SecureRandom instance + * @param mech Mechanism used to create SecureRandom instance + */ + private static void verifyAPI(SecureRandom random, String mech) + throws Exception { + + System.out.printf("%nTest SecureRandom mechanism: %s for provider: %s", + mech, random.getProvider().getName()); + byte[] output = new byte[2]; + + // Generate random number. + random.nextBytes(output); + + // Seed the SecureRandom with a generated seed value of lesser size. + byte[] seed = random.generateSeed(1); + random.setSeed(seed); + random.nextBytes(output); + + // Seed the SecureRandom with a fixed seed value. + random.setSeed(SEED); + random.nextBytes(output); + + // Seed the SecureRandom with a larger seed value. + seed = random.generateSeed(128); + random.setSeed(seed); + random.nextBytes(output); + + // Additional operation only supported for DRBG based SecureRandom. + // Execute the code block and expect to pass for DRBG. If it will fail + // then it should fail with specified exception type. Else the case + // will be considered as a test case failure. + matchExc(() -> { + random.reseed(); + random.nextBytes(output); + }, + isDRBG(mech), + UnsupportedOperationException.class, + String.format("PASS - Unsupported reseed() method for " + + "SecureRandom Algorithm %s ", mech)); + + matchExc(() -> { + random.reseed(DrbgParameters.reseed(false, new byte[]{})); + random.nextBytes(output); + }, + isDRBG(mech), + UnsupportedOperationException.class, + String.format("PASS - Unsupported reseed(param) method for " + + "SecureRandom Algorithm %s ", mech)); + + matchExc(() -> { + random.reseed(DrbgParameters.reseed(true, new byte[]{})); + random.nextBytes(output); + }, + isDRBG(mech), + !isSupportPR(mech, random) ? IllegalArgumentException.class + : UnsupportedOperationException.class, + String.format("PASS - Unsupported or illegal reseed(param) " + + "method for SecureRandom Algorithm %s ", mech)); + + matchExc(() -> random.nextBytes(output, + DrbgParameters.nextBytes(-1, false, new byte[]{})), + isDRBG(mech), + UnsupportedOperationException.class, + String.format("PASS - Unsupported nextBytes(out, nextByteParam)" + + " method for SecureRandom Algorithm %s ", mech)); + + matchExc(() -> random.nextBytes(output, + DrbgParameters.nextBytes(-1, true, new byte[]{})), + isDRBG(mech), + !isSupportPR(mech, random) ? IllegalArgumentException.class + : UnsupportedOperationException.class, + String.format("PASS - Unsupported or illegal " + + "nextBytes(out, nextByteParam) method for " + + "SecureRandom Algorithm %s ", mech)); + + matchExc(() -> { + random.reseed(null); + random.nextBytes(output); + }, + !SHOULD_PASS, + IllegalArgumentException.class, + "PASS - Test is expected to fail when parameter for reseed() " + + "is null"); + + matchExc(() -> random.nextBytes(output, null), + !SHOULD_PASS, + IllegalArgumentException.class, + "PASS - Test is expected to fail when parameter for nextBytes()" + + " is null"); + + } + + private static boolean isSupportPR(String mech, SecureRandom random) { + return (isDRBG(mech) && ((Instantiation) random.getParameters()) + .getCapability() + .supportsPredictionResistance()); + } + + private interface RunnableCode { + + void run() throws Exception; + } + + /** + * Execute a given code block and verify, if the exception type is expected. + * @param r Code block to run + * @param ex Expected exception type + * @param shouldPass If the code execution expected to pass without failure + * @param msg Message to log in case of expected failure + */ + private static void matchExc(RunnableCode r, boolean shouldPass, Class ex, + String msg) { + try { + r.run(); + if (!shouldPass) { + throw new RuntimeException("Excecution should fail here."); + } + } catch (Exception e) { + System.out.printf("%nOccured exception: %s - Expected exception: " + + "%s : ", e.getClass(), ex.getCanonicalName()); + if (ex.isAssignableFrom(e.getClass())) { + System.out.printf("%n%s : Expected Exception occured: %s : ", + e.getClass(), msg); + } else if (shouldPass) { + throw new RuntimeException(e); + } else { + System.out.printf("Ignore the following exception: %s%n", + e.getMessage()); + } + } + } +} diff --git a/jdk/test/java/security/SecureRandom/EnoughSeedTest.java b/jdk/test/java/security/SecureRandom/EnoughSeedTest.java new file mode 100644 index 00000000000..a42807d0530 --- /dev/null +++ b/jdk/test/java/security/SecureRandom/EnoughSeedTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8141039 + * @library /lib/testlibrary + * @summary Check SecureRandom generate expected seed counts what the caller + * asked for. + * @run main/othervm EnoughSeedTest + */ +import java.security.SecureRandom; +import java.security.Security; +import static java.lang.Math.*; + +public class EnoughSeedTest { + + private static final String DRBG_CONFIG = "securerandom.drbg.config"; + private static final String DRBG_CONFIG_VALUE + = Security.getProperty(DRBG_CONFIG); + + public static void main(String[] args) { + System.setProperty("java.security.egd", "file:/dev/urandom"); + + boolean success = true; + for (String mech : new String[]{ + "SHA1PRNG", "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) { + System.out.printf("%nTest for SecureRandom algorithm: '%s'", mech); + try { + SecureRandom sr = null; + if (!mech.contains("_DRBG")) { + sr = SecureRandom.getInstance(mech); + } else { + Security.setProperty(DRBG_CONFIG, mech); + sr = SecureRandom.getInstance("DRBG"); + } + + success &= forEachSeedBytes(sr); + System.out.printf("%nCompleted test for SecureRandom " + + "mechanism: '%s'", mech); + } catch (Exception e) { + success &= false; + e.printStackTrace(System.out); + } finally { + Security.setProperty(DRBG_CONFIG, DRBG_CONFIG_VALUE); + } + } + if (!success) { + throw new RuntimeException("At least one test failed."); + } + } + + /** + * Generates fixed number of seed bytes through a SecureRandom instance + * to verify it's seed generation status. + * @param sr SecureRandom instance + * @return The test success indicator + */ + private static boolean forEachSeedBytes(SecureRandom sr) { + boolean success = true; + sr.setSeed(1l); + for (int seedByte : new int[]{Integer.MIN_VALUE, -1, 0, 1, 256, 1024, + Short.MAX_VALUE, (int) pow(2, 20)}) { + try { + byte[] seed = sr.generateSeed(seedByte); + if (seed.length != seedByte) { + throw new RuntimeException("Not able to produce expected " + + "seed size."); + } + } catch (IllegalArgumentException e) { + if (seedByte >= 0) { + throw new RuntimeException("Unknown Exception occured.", e); + } + System.out.printf("%nPASS - Exception expected when required " + + "seed size requested is negative: %s", seedByte); + } + } + return success; + } + +} diff --git a/jdk/test/java/security/SecureRandom/GetAlgorithm.java b/jdk/test/java/security/SecureRandom/GetAlgorithm.java index b1947ef1db8..1ec3fd25ce2 100644 --- a/jdk/test/java/security/SecureRandom/GetAlgorithm.java +++ b/jdk/test/java/security/SecureRandom/GetAlgorithm.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,49 +23,54 @@ /** * @test - * @bug 4915392 + * @bug 4915392 8141039 * @summary test that the getAlgorithm() method works correctly * @author Andreas Sterbenz + * @run main GetAlgorithm */ - import java.io.*; - import java.security.*; +import java.util.Arrays; +import java.util.List; public class GetAlgorithm { - private final static String BASE = System.getProperty("test.src", "."); + private static final String BASE = System.getProperty("test.src", "."); + private static final String DRBG_CONFIG = "securerandom.drbg.config"; + private static final String DRBG_CONFIG_VALUE + = Security.getProperty(DRBG_CONFIG); public static void main(String[] args) throws Exception { - SecureRandom sr; - - sr = new SecureRandom(); + SecureRandom sr = new SecureRandom(); if (sr.getAlgorithm().equals("unknown")) { throw new Exception("Unknown: " + sr.getAlgorithm()); } - sr = SecureRandom.getInstance("SHA1PRNG"); - check("SHA1PRNG", sr); + for (String mech : new String[]{supportedNativeAlgo(), "SHA1PRNG", + "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) { + if (!mech.contains("_DRBG")) { + check(mech, SecureRandom.getInstance(mech)); + } else { + try { + Security.setProperty(DRBG_CONFIG, mech); + check("DRBG", SecureRandom.getInstance("DRBG")); + } finally { + Security.setProperty(DRBG_CONFIG, DRBG_CONFIG_VALUE); + } + } + } + check("unknown", new MySecureRandom()); -// OutputStream out = new FileOutputStream("sha1prng.bin"); -// ObjectOutputStream oout = new ObjectOutputStream(out); -// sr.nextInt(); -// oout.writeObject(sr); -// oout.flush(); -// oout.close(); - - sr = new MySecureRandom(); - check("unknown", sr); - - InputStream in = new FileInputStream(new File(BASE, "sha1prng-old.bin")); + InputStream in = new FileInputStream( + new File(BASE, "sha1prng-old.bin")); ObjectInputStream oin = new ObjectInputStream(in); - sr = (SecureRandom)oin.readObject(); + sr = (SecureRandom) oin.readObject(); oin.close(); check("unknown", sr); in = new FileInputStream(new File(BASE, "sha1prng-new.bin")); oin = new ObjectInputStream(in); - sr = (SecureRandom)oin.readObject(); + sr = (SecureRandom) oin.readObject(); oin.close(); check("SHA1PRNG", sr); @@ -83,4 +88,17 @@ public class GetAlgorithm { } + /** + * Find the name of supported native mechanism name for current platform. + */ + private static String supportedNativeAlgo() { + String nativeSr = "Windows-PRNG"; + try { + SecureRandom.getInstance(nativeSr); + } catch (NoSuchAlgorithmException e) { + nativeSr = "NativePRNG"; + } + return nativeSr; + } + } diff --git a/jdk/test/java/security/SecureRandom/GetInstanceTest.java b/jdk/test/java/security/SecureRandom/GetInstanceTest.java new file mode 100644 index 00000000000..08477da847e --- /dev/null +++ b/jdk/test/java/security/SecureRandom/GetInstanceTest.java @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8141039 + * @library /lib/testlibrary + * @summary SecureRandom supports multiple getInstance method including + * getInstanceStrong() method. This test verifies a set of possible + * cases for getInstance with different SecureRandom mechanism + * supported in Java. + * @run main GetInstanceTest + */ +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.SecureRandom; +import java.security.SecureRandomParameters; +import java.security.DrbgParameters; +import static java.security.DrbgParameters.Capability.*; +import java.security.Security; +import java.util.Arrays; +import jdk.testlibrary.Asserts; + +public class GetInstanceTest { + + private static final boolean PASS = true; + private static final String INVALID_ALGO = "INVALID"; + private static final String SUN_PROVIDER = "SUN"; + private static final String INVALID_PROVIDER = "INVALID"; + private static final String STRONG_ALG_SEC_PROP + = "securerandom.strongAlgorithms"; + private static final String DRBG_CONFIG = "securerandom.drbg.config"; + private static final String DRBG_CONFIG_VALUE + = Security.getProperty(DRBG_CONFIG); + + public static void main(String[] args) throws Exception { + + boolean success = true; + // Only accepted failure is NoSuchAlgorithmException. + // For any other failure the test case will fail here. + SecureRandom sr = matchExc(() -> SecureRandom.getInstanceStrong(), + PASS, NoSuchAlgorithmException.class, + "PASS - Undefined security Property " + + "'securerandom.strongAlgorithms'"); + System.out.format("Current platform supports mechanism: '%s' through " + + "provider: '%s' for the method getInstanceStrong().", + sr.getAlgorithm(), sr.getProvider().getName()); + + // DRBG name should appear with "securerandom.strongAlgorithms" + // security property. + String origDRBGConfig = Security.getProperty(STRONG_ALG_SEC_PROP); + if (!origDRBGConfig.contains("DRBG")) { + throw new RuntimeException("DRBG is not associated with default " + + "strong algorithm through security Property: " + + "'securerandom.strongAlgorithms'."); + } + try { + Security.setProperty(STRONG_ALG_SEC_PROP, "DRBG:SUN"); + sr = matchExc(() -> SecureRandom.getInstanceStrong(), + PASS, NoSuchAlgorithmException.class, + "PASS - Undefined security Property " + + "'securerandom.strongAlgorithms'"); + checkAttributes(sr, "DRBG"); + } finally { + Security.setProperty(STRONG_ALG_SEC_PROP, origDRBGConfig); + } + + for (String mech : new String[]{ + "SHA1PRNG", "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG", INVALID_ALGO,}) { + System.out.printf("%nTest SecureRandom mechanism: '%s'", mech); + try { + if (isDRBG(mech)) { + Security.setProperty(DRBG_CONFIG, mech); + } + verifyInstance(mech); + } catch (Exception e) { + e.printStackTrace(System.out); + success = false; + } finally { + Security.setProperty(DRBG_CONFIG, DRBG_CONFIG_VALUE); + } + } + if (!success) { + throw new RuntimeException("At least one test failed."); + } + } + + private static void verifyInstance(String mech) throws Exception { + + String srAlgo = isDRBG(mech) ? "DRBG" : mech; + + // Test for getInstance(algorithm) method. + // It should pass for all case other than invalid algorithm name. + // If it fails then the expected exception type should be + // NoSuchAlgorithmException. Any other Exception type occured will be + // treated as failure. + checkAttributes( + matchExc(() -> SecureRandom.getInstance(srAlgo), !(nsa(mech)), + NoSuchAlgorithmException.class, + String.format("PASS - It is expected to fail for" + + " getInstance(algorithm) when algorithm: '%s'" + + " is null or invalid.", mech)), mech); + // Test for getInstance(algorithm, provider) method. + checkAttributes( + matchExc(() -> SecureRandom.getInstance(srAlgo, + Security.getProvider(SUN_PROVIDER)), + !(nsa(mech)), + NoSuchAlgorithmException.class, + String.format("PASS - It is expected to fail for" + + " getInstance(algorithm, provider) when" + + " algorithm:'%s' is null or invalid.", mech)), + mech); + // Test for getInstance(algorithm, providerName) method. + checkAttributes( + matchExc(() -> SecureRandom.getInstance(srAlgo, SUN_PROVIDER), + !(nsa(mech)), NoSuchAlgorithmException.class, + String.format("PASS - It is expected to fail for " + + "getInstance(algorithm, providerName) when " + + "algorithm: '%s' is null or invalid.", mech)), + mech); + // Test for getInstance(algorithm, providerName) method. + checkAttributes( + matchExc(() -> SecureRandom.getInstance( + srAlgo, INVALID_PROVIDER), + !PASS, NoSuchProviderException.class, + String.format("PASS - It is expected to fail for " + + "getInstance(algorithm, providerName) when " + + "provider name: '%s' is invalid and " + + "algorithm: '%s'", INVALID_PROVIDER, mech)), + mech); + + // Run the test for a set of SecureRandomParameters + for (SecureRandomParameters param : Arrays.asList(null, + DrbgParameters.instantiation(-1, NONE, null))) { + + System.out.printf("%nRunning DRBG param getInstance() methods " + + "for algorithm: %s and DRBG param type: %s", mech, + (param != null) ? param.getClass().getName() : param); + + // Following Test are applicable for new DRBG methods only. + // Test for getInstance(algorithm, params) method. + // Tests are expected to pass for DRBG type with valid parameter + // If it fails the expected exception type is derived from + // getExcType(mech, param) method. If exception type is not + // expected then the test will be considered as failure. + checkAttributes( + matchExc(() -> SecureRandom.getInstance(srAlgo, param), + (isDRBG(mech)) && (isValidDRBGParam(param)), + getExcType(mech, param), + String.format("PASS - It is expected to fail " + + "for getInstance(algorithm, params) " + + "for algorithm: %s and parameter: %s", + mech, param)), + mech); + // Test for getInstance(algorithm, params, provider) method. + checkAttributes( + matchExc(() -> SecureRandom.getInstance(srAlgo, param, + Security.getProvider(SUN_PROVIDER)), + (isDRBG(mech)) && (isValidDRBGParam(param)), + getExcType(mech, param), + String.format("PASS - It is expected to fail " + + "for getInstance(algorithm, params, " + + "provider) for algorithm: %s and " + + "parameter: %s", mech, param)), + mech); + // Test for getInstance(algorithm, params, providerName) method. + checkAttributes( + matchExc(() -> SecureRandom.getInstance(srAlgo, param, + SUN_PROVIDER), + (isDRBG(mech)) && (isValidDRBGParam(param)), + getExcType(mech, param), + String.format("PASS - It is expected to fail " + + "for getInstance(algorithm, params, " + + "providerName) for algorithm: %s and " + + "parameter: %s", mech, param)), mech); + // getInstance(algorithm, params, providerName) when + // providerName is invalid + checkAttributes( + matchExc(() -> SecureRandom.getInstance(srAlgo, param, + INVALID_PROVIDER), + !PASS, ((param == null) + ? IllegalArgumentException.class + : NoSuchProviderException.class), + String.format("PASS - It is expected to fail " + + "for getInstance(algorithm, params, " + + "providerName) when param is null or" + + " provider: %s is invalid for " + + "algorithm: '%s'", INVALID_PROVIDER, + mech)), mech); + // getInstance(algorithm, params, provider) when provider=null + checkAttributes( + matchExc(() -> SecureRandom.getInstance(srAlgo, param, + (String) null), + !PASS, IllegalArgumentException.class, + String.format("PASS - It is expected to fail " + + "for getInstance(algorithm, params, " + + "providerName) when provider name " + + "is null")), mech); + // getInstance(algorithm, params, providerName) when + // providerName is empty. + checkAttributes( + matchExc(() -> SecureRandom.getInstance( + srAlgo, param, ""), + !PASS, IllegalArgumentException.class, + String.format("PASS - It is expected to fail " + + "for getInstance(algorithm, params, " + + "providerName) when provider name " + + "is empty")), mech); + } + } + + private static boolean isValidDRBGParam(SecureRandomParameters param) { + return (param instanceof DrbgParameters.Instantiation); + } + + /** + * If the mechanism should occur NoSuchAlgorithmException. + */ + private static boolean nsa(String mech) { + return mech.equals(INVALID_ALGO); + } + + /** + * Verify if the mechanism is DRBG type. + * @param mech Mechanism name + * @return True if the mechanism name is DRBG type else False. + */ + private static boolean isDRBG(String mech) { + return mech.contains("_DRBG"); + } + + /** + * Type of exception expected for a SecureRandom instance when exception + * occurred while calling getInstance method with a fixed set of parameter. + * @param mech Mechanism used to create a SecureRandom instance + * @param param Parameter to getInstance() method + * @return Exception type expected + */ + private static Class getExcType(String mech, SecureRandomParameters param) { + return ((isDRBG(mech) && !isValidDRBGParam(param)) || param == null) + ? IllegalArgumentException.class + : NoSuchAlgorithmException.class; + } + + private interface RunnableCode { + + SecureRandom run() throws Exception; + } + + /** + * Execute a given code block and verify, if the exception type is expected. + * @param r Code block to run + * @param ex Expected exception type + * @param shouldPass If the code execution expected to pass without failure + * @param msg Message to log in case of expected failure + */ + private static SecureRandom matchExc(RunnableCode r, boolean shouldPass, + Class ex, String msg) { + SecureRandom sr = null; + try { + sr = r.run(); + if (!shouldPass) { + throw new RuntimeException("Excecution should fail here."); + } + } catch (Exception e) { + System.out.printf("%nOccured exception: %s - Expected exception: %s" + + " : ", e.getClass(), ex.getCanonicalName()); + if (ex.isAssignableFrom(e.getClass())) { + System.out.printf("%n%s : Expected Exception: %s : ", + e.getClass(), msg); + } else if (shouldPass) { + throw new RuntimeException(e); + } else { + System.out.printf("%nIgnore the following exception: %s%n", + e.getMessage()); + } + } + return sr; + } + + /** + * Check specific attributes of a SecureRandom instance. + */ + private static void checkAttributes(SecureRandom sr, String mech) { + if (sr == null) { + return; + } + Asserts.assertEquals(sr.getAlgorithm(), (isDRBG(mech) ? "DRBG" : mech)); + Asserts.assertEquals(sr.getProvider().getName(), SUN_PROVIDER); + } + +} diff --git a/jdk/test/java/security/SecureRandom/MultiThreadTest.java b/jdk/test/java/security/SecureRandom/MultiThreadTest.java new file mode 100644 index 00000000000..82c6d68dd94 --- /dev/null +++ b/jdk/test/java/security/SecureRandom/MultiThreadTest.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.math.BigInteger; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.Security; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletionService; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import static java.lang.Math.*; + +/* + * @test + * @bug 8141039 + * @library /lib/testlibrary + * @summary Test behavior of a shared SecureRandom object when it is operated + * by multiple threads concurrently. + * @run main/othervm -Djava.security.egd=file:/dev/urandom MultiThreadTest + */ +public class MultiThreadTest { + + private static final byte[] GEN_RND_BYTES = {1}; + private static final String DRBG_CONFIG = "securerandom.drbg.config"; + private static final String DRBG_CONFIG_VALUE + = Security.getProperty(DRBG_CONFIG); + + private enum SEED { + + NONE, RESEED, SETSEED + } + + public static void main(String[] args) { + + boolean success = true; + for (int byteLen : GEN_RND_BYTES) { + for (SEED reSeed : SEED.values()) { + for (String mech : new String[]{ + "SHA1PRNG", "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) { + try { + forEachMech(mech, byteLen, reSeed); + } catch (Exception e) { + success = false; + e.printStackTrace(System.out); + } finally { + Security.setProperty(DRBG_CONFIG, DRBG_CONFIG_VALUE); + } + } + } + } + + if (!success) { + throw new RuntimeException("At least one test failed."); + } + } + + /** + * Generate a number of threads to fetch random numbers of certain bits + * generated through a shared SecureRandom instance. + * @param mech Mechanism name + * @param byteLen Number of bytes of random number to produce + * @param reSeed Call reseed() before generating random numbers + * @throws NoSuchAlgorithmException + * @throws InterruptedException + * @throws ExecutionException + */ + private static void forEachMech(String mech, int byteLen, SEED reSeed) + throws NoSuchAlgorithmException, InterruptedException, + ExecutionException { + + if ("SHA1PRNG".equals(mech) && SEED.RESEED.equals(reSeed)) { + System.out.printf( + "%nreseed() api is not supported for '%s'", mech); + return; + } + System.out.printf("%nTest SecureRandom mechanism: '%s' with support of" + + " reseed: '%s'", mech, reSeed); + int threadCount = (int) pow(2, 8 * byteLen); + System.out.printf("%nCreating %s number of threads to generate secure " + + "random numbers concurrently.", threadCount); + + ExecutorService executor + = Executors.newCachedThreadPool(new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread t = Executors.defaultThreadFactory() + .newThread(r); + t.setDaemon(true); + return t; + } + }); + CompletionService completionService + = new ExecutorCompletionService(executor); + + CountDownLatch latch = new CountDownLatch(1); + SecureRandom rnd = null; + if (!mech.contains("_DRBG")) { + rnd = SecureRandom.getInstance(mech); + } else { + Security.setProperty(DRBG_CONFIG, mech); + rnd = SecureRandom.getInstance("DRBG"); + } + try { + for (int i = 0; i < threadCount; i++) { + completionService.submit(new Task(rnd, latch, byteLen, reSeed)); + } + latch.countDown(); + + for (int i = 0; i < threadCount; i++) { + completionService.take(); + } + } finally { + executor.shutdown(); + } + System.out.printf("%nCompleted Test for algorithm '%s' with thread " + + "counts to '%s' using reseeding '%s'", + mech, threadCount, reSeed); + + } + + /** + * Define a Task to be executed by multiple thread to produce random numbers + * from a shared SecureRandom instance. + */ + private static class Task implements Callable { + + private final SecureRandom random; + private final CountDownLatch latch; + private final SEED reSeed; + private final int byteSize; + + public Task(SecureRandom random, CountDownLatch latch, int byteSize, + SEED reSeed) { + this.random = random; + this.latch = latch; + this.byteSize = byteSize; + this.reSeed = reSeed; + } + + @Override + public Integer call() throws Exception { + latch.await(); + switch (this.reSeed) { + case RESEED: + this.random.reseed(); + break; + case SETSEED: + this.random.setSeed(1l); + break; + } + byte[] bytes = new byte[byteSize]; + random.nextBytes(bytes); + return new BigInteger(bytes).intValue(); + } + } + +} diff --git a/jdk/test/java/security/SecureRandom/Serialize.java b/jdk/test/java/security/SecureRandom/Serialize.java index 799f1bfa428..2e364878c80 100644 --- a/jdk/test/java/security/SecureRandom/Serialize.java +++ b/jdk/test/java/security/SecureRandom/Serialize.java @@ -24,6 +24,7 @@ /* @test * @bug 4102896 * @summary Make sure that a SecureRandom object can be serialized + * @run main/othervm Serialize */ import java.security.*; @@ -32,6 +33,8 @@ import java.io.*; public class Serialize { public static void main(String args[]) throws Exception { + System.setProperty("java.security.egd", "file:/dev/urandom"); + for (String alg: new String[]{ "SHA1PRNG", "DRBG", "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG", "Hash_DRBG,SHA-512,192,pr_and_reseed"}) { diff --git a/jdk/test/java/security/SecureRandom/SerializedSeedTest.java b/jdk/test/java/security/SecureRandom/SerializedSeedTest.java new file mode 100644 index 00000000000..9af7296c4ab --- /dev/null +++ b/jdk/test/java/security/SecureRandom/SerializedSeedTest.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8141039 + * @library /lib/testlibrary + * @summary When random number is generated through the a SecureRandom instance + * as well from it's serialized instance in the same time then the + * generated random numbers should be different when one or both are + * reseeded. + * @run main/othervm -Djava.security.egd=file:/dev/urandom SerializedSeedTest + */ +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ByteArrayInputStream; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.Security; +import jdk.testlibrary.Asserts; + +public class SerializedSeedTest { + + private static final byte[] SEED = "seed".getBytes(); + private static final String DRBG_CONFIG = "securerandom.drbg.config"; + private static final String DRBG_CONFIG_VALUE + = Security.getProperty(DRBG_CONFIG); + + public static void main(String[] args) { + boolean success = true; + + for (String mech : new String[]{ + "SHA1PRNG", "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) { + System.out.printf( + "%nRunning test for SecureRandom mechanism: '%s'", mech); + try { + // Serialize without seed and compare generated random numbers + // produced through original and serialized instances. + SecureRandom orig = getSRInstance(mech); + SecureRandom copy = deserializedCopy(orig); + System.out.printf("%nSerialize without seed. Generated random" + + " numbers should be different."); + check(orig, copy, false, mech); + + // Serialize after default seed and compare generated random + // numbers produced through original and serialized instances. + orig = getSRInstance(mech); + orig.nextInt(); // Default seeded + copy = deserializedCopy(orig); + System.out.printf("%nSerialize after default seed. Generated" + + " random numbers should be same till 20-bytes."); + check(orig, copy, !isDRBG(mech), mech); + + // Serialize after explicit seed and compare generated random + // numbers produced through original and serialized instances. + orig = getSRInstance(mech); + orig.setSeed(SEED); // Explicitly seeded + copy = deserializedCopy(orig); + System.out.printf("%nSerialize after explicit seed. Generated " + + "random numbers should be same till 20-bytes."); + check(orig, copy, !isDRBG(mech), mech); + + // Serialize without seed but original is explicitly seeded + // before generating any random number. Then compare generated + // random numbers produced through original and serialized + // instances. + orig = getSRInstance(mech); + copy = deserializedCopy(orig); + orig.setSeed(SEED); // Explicitly seeded + System.out.printf("%nSerialize without seed. When original is " + + "explicitly seeded before generating random numbers," + + " Generated random numbers should be different."); + check(orig, copy, false, mech); + + // Serialize after default seed but original is explicitly + // seeded before generating any random number. Then compare + // generated random numbers produced through original and + // serialized instances. + orig = getSRInstance(mech); + orig.nextInt(); // Default seeded + copy = deserializedCopy(orig); + orig.setSeed(SEED); // Explicitly seeded + System.out.printf("%nSerialize after default seed but original " + + "is explicitly seeded before generating random number" + + ". Generated random numbers should be different."); + check(orig, copy, false, mech); + + // Serialize after explicit seed but original is explicitly + // seeded again before generating random number. Then compare + // generated random numbers produced through original and + // serialized instances. + orig = getSRInstance(mech); + orig.setSeed(SEED); // Explicitly seeded + copy = deserializedCopy(orig); + orig.setSeed(SEED); // Explicitly seeded + System.out.printf("%nSerialize after explicit seed but " + + "original is explicitly seeded again before " + + "generating random number. Generated random " + + "numbers should be different."); + check(orig, copy, false, mech); + + } catch (Exception e) { + e.printStackTrace(System.out); + success = false; + } finally { + Security.setProperty(DRBG_CONFIG, DRBG_CONFIG_VALUE); + } + System.out.printf("%n------Completed Test for %s------", mech); + } + + if (!success) { + throw new RuntimeException("At least one test failed."); + } + } + + /** + * Find if the mechanism is a DRBG mechanism. + * @param mech Mechanism name + * @return True for DRBG mechanism else False + */ + private static boolean isDRBG(String mech) { + return mech.contains("_DRBG"); + } + + /** + * Verify the similarity of random numbers generated though both original + * as well as deserialized instance. + */ + private static void check(SecureRandom orig, SecureRandom copy, + boolean equal, String mech) { + int o = orig.nextInt(); + int c = copy.nextInt(); + System.out.printf("%nRandom number generated for mechanism: '%s' " + + "from original instance as: '%s' and from serialized " + + "instance as: '%s'", mech, o, c); + if (equal) { + Asserts.assertEquals(o, c, mech); + } else { + Asserts.assertNotEquals(o, c, mech); + } + } + + /** + * Get a copy of SecureRandom instance through deserialization. + * @param orig Original SecureRandom instance + * @return Deserialized SecureRandom instance + * @throws IOException + * @throws ClassNotFoundException + */ + private static SecureRandom deserializedCopy(SecureRandom orig) + throws IOException, ClassNotFoundException { + return deserialize(serialize(orig)); + } + + /** + * Deserialize the SecureRandom object. + */ + private static SecureRandom deserialize(byte[] serialized) + throws IOException, ClassNotFoundException { + SecureRandom sr = null; + try (ByteArrayInputStream bis = new ByteArrayInputStream(serialized); + ObjectInputStream ois = new ObjectInputStream(bis)) { + sr = (SecureRandom) ois.readObject(); + } + return sr; + } + + /** + * Serialize the given SecureRandom object. + */ + private static byte[] serialize(SecureRandom sr) throws IOException { + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos)) { + oos.writeObject(sr); + return bos.toByteArray(); + } + } + + /** + * Create a SecureRandom instance for a given mechanism. + */ + private static SecureRandom getSRInstance(String mech) + throws NoSuchAlgorithmException { + if (!isDRBG(mech)) { + return SecureRandom.getInstance(mech); + } else { + Security.setProperty(DRBG_CONFIG, mech); + return SecureRandom.getInstance("DRBG"); + } + } + +} diff --git a/jdk/test/java/sql/TEST.properties b/jdk/test/java/sql/TEST.properties new file mode 100644 index 00000000000..878b05fc591 --- /dev/null +++ b/jdk/test/java/sql/TEST.properties @@ -0,0 +1,2 @@ +modules = java.sql + diff --git a/jdk/test/java/util/Arrays/SortingNearlySortedPrimitive.java b/jdk/test/java/util/Arrays/SortingNearlySortedPrimitive.java index 99bd4cf04d2..b2c8d6ec45b 100644 --- a/jdk/test/java/util/Arrays/SortingNearlySortedPrimitive.java +++ b/jdk/test/java/util/Arrays/SortingNearlySortedPrimitive.java @@ -1,6 +1,6 @@ /* * Copyright 2015 Goldman Sachs. - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ */ /* * @test + * @bug 8154049 * @summary Tests the sorting of a large array of sorted primitive values, * predominently for cases where the array is nearly sorted. This tests * code that detects patterns in the array to determine if it is nearly @@ -32,32 +33,117 @@ * @run testng SortingNearlySortedPrimitive */ -import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import java.util.ArrayList; import java.util.Arrays; -import java.util.function.Supplier; +import java.util.List; +import java.util.StringJoiner; +import java.util.function.IntFunction; +import java.util.stream.IntStream; +import java.util.stream.Stream; public class SortingNearlySortedPrimitive { - private static final int ARRAY_SIZE = 1_000_000; - @DataProvider(name = "arrays") - public Object[][] createData() { - return new Object[][]{ - {"hiZeroLowTest", (Supplier) this::hiZeroLowData}, - {"endLessThanTest", (Supplier) this::endLessThanData}, - {"highFlatLowTest", (Supplier) this::highFlatLowData}, - {"identicalTest", (Supplier) this::identicalData}, - {"sortedReversedSortedTest", (Supplier) this::sortedReversedSortedData}, - {"pairFlipTest", (Supplier) this::pairFlipData}, - {"zeroHiTest", (Supplier) this::zeroHiData}, - }; + static final int BASE = 3; + static final int WIDTH = 4; + // Should be > DualPivotQuicksort.QUICKSORT_THRESHOLD + static final int PAD = 300; + + Stream createCombinations() { + // Create all combinations for the BASE value and double the WIDTH + // elements + // This is create various combinations of ascending, descending and + // equal runs to exercise the nearly sorted code paths + return IntStream.range(0, (int) Math.pow(BASE, 2 * WIDTH)). + mapToObj(this::createArray); } - @Test(dataProvider = "arrays") - public void runTests(String testName, Supplier dataMethod) throws Exception { - int[] intSourceArray = dataMethod.get(); + // Create an array which at either end is filled with -ve and +ve elements + // according to the base value and padded with zeros in between + int[] createArray(int v) { + int[] a = new int[WIDTH + PAD + WIDTH]; + + // Fill head of array + for (int j = 0; j < WIDTH; j++) { + a[j] = (v % BASE) - (BASE / 2); + v /= BASE; + } + // Fill tail of array + for (int j = 0; j < WIDTH; j++) { + a[WIDTH + PAD + j] = (v % BASE) - (BASE / 2); + v /= BASE; + } + return a; + } + + @Test + public void testCombination() { + createCombinations().forEach(a -> { + try { + // Clone source array to ensure it is not modified + this.sortAndAssert(a.clone()); + this.sortAndAssert(floatCopyFromInt(a)); + this.sortAndAssert(doubleCopyFromInt(a)); + this.sortAndAssert(longCopyFromInt(a)); + this.sortAndAssert(shortCopyFromInt(a)); + this.sortAndAssert(charCopyFromInt(a)); + } catch (AssertionError sae) { + AssertionError ae = new AssertionError("Sort failed for " + arrayToString(a)); + ae.addSuppressed(sae); + throw ae; + } + }); + } + + String arrayToString(int[] a) { + int[] l = Arrays.copyOfRange(a, 0, WIDTH + 2); + int[] r = Arrays.copyOfRange(a, a.length - (WIDTH + 2), a.length); + StringJoiner sj = new StringJoiner(",", "[", "]"); + for (int i : l) { + sj.add(Integer.toString(i)); + } + sj.add("..."); + for (int i : r) { + sj.add(Integer.toString(i)); + } + return sj.toString(); + } + + + @DataProvider(name = "shapes") + public Object[][] createShapes() { + Stream> baseCases = Stream.of( + List.of("hiZeroLowTest", (IntFunction) this::hiZeroLowData), + List.of("endLessThanTest", (IntFunction) this::endLessThanData), + List.of("highFlatLowTest", (IntFunction) this::highFlatLowData), + List.of("identicalTest", (IntFunction) this::identicalData), + List.of("sortedReversedSortedTest", (IntFunction) this::sortedReversedSortedData), + List.of("pairFlipTest", (IntFunction) this::pairFlipData), + List.of("zeroHiTest", (IntFunction) this::zeroHiData) + ); + + // Ensure the following inequality holds for certain sizes + // DualPivotQuicksort.QUICKSORT_THRESHOLD <= size - 1 + // < DualPivotQuicksort.COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR + // This guarantees that code paths are taken for checking nearly sorted + // arrays for all primitive types + List sizes = List.of(100, 1_000, 10_000, 1_000_000); + return baseCases. + flatMap(l -> sizes.stream().map(s -> append(l, s))). + toArray(Object[][]::new); + } + + Object[] append(List l, Object value) { + List nl = new ArrayList<>(l); + nl.add(value); + return nl.toArray(); + } + + @Test(dataProvider = "shapes") + public void testShapes(String testName, IntFunction dataMethod, int size) { + int[] intSourceArray = dataMethod.apply(size); // Clone source array to ensure it is not modified this.sortAndAssert(intSourceArray.clone()); @@ -110,73 +196,67 @@ public class SortingNearlySortedPrimitive { private void sortAndAssert(int[] array) { Arrays.sort(array); - for (int i = 1; i < ARRAY_SIZE; i++) { + for (int i = 1; i < array.length; i++) { if (array[i] < array[i - 1]) { throw new AssertionError("not sorted"); } } - Assert.assertEquals(ARRAY_SIZE, array.length); } private void sortAndAssert(char[] array) { Arrays.sort(array); - for (int i = 1; i < ARRAY_SIZE; i++) { + for (int i = 1; i < array.length; i++) { if (array[i] < array[i - 1]) { throw new AssertionError("not sorted"); } } - Assert.assertEquals(ARRAY_SIZE, array.length); } private void sortAndAssert(short[] array) { Arrays.sort(array); - for (int i = 1; i < ARRAY_SIZE; i++) { + for (int i = 1; i < array.length; i++) { if (array[i] < array[i - 1]) { throw new AssertionError("not sorted"); } } - Assert.assertEquals(ARRAY_SIZE, array.length); } private void sortAndAssert(double[] array) { Arrays.sort(array); - for (int i = 1; i < ARRAY_SIZE; i++) { + for (int i = 1; i < array.length; i++) { if (array[i] < array[i - 1]) { throw new AssertionError("not sorted"); } } - Assert.assertEquals(ARRAY_SIZE, array.length); } private void sortAndAssert(float[] array) { Arrays.sort(array); - for (int i = 1; i < ARRAY_SIZE; i++) { + for (int i = 1; i < array.length; i++) { if (array[i] < array[i - 1]) { throw new AssertionError("not sorted"); } } - Assert.assertEquals(ARRAY_SIZE, array.length); } private void sortAndAssert(long[] array) { Arrays.sort(array); - for (int i = 1; i < ARRAY_SIZE; i++) { + for (int i = 1; i < array.length; i++) { if (array[i] < array[i - 1]) { throw new AssertionError("not sorted"); } } - Assert.assertEquals(ARRAY_SIZE, array.length); } - private int[] zeroHiData() { - int[] array = new int[ARRAY_SIZE]; + private int[] zeroHiData(int size) { + int[] array = new int[size]; - int threeQuarters = (int) (ARRAY_SIZE * 0.75); + int threeQuarters = (int) (size * 0.75); for (int i = 0; i < threeQuarters; i++) { array[i] = 0; } int k = 1; - for (int i = threeQuarters; i < ARRAY_SIZE; i++) { + for (int i = threeQuarters; i < size; i++) { array[i] = k; k++; } @@ -184,10 +264,10 @@ public class SortingNearlySortedPrimitive { return array; } - private int[] hiZeroLowData() { - int[] array = new int[ARRAY_SIZE]; + private int[] hiZeroLowData(int size) { + int[] array = new int[size]; - int oneThird = ARRAY_SIZE / 3; + int oneThird = size / 3; for (int i = 0; i < oneThird; i++) { array[i] = i; } @@ -195,16 +275,16 @@ public class SortingNearlySortedPrimitive { for (int i = oneThird; i < twoThirds; i++) { array[i] = 0; } - for (int i = twoThirds; i < ARRAY_SIZE; i++) { + for (int i = twoThirds; i < size; i++) { array[i] = oneThird - i + twoThirds; } return array; } - private int[] highFlatLowData() { - int[] array = new int[ARRAY_SIZE]; + private int[] highFlatLowData(int size) { + int[] array = new int[size]; - int oneThird = ARRAY_SIZE / 3; + int oneThird = size / 3; for (int i = 0; i < oneThird; i++) { array[i] = i; } @@ -213,57 +293,57 @@ public class SortingNearlySortedPrimitive { for (int i = oneThird; i < twoThirds; i++) { array[i] = constant; } - for (int i = twoThirds; i < ARRAY_SIZE; i++) { + for (int i = twoThirds; i < size; i++) { array[i] = constant - i + twoThirds; } return array; } - private int[] identicalData() { - int[] array = new int[ARRAY_SIZE]; + private int[] identicalData(int size) { + int[] array = new int[size]; int listNumber = 24; - for (int i = 0; i < ARRAY_SIZE; i++) { + for (int i = 0; i < size; i++) { array[i] = listNumber; } return array; } - private int[] endLessThanData() { - int[] array = new int[ARRAY_SIZE]; + private int[] endLessThanData(int size) { + int[] array = new int[size]; - for (int i = 0; i < ARRAY_SIZE - 1; i++) { + for (int i = 0; i < size - 1; i++) { array[i] = 3; } - array[ARRAY_SIZE - 1] = 1; + array[size - 1] = 1; return array; } - private int[] sortedReversedSortedData() { - int[] array = new int[ARRAY_SIZE]; + private int[] sortedReversedSortedData(int size) { + int[] array = new int[size]; - for (int i = 0; i < ARRAY_SIZE / 2; i++) { + for (int i = 0; i < size / 2; i++) { array[i] = i; } int num = 0; - for (int i = ARRAY_SIZE / 2; i < ARRAY_SIZE; i++) { - array[i] = ARRAY_SIZE - num; + for (int i = size / 2; i < size; i++) { + array[i] = size - num; num++; } return array; } - private int[] pairFlipData() { - int[] array = new int[ARRAY_SIZE]; + private int[] pairFlipData(int size) { + int[] array = new int[size]; - for (int i = 0; i < ARRAY_SIZE; i++) { + for (int i = 0; i < size; i++) { array[i] = i; } - for (int i = 0; i < ARRAY_SIZE; i += 2) { + for (int i = 0; i < size; i += 2) { int temp = array[i]; array[i] = array[i + 1]; array[i + 1] = temp; diff --git a/jdk/test/java/util/Currency/PropertiesTest.java b/jdk/test/java/util/Currency/PropertiesTest.java index 96127bf19fe..fe35f2e6161 100644 --- a/jdk/test/java/util/Currency/PropertiesTest.java +++ b/jdk/test/java/util/Currency/PropertiesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ import java.io.*; import java.text.*; import java.util.*; import java.util.regex.*; +import java.util.stream.Collectors; public class PropertiesTest { public static void main(String[] args) throws Exception { @@ -32,9 +33,14 @@ public class PropertiesTest { dump(args[1]); } else if (args.length == 4 && args[0].equals("-c")) { compare(args[1], args[2], args[3]); + } else if (args.length == 1 && args[0].equals("bug7102969")) { + bug7102969(); + } else if (args.length == 1 && args[0].equals("bug8157138")) { + bug8157138(); } else { System.err.println("Usage: java PropertiesTest -d "); System.err.println(" java PropertiesTest -c "); + System.err.println(" java PropertiesTest bug[JBS bug id number] e.g. bug7102969"); System.exit(-1); } } @@ -174,6 +180,74 @@ public class PropertiesTest { } } + private static void bug7102969() { + + // check the correct overriding of special case entries + Currency cur = Currency.getInstance(new Locale("", "JP")); + if (!cur.getCurrencyCode().equals("ABC")) { + throw new RuntimeException("[Expected: ABC as currency code of JP, found: " + + cur.getCurrencyCode() + "]"); + } + + /* check if the currency instance is returned by + * getAvailableCurrencies() method + */ + if (!Currency.getAvailableCurrencies().contains(cur)) { + throw new RuntimeException("[The Currency instance [" + + cur.getCurrencyCode() + ", " + + cur.getNumericCode() + ", " + + cur.getDefaultFractionDigits() + + "] is not available in the currencies list]"); + } + + } + + private static void bug8157138() { + + /* check the currencies which exist only as a special case are + * accessible i.e. it should not throw IllegalArgumentException + */ + try { + Currency.getInstance("MAD"); + } catch (IllegalArgumentException ex) { + throw new RuntimeException("Test Failed: " + + "special case currency instance MAD not found" + + " via Currency.getInstance(\"MAD\")"); + } + + try { + Currency.getInstance("ABC"); + } catch (IllegalArgumentException ex) { + throw new RuntimeException("Test Failed: " + + "special case currency instance ABC not found" + + " via Currency.getInstance(\"ABC\")"); + } + + /* check the currency value is returned by getAvailableCurrencies() + * method + */ + List list = Currency.getAvailableCurrencies().stream() + .filter(cur -> cur.getCurrencyCode().equals("MAD")) + .collect(Collectors.toList()); + + if (list.isEmpty()) { + throw new RuntimeException("Test Failed: " + + "special case currency instance MAD not found" + + " in Currency.getAvailableCurrencies() list"); + } + + list = Currency.getAvailableCurrencies().stream() + .filter(cur -> cur.getCurrencyCode().equals("ABC")) + .collect(Collectors.toList()); + + if (list.isEmpty()) { + throw new RuntimeException("Test Failed: " + + "special case currency instance ABC not found" + + " in Currency.getAvailableCurrencies() list"); + } + + } + private static boolean isPastCutoverDate(String s) throws IndexOutOfBoundsException, NullPointerException, ParseException { String dateString = s.substring(s.lastIndexOf(',')+1, s.length()).trim(); diff --git a/jdk/test/java/util/Currency/PropertiesTest.sh b/jdk/test/java/util/Currency/PropertiesTest.sh index a6f8a76d189..215be9229ae 100644 --- a/jdk/test/java/util/Currency/PropertiesTest.sh +++ b/jdk/test/java/util/Currency/PropertiesTest.sh @@ -23,7 +23,8 @@ # # @test -# @bug 6332666 6863624 7180362 8003846 8074350 8074351 8130246 8149735 +# @bug 6332666 6863624 7180362 8003846 8074350 8074351 8130246 8149735 7102969 +# 8157138 # @summary tests the capability of replacing the currency data with user # specified currency properties file # @build PropertiesTest @@ -113,6 +114,16 @@ ${WRITABLEJDK}${FS}bin${FS}java ${TESTVMOPTS} -cp ${TESTCLASSES} PropertiesTest if [ $? != 0 ]; then failures=`expr $failures + 1`; fi if [ ! -f dump3 ]; then echo "file dump3 not created. Test cannot execute. Failed."; exit 1; fi +# run bug7102969 test +echo '' +${WRITABLEJDK}${FS}bin${FS}java ${TESTVMOPTS} -cp ${TESTCLASSES} PropertiesTest bug7102969 +if [ $? != 0 ]; then failures=`expr $failures + 1`; fi + +# run bug8157138 test +echo '' +${WRITABLEJDK}${FS}bin${FS}java ${TESTVMOPTS} -cp ${TESTCLASSES} PropertiesTest bug8157138 +if [ $? != 0 ]; then failures=`expr $failures + 1`; fi + # Cleanup rm -rf $WRITABLEJDK diff --git a/jdk/test/java/util/Currency/currency.properties b/jdk/test/java/util/Currency/currency.properties index d8e874d819a..57b293542b8 100644 --- a/jdk/test/java/util/Currency/currency.properties +++ b/jdk/test/java/util/Currency/currency.properties @@ -6,7 +6,7 @@ CL=CLF,990,4 CM=IED,111,2, 2004-01-01T00:70:00 ES=ESD,877,2 -JP=JPZ,123,2 +JP=ABC,999,0 MA=MAA,555,5 MC=MCC,555,6 MD=MDD,555,7 diff --git a/jdk/test/java/util/Currency/tablea1.txt b/jdk/test/java/util/Currency/tablea1.txt index 92e43adf2be..dacc0fb5210 100644 --- a/jdk/test/java/util/Currency/tablea1.txt +++ b/jdk/test/java/util/Currency/tablea1.txt @@ -5,7 +5,7 @@ # # Version -FILEVERSION=2 +FILEVERSION=3 DATAVERSION=160 # ISO 4217 currency data diff --git a/jdk/test/java/util/Properties/CheckOverrides.java b/jdk/test/java/util/Properties/CheckOverrides.java new file mode 100644 index 00000000000..327143a66cb --- /dev/null +++ b/jdk/test/java/util/Properties/CheckOverrides.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/* + * @test + * @bug 8029891 + * @summary Test that the Properties class overrides all public+protected + * methods of all ancestor classes and interfaces + * @run main CheckOverrides + */ +public class CheckOverrides { + + public static void main(String[] args) { + Set pMethodSignatures = + Stream.of(Properties.class.getDeclaredMethods()) + .filter(CheckOverrides::isMethodOfInterest) + .map(MethodSignature::new) + .collect(Collectors.toSet()); + + Map unoverriddenMethods = new HashMap<>(); + for (Class superclass = Properties.class.getSuperclass(); + superclass != Object.class; + superclass = superclass.getSuperclass()) { + Stream.of(superclass.getDeclaredMethods()) + .filter(CheckOverrides::isMethodOfInterest) + .forEach(m -> unoverriddenMethods.putIfAbsent(new MethodSignature(m), m)); + } + unoverriddenMethods.keySet().removeAll(pMethodSignatures); + + if (!unoverriddenMethods.isEmpty()) { + throw new RuntimeException( + "The following methods should be overridden by Properties class:\n" + + unoverriddenMethods.values().stream() + .map(Method::toString) + .collect(Collectors.joining("\n ", " ", "\n")) + ); + } + } + + static boolean isMethodOfInterest(Method method) { + int mods = method.getModifiers(); + return !Modifier.isStatic(mods) && + (Modifier.isPublic(mods) || Modifier.isProtected(mods)); + } + + static class MethodSignature { + final Class returnType; + final String name; + final Class[] parameterTypes; + + MethodSignature(Method method) { + this(method.getReturnType(), method.getName(), method.getParameterTypes()); + } + + private MethodSignature(Class returnType, String name, Class[] parameterTypes) { + this.returnType = returnType; + this.name = name; + this.parameterTypes = parameterTypes; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MethodSignature that = (MethodSignature) o; + if (!returnType.equals(that.returnType)) return false; + if (!name.equals(that.name)) return false; + return Arrays.equals(parameterTypes, that.parameterTypes); + } + + @Override + public int hashCode() { + int result = returnType.hashCode(); + result = 31 * result + name.hashCode(); + result = 31 * result + Arrays.hashCode(parameterTypes); + return result; + } + } +} + diff --git a/jdk/test/java/util/Properties/CheckUnsynchronized.java b/jdk/test/java/util/Properties/CheckUnsynchronized.java new file mode 100644 index 00000000000..1b32cca0827 --- /dev/null +++ b/jdk/test/java/util/Properties/CheckUnsynchronized.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.Enumeration; +import java.util.Properties; +import java.util.concurrent.CompletableFuture; + +/* + * @test + * @bug 8029891 + * @summary Test Properties methods that do not synchronize any more + * @run main CheckUnsynchronized + */ +public class CheckUnsynchronized { + public static void main(String[] args) { + Properties props = new Properties(); + synchronized (props) { + props.setProperty("key", "value"); + System.out.println("contains(value)? " + + CompletableFuture.supplyAsync(() -> props.contains("value")).join()); + System.out.println("containsKey(key)? " + + CompletableFuture.supplyAsync(() -> props.containsKey("key")).join()); + System.out.println("containsValue(value)? " + + CompletableFuture.supplyAsync(() -> props.containsValue("value")).join()); + Enumeration elems = + CompletableFuture.supplyAsync(() -> props.elements()).join(); + System.out.println("first value from elements(): " + elems.nextElement()); + System.out.println("value from get(): " + + CompletableFuture.supplyAsync(() -> props.getProperty("key")).join()); + System.out.println("getOrDefault(\"missing\"): " + + CompletableFuture.supplyAsync(() -> props.getOrDefault("missing", "default")).join()); + System.out.println("isEmpty()? " + + CompletableFuture.supplyAsync(() -> props.isEmpty()).join()); + Enumeration keys = + CompletableFuture.supplyAsync(() -> props.keys()).join(); + System.out.println("first key from keys(): " + keys.nextElement()); + System.out.println("size(): " + + CompletableFuture.supplyAsync(() -> props.size()).join()); + } + } +} diff --git a/jdk/test/java/util/Properties/PropertiesSerialization.java b/jdk/test/java/util/Properties/PropertiesSerialization.java new file mode 100644 index 00000000000..2fcf1dc810a --- /dev/null +++ b/jdk/test/java/util/Properties/PropertiesSerialization.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Base64; +import java.util.Properties; + +/** + * @test + * @bug 8029891 + * @summary tests the compatibility of Properties serial form + * @run main PropertiesSerialization read + * + * To update this test in case the serial form of Properties changes, run this + * test with the 'write' flag, and copy the resulting output back into this + * file, replacing the existing String declaration(s). + */ +public class PropertiesSerialization { + private static final Properties TEST_PROPS; + static { + TEST_PROPS = new Properties(); + TEST_PROPS.setProperty("one", "two"); + TEST_PROPS.setProperty("buckle", "shoe"); + TEST_PROPS.setProperty("three", "four"); + TEST_PROPS.setProperty("shut", "door"); + } + + /** + * Base64 encoded string for Properties object + * Java version: 1.8.0 + **/ + private static final String TEST_SER_BASE64 = + "rO0ABXNyABRqYXZhLnV0aWwuUHJvcGVydGllczkS0HpwNj6YAgABTAAIZGVmYXVs" + + "dHN0ABZMamF2YS91dGlsL1Byb3BlcnRpZXM7eHIAE2phdmEudXRpbC5IYXNodGFi" + + "bGUTuw8lIUrkuAMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAAAAAAAI" + + "dwgAAAALAAAABHQAA29uZXQAA3R3b3QABHNodXR0AARkb29ydAAGYnVja2xldAAE" + + "c2hvZXQABXRocmVldAAEZm91cnhw"; + + public static void main(String[] args) throws IOException, + ClassNotFoundException { + if (args.length == 0) { + System.err.println("Run with 'read' or 'write'"); + System.err.println(" read mode: normal test mode."); + System.err.println(" Confirms that serial stream can"); + System.err.println(" be deserialized as expected."); + System.err.println(" write mode: meant for updating the test,"); + System.err.println(" should the serial form change."); + System.err.println(" Test output should be pasted"); + System.err.println(" back into the test source."); + return; + } + + Properties deserializedObject; + if ("read".equals(args[0])) { + ByteArrayInputStream bais = new + ByteArrayInputStream(Base64.getDecoder().decode(TEST_SER_BASE64)); + try (ObjectInputStream ois = new ObjectInputStream(bais)) { + deserializedObject = (Properties) ois.readObject(); + } + if (!TEST_PROPS.equals(deserializedObject)) { + throw new RuntimeException("deserializedObject not equals()"); + } + System.out.println("Test passed"); + } else if ("write".equals(args[0])) { + System.out.println("\nTo update the test, paste the following back " + + "into the test code:\n"); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(TEST_PROPS); + oos.flush(); + oos.close(); + + byte[] byteArray = baos.toByteArray(); + // Check that the Properties deserializes correctly + ByteArrayInputStream bais = new ByteArrayInputStream(byteArray); + ObjectInputStream ois = new ObjectInputStream(bais); + Properties deser = (Properties)ois.readObject(); + if (!TEST_PROPS.equals(deser)) { + throw new RuntimeException("write: Deserialized != original"); + } + + // Now get a Base64 string representation of the serialized bytes. + final String base64 = Base64.getEncoder().encodeToString(byteArray); + // Check that we can deserialize the Base64 string we just computed. + ByteArrayInputStream bais2 = + new ByteArrayInputStream(Base64.getDecoder().decode(base64)); + ObjectInputStream ois2 = new ObjectInputStream(bais2); + Properties deser2 = (Properties)ois2.readObject(); + if (!TEST_PROPS.equals(deser2)) { + throw new RuntimeException("write: Deserialized base64 != " + + "original"); + } + System.out.println(dumpBase64SerialStream(base64)); + } + } + + private static final String INDENT = " "; + /* Based on: + * java/util/logging/HigherResolutionTimeStamps/SerializeLogRecored.java + */ + private static String dumpBase64SerialStream(String base64) { + // Generates the Java Pseudo code that can be cut & pasted into + // this test (see Jdk8SerializedLog and Jdk9SerializedLog below) + final StringBuilder sb = new StringBuilder(); + sb.append(INDENT).append(" /**").append('\n'); + sb.append(INDENT).append(" * Base64 encoded string for Properties object\n"); + sb.append(INDENT).append(" * Java version: ") + .append(System.getProperty("java.version")).append('\n'); + sb.append(INDENT).append(" **/").append('\n'); + sb.append(INDENT).append(" private static final String TEST_SER_BASE64 = ") + .append("\n").append(INDENT).append(" "); + final int last = base64.length() - 1; + for (int i=0; i listNotFound = new ArrayList<>(); + String[][] zoneStrings = DateFormatSymbols.getInstance() + .getZoneStrings(); + for (String tzID : TimeZone.getAvailableIDs()) { + if (!Arrays.stream(zoneStrings) + .anyMatch(zone -> tzID.equalsIgnoreCase(zone[0]))) { + // to ignore names for Etc/GMT[+-][0-9]+ which are not supported + if (!tzID.startsWith("Etc/GMT") && !tzID.startsWith("GMT")) { + listNotFound.add(tzID); + } + } + } + + if (!listNotFound.isEmpty()) { + throw new RuntimeException("Test Failed: Time Zone Strings for " + + listNotFound + " not found"); + } + + } + +} diff --git a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarAPI.java b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarAPI.java index e6dd04c23af..54b889f9427 100644 --- a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarAPI.java +++ b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarAPI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8132734 + * @bug 8132734 8144062 * @summary Test the extended API and the aliasing additions in JarFile that * support multi-release jar files * @library /lib/testlibrary/java/util/jar @@ -39,7 +39,6 @@ import java.util.Arrays; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import jdk.Version; import static java.util.jar.JarFile.Release; @@ -51,7 +50,7 @@ import org.testng.annotations.Test; public class MultiReleaseJarAPI { - static final int MAJOR_VERSION = Version.current().major(); + static final int MAJOR_VERSION = Runtime.version().major(); String userdir = System.getProperty("user.dir","."); CreateMultiReleaseTestJars creator = new CreateMultiReleaseTestJars(); diff --git a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarIterators.java b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarIterators.java index 59900cf3f7a..60d5063ba71 100644 --- a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarIterators.java +++ b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarIterators.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8132734 + * @bug 8132734 8144062 * @summary Test the extended API and the aliasing additions in JarFile that * support multi-release jar files * @library /lib/testlibrary/java/util/jar @@ -42,7 +42,6 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.stream.Collectors; import java.util.zip.ZipFile; -import jdk.Version; import static java.util.jar.JarFile.Release; @@ -54,7 +53,7 @@ import org.testng.annotations.Test; public class MultiReleaseJarIterators { - static final int MAJOR_VERSION = Version.current().major(); + static final int MAJOR_VERSION = Runtime.version().major(); String userdir = System.getProperty("user.dir", "."); File unversioned = new File(userdir, "unversioned.jar"); diff --git a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarProperties.java b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarProperties.java index 6bf059fb8ea..d729c438a66 100644 --- a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarProperties.java +++ b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarProperties.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8132734 + * @bug 8132734 8144062 * @summary Test the System properties for JarFile that support multi-release jar files * @library /lib/testlibrary/java/util/jar * @build Compiler JarBuilder CreateMultiReleaseTestJars @@ -54,7 +54,6 @@ import java.net.URLClassLoader; import java.nio.file.Files; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import jdk.Version; import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -63,7 +62,7 @@ import org.testng.annotations.Test; public class MultiReleaseJarProperties { - static final int MAJOR_VERSION = Version.current().major(); + static final int MAJOR_VERSION = Runtime.version().major(); final static int ROOTVERSION = 8; // magic number from knowledge of internals final static String userdir = System.getProperty("user.dir", "."); diff --git a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarSecurity.java b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarSecurity.java index 348194a3be3..538742ce192 100644 --- a/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarSecurity.java +++ b/jdk/test/java/util/jar/JarFile/mrjar/MultiReleaseJarSecurity.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8132734 + * @bug 8132734 8144062 * @summary Test potential security related issues * @library /lib/testlibrary/java/util/jar * @build Compiler JarBuilder CreateMultiReleaseTestJars @@ -40,7 +40,6 @@ import java.util.Arrays; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.zip.ZipFile; -import jdk.Version; import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -49,7 +48,7 @@ import org.testng.annotations.Test; public class MultiReleaseJarSecurity { - static final int MAJOR_VERSION = Version.current().major(); + static final int MAJOR_VERSION = Runtime.version().major(); String userdir = System.getProperty("user.dir","."); File multirelease = new File(userdir, "multi-release.jar"); diff --git a/jdk/test/javax/accessibility/8017112/AccessibleIndexInParentTest.java b/jdk/test/javax/accessibility/8017112/AccessibleIndexInParentTest.java new file mode 100644 index 00000000000..87f35b40da9 --- /dev/null +++ b/jdk/test/javax/accessibility/8017112/AccessibleIndexInParentTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Component; +import javax.swing.JLabel; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +/* + * @test + * @bug 8017112 + * @summary JTabbedPane components have inconsistent accessibility tree + * @run main AccessibleIndexInParentTest + */ + +public class AccessibleIndexInParentTest { + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(AccessibleIndexInParentTest::test); + } + + private static void test() { + + int N = 5; + JTabbedPane tabbedPane = new JTabbedPane(); + + for (int i = 0; i < N; i++) { + tabbedPane.addTab("Title: " + i, new JLabel("Component: " + i)); + } + + for (int i = 0; i < tabbedPane.getTabCount(); i++) { + Component child = tabbedPane.getComponentAt(i); + + AccessibleContext ac = child.getAccessibleContext(); + if (ac == null) { + throw new RuntimeException("Accessible Context is null!"); + } + + int index = ac.getAccessibleIndexInParent(); + Accessible parent = ac.getAccessibleParent(); + + if (parent.getAccessibleContext().getAccessibleChild(index) != child) { + throw new RuntimeException("Wrong getAccessibleIndexInParent!"); + } + } + } +} \ No newline at end of file diff --git a/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java b/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java index 6592555706d..35f35a5c410 100644 --- a/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java +++ b/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,8 +47,16 @@ import sun.security.util.HexDumpEncoder; * An example to show the way to use SSLEngine in datagram connections. */ public class DTLSOverDatagram { + + static { + System.setProperty("javax.net.debug", "ssl"); + } + private static int MAX_HANDSHAKE_LOOPS = 200; private static int MAX_APP_READ_LOOPS = 60; + private static int SOCKET_TIMEOUT = 10 * 1000; // in millis + private static int BUFFER_SIZE = 1024; + private static int MAXIMUM_PACKET_SIZE = 1024; /* * The following is to set up the keystores. @@ -84,37 +92,33 @@ public class DTLSOverDatagram { /* * Define the server side of the test. */ - void doServerSide() throws Exception { - DatagramSocket socket = serverDatagramSocket; - socket.setSoTimeout(10000); // 10 second + void doServerSide(DatagramSocket socket, InetSocketAddress clientSocketAddr) + throws Exception { // create SSLEngine SSLEngine engine = createSSLEngine(false); // handshaking - handshake(engine, socket, clientSocketAddr); + handshake(engine, socket, clientSocketAddr, "Server"); // read client application data receiveAppData(engine, socket, clientApp); // write server application data deliverAppData(engine, socket, serverApp, clientSocketAddr); - - socket.close(); } /* * Define the client side of the test. */ - void doClientSide() throws Exception { - DatagramSocket socket = clientDatagramSocket; - socket.setSoTimeout(1000); // 1 second read timeout + void doClientSide(DatagramSocket socket, InetSocketAddress serverSocketAddr) + throws Exception { // create SSLEngine SSLEngine engine = createSSLEngine(true); // handshaking - handshake(engine, socket, serverSocketAddr); + handshake(engine, socket, serverSocketAddr, "Client"); // write client application data deliverAppData(engine, socket, clientApp, serverSocketAddr); @@ -132,7 +136,7 @@ public class DTLSOverDatagram { SSLEngine engine = context.createSSLEngine(); SSLParameters paras = engine.getSSLParameters(); - paras.setMaximumPacketSize(1024); + paras.setMaximumPacketSize(MAXIMUM_PACKET_SIZE); engine.setUseClientMode(isClient); engine.setSSLParameters(paras); @@ -142,7 +146,7 @@ public class DTLSOverDatagram { // handshake void handshake(SSLEngine engine, DatagramSocket socket, - SocketAddress peerAddr) throws Exception { + SocketAddress peerAddr, String side) throws Exception { boolean endLoops = false; int loops = MAX_HANDSHAKE_LOOPS; @@ -159,39 +163,60 @@ public class DTLSOverDatagram { if (hs == SSLEngineResult.HandshakeStatus.NEED_UNWRAP || hs == SSLEngineResult.HandshakeStatus.NEED_UNWRAP_AGAIN) { + log(side, "Receive DTLS records, handshake status is " + hs); + ByteBuffer iNet; ByteBuffer iApp; if (hs == SSLEngineResult.HandshakeStatus.NEED_UNWRAP) { - // receive ClientHello request and other SSL/TLS records - byte[] buf = new byte[1024]; + byte[] buf = new byte[BUFFER_SIZE]; DatagramPacket packet = new DatagramPacket(buf, buf.length); try { socket.receive(packet); } catch (SocketTimeoutException ste) { - List packets = - onReceiveTimeout(engine, peerAddr); + log(side, "Warning: " + ste); + + List packets = new ArrayList<>(); + boolean finished = onReceiveTimeout( + engine, peerAddr, side, packets); + for (DatagramPacket p : packets) { socket.send(p); } + if (finished) { + log(side, "Handshake status is FINISHED " + + "after calling onReceiveTimeout(), " + + "finish the loop"); + endLoops = true; + } + + log(side, "New handshake status is " + + engine.getHandshakeStatus()); + continue; } iNet = ByteBuffer.wrap(buf, 0, packet.getLength()); - iApp = ByteBuffer.allocate(1024); + iApp = ByteBuffer.allocate(BUFFER_SIZE); } else { iNet = ByteBuffer.allocate(0); - iApp = ByteBuffer.allocate(1024); + iApp = ByteBuffer.allocate(BUFFER_SIZE); } SSLEngineResult r = engine.unwrap(iNet, iApp); SSLEngineResult.Status rs = r.getStatus(); hs = r.getHandshakeStatus(); - if (rs == SSLEngineResult.Status.BUFFER_OVERFLOW) { + if (rs == SSLEngineResult.Status.OK) { + // OK + } else if (rs == SSLEngineResult.Status.BUFFER_OVERFLOW) { + log(side, "BUFFER_OVERFLOW, handshake status is " + hs); + // the client maximum fragment size config does not work? throw new Exception("Buffer overflow: " + "incorrect client maximum fragment size"); } else if (rs == SSLEngineResult.Status.BUFFER_UNDERFLOW) { + log(side, "BUFFER_UNDERFLOW, handshake status is " + hs); + // bad packet, or the client maximum fragment size // config does not work? if (hs != SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) { @@ -199,31 +224,64 @@ public class DTLSOverDatagram { "incorrect client maximum fragment size"); } // otherwise, ignore this packet } else if (rs == SSLEngineResult.Status.CLOSED) { - endLoops = true; - } // otherwise, SSLEngineResult.Status.OK: + throw new Exception( + "SSL engine closed, handshake status is " + hs); + } else { + throw new Exception("Can't reach here, result is " + rs); + } - if (rs != SSLEngineResult.Status.OK) { - continue; + if (hs == SSLEngineResult.HandshakeStatus.FINISHED) { + log(side, "Handshake status is FINISHED, finish the loop"); + endLoops = true; } } else if (hs == SSLEngineResult.HandshakeStatus.NEED_WRAP) { - List packets = - produceHandshakePackets(engine, peerAddr); + List packets = new ArrayList<>(); + boolean finished = produceHandshakePackets( + engine, peerAddr, side, packets); + for (DatagramPacket p : packets) { socket.send(p); } + + if (finished) { + log(side, "Handshake status is FINISHED " + + "after producing handshake packets, " + + "finish the loop"); + endLoops = true; + } } else if (hs == SSLEngineResult.HandshakeStatus.NEED_TASK) { runDelegatedTasks(engine); } else if (hs == SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) { - // OK, time to do application data exchange. + log(side, "Handshake status is NOT_HANDSHAKING, finish the loop"); endLoops = true; } else if (hs == SSLEngineResult.HandshakeStatus.FINISHED) { - endLoops = true; + throw new Exception( + "Unexpected status, SSLEngine.getHandshakeStatus() " + + "shouldn't return FINISHED"); + } else { + throw new Exception("Can't reach here, handshake status is " + hs); } } SSLEngineResult.HandshakeStatus hs = engine.getHandshakeStatus(); + log(side, "Handshake finished, status is " + hs); + + if (engine.getHandshakeSession() != null) { + throw new Exception( + "Handshake finished, but handshake session is not null"); + } + + SSLSession session = engine.getSession(); + if (session == null) { + throw new Exception("Handshake finished, but session is null"); + } + log(side, "Negotiated protocol is " + session.getProtocol()); + log(side, "Negotiated cipher suite is " + session.getCipherSuite()); + + // handshake status should be NOT_HANDSHAKING + // according to the spec, SSLEngine.getHandshakeStatus() can't return FINISHED if (hs != SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) { - throw new Exception("Not ready for application data yet"); + throw new Exception("Unexpected handshake status " + hs); } } @@ -251,11 +309,11 @@ public class DTLSOverDatagram { "Too much loops to receive application data"); } - byte[] buf = new byte[1024]; + byte[] buf = new byte[BUFFER_SIZE]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); ByteBuffer netBuffer = ByteBuffer.wrap(buf, 0, packet.getLength()); - ByteBuffer recBuffer = ByteBuffer.allocate(1024); + ByteBuffer recBuffer = ByteBuffer.allocate(BUFFER_SIZE); SSLEngineResult rs = engine.unwrap(netBuffer, recBuffer); recBuffer.flip(); if (recBuffer.remaining() != 0) { @@ -270,10 +328,9 @@ public class DTLSOverDatagram { } // produce handshake packets - List produceHandshakePackets( - SSLEngine engine, SocketAddress socketAddr) throws Exception { + boolean produceHandshakePackets(SSLEngine engine, SocketAddress socketAddr, + String side, List packets) throws Exception { - List packets = new ArrayList<>(); boolean endLoops = false; int loops = MAX_HANDSHAKE_LOOPS; while (!endLoops && @@ -296,6 +353,8 @@ public class DTLSOverDatagram { throw new Exception("Buffer overflow: " + "incorrect server maximum fragment size"); } else if (rs == SSLEngineResult.Status.BUFFER_UNDERFLOW) { + log(side, "Produce handshake packets: BUFFER_UNDERFLOW occured"); + log(side, "Produce handshake packets: Handshake status: " + hs); // bad packet, or the client maximum fragment size // config does not work? if (hs != SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) { @@ -304,7 +363,11 @@ public class DTLSOverDatagram { } // otherwise, ignore this packet } else if (rs == SSLEngineResult.Status.CLOSED) { throw new Exception("SSLEngine has closed"); - } // otherwise, SSLEngineResult.Status.OK + } else if (rs == SSLEngineResult.Status.OK) { + // OK + } else { + throw new Exception("Can't reach here, result is " + rs); + } // SSLEngineResult.Status.OK: if (oNet.hasRemaining()) { @@ -313,25 +376,39 @@ public class DTLSOverDatagram { DatagramPacket packet = createHandshakePacket(ba, socketAddr); packets.add(packet); } + + if (hs == SSLEngineResult.HandshakeStatus.FINISHED) { + log(side, "Produce handshake packets: " + + "Handshake status is FINISHED, finish the loop"); + return true; + } + boolean endInnerLoop = false; SSLEngineResult.HandshakeStatus nhs = hs; while (!endInnerLoop) { if (nhs == SSLEngineResult.HandshakeStatus.NEED_TASK) { runDelegatedTasks(engine); - nhs = engine.getHandshakeStatus(); - } else if ((nhs == SSLEngineResult.HandshakeStatus.FINISHED) || - (nhs == SSLEngineResult.HandshakeStatus.NEED_UNWRAP) || - (nhs == SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING)) { + } else if (nhs == SSLEngineResult.HandshakeStatus.NEED_UNWRAP || + nhs == SSLEngineResult.HandshakeStatus.NEED_UNWRAP_AGAIN || + nhs == SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) { endInnerLoop = true; endLoops = true; } else if (nhs == SSLEngineResult.HandshakeStatus.NEED_WRAP) { endInnerLoop = true; + } else if (nhs == SSLEngineResult.HandshakeStatus.FINISHED) { + throw new Exception( + "Unexpected status, SSLEngine.getHandshakeStatus() " + + "shouldn't return FINISHED"); + } else { + throw new Exception("Can't reach here, handshake status is " + + nhs); } + nhs = engine.getHandshakeStatus(); } } - return packets; + return false; } DatagramPacket createHandshakePacket(byte[] ba, SocketAddress socketAddr) { @@ -358,7 +435,11 @@ public class DTLSOverDatagram { throw new Exception("Buffer underflow during wraping"); } else if (rs == SSLEngineResult.Status.CLOSED) { throw new Exception("SSLEngine has closed"); - } // otherwise, SSLEngineResult.Status.OK + } else if (rs == SSLEngineResult.Status.OK) { + // OK + } else { + throw new Exception("Can't reach here, result is " + rs); + } // SSLEngineResult.Status.OK: if (appNet.hasRemaining()) { @@ -386,15 +467,15 @@ public class DTLSOverDatagram { } // retransmission if timeout - List onReceiveTimeout( - SSLEngine engine, SocketAddress socketAddr) throws Exception { + boolean onReceiveTimeout(SSLEngine engine, SocketAddress socketAddr, + String side, List packets) throws Exception { SSLEngineResult.HandshakeStatus hs = engine.getHandshakeStatus(); if (hs == SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) { - return new ArrayList(); + return false; } else { // retransmission of handshake messages - return produceHandshakePackets(engine, socketAddr); + return produceHandshakePackets(engine, socketAddr, side, packets); } } @@ -405,8 +486,13 @@ public class DTLSOverDatagram { char[] passphrase = "passphrase".toCharArray(); - ks.load(new FileInputStream(keyFilename), passphrase); - ts.load(new FileInputStream(trustFilename), passphrase); + try (FileInputStream fis = new FileInputStream(keyFilename)) { + ks.load(fis, passphrase); + } + + try (FileInputStream fis = new FileInputStream(trustFilename)) { + ts.load(fis, passphrase); + } KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, passphrase); @@ -427,94 +513,84 @@ public class DTLSOverDatagram { * The remainder is support stuff to kickstart the testing. */ - // the server side SocketAddress - volatile static SocketAddress serverSocketAddr = null; - - // the client side SocketAddress - volatile static SocketAddress clientSocketAddr = null; - - // the server side DatagramSocket instance - volatile static DatagramSocket serverDatagramSocket = null; - - // the server side DatagramSocket instance - volatile static DatagramSocket clientDatagramSocket = null; - - // get server side SocketAddress object - public SocketAddress getServerSocketAddress() { - return serverSocketAddr; - } - - // get client side SocketAddress object - public SocketAddress getClientSocketAddress() { - return clientSocketAddr; - } - - // get server side DatagramSocket object - public DatagramSocket getServerDatagramSocket() { - return serverDatagramSocket; - } - - // get client side DatagramSocket object - public DatagramSocket getClientDatagramSocket() { - return clientDatagramSocket; - } - // Will the handshaking and application data exchange succeed? public boolean isGoodJob() { return true; } public final void runTest(DTLSOverDatagram testCase) throws Exception { - serverDatagramSocket = new DatagramSocket(); - serverSocketAddr = new InetSocketAddress( - InetAddress.getLocalHost(), serverDatagramSocket.getLocalPort()); + try (DatagramSocket serverSocket = new DatagramSocket(); + DatagramSocket clientSocket = new DatagramSocket()) { - clientDatagramSocket = new DatagramSocket(); - clientSocketAddr = new InetSocketAddress( - InetAddress.getLocalHost(), clientDatagramSocket.getLocalPort()); + serverSocket.setSoTimeout(SOCKET_TIMEOUT); + clientSocket.setSoTimeout(SOCKET_TIMEOUT); - ExecutorService pool = Executors.newFixedThreadPool(2); - List> list = new ArrayList>(); + InetSocketAddress serverSocketAddr = new InetSocketAddress( + InetAddress.getLocalHost(), serverSocket.getLocalPort()); - try { - list.add(pool.submit(new ServerCallable(testCase))); // server task - list.add(pool.submit(new ClientCallable(testCase))); // client task - } finally { - pool.shutdown(); - } + InetSocketAddress clientSocketAddr = new InetSocketAddress( + InetAddress.getLocalHost(), clientSocket.getLocalPort()); + + ExecutorService pool = Executors.newFixedThreadPool(2); + Future server, client; - Exception reserved = null; - for (Future fut : list) { try { - System.out.println(fut.get()); - } catch (CancellationException | - InterruptedException | ExecutionException cie) { - if (reserved != null) { - cie.addSuppressed(reserved); - reserved = cie; - } else { - reserved = cie; - } + server = pool.submit(new ServerCallable( + testCase, serverSocket, clientSocketAddr)); + client = pool.submit(new ClientCallable( + testCase, clientSocket, serverSocketAddr)); + } finally { + pool.shutdown(); } - } - if (reserved != null) { - throw reserved; + boolean failed = false; + + // wait for client to finish + try { + System.out.println("Client finished: " + client.get()); + } catch (CancellationException | InterruptedException + | ExecutionException e) { + System.out.println("Exception on client side: "); + e.printStackTrace(System.out); + failed = true; + } + + // wait for server to finish + try { + System.out.println("Client finished: " + server.get()); + } catch (CancellationException | InterruptedException + | ExecutionException e) { + System.out.println("Exception on server side: "); + e.printStackTrace(System.out); + failed = true; + } + + if (failed) { + throw new RuntimeException("Test failed"); + } } } final static class ServerCallable implements Callable { - DTLSOverDatagram testCase; - ServerCallable(DTLSOverDatagram testCase) { + private final DTLSOverDatagram testCase; + private final DatagramSocket socket; + private final InetSocketAddress clientSocketAddr; + + ServerCallable(DTLSOverDatagram testCase, DatagramSocket socket, + InetSocketAddress clientSocketAddr) { + this.testCase = testCase; + this.socket = socket; + this.clientSocketAddr = clientSocketAddr; } @Override public String call() throws Exception { try { - testCase.doServerSide(); + testCase.doServerSide(socket, clientSocketAddr); } catch (Exception e) { + System.out.println("Exception in ServerCallable.call():"); e.printStackTrace(System.out); serverException = e; @@ -523,10 +599,6 @@ public class DTLSOverDatagram { } else { return "Well done, server!"; } - } finally { - if (serverDatagramSocket != null) { - serverDatagramSocket.close(); - } } if (testCase.isGoodJob()) { @@ -538,28 +610,33 @@ public class DTLSOverDatagram { } final static class ClientCallable implements Callable { - DTLSOverDatagram testCase; - ClientCallable(DTLSOverDatagram testCase) { + private final DTLSOverDatagram testCase; + private final DatagramSocket socket; + private final InetSocketAddress serverSocketAddr; + + ClientCallable(DTLSOverDatagram testCase, DatagramSocket socket, + InetSocketAddress serverSocketAddr) { + this.testCase = testCase; + this.socket = socket; + this.serverSocketAddr = serverSocketAddr; } @Override public String call() throws Exception { try { - testCase.doClientSide(); + testCase.doClientSide(socket, serverSocketAddr); } catch (Exception e) { + System.out.println("Exception in ClientCallable.call():"); e.printStackTrace(System.out); clientException = e; + if (testCase.isGoodJob()) { throw e; } else { return "Well done, client!"; } - } finally { - if (clientDatagramSocket != null) { - clientDatagramSocket.close(); - } } if (testCase.isGoodJob()) { @@ -600,4 +677,8 @@ public class DTLSOverDatagram { System.out.flush(); } } + + static void log(String side, String message) { + System.out.println(side + ": " + message); + } } diff --git a/jdk/test/javax/net/ssl/DTLS/Reordered.java b/jdk/test/javax/net/ssl/DTLS/Reordered.java index 9e91979a909..25053d221bb 100644 --- a/jdk/test/javax/net/ssl/DTLS/Reordered.java +++ b/jdk/test/javax/net/ssl/DTLS/Reordered.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,16 +51,17 @@ public class Reordered extends DTLSOverDatagram { } @Override - List produceHandshakePackets( - SSLEngine engine, SocketAddress socketAddr) throws Exception { - List packets = - super.produceHandshakePackets(engine, socketAddr); + boolean produceHandshakePackets(SSLEngine engine, SocketAddress socketAddr, + String side, List packets) throws Exception { + + boolean finished = super.produceHandshakePackets( + engine, socketAddr, side, packets); if (needPacketReorder && (!engine.getUseClientMode())) { needPacketReorder = false; Collections.reverse(packets); } - return packets; + return finished; } } diff --git a/jdk/test/javax/net/ssl/DTLS/Retransmission.java b/jdk/test/javax/net/ssl/DTLS/Retransmission.java index 75aecab22fb..840b08a7d7d 100644 --- a/jdk/test/javax/net/ssl/DTLS/Retransmission.java +++ b/jdk/test/javax/net/ssl/DTLS/Retransmission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,13 +52,14 @@ public class Retransmission extends DTLSOverDatagram { } @Override - List produceHandshakePackets( - SSLEngine engine, SocketAddress socketAddr) throws Exception { - List packets = - super.produceHandshakePackets(engine, socketAddr); + boolean produceHandshakePackets(SSLEngine engine, SocketAddress socketAddr, + String side, List packets) throws Exception { + + boolean finished = super.produceHandshakePackets( + engine, socketAddr, side, packets); if (!needPacketLoss || (!engine.getUseClientMode())) { - return packets; + return finished; } List parts = new ArrayList<>(); @@ -75,6 +76,9 @@ public class Retransmission extends DTLSOverDatagram { parts.add(packet); } - return parts; + packets.clear(); + packets.addAll(parts); + + return finished; } } diff --git a/jdk/test/javax/net/ssl/HttpsURLConnection/Equals.java b/jdk/test/javax/net/ssl/HttpsURLConnection/Equals.java index 0a482f31b90..0e40e52ce9b 100644 --- a/jdk/test/javax/net/ssl/HttpsURLConnection/Equals.java +++ b/jdk/test/javax/net/ssl/HttpsURLConnection/Equals.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /** * @test * @library /lib/testlibrary + * @modules jdk.httpserver * @build jdk.testlibrary.SimpleSSLContext * @run main Equals * @bug 8055299 diff --git a/jdk/test/javax/net/ssl/ServerName/BestEffortOnLazyConnected.java b/jdk/test/javax/net/ssl/ServerName/BestEffortOnLazyConnected.java index ba3e5f10e50..bda0710f61e 100644 --- a/jdk/test/javax/net/ssl/ServerName/BestEffortOnLazyConnected.java +++ b/jdk/test/javax/net/ssl/ServerName/BestEffortOnLazyConnected.java @@ -34,9 +34,6 @@ */ import java.io.*; -import java.nio.*; -import java.nio.channels.*; -import java.util.*; import java.net.*; import javax.net.ssl.*; @@ -197,6 +194,7 @@ public class BestEffortOnLazyConnected { hostname); // Ignore the test if the hostname does not sound like a domain name. if ((hostname == null) || hostname.isEmpty() || + !hostname.contains(".") || hostname.endsWith(".") || hostname.startsWith("localhost") || Character.isDigit(hostname.charAt(hostname.length() - 1))) { diff --git a/jdk/test/javax/net/ssl/TLS/CipherTestUtils.java b/jdk/test/javax/net/ssl/TLS/CipherTestUtils.java index a86b10abd26..04020bc6f03 100644 --- a/jdk/test/javax/net/ssl/TLS/CipherTestUtils.java +++ b/jdk/test/javax/net/ssl/TLS/CipherTestUtils.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it under @@ -202,6 +202,8 @@ public class CipherTestUtils { @Override public abstract void run(); + abstract int getPort(); + void handleRequest(InputStream in, OutputStream out) throws IOException { boolean newline = false; @@ -528,9 +530,9 @@ public class CipherTestUtils { return ks; } - public static void main(PeerFactory peerFactory, String mode, - String expectedException) - throws Exception { + public static int mainServer(PeerFactory peerFactory, + String expectedException) throws Exception { + long time = System.currentTimeMillis(); setTestedArguments(peerFactory.getTestedProtocol(), peerFactory.getTestedCipher()); @@ -540,33 +542,49 @@ public class CipherTestUtils { secureRandom.nextInt(); CipherTestUtils cipherTest = CipherTestUtils.getInstance(); - if (mode.equalsIgnoreCase("Server")) { // server mode - Thread serverThread = new Thread(peerFactory.newServer(cipherTest), - "Server"); - serverThread.start(); - } else if (mode.equalsIgnoreCase("Client")) { - peerFactory.newClient(cipherTest).run(); - cipherTest.checkResult(expectedException); - JSSEServer.closeServer = true; - } else { - throw new RuntimeException("unsupported mode"); - } + Server server = peerFactory.newServer(cipherTest, PeerFactory.FREE_PORT); + Thread serverThread = new Thread(server, "Server"); + serverThread.start(); + time = System.currentTimeMillis() - time; System.out.println("Elapsed time " + time); + return server.getPort(); + } + + public static void mainClient(PeerFactory peerFactory, int port, + String expectedException) throws Exception { + + long time = System.currentTimeMillis(); + setTestedArguments(peerFactory.getTestedProtocol(), + peerFactory.getTestedCipher()); + + System.out.print( + " Initializing test '" + peerFactory.getName() + "'..."); + secureRandom.nextInt(); + + CipherTestUtils cipherTest = CipherTestUtils.getInstance(); + peerFactory.newClient(cipherTest, port).run(); + cipherTest.checkResult(expectedException); + JSSEServer.closeServer = true; + + time = System.currentTimeMillis() - time; + System.out.println("Elapsed time " + time); } public static abstract class PeerFactory { + public static final int FREE_PORT = 0; + abstract String getName(); abstract String getTestedProtocol(); abstract String getTestedCipher(); - abstract Client newClient(CipherTestUtils cipherTest) throws Exception; + abstract Client newClient(CipherTestUtils cipherTest, int testPort) throws Exception; - abstract Server newServer(CipherTestUtils cipherTest) throws Exception; + abstract Server newServer(CipherTestUtils cipherTest, int testPort) throws Exception; boolean isSupported(String cipherSuite) { return true; diff --git a/jdk/test/javax/net/ssl/TLS/JSSEServer.java b/jdk/test/javax/net/ssl/TLS/JSSEServer.java index f6e55a31706..1ece6f0f8b8 100644 --- a/jdk/test/javax/net/ssl/TLS/JSSEServer.java +++ b/jdk/test/javax/net/ssl/TLS/JSSEServer.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it under @@ -77,4 +77,8 @@ public class JSSEServer extends CipherTestUtils.Server { } } } + + int getPort() { + return serverSocket.getLocalPort(); + } } diff --git a/jdk/test/javax/net/ssl/TLS/TestJSSE.java b/jdk/test/javax/net/ssl/TLS/TestJSSE.java index d4c41480c0b..d477e4facdf 100644 --- a/jdk/test/javax/net/ssl/TLS/TestJSSE.java +++ b/jdk/test/javax/net/ssl/TLS/TestJSSE.java @@ -27,10 +27,8 @@ import java.security.Security; /** * @test * @bug 8049429 - * @library ../../../../lib/testlibrary/ * @modules java.management * jdk.crypto.ec/sun.security.ec - * @build jdk.testlibrary.Utils * @compile CipherTestUtils.java JSSEClient.java JSSEServer.java * @summary Test that all cipher suites work in all versions and all client * authentication types. The way this is setup the server is stateless and @@ -86,7 +84,6 @@ public class TestJSSE { String serverProtocol = System.getProperty("SERVER_PROTOCOL"); String clientProtocol = System.getProperty("CLIENT_PROTOCOL"); - int port = jdk.testlibrary.Utils.getFreePort(); String cipher = System.getProperty("CIPHER"); if (serverProtocol == null || clientProtocol == null @@ -97,7 +94,7 @@ public class TestJSSE { out.println("ServerProtocol =" + serverProtocol); out.println("ClientProtocol =" + clientProtocol); out.println("Cipher =" + cipher); - server(serverProtocol, cipher, port, args); + int port = server(serverProtocol, cipher, args); client(port, clientProtocol, cipher, args); } @@ -112,28 +109,30 @@ public class TestJSSE { out.println(" Testing - Protocol : " + testProtocols); out.println(" Testing - Cipher : " + testCipher); try { - CipherTestUtils.main(new JSSEFactory(LOCAL_IP, - testPort, testProtocols, - testCipher, "client JSSE"), - "client", expectedException); + CipherTestUtils.mainClient(new JSSEFactory(LOCAL_IP, testProtocols, + testCipher, "Client JSSE"), + testPort, expectedException); } catch (Exception e) { throw new RuntimeException(e); } } - public static void server(String testProtocol, String testCipher, - int testPort, + public static int server(String testProtocol, String testCipher, String... exception) throws Exception { + String expectedException = exception.length >= 1 ? exception[0] : null; out.println(" This is Server"); out.println(" Testing Protocol: " + testProtocol); out.println(" Testing Cipher: " + testCipher); - out.println(" Testing Port: " + testPort); + try { - CipherTestUtils.main(new JSSEFactory(null, testPort, - testProtocol, testCipher, "Server JSSE"), - "Server", expectedException); + int port = CipherTestUtils.mainServer(new JSSEFactory( + null, testProtocol, testCipher, "Server JSSE"), + expectedException); + + out.println(" Testing Port: " + port); + return port; } catch (Exception e) { throw new RuntimeException(e); } @@ -142,15 +141,13 @@ public class TestJSSE { private static class JSSEFactory extends CipherTestUtils.PeerFactory { final String testedCipherSuite, testedProtocol, testHost; - final int testPort; final String name; - JSSEFactory(String testHost, int testPort, String testedProtocol, + JSSEFactory(String testHost, String testedProtocol, String testedCipherSuite, String name) { this.testedCipherSuite = testedCipherSuite; this.testedProtocol = testedProtocol; this.testHost = testHost; - this.testPort = testPort; this.name = name; } @@ -170,14 +167,14 @@ public class TestJSSE { } @Override - CipherTestUtils.Client newClient(CipherTestUtils cipherTest) + CipherTestUtils.Client newClient(CipherTestUtils cipherTest, int testPort) throws Exception { return new JSSEClient(cipherTest, testHost, testPort, testedProtocol, testedCipherSuite); } @Override - CipherTestUtils.Server newServer(CipherTestUtils cipherTest) + CipherTestUtils.Server newServer(CipherTestUtils cipherTest, int testPort) throws Exception { return new JSSEServer(cipherTest, testPort, testedProtocol, testedCipherSuite); diff --git a/jdk/test/javax/net/ssl/etc/README b/jdk/test/javax/net/ssl/etc/README new file mode 100644 index 00000000000..0ac6a844a86 --- /dev/null +++ b/jdk/test/javax/net/ssl/etc/README @@ -0,0 +1,94 @@ +Keystores used for the JSSE regression test suite. + +keystore +truststore +========== + +These are the primary two keystores and contain entries for testing most +of the JSSE regression test files. There are three entries, one RSA-based, +one DSA-based and one EC-based. If they expire, simply recreate them +using keytool and most of the test cases should work. + +The password on both files is: + + passphrase + +There are no individual key entry passwords at this time. + + +keystore entries +================ + +Alias name: dummy +----------------- +Creation date: May 16, 2016 +Entry type: PrivateKeyEntry +Certificate chain length: 1 +Certificate[1]: +Owner: CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US +Issuer: CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US +Serial number: 57399b87 +Valid from: Mon May 16 10:06:38 UTC 2016 until: Sat May 16 10:06:38 UTC 2026 +Signature algorithm name: SHA256withRSA +Version: 1 + +This can be generated using hacked (update the keytool source code so that +it can be used for version 1 X.509 certificate) keytool command: +% keytool -genkeypair -alias dummy -keyalg RSA -keysize 2048 \ + -sigalg SHA256withRSA \ + -dname "CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US" \ + -validity 3652 -keypass passphrase -keystore keystore -storepass passphrase + + +Alias name: dummyecdsa +---------------------- +Creation date: May 16, 2016 +Entry type: PrivateKeyEntry +Certificate chain length: 1 +Certificate[1]: +Owner: CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US +Issuer: CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US +Serial number: 57399c1d +Valid from: Mon May 16 10:09:01 UTC 2016 until: Sat May 16 10:09:01 UTC 2026 +Signature algorithm name: SHA256withECDSA +Version: 1 + +This can be generated using hacked (update the keytool source code so that +it can be used for version 1 X.509 certificate) keytool command: +% keytool -genkeypair -alias dummy -keyalg EC -keysize 256 \ + -sigalg SHA256withECDSA \ + -dname "CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US" \ + -validity 3652 -keypass passphrase -keystore keystore -storepass passphrase + +Alias name: dummydsa +-------------------- +Creation date: Mar 11, 2007 +Entry type: PrivateKeyEntry +Certificate chain length: 1 +Certificate[1]: +Owner: CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US +Issuer: CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US +Serial number: 45f3a314 +Valid from: Sun Mar 11 06:35:00 UTC 2007 until: Wed Mar 08 06:35:00 UTC 2017 +Certificate fingerprints: +Signature algorithm name: SHA1withDSA +Version: 1 + +This can be generated using hacked (update the keytool source code so that +it can be used for version 1 X.509 certificate) keytool command: +% keytool -genkeypair -alias dummy -keyalg DSA -keysize 1024 \ + -sigalg SHA1withDSA \ + -dname "CN=dummy.example.com, OU=Dummy, O=Dummy, L=Cupertino, ST=CA, C=US" \ + -validity 3652 -keypass passphrase -keystore keystore -storepass passphrase + + +truststore entries +================== +This key store contains only trusted certificate entries. The same +certificates are used in both keystore and truststore. + + +unknown_keystore +================ +A keystore you can use when you don't want things to be verified. +Use this with keystore/truststore, and you'll never get a match. diff --git a/jdk/test/javax/net/ssl/etc/keystore b/jdk/test/javax/net/ssl/etc/keystore index 2eb1993f3af..4062e1798c5 100644 Binary files a/jdk/test/javax/net/ssl/etc/keystore and b/jdk/test/javax/net/ssl/etc/keystore differ diff --git a/jdk/test/javax/net/ssl/etc/truststore b/jdk/test/javax/net/ssl/etc/truststore index 65a140d7732..12da39e66a5 100644 Binary files a/jdk/test/javax/net/ssl/etc/truststore and b/jdk/test/javax/net/ssl/etc/truststore differ diff --git a/jdk/test/javax/rmi/TEST.properties b/jdk/test/javax/rmi/TEST.properties new file mode 100644 index 00000000000..d4bbfc905b9 --- /dev/null +++ b/jdk/test/javax/rmi/TEST.properties @@ -0,0 +1 @@ +modules = java.rmi diff --git a/jdk/test/javax/script/ProviderTest.sh b/jdk/test/javax/script/ProviderTest.sh index 1db161dfcf6..24b4120912c 100644 --- a/jdk/test/javax/script/ProviderTest.sh +++ b/jdk/test/javax/script/ProviderTest.sh @@ -43,8 +43,18 @@ $JAR ${TESTTOOLVMOPTS} -cf ${TESTCLASSES}/dummy.jar \ -C ${TESTCLASSES} DummyScriptEngineFactory.class \ -C "${TESTSRC}" META-INF/services/javax.script.ScriptEngineFactory -echo "Running test ..." +echo "Running test with security manager ..." +$JAVA ${TESTVMOPTS} -Djava.security.manager -classpath \ + "${TESTCLASSES}${PS}${TESTCLASSES}/dummy.jar" \ + ProviderTest +ret=$? +if [ $ret -ne 0 ] +then + exit $ret +fi + +echo "Running test without security manager ..." $JAVA ${TESTVMOPTS} -classpath \ "${TESTCLASSES}${PS}${TESTCLASSES}/dummy.jar" \ ProviderTest diff --git a/jdk/test/javax/script/TEST.properties b/jdk/test/javax/script/TEST.properties new file mode 100644 index 00000000000..3bb100c3fad --- /dev/null +++ b/jdk/test/javax/script/TEST.properties @@ -0,0 +1 @@ +modules = java.scripting diff --git a/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeAiffFiles.java b/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeAiffFiles.java new file mode 100644 index 00000000000..c0899484328 --- /dev/null +++ b/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeAiffFiles.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.ByteArrayInputStream; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +/** + * @test + * @bug 6729836 + */ +public final class RecognizeHugeAiffFiles { + + /** + * The maximum number of sample frames per AIFF specification. + */ + private static final /* unsigned int */ long MAX_UNSIGNED_INT = 0xffffffffL; + + /** + * The supported aiff sample size in bits. + */ + private static final byte[] aiffBits = { + 1, 2, 4, 8, 11, 16, 20, 24, 27, 32 + }; + + /** + * The list of supported sample rates. + */ + private static final int[] sampleRates = { + 8000, 11025, 16000, 22050, 32000, 37800, 44056, 44100, 47250, 48000, + 50000, 50400, 88200, 96000, 176400, 192000, 352800, 2822400, + 5644800, Integer.MAX_VALUE + }; + + /** + * The list of supported channels. + */ + private static final int[] channels = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + }; + + /** + * The list of supported number of frames. + *

      + * The {@code MAX_UNSIGNED_INT} is a maximum. + */ + private static final long[] numberOfFrames = { + 0, 1, 2, 3, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, + (long) Integer.MAX_VALUE + 1, MAX_UNSIGNED_INT - 1, MAX_UNSIGNED_INT + }; + + public static void main(final String[] args) throws Exception { + for (final byte bits : aiffBits) { + for (final int sampleRate : sampleRates) { + for (final int channel : channels) { + for (final long dataSize : numberOfFrames) { + testAFF(bits, sampleRate, channel, dataSize); + testAIS(bits, sampleRate, channel, dataSize); + } + } + } + } + } + + /** + * Tests the {@code AudioFileFormat} fetched from the fake header. + *

      + * Note that the frameLength and byteLength are stored as int which means + * that {@code AudioFileFormat} will store the data above {@code MAX_INT} as + * NOT_SPECIFIED. + */ + private static void testAFF(final byte bits, final int rate, + final int channel, final long frameLength) + throws Exception { + final byte[] header = createHeader(bits, rate, channel, frameLength); + final ByteArrayInputStream fake = new ByteArrayInputStream(header); + final AudioFileFormat aff = AudioSystem.getAudioFileFormat(fake); + + if (aff.getType() != AudioFileFormat.Type.AIFF) { + throw new RuntimeException("Error"); + } + + if (frameLength <= Integer.MAX_VALUE) { + if (aff.getFrameLength() != frameLength) { + System.err.println("Expected: " + frameLength); + System.err.println("Actual: " + aff.getFrameLength()); + throw new RuntimeException(); + } + } else { + if (aff.getFrameLength() != AudioSystem.NOT_SPECIFIED) { + System.err.println("Expected: " + AudioSystem.NOT_SPECIFIED); + System.err.println("Actual: " + aff.getFrameLength()); + throw new RuntimeException(); + } + } + validateFormat(bits, rate, channel, aff.getFormat()); + } + + /** + * Tests the {@code AudioInputStream} fetched from the fake header. + *

      + * Note that the frameLength is stored as long which means that {@code + * AudioInputStream} must store all possible data from aiff file. + */ + private static void testAIS(final byte bits, final int rate, + final int channel, final long frameLength) + throws Exception { + final byte[] header = createHeader(bits, rate, channel, frameLength); + final ByteArrayInputStream fake = new ByteArrayInputStream(header); + final AudioInputStream ais = AudioSystem.getAudioInputStream(fake); + final AudioFormat format = ais.getFormat(); + + if (frameLength != ais.getFrameLength()) { + System.err.println("Expected: " + frameLength); + System.err.println("Actual: " + ais.getFrameLength()); + throw new RuntimeException(); + } + if (ais.available() < 0) { + System.err.println("available should be >=0: " + ais.available()); + throw new RuntimeException(); + } + + validateFormat(bits, rate, channel, format); + } + + /** + * Tests that format contains the same data as were provided to the fake + * stream. + */ + private static void validateFormat(final byte bits, final int rate, + final int channel, + final AudioFormat format) { + + if (Float.compare(format.getSampleRate(), rate) != 0) { + System.err.println("Expected: " + rate); + System.err.println("Actual: " + format.getSampleRate()); + throw new RuntimeException(); + } + if (format.getChannels() != channel) { + System.err.println("Expected: " + channel); + System.err.println("Actual: " + format.getChannels()); + throw new RuntimeException(); + } + int frameSize = ((bits + 7) / 8) * channel; + if (format.getFrameSize() != frameSize) { + System.out.println("Expected: " + frameSize); + System.err.println("Actual: " + format.getFrameSize()); + throw new RuntimeException(); + } + } + + private static final int DOUBLE_MANTISSA_LENGTH = 52; + private static final int DOUBLE_EXPONENT_LENGTH = 11; + private static final long DOUBLE_SIGN_MASK = 0x8000000000000000L; + private static final long DOUBLE_EXPONENT_MASK = 0x7FF0000000000000L; + private static final long DOUBLE_MANTISSA_MASK = 0x000FFFFFFFFFFFFFL; + private static final int DOUBLE_EXPONENT_OFFSET = 1023; + + private static final int EXTENDED_EXPONENT_OFFSET = 16383; + private static final int EXTENDED_MANTISSA_LENGTH = 63; + private static final int EXTENDED_EXPONENT_LENGTH = 15; + private static final long EXTENDED_INTEGER_MASK = 0x8000000000000000L; + + /** + * Creates the custom header of the AIFF file. It is expected that all + * passed data are supported. + */ + private static byte[] createHeader(final byte bits, final int rate, + final int channel, final long frameLength) { + long doubleBits = Double.doubleToLongBits(rate); + + long sign = (doubleBits & DOUBLE_SIGN_MASK) + >> (DOUBLE_EXPONENT_LENGTH + DOUBLE_MANTISSA_LENGTH); + long doubleExponent = (doubleBits & DOUBLE_EXPONENT_MASK) + >> DOUBLE_MANTISSA_LENGTH; + long doubleMantissa = doubleBits & DOUBLE_MANTISSA_MASK; + + long extendedExponent = doubleExponent - DOUBLE_EXPONENT_OFFSET + + EXTENDED_EXPONENT_OFFSET; + long extendedMantissa = doubleMantissa + << (EXTENDED_MANTISSA_LENGTH - DOUBLE_MANTISSA_LENGTH); + long extendedSign = sign << EXTENDED_EXPONENT_LENGTH; + short extendedBits79To64 = (short) (extendedSign | extendedExponent); + long extendedBits63To0 = EXTENDED_INTEGER_MASK | extendedMantissa; + + return new byte[]{ + // AIFF_MAGIC + 0x46, 0x4f, 0x52, 0x4d, + // fileLength (will use the number of frames for testing) + (byte) (frameLength >> 24), (byte) (frameLength >> 16), + (byte) (frameLength >> 8), (byte) frameLength, + // form aiff + 0x41, 0x49, 0x46, 0x46, + // COMM_MAGIC + 0x43, 0x4f, 0x4d, 0x4d, + // comm chunk size + 0, 0, 0, 18, + // channels + (byte) (channel >> 8),(byte) channel, + // numSampleFrames + (byte) (frameLength >> 24), (byte) (frameLength >> 16), + (byte) (frameLength >> 8), (byte) (frameLength), + // samplesize + (byte) (bits >> 8),(byte) (bits), + // samplerate + (byte) (extendedBits79To64 >> 8), + (byte) extendedBits79To64, + (byte) (extendedBits63To0 >> 56), + (byte) (extendedBits63To0 >> 48), + (byte) (extendedBits63To0 >> 40), + (byte) (extendedBits63To0 >> 32), (byte) (extendedBits63To0 >> 24), + (byte) (extendedBits63To0 >> 16), (byte) (extendedBits63To0 >> 8), + (byte) extendedBits63To0, + // SND_MAGIC + 0x53, 0x53, 0x4e, 0x44, + // data chunk size + 0, 0, 0, 0, + // dataOffset + 0, 0, 0, 0, + // blocksize + 0, 0, 0, 0, + }; + } +} diff --git a/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeAuFiles.java b/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeAuFiles.java new file mode 100644 index 00000000000..ba908667299 --- /dev/null +++ b/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeAuFiles.java @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.ByteArrayInputStream; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +/** + * @test + * @bug 6729836 + */ +public final class RecognizeHugeAuFiles { + + /** + * The size of the header's data. + */ + private static final byte AU_HEADER = 44; + + /** + * This value should be used if the size in bytes is unknown. + */ + private static final /* unsigned int */ long MAX_UNSIGNED_INT = 0xffffffffL; + + /** + * The list of supported au formats and sample size in bits per format. + */ + private static final byte[][] auTypeBits = { + {1, 8}, {2, 8}, {3, 16}, {4, 24}, {5, 32}, {6, 32}, {27, 8} + }; + + /** + * The list of supported sample rates(stored as unsigned int). + */ + private static final int[] sampleRates = { + 8000, 11025, 16000, 22050, 32000, 37800, 44056, 44100, 47250, 48000, + 50000, 50400, 88200, 96000, 176400, 192000, 352800, 2822400, + 5644800, Integer.MAX_VALUE + }; + + /** + * The list of supported channels (stored as unsigned int). + */ + private static final int[] channels = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + }; + + /** + * The list of supported size of data (stored as unsigned int). + *

      + * The {@code MAX_UNSIGNED_INT} used if the size in bytes is unknown. + */ + private static final long[] dataSizes = { + 0, 1, 2, 3, Integer.MAX_VALUE - AU_HEADER, Integer.MAX_VALUE - 1, + Integer.MAX_VALUE, (long) Integer.MAX_VALUE + 1, + (long) Integer.MAX_VALUE + AU_HEADER, MAX_UNSIGNED_INT - AU_HEADER, + MAX_UNSIGNED_INT - 1, MAX_UNSIGNED_INT + }; + + public static void main(final String[] args) throws Exception { + for (final byte[] type : auTypeBits) { + for (final int sampleRate : sampleRates) { + for (final int channel : channels) { + for (final long dataSize : dataSizes) { + testAFF(type, sampleRate, channel, dataSize); + testAIS(type, sampleRate, channel, dataSize); + } + } + } + } + } + + /** + * Tests the {@code AudioFileFormat} fetched from the fake header. + *

      + * Note that the frameLength and byteLength are stored as int which means + * that {@code AudioFileFormat} will store the data above {@code MAX_INT} + * as NOT_SPECIFIED. + */ + private static void testAFF(final byte[] type, final int rate, + final int channel, final long size) + throws Exception { + final byte[] header = createHeader(type, rate, channel, size); + final ByteArrayInputStream fake = new ByteArrayInputStream(header); + final AudioFileFormat aff = AudioSystem.getAudioFileFormat(fake); + final AudioFormat format = aff.getFormat(); + + if (aff.getType() != AudioFileFormat.Type.AU) { + throw new RuntimeException("Error"); + } + + final long frameLength = size / format.getFrameSize(); + if (size != MAX_UNSIGNED_INT && frameLength <= Integer.MAX_VALUE) { + if (aff.getFrameLength() != frameLength) { + System.err.println("Expected: " + frameLength); + System.err.println("Actual: " + aff.getFrameLength()); + throw new RuntimeException(); + } + } else { + if (aff.getFrameLength() != AudioSystem.NOT_SPECIFIED) { + System.err.println("Expected: " + AudioSystem.NOT_SPECIFIED); + System.err.println("Actual: " + aff.getFrameLength()); + throw new RuntimeException(); + } + } + + final long byteLength = size + AU_HEADER; + if (byteLength <= Integer.MAX_VALUE) { + if (aff.getByteLength() != byteLength) { + System.err.println("Expected: " + byteLength); + System.err.println("Actual: " + aff.getByteLength()); + throw new RuntimeException(); + } + } else { + if (aff.getByteLength() != AudioSystem.NOT_SPECIFIED) { + System.err.println("Expected: " + AudioSystem.NOT_SPECIFIED); + System.err.println("Actual: " + aff.getByteLength()); + throw new RuntimeException(); + } + } + validateFormat(type[1], rate, channel, aff.getFormat()); + } + + /** + * Tests the {@code AudioInputStream} fetched from the fake header. + *

      + * Note that the frameLength is stored as long which means + * that {@code AudioInputStream} must store all possible data from au file. + */ + private static void testAIS(final byte[] type, final int rate, + final int channel, final long size) + throws Exception { + final byte[] header = createHeader(type, rate, channel, size); + final ByteArrayInputStream fake = new ByteArrayInputStream(header); + final AudioInputStream ais = AudioSystem.getAudioInputStream(fake); + final AudioFormat format = ais.getFormat(); + final long frameLength = size / format.getFrameSize(); + if (size != MAX_UNSIGNED_INT) { + if (frameLength != ais.getFrameLength()) { + System.err.println("Expected: " + frameLength); + System.err.println("Actual: " + ais.getFrameLength()); + throw new RuntimeException(); + } + } else { + if (ais.getFrameLength() != AudioSystem.NOT_SPECIFIED) { + System.err.println("Expected: " + AudioSystem.NOT_SPECIFIED); + System.err.println("Actual: " + ais.getFrameLength()); + throw new RuntimeException(); + } + } + if (ais.available() < 0) { + System.err.println("available should be >=0: " + ais.available()); + throw new RuntimeException(); + } + validateFormat(type[1], rate, channel, format); + } + + /** + * Tests that format contains the same data as were provided to the fake + * stream. + */ + private static void validateFormat(final byte bits, final int rate, + final int channel, + final AudioFormat format) { + + if (Float.compare(format.getSampleRate(), rate) != 0) { + System.out.println("Expected: " + rate); + System.out.println("Actual: " + format.getSampleRate()); + throw new RuntimeException(); + } + if (format.getChannels() != channel) { + System.out.println("Expected: " + channel); + System.out.println("Actual: " + format.getChannels()); + throw new RuntimeException(); + } + int frameSize = ((bits + 7) / 8) * channel; + if (format.getFrameSize() != frameSize) { + System.out.println("Expected: " + frameSize); + System.out.println("Actual: " + format.getFrameSize()); + throw new RuntimeException(); + } + } + + /** + * Creates the custom header of the AU file. It is expected that all passed + * data are supported. + */ + private static byte[] createHeader(final byte[] type, final int rate, + final int channel, final long size) { + return new byte[]{ + // AU_SUN_MAGIC + 0x2e, 0x73, 0x6e, 0x64, + // headerSize + 0, 0, 0, AU_HEADER, + // dataSize + (byte) (size >> 24), (byte) (size >> 16), (byte) (size >> 8), + (byte) size, + // encoding + 0, 0, 0, type[0], + // sampleRate + (byte) (rate >> 24), (byte) (rate >> 16), (byte) (rate >> 8), + (byte) (rate), + // channels + (byte) (channel >> 24), (byte) (channel >> 16), + (byte) (channel >> 8), (byte) (channel), + // data + 0, 0, 0, 0, 0, 0 + }; + } +} diff --git a/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveExtFiles.java b/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveExtFiles.java index 88b231d62d7..ca8d17e3e78 100644 --- a/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveExtFiles.java +++ b/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveExtFiles.java @@ -125,7 +125,7 @@ public final class RecognizeHugeWaveExtFiles { * Tests the {@code AudioInputStream} fetched from the fake header. *

      * Note that the frameLength is stored as long which means that {@code - * AudioInputStream} must store all possible data from au file. + * AudioInputStream} must store all possible data from wave file. */ private static void testAIS(final int[] type, final int rate, final int channel, final long size) @@ -166,8 +166,9 @@ public final class RecognizeHugeWaveExtFiles { System.err.println("Actual: " + format.getChannels()); throw new RuntimeException(); } - if (format.getFrameSize() != ((bits + 7) / 8) * channel) { - System.err.println("Expected: " + (bits * channel + 1) / 8); + int frameSize = ((bits + 7) / 8) * channel; + if (format.getFrameSize() != frameSize) { + System.err.println("Expected: " + frameSize); System.err.println("Actual: " + format.getFrameSize()); throw new RuntimeException(); } diff --git a/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveFloatFiles.java b/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveFiles.java similarity index 91% rename from jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveFloatFiles.java rename to jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveFiles.java index e36a7e2b180..191290a128e 100644 --- a/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveFloatFiles.java +++ b/jdk/test/javax/sound/sampled/spi/AudioFileReader/RecognizeHugeWaveFiles.java @@ -30,9 +30,9 @@ import javax.sound.sampled.AudioSystem; /** * @test - * @bug 8132782 + * @bug 8132782 6729836 */ -public final class RecognizeHugeWaveFloatFiles { +public final class RecognizeHugeWaveFiles { /** * The maximum size in bytes per WAVE specification. @@ -43,7 +43,17 @@ public final class RecognizeHugeWaveFloatFiles { * The supported wave pcm_float format and sample size in bits. */ private static final byte[][] waveTypeBits = { - {0x0003/*WAVE_FORMAT_IEEE_FLOAT*/, 32} + {0x0001/*WAVE_FORMAT_PCM*/,1}, + {0x0001/*WAVE_FORMAT_PCM*/,2}, + {0x0001/*WAVE_FORMAT_PCM*/,4}, + {0x0001/*WAVE_FORMAT_PCM*/,8}, + {0x0001/*WAVE_FORMAT_PCM*/,16}, + {0x0001/*WAVE_FORMAT_PCM*/,20}, + {0x0001/*WAVE_FORMAT_PCM*/,24}, + {0x0001/*WAVE_FORMAT_PCM*/,32}, + {0x0003/*WAVE_FORMAT_IEEE_FLOAT*/, 32}, + {0x0006/*WAVE_FORMAT_ALAW*/, 8}, + {0x0007/*WAVE_FORMAT_MULAW*/, 8} }; /** @@ -125,7 +135,7 @@ public final class RecognizeHugeWaveFloatFiles { * Tests the {@code AudioInputStream} fetched from the fake header. *

      * Note that the frameLength is stored as long which means that {@code - * AudioInputStream} must store all possible data from au file. + * AudioInputStream} must store all possible data from wave file. */ private static void testAIS(final byte[] type, final int rate, final int channel, final long size) @@ -166,8 +176,9 @@ public final class RecognizeHugeWaveFloatFiles { System.err.println("Actual: " + format.getChannels()); throw new RuntimeException(); } - if (format.getFrameSize() != ((bits + 7) / 8) * channel) { - System.err.println("Expected: " + (bits * channel + 1) / 8); + int frameSize = ((bits + 7) / 8) * channel; + if (format.getFrameSize() != frameSize) { + System.err.println("Expected: " + frameSize); System.err.println("Actual: " + format.getFrameSize()); throw new RuntimeException(); } diff --git a/jdk/test/javax/swing/JFileChooser/8152677/SelectAllFilesFilterTest.java b/jdk/test/javax/swing/JFileChooser/8152677/SelectAllFilesFilterTest.java new file mode 100644 index 00000000000..bc17b04a306 --- /dev/null +++ b/jdk/test/javax/swing/JFileChooser/8152677/SelectAllFilesFilterTest.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Component; +import java.awt.Container; +import java.awt.Robot; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; + +/* + * @test + * @bug 8152677 + * @requires (os.family == "mac") + * @summary [macosx] All files filter can't be selected in JFileChooser + * @run main SelectAllFilesFilterTest + */ + +public class SelectAllFilesFilterTest { + + private static final String LABEL_TEXT = "File Format:"; + private static volatile JFileChooser fileChooser; + private static JComboBox comboBox; + + public static void main(String[] args) throws Exception { + + SwingUtilities.invokeLater(SelectAllFilesFilterTest::createAndShowGUI); + + while (fileChooser == null) { + Thread.sleep(100); + } + + Robot robot = new Robot(); + robot.waitForIdle(); + + SwingUtilities.invokeAndWait(() -> { + comboBox = findComboBox(fileChooser); + comboBox.setSelectedIndex(0); + }); + robot.waitForIdle(); + + SwingUtilities.invokeAndWait(() -> { + int selectedIndex = comboBox.getSelectedIndex(); + fileChooser.setVisible(false); + + if (selectedIndex != 0) { + throw new RuntimeException("Select All file filter is not selected!"); + } + }); + } + + private static void createAndShowGUI() { + fileChooser = new JFileChooser(); + fileChooser.setAcceptAllFileFilterUsed(true); + fileChooser.setDialogType(JFileChooser.OPEN_DIALOG); + + FileFilter txtFilter = new FileNameExtensionFilter("Text files", "txt"); + fileChooser.addChoosableFileFilter(txtFilter); + fileChooser.setFileFilter(txtFilter); + fileChooser.showOpenDialog(null); + } + + private static JComboBox findComboBox(Component comp) { + + if (comp instanceof JLabel) { + JLabel label = (JLabel) comp; + if (LABEL_TEXT.equals(label.getText())) { + return (JComboBox) label.getLabelFor(); + } + } + + if (comp instanceof Container) { + Container cont = (Container) comp; + for (int i = 0; i < cont.getComponentCount(); i++) { + + JComboBox result = findComboBox(cont.getComponent(i)); + if (result != null) { + return result; + } + } + } + + return null; + } +} diff --git a/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java b/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java index 1a9f42120e2..589bb9b5744 100644 --- a/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java +++ b/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java @@ -21,23 +21,23 @@ * questions. */ -/* + /* * @test - * @bug 7160951 + * @bug 7160951 8152492 * @summary [macosx] ActionListener called twice for JMenuItem using ScreenMenuBar * @author vera.akulova@oracle.com * @library ../../../../lib/testlibrary * @build jdk.testlibrary.OSInfo * @run main ActionListenerCalledTwiceTest */ - import jdk.testlibrary.OSInfo; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ActionListenerCalledTwiceTest { - static String menuItems[] = { "Item1", "Item2", "Item3", "Item4", "Item5", "Item6" }; + + static String menuItems[] = {"Item1", "Item2", "Item3", "Item4", "Item5", "Item6"}; static KeyStroke keyStrokes[] = { KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.META_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), @@ -46,8 +46,10 @@ public class ActionListenerCalledTwiceTest { KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, InputEvent.META_MASK) }; - + static JMenu menu; + static JFrame frame; static volatile int listenerCallCounter = 0; + public static void main(String[] args) throws Exception { if (OSInfo.getOSType() != OSInfo.OSType.MACOSX) { System.out.println("This test is for MacOS only. Automatically passed on other platforms."); @@ -82,33 +84,38 @@ public class ActionListenerCalledTwiceTest { robot.waitForIdle(); if (listenerCallCounter != 1) { - throw new Exception("Test failed: ActionListener for " + menuItems[i] + - " called " + listenerCallCounter + " times instead of 1!"); + throw new Exception("Test failed: ActionListener for " + menuItems[i] + + " called " + listenerCallCounter + " times instead of 1!"); } listenerCallCounter = 0; } + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame.dispose(); + } + }); } private static void createAndShowGUI() { - JMenu menu = new JMenu("Menu"); + menu = new JMenu("Menu"); for (int i = 0; i < menuItems.length; ++i) { JMenuItem newItem = new JMenuItem(menuItems[i]); newItem.setAccelerator(keyStrokes[i]); newItem.addActionListener( - new ActionListener(){ - public void actionPerformed(ActionEvent e) { - listenerCallCounter++; - } + new ActionListener() { + public void actionPerformed(ActionEvent e) { + listenerCallCounter++; } + } ); menu.add(newItem); } JMenuBar bar = new JMenuBar(); bar.add(menu); - JFrame frame = new JFrame("Test"); + frame = new JFrame("Test"); frame.setJMenuBar(bar); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); diff --git a/jdk/test/javax/swing/JSpinner/6421058/bug6421058.java b/jdk/test/javax/swing/JSpinner/6421058/bug6421058.java new file mode 100644 index 00000000000..d67762b21d7 --- /dev/null +++ b/jdk/test/javax/swing/JSpinner/6421058/bug6421058.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + /* + * @test + * @bug 6421058 + * @summary Verify font of the text field is changed to the font of + * JSpinner if the font of text field was NOT set by the user + * @run main bug6421058 + */ + +import java.awt.Font; +import javax.swing.JFrame; +import javax.swing.JSpinner; +import javax.swing.JSpinner.DefaultEditor; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.plaf.UIResource; +import static javax.swing.UIManager.getInstalledLookAndFeels; + +public class bug6421058 implements Runnable { + + public static void main(final String[] args) throws Exception { + for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) { + SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf)); + SwingUtilities.invokeAndWait(new bug6421058()); + } + } + + @Override + public void run() { + final JFrame mainFrame = new JFrame(); + try { + testDefaultFont(mainFrame); + } finally { + mainFrame.dispose(); + } + } + + private static void testDefaultFont(final JFrame frame) { + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JSpinner spinner = new JSpinner(); + frame.add(spinner); + frame.setSize(300, 100); + frame.setVisible(true); + + final DefaultEditor editor = (DefaultEditor) spinner.getEditor(); + final Font editorFont = editor.getTextField().getFont(); + + /* + * Validate that the font of the text field is changed to the + * font of JSpinner if the font of text field was not set by the + * user. + */ + + if (!(editorFont instanceof UIResource)) { + throw new RuntimeException("Font must be UIResource"); + } + if (!editorFont.equals(spinner.getFont())) { + throw new RuntimeException("Wrong FONT"); + } + } + + private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) { + try { + UIManager.setLookAndFeel(laf.getClassName()); + } catch (ClassNotFoundException | InstantiationException | + UnsupportedLookAndFeelException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK.java b/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK.java new file mode 100644 index 00000000000..c1b7214e406 --- /dev/null +++ b/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + @test + @summary Tests that GTK LaF is supported on solaris + regardless of jdk.gtk.version flag values. + @bug 8156121 + @requires (os.name == "linux" | os.name == "solaris") + @run main/othervm -Djdk.gtk.version=2 DemandGTK + @run main/othervm -Djdk.gtk.version=3 DemandGTK +*/ + +import javax.swing.JFrame; +import javax.swing.UIManager; +import javax.swing.SwingUtilities; +import java.awt.Robot; + +public class DemandGTK { + + static JFrame frame; + public static void createAndShow() { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + } catch(Exception cnf) { + cnf.printStackTrace(); + throw new RuntimeException("GTK LaF must be supported"); + } + frame = new JFrame("JFrame"); + frame.setSize(200, 200); + + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setVisible(true); + } + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(DemandGTK::createAndShow); + Robot robot = new Robot(); + robot.waitForIdle(); + robot.delay(1000); + SwingUtilities.invokeAndWait( () -> { + frame.setVisible(false); + frame.dispose(); + }); + + } +} + diff --git a/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK2.sh b/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK2.sh new file mode 100644 index 00000000000..93de97904fd --- /dev/null +++ b/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK2.sh @@ -0,0 +1,89 @@ +#!/bin/ksh -p + +# +# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @summary Try to force GTK2. We must bail out to GTK3 (if any) if no 2 available. +# +# @compile ProvokeGTK.java +# @requires os.family == "linux" +# @run shell/timeout=400 DemandGTK2.sh + +# +# Note that we depend on +# strace in the PATH +# /sbin/ldconfig (which may be not in PATH) +# It is true for OEL 7 and Ubuntu 14, 16 +# but may fail in future. Save tomorrow for tomorrow. +# +# Read DemandGTK2.txt how to prepare GTK2-less machine. +# + +which strace +if [ $? -ne 0 ] +then + echo "Please provide strace: \"which strace\" failed." + exit 1 +fi + +HAVE_2=`/sbin/ldconfig -v 2>/dev/null | grep libgtk-x11-2 | wc -l` +HAVE_3=`/sbin/ldconfig -v 2>/dev/null | grep libgtk-3.so | wc -l` + + +if [ "${HAVE_2}" = "0" ] +then + + if [ "${HAVE_3}" = "0" ] + then + echo "Neither GTK2 nor GTK3 found: system misconfiguration. Exit." + exit 1 + fi + echo "No GTK 2 library found: we should bail out to 3" + strace -o strace.log -fe open ${TESTJAVA}/bin/java -cp ${TESTCLASSPATH} -Djdk.gtk.version=2 ProvokeGTK + EXECRES=$? + grep 'libgtk-3.*=\ *[0-9]*$' strace.log > logg +else + echo "There is GTK 2 library: we should use it" + strace -o strace.log -fe open ${TESTJAVA}/bin/java -cp ${TESTCLASSPATH} -Djdk.gtk.version=2 ProvokeGTK + EXECRES=$? + grep 'libgtk-x11.*=\ *[0-9]*$' strace.log > logg +fi + +if [ ${EXECRES} -ne 0 ] +then + echo "java execution failed for unknown reason, see logs" + exit 2 +fi + +cat logg +if [ -s logg ] +then + echo "Success." + exit 0 +else + echo "Failed. Examine logs." + exit 3 +fi + + diff --git a/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK2.txt b/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK2.txt new file mode 100644 index 00000000000..7313e3ee4a7 --- /dev/null +++ b/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK2.txt @@ -0,0 +1,36 @@ +How to prepare an Ubuntu machine for GTK-2-less test run. + +The test DemandGTK2.sh should work well without GTK-2 switching to version 3 +if there's no GTK-2 library available. +At the moment, it's not easy to find a system with GTK-3 and without GTK-2: +many programs still depend on version 2. +We can, however, rename GTK-2 library for a single test run and then restore +it back. + +(1) Find GTK2 library: run + /sbin/ldconfig -v 2>/dev/null | grep libgtk-x11-2 + +It will output one or two lines like +libgtk-x11-2.0.so.0 -> libgtk-x11-2.0.so.0.2400.23 +Search for the target of that symlink for instance with locate: +locate libgtk-x11-2.0.so.0.2400.23 +Finally, you'll find the libraries. On my current machine they are +/usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0.2400.23 +/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.23 + +I'm running 64-bit JDK and need to tamper with x86_64 copy only. + +(2) Find running programs depending on this library. They probably would crash +if you rename it. Stop them for this test run. +That said, I'm afraid it would be impossible to do on a system older than Ubuntu 16.04. +On my Ubuntu 16.04 I have only hud-service using this library, and that's OK, it will restart +after a crash, if any. +To find these programs, run +lsof /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.23 + +(3) Now, +sudo mv /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.23 /usr/lib/x86_64-linux-gnu/bak.libgtk-x11-2.0.so.0.2400.23 +jtreg DemandGTK2.sh +sudo mv /usr/lib/x86_64-linux-gnu/bak.libgtk-x11-2.0.so.0.2400.23 /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.23 + +Needless to say, you should substitute your own library path and however you run jtreg. diff --git a/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK3.sh b/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK3.sh new file mode 100644 index 00000000000..1a9038a4bef --- /dev/null +++ b/jdk/test/javax/swing/LookAndFeel/8145547/DemandGTK3.sh @@ -0,0 +1,81 @@ +#!/bin/ksh -p + +# +# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + + +# @test +# @summary Try to force GTK3. We must bail out to GTK2 if no 3 available. +# +# @compile ProvokeGTK.java +# @requires os.family == "linux" +# @run shell/timeout=400 DemandGTK3.sh + +# +# Note that we depend on +# strace in the PATH +# /sbin/ldconfig (which may be is not in PATH) +# It is true for OEL 7 and Ubuntu 14, 16 +# but may fail in future. Save tomorrow for tomorrow. +# + +which strace +if [ $? -ne 0 ] +then + echo "Please provide strace: \"which strace\" failed." + exit 1 +fi + +HAVE_3=`/sbin/ldconfig -v 2>/dev/null | grep libgtk-3.so | wc -l` + + +if [ "${HAVE_3}" = "0" ] +then + + echo "No GTK 3 library found: we should bail out to 2" + strace -o strace.log -fe open ${TESTJAVA}/bin/java -cp ${TESTCLASSPATH} -Djdk.gtk.version=3 ProvokeGTK + EXECRES=$? + grep 'libgtk-x11.*=\ *[0-9]*$' strace.log > logg +else + echo "There is GTK 3 library: we should use it" + strace -o strace.log -fe open ${TESTJAVA}/bin/java -cp ${TESTCLASSPATH} -Djdk.gtk.version=3 ProvokeGTK + EXECRES=$? + grep 'libgtk-3.*=\ *[0-9]*$' strace.log > logg +fi + +if [ ${EXECRES} -ne 0 ] +then + echo "java execution failed for unknown reason, see logs" + exit 2 +fi + +cat logg +if [ -s logg ] +then + echo "Success." + exit 0 +else + echo "Failed. Examine logs." + exit 3 +fi + diff --git a/jdk/test/javax/swing/LookAndFeel/8145547/ProvokeGTK.java b/jdk/test/javax/swing/LookAndFeel/8145547/ProvokeGTK.java new file mode 100644 index 00000000000..485ea05beaa --- /dev/null +++ b/jdk/test/javax/swing/LookAndFeel/8145547/ProvokeGTK.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import javax.swing.JFrame; +import javax.swing.UIManager; +import javax.swing.SwingUtilities; + +public class ProvokeGTK { + + static JFrame frame; + public static void createAndShow() { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + } catch(Exception cnf) { + cnf.printStackTrace(); + } + frame = new JFrame("JFrame"); + frame.setSize(200, 200); + + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setVisible(true); + } + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(ProvokeGTK::createAndShow); + Thread.sleep(1000); + SwingUtilities.invokeAndWait( () -> { + frame.setVisible(false); + frame.dispose(); + }); + + } +} + diff --git a/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java b/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java index 4a556efce13..9cc57cfcdae 100644 --- a/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java +++ b/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,47 +23,107 @@ /* * @test - * @bug 8032884 + * @bug 8032884 8072579 * @summary Globalbindings optionalProperty="primitive" does not work when minOccurs=0 - * @run shell compile-schema.sh - * @compile -addmods java.xml.bind XjcOptionalPropertyTest.java - * @run main/othervm XjcOptionalPropertyTest + * @library /lib/testlibrary + * @modules java.xml.bind + * @run testng/othervm XjcOptionalPropertyTest */ import java.io.IOException; import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; +import java.util.Arrays; +import jdk.testlibrary.JDKToolLauncher; +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; public class XjcOptionalPropertyTest { - public static void main(String[] args) throws IOException { - - generated.Foo foo = new generated.Foo(); - log("foo = " + foo); + @Test + public void optionalPropertyTest() throws Exception { + runXjc(); + compileXjcGeneratedClasses(); + URLClassLoader testClassLoader; + testClassLoader = URLClassLoader.newInstance(new URL[]{testWorkDirUrl}); + Class fooClass = testClassLoader.loadClass(CLASS_TO_TEST); + Object foo = fooClass.newInstance(); Method[] methods = foo.getClass().getMethods(); - log("Found [" + methods.length + "] methods"); + System.out.println("Found [" + methods.length + "] methods"); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; if (method.getName().equals("setFoo")) { - log("Checking method [" + method.getName() + "]"); + System.out.println("Checking method [" + method.getName() + "]"); Class[] parameterTypes = method.getParameterTypes(); - if (parameterTypes.length != 1) - fail("more than 1 parameter"); - if (!parameterTypes[0].isPrimitive()) { - fail("Found [" + parameterTypes[0].getName() + "], but expected primitive!"); - } + Assert.assertEquals(parameterTypes.length, 1); + Assert.assertTrue(parameterTypes[0].isPrimitive()); break; } } - log("TEST PASSED."); - } - private static void fail(String message) { - throw new RuntimeException(message); + @BeforeTest + public void setUp() throws IOException { + // Create test directory inside scratch + testWorkDir = Paths.get(System.getProperty("user.dir", ".")); + // Save its URL + testWorkDirUrl = testWorkDir.toUri().toURL(); + // Get test source directory path + testSrcDir = Paths.get(System.getProperty("test.src", ".")); + // Get path of xjc result folder + xjcResultDir = testWorkDir.resolve(TEST_PACKAGE); + // Copy schema document file to scratch directory + Files.copy(testSrcDir.resolve(XSD_FILENAME), testWorkDir.resolve(XSD_FILENAME), REPLACE_EXISTING); } - private static void log(String msg) { - System.out.println(msg); + // Compile schema file into java classes definitions + void runXjc() throws Exception { + // Prepare process builder to run schemagen tool and save its output + JDKToolLauncher xjcLauncher = JDKToolLauncher.createUsingTestJDK("xjc"); + xjcLauncher.addToolArg(XSD_FILENAME); + System.out.println("Executing xjc command: " + Arrays.asList(xjcLauncher.getCommand())); + ProcessBuilder pb = new ProcessBuilder(xjcLauncher.getCommand()); + // Set xjc work directory with the input java file + pb.directory(testWorkDir.toFile()); + pb.inheritIO(); + Process p = pb.start(); + p.waitFor(); + p.destroy(); } + // Compile java classes with javac tool + void compileXjcGeneratedClasses() throws Exception { + JDKToolLauncher javacLauncher = JDKToolLauncher.createUsingTestJDK("javac"); + javacLauncher.addToolArg("-addmods"); + javacLauncher.addToolArg("java.xml.bind"); + javacLauncher.addToolArg(xjcResultDir.resolve("Foo.java").toString()); + System.out.println("Compiling xjc generated class: " + Arrays.asList(javacLauncher.getCommand())); + ProcessBuilder pb = new ProcessBuilder(javacLauncher.getCommand()); + pb.inheritIO(); + pb.directory(testWorkDir.toFile()); + Process p = pb.start(); + p.waitFor(); + p.destroy(); + } + + // Test schema filename + static final String XSD_FILENAME = "optional-property-schema.xsd"; + // Test package with generated class + static final String TEST_PACKAGE = "anamespace"; + // Name of generated java class + static final String CLASS_TO_TEST = TEST_PACKAGE+".Foo"; + // Test working directory + Path testWorkDir; + // Test working directory URL + URL testWorkDirUrl; + // Directory with test src + Path testSrcDir; + // Directory with java files generated by xjc + Path xjcResultDir; } diff --git a/jdk/test/javax/xml/bind/xjc/8145039/JaxbMarshallTest.java b/jdk/test/javax/xml/bind/xjc/8145039/JaxbMarshallTest.java index 37b817d0b4d..cc1be256343 100644 --- a/jdk/test/javax/xml/bind/xjc/8145039/JaxbMarshallTest.java +++ b/jdk/test/javax/xml/bind/xjc/8145039/JaxbMarshallTest.java @@ -23,10 +23,10 @@ /* * @test - * @bug 8145039 + * @bug 8145039 8157096 * @summary Check that marshalling of xjc generated class doesn't throw * ClassCast exception. - * @modules javax.xml.bind + * @modules java.xml.bind * @library /lib/testlibrary * @run testng/othervm JaxbMarshallTest */ @@ -127,6 +127,8 @@ public class JaxbMarshallTest { // Compile java classes with javac tool void compileXjcGeneratedClasses() throws Exception { JDKToolLauncher javacLauncher = JDKToolLauncher.createUsingTestJDK("javac"); + javacLauncher.addToolArg("-addmods"); + javacLauncher.addToolArg("java.xml.bind"); javacLauncher.addToolArg(xjcResultDir.resolve("ObjectFactory.java").toString()); javacLauncher.addToolArg(xjcResultDir.resolve("TypesLongList.java").toString()); javacLauncher.addToolArg(xjcResultDir.resolve("package-info.java").toString()); diff --git a/jdk/test/javax/xml/jaxp/TEST.properties b/jdk/test/javax/xml/jaxp/TEST.properties new file mode 100644 index 00000000000..fbf9f77ec10 --- /dev/null +++ b/jdk/test/javax/xml/jaxp/TEST.properties @@ -0,0 +1 @@ +modules = java.xml diff --git a/jdk/test/jdk/internal/jimage/JImageOpenTest.java b/jdk/test/jdk/internal/jimage/JImageOpenTest.java new file mode 100644 index 00000000000..06c19937a41 --- /dev/null +++ b/jdk/test/jdk/internal/jimage/JImageOpenTest.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.reflect.Layer; +import java.net.URI; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/* + * jimage shared open testing. + * @test + * @summary Test to see if thread interrupt handling interferes with other threads. + * @build JImageOpenTest.java + * @run main/othervm -Djdk.image.map.all=false JImageOpenTest + */ +public class JImageOpenTest { + private static final int NTHREADS = 10; + + public static void main(String[] args) throws Exception { + + final FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); + final Path root = fs.getPath("/modules"); + + final List names = Files.walk(root) + .filter(p -> p.getNameCount() > 2) + .filter(p -> Layer.boot().findModule(p.getName(1).toString()).isPresent()) + .map(p -> p.subpath(2, p.getNameCount())) + .map(p -> p.toString()) + .filter(s -> s.endsWith(".class") && !s.endsWith("module-info.class")) + .collect(Collectors.toList()); + + Runnable r = new Runnable() { + @Override + public void run() { + names.forEach(name -> { + String cn = name.substring(0, name.length() - 6).replace('/', '.'); + try { + Class.forName(cn, false, ClassLoader.getSystemClassLoader()); + } catch (Exception ex) { + System.err.println(Thread.currentThread() + " " + ex.getClass()); + } + }); + } + }; + + Thread[] threads = new Thread[NTHREADS]; + + for (int i = 0; i < NTHREADS; i++) { + Thread thread = new Thread(r); + threads[i] = thread; + thread.start(); + } + + Thread.sleep(1); + + for (int i = 0; i < NTHREADS; i++) { + Thread thread = threads[i]; + + if (thread.isAlive()) { + thread.interrupt(); + break; + } + } + + for (int i = 0; i < NTHREADS; i++) { + Thread thread = threads[i]; + thread.join(); + } + } +} diff --git a/jdk/test/jdk/internal/jline/extra/HistoryTest.java b/jdk/test/jdk/internal/jline/extra/HistoryTest.java new file mode 100644 index 00000000000..f8d3084b767 --- /dev/null +++ b/jdk/test/jdk/internal/jline/extra/HistoryTest.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary Test Completion + * @modules jdk.internal.le/jdk.internal.jline + * jdk.internal.le/jdk.internal.jline.console + * jdk.internal.le/jdk.internal.jline.console.history + * jdk.internal.le/jdk.internal.jline.extra + * @build HistoryTest + * @run testng HistoryTest + */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicBoolean; + +import jdk.internal.jline.UnsupportedTerminal; +import jdk.internal.jline.console.ConsoleReader; +import jdk.internal.jline.console.history.MemoryHistory; +import jdk.internal.jline.extra.EditingHistory; + +import org.testng.annotations.Test; + +import static org.testng.Assert.*; + +@Test +public class HistoryTest { + + public void testHistory() throws IOException { + ConsoleReader in = new ConsoleReader(new ByteArrayInputStream(new byte[0]), new ByteArrayOutputStream(), new UnsupportedTerminal()); + AtomicBoolean complete = new AtomicBoolean(); + EditingHistory history = new EditingHistory(in, Collections.emptyList()) { + @Override + protected boolean isComplete(CharSequence input) { + return complete.get(); + } + }; + complete.set(false); history.add("void test() {"); + complete.set(false); history.add(" System.err.println(1);"); + complete.set(true); history.add("}"); + complete.set(true); history.add("/exit"); + + previousAndAssert(history, "/exit"); + + history.previous(); history.previous(); history.previous(); + + complete.set(false); history.add("void test() { /*changed*/"); + + complete.set(true); + previousAndAssert(history, "}"); + previousAndAssert(history, " System.err.println(1);"); + previousAndAssert(history, "void test() {"); + + assertFalse(history.previous()); + + nextAndAssert(history, " System.err.println(1);"); + nextAndAssert(history, "}"); + nextAndAssert(history, ""); + + complete.set(false); history.add(" System.err.println(2);"); + complete.set(true); history.add("} /*changed*/"); + + assertEquals(history.size(), 7); + + Collection persistentHistory = history.save(); + + history = new EditingHistory(in, persistentHistory) { + @Override + protected boolean isComplete(CharSequence input) { + return complete.get(); + } + }; + + previousSnippetAndAssert(history, "void test() { /*changed*/"); + previousSnippetAndAssert(history, "/exit"); + previousSnippetAndAssert(history, "void test() {"); + + assertFalse(history.previousSnippet()); + + nextSnippetAndAssert(history, "/exit"); + nextSnippetAndAssert(history, "void test() { /*changed*/"); + nextSnippetAndAssert(history, ""); + + assertFalse(history.nextSnippet()); + + complete.set(false); history.add("{"); + complete.set(true); history.add("}"); + + persistentHistory = history.save(); + + history = new EditingHistory(in, persistentHistory) { + @Override + protected boolean isComplete(CharSequence input) { + return complete.get(); + } + }; + + previousSnippetAndAssert(history, "{"); + previousSnippetAndAssert(history, "void test() { /*changed*/"); + previousSnippetAndAssert(history, "/exit"); + previousSnippetAndAssert(history, "void test() {"); + + while (history.next()); + + complete.set(true); history.add("/*current1*/"); + complete.set(true); history.add("/*current2*/"); + complete.set(true); history.add("/*current3*/"); + + assertEquals(history.currentSessionEntries(), Arrays.asList("/*current1*/", "/*current2*/", "/*current3*/")); + + history.remove(0); + + assertEquals(history.currentSessionEntries(), Arrays.asList("/*current1*/", "/*current2*/", "/*current3*/")); + + while (history.size() > 2) + history.remove(0); + + assertEquals(history.currentSessionEntries(), Arrays.asList("/*current2*/", "/*current3*/")); + + for (int i = 0; i < MemoryHistory.DEFAULT_MAX_SIZE * 2; i++) { + complete.set(true); history.add("/exit"); + } + + complete.set(false); history.add("void test() { /*after full*/"); + complete.set(false); history.add(" System.err.println(1);"); + complete.set(true); history.add("}"); + + previousSnippetAndAssert(history, "void test() { /*after full*/"); + } + + private void previousAndAssert(EditingHistory history, String expected) { + assertTrue(history.previous()); + assertEquals(history.current().toString(), expected); + } + + private void nextAndAssert(EditingHistory history, String expected) { + assertTrue(history.next()); + assertEquals(history.current().toString(), expected); + } + + private void previousSnippetAndAssert(EditingHistory history, String expected) { + assertTrue(history.previousSnippet()); + assertEquals(history.current().toString(), expected); + } + + private void nextSnippetAndAssert(EditingHistory history, String expected) { + assertTrue(history.nextSnippet()); + assertEquals(history.current().toString(), expected); + } + +} diff --git a/jdk/test/jdk/modules/scenarios/overlappingpackages/OverlappingPackagesTest.java b/jdk/test/jdk/modules/scenarios/overlappingpackages/OverlappingPackagesTest.java index 826e282326a..529996e8e7d 100644 --- a/jdk/test/jdk/modules/scenarios/overlappingpackages/OverlappingPackagesTest.java +++ b/jdk/test/jdk/modules/scenarios/overlappingpackages/OverlappingPackagesTest.java @@ -66,13 +66,7 @@ public class OverlappingPackagesTest { } Path srcMisc = SRC_DIR.resolve("misc"); Path modsMisc = MODS_DIR.resolve("misc"); - assertTrue(CompilerUtils.compile(srcMisc.resolve("sun") - .resolve("misc") - .resolve("Unsafe.java"), - modsMisc, - "-Xmodule:java.base")); - assertTrue(CompilerUtils.compile(srcMisc.resolve("module-info.java"), - modsMisc)); + assertTrue(CompilerUtils.compile(srcMisc, modsMisc)); } /** @@ -92,7 +86,7 @@ public class OverlappingPackagesTest { /** * Run the test with "-addmods misc", the misc module has package - * sun.misc and so should overlap with the base module. + * jdk.internal.misc and so should overlap with the base module. */ public void testOverlapWithBaseModule() throws Exception { int exitValue diff --git a/jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/sun/misc/Unsafe.java b/jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/jdk/internal/misc/Unsafe.java similarity index 97% rename from jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/sun/misc/Unsafe.java rename to jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/jdk/internal/misc/Unsafe.java index 135652ea9b7..0b4aa917ccd 100644 --- a/jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/sun/misc/Unsafe.java +++ b/jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/jdk/internal/misc/Unsafe.java @@ -21,7 +21,7 @@ * questions. */ -package sun.misc; +package jdk.internal.misc; public class Unsafe { private Unsafe() { } diff --git a/jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/module-info.java b/jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/module-info.java index 65cc15d749b..d4f3bd98b69 100644 --- a/jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/module-info.java +++ b/jdk/test/jdk/modules/scenarios/overlappingpackages/src/misc/module-info.java @@ -22,6 +22,6 @@ */ module misc { - exports sun.misc; + exports jdk.internal.misc; } diff --git a/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java b/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java index 6f87dc68813..7f5f37b44fa 100644 --- a/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java +++ b/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8144355 + * @bug 8144355 8144062 * @summary Test aliasing additions to ZipFileSystem for multi-release jar files * @library /lib/testlibrary/java/util/jar * @build Compiler JarBuilder CreateMultiReleaseTestJars @@ -34,17 +34,17 @@ import java.io.IOException; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +import java.lang.Runtime.Version; import java.net.URI; import java.nio.file.*; import java.util.HashMap; import java.util.Map; -import jdk.Version; import org.testng.Assert; import org.testng.annotations.*; public class MultiReleaseJarTest { - final private int MAJOR_VERSION = Version.current().major(); + final private int MAJOR_VERSION = Runtime.version().major(); final private String userdir = System.getProperty("user.dir","."); final private Map stringEnv = new HashMap<>(); diff --git a/jdk/test/lib/testlibrary/CompilerUtils.java b/jdk/test/lib/testlibrary/CompilerUtils.java index 91ca9181340..261c2c8f930 100644 --- a/jdk/test/lib/testlibrary/CompilerUtils.java +++ b/jdk/test/lib/testlibrary/CompilerUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,13 +50,21 @@ public final class CompilerUtils { * * @return true if the compilation is successful * - * @throws IOException if there is an I/O error scanning the source tree or - * creating the destination directory + * @throws IOException + * if there is an I/O error scanning the source tree or + * creating the destination directory + * @throws UnsupportedOperationException + * if there is no system java compiler */ public static boolean compile(Path source, Path destination, String ... options) throws IOException { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + if (compiler == null) { + // no compiler available + throw new UnsupportedOperationException("Unable to get system java compiler. " + + "Perhaps, jdk.compiler module is not available."); + } StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null); List sources diff --git a/jdk/test/sun/applet/DeprecatedAppletViewer/DeprecatedAppletViewer.java b/jdk/test/sun/applet/DeprecatedAppletViewer/DeprecatedAppletViewer.java index f3b43f83eee..27cf0330389 100644 --- a/jdk/test/sun/applet/DeprecatedAppletViewer/DeprecatedAppletViewer.java +++ b/jdk/test/sun/applet/DeprecatedAppletViewer/DeprecatedAppletViewer.java @@ -32,17 +32,18 @@ import java.io.PrintStream; */ public final class DeprecatedAppletViewer { - private static final String TEXT = "AppletViewer is deprecated."; + private static final String TEXT + = "Warning: Applet API and AppletViewer are deprecated."; public static void main(final String[] args) { - final PrintStream old = System.out; + final PrintStream old = System.err; final ByteArrayOutputStream baos = new ByteArrayOutputStream(1000); final PrintStream ps = new PrintStream(baos); try { - System.setOut(ps); + System.setErr(ps); sun.applet.Main.main(new String[]{}); } finally { - System.setOut(old); + System.setErr(old); } final String text = new String(baos.toByteArray()); diff --git a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ImpactOnSNI.java b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ImpactOnSNI.java index 4e0f0bdac59..d90d9478e2a 100644 --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ImpactOnSNI.java +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ImpactOnSNI.java @@ -235,6 +235,7 @@ public class ImpactOnSNI { hostname); // Ignore the test if the hostname does not sound like a domain name. if ((hostname == null) || hostname.isEmpty() || + !hostname.contains(".") || hostname.endsWith(".") || hostname.startsWith("localhost") || Character.isDigit(hostname.charAt(hostname.length() - 1))) { diff --git a/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java b/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java index 0f5545707a4..f6b01a08d40 100644 --- a/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java +++ b/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8132734 + * @bug 8132734 8144062 * @summary Test that URL connections to multi-release jars can be runtime versioned * @library /lib/testlibrary/java/util/jar * @build Compiler JarBuilder CreateMultiReleaseTestJars SimpleHttpServer @@ -43,8 +43,6 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.jar.JarFile; -import jdk.Version; - import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; @@ -94,7 +92,7 @@ public class MultiReleaseJarURLConnection { public void testRuntimeVersioning(String style, String file) throws Exception { String urlFile = "jar:file:" + file + "!/"; String baseUrlEntry = urlFile + "version/Version.java"; - String rtreturn = "return " + Version.current().major(); + String rtreturn = "return " + Runtime.version().major(); Assert.assertTrue(readAndCompare(new URL(baseUrlEntry), "return 8")); // #runtime is "magic" for a multi-release jar, but not for unversioned jar @@ -109,7 +107,7 @@ public class MultiReleaseJarURLConnection { if (style.equals("unversioned")) return; // direct access to versioned entry - String versUrlEntry = urlFile + "META-INF/versions/" + Version.current().major() + String versUrlEntry = urlFile + "META-INF/versions/" + Runtime.version().major() + "/version/Version.java"; Assert.assertTrue(readAndCompare(new URL(versUrlEntry), rtreturn)); // adding any fragment does not change things @@ -187,7 +185,7 @@ public class MultiReleaseJarURLConnection { MethodType mt = MethodType.methodType(int.class); MethodHandle mh = MethodHandles.lookup().findVirtual(vcls, "getVersion", mt); Assert.assertEquals((int)mh.invoke(vcls.newInstance()), - style.equals("unversioned") ? 8 : Version.current().major()); + style.equals("unversioned") ? 8 : Runtime.version().major()); // now get a resource and verify that we don't have a fragment attached URL vclsUrl = vcls.getResource("/version/Version.class"); @@ -206,7 +204,7 @@ public class MultiReleaseJarURLConnection { if (style.equals("unversioned")) { suffix = ".jar!/version/Version.class"; } else { - suffix = ".jar!/META-INF/versions/" + Version.current().major() + suffix = ".jar!/META-INF/versions/" + Runtime.version().major() + "/version/Version.class"; } Assert.assertTrue(rep.endsWith(suffix)); diff --git a/jdk/test/sun/security/jca/PreferredProviderTest.java b/jdk/test/sun/security/jca/PreferredProviderTest.java index 56aa4a0210e..72026222fee 100644 --- a/jdk/test/sun/security/jca/PreferredProviderTest.java +++ b/jdk/test/sun/security/jca/PreferredProviderTest.java @@ -25,15 +25,17 @@ import java.security.MessageDigest; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.Security; +import java.security.Signature; import java.security.Provider; import java.util.Arrays; import java.util.List; import javax.crypto.Cipher; +import javax.crypto.Mac; import javax.crypto.NoSuchPaddingException; /** * @test - * @bug 8076359 8133151 8145344 8150512 + * @bug 8076359 8133151 8145344 8150512 8155847 * @summary Test the value for new jdk.security.provider.preferred * security property */ @@ -61,8 +63,8 @@ public class PreferredProviderTest { //java.security file which will be verified. switch (type) { case "sparcv9": - preferredProp = "AES:SunJCE, SHA1:SUN, SHA-224:SUN," - + " SHA-256:SUN, SHA-384:SUN, SHA-512:SUN"; + preferredProp = "AES:SunJCE, SHA1:SUN, Group.SHA2:SUN, " + + "HmacSHA1:SunJCE, Group.HmacSHA2:SunJCE"; verifyPreferredProviderProperty(os, type, preferredProp); verifyDigestProvider(os, type, Arrays.asList( @@ -71,14 +73,51 @@ public class PreferredProviderTest { new DataTuple("SHA-224", "SUN"), new DataTuple("SHA-256", "SUN"), new DataTuple("SHA-384", "SUN"), - new DataTuple("SHA-512", "SUN"))); + new DataTuple("SHA-512", "SUN"), + new DataTuple("SHA-512/224", "SUN"), + new DataTuple("SHA-512/256", "SUN"))); + + verifyMacProvider(os, type, Arrays.asList( + new DataTuple("HmacSHA1", "SunJCE"), + new DataTuple("HmacSHA224", "SunJCE"), + new DataTuple("HmacSHA256", "SunJCE"), + new DataTuple("HmacSHA384", "SunJCE"), + new DataTuple("HmacSHA512", "SunJCE"))); break; case "amd64": - preferredProp = "AES:SunJCE, RSA:SunRsaSign"; + preferredProp = "AES:SunJCE, SHA1:SUN, Group.SHA2:SUN, " + + "HmacSHA1:SunJCE, Group.HmacSHA2:SunJCE, " + + "RSA:SunRsaSign, SHA1withRSA:SunRsaSign, " + + "Group.SHA2RSA:SunRsaSign"; + verifyPreferredProviderProperty(os, type, preferredProp); verifyKeyFactoryProvider(os, type, Arrays.asList( new DataTuple("RSA", "SunRsaSign"))); + + verifyDigestProvider(os, type, Arrays.asList( + new DataTuple("SHA1", "SUN"), + new DataTuple("SHA-1", "SUN"), + new DataTuple("SHA-224", "SUN"), + new DataTuple("SHA-256", "SUN"), + new DataTuple("SHA-384", "SUN"), + new DataTuple("SHA-512", "SUN"), + new DataTuple("SHA-512/224", "SUN"), + new DataTuple("SHA-512/256", "SUN"))); + + verifyMacProvider(os, type, Arrays.asList( + new DataTuple("HmacSHA1", "SunJCE"), + new DataTuple("HmacSHA224", "SunJCE"), + new DataTuple("HmacSHA256", "SunJCE"), + new DataTuple("HmacSHA384", "SunJCE"), + new DataTuple("HmacSHA512", "SunJCE"))); + + verifySignatureProvider(os, type, Arrays.asList( + new DataTuple("SHA1withRSA", "SunRsaSign"), + new DataTuple("SHA224withRSA", "SunRsaSign"), + new DataTuple("SHA256withRSA", "SunRsaSign"), + new DataTuple("SHA384withRSA", "SunRsaSign"), + new DataTuple("SHA512withRSA", "SunRsaSign"))); break; } verifyDigestProvider(os, type, Arrays.asList( @@ -99,6 +138,8 @@ public class PreferredProviderTest { String preferredProvider = Security.getProperty("jdk.security.provider.preferred"); if (!preferredProvider.equals(preferred)) { + System.out.println("Expected: " + preferred + "\nResult: " + + preferredProvider); throw new RuntimeException(String.format( "Test Failed: wrong jdk.security.provider.preferred value " + "on %s-%s", os, arch)); @@ -120,6 +161,19 @@ public class PreferredProviderTest { "Preferred MessageDigest algorithm verification successful."); } + private static void verifyMacProvider(String os, String arch, + List algoProviders) throws NoSuchAlgorithmException { + for (DataTuple dataTuple : algoProviders) { + System.out.printf( + "Verifying Mac for '%s'%n", dataTuple.algorithm); + Mac mac = Mac.getInstance(dataTuple.algorithm); + matchProvider(mac.getProvider(), dataTuple.provider, + dataTuple.algorithm, os, arch); + } + System.out.println( + "Preferred Mac algorithm verification successful."); + } + private static void verifyKeyFactoryProvider(String os, String arch, List algoProviders) throws NoSuchAlgorithmException { for (DataTuple dataTuple : algoProviders) { @@ -133,6 +187,19 @@ public class PreferredProviderTest { "Preferred KeyFactory algorithm verification successful."); } + private static void verifySignatureProvider(String os, String arch, + List algoProviders) throws NoSuchAlgorithmException { + for (DataTuple dataTuple : algoProviders) { + System.out.printf( + "Verifying Signature for '%s'%n", dataTuple.algorithm); + Signature si = Signature.getInstance(dataTuple.algorithm); + matchProvider(si.getProvider(), dataTuple.provider, + dataTuple.algorithm, os, arch); + } + System.out.println( + "Preferred Signature algorithm verification successful."); + } + private static void matchProvider(Provider provider, String expected, String algo, String os, String arch) { if (!provider.getName().equals(expected)) { diff --git a/jdk/test/sun/security/krb5/canonicalize/Test.java b/jdk/test/sun/security/krb5/canonicalize/Test.java index 8d21a50727f..62c44de9984 100644 --- a/jdk/test/sun/security/krb5/canonicalize/Test.java +++ b/jdk/test/sun/security/krb5/canonicalize/Test.java @@ -22,7 +22,7 @@ */ /* * @test - * @bug 6682516 + * @bug 6682516 8149521 * @summary SPNEGO_HTTP_AUTH/WWW_KRB and SPNEGO_HTTP_AUTH/WWW_SPNEGO failed on all non-windows platforms * @modules java.security.jgss/sun.security.krb5 * @run main/othervm -Djava.security.krb5.conf=krb5.conf Test @@ -44,9 +44,11 @@ public class Test { check("c1", "c1.this.domain"); check("c1.this", "c1.this.domain"); check("c1.this.domain", "c1.this.domain"); + check("c1.this.domain.", "c1.this.domain"); // canonicalized name goes IP, reject check("c2", "c2"); + check("c2.", "c2"); // canonicalized name goes strange, reject check("c3", "c3"); @@ -63,4 +65,4 @@ public class Test { throw new Exception("Output is " + pn); } } - } +} diff --git a/jdk/test/sun/security/provider/PolicyFile/BadPolicyFile.java b/jdk/test/sun/security/provider/PolicyFile/BadPolicyFile.java new file mode 100644 index 00000000000..17a4c5d8d71 --- /dev/null +++ b/jdk/test/sun/security/provider/PolicyFile/BadPolicyFile.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8150468 + * @summary check that a badly formatted policy file is handled correctly + * @run main/othervm BadPolicyFile + */ + +import java.io.File; +import java.net.URI; +import java.security.AccessControlException; +import java.security.Policy; +import java.security.URIParameter; + +public class BadPolicyFile { + + public static void main(String[] args) throws Exception { + URI uri = new File(System.getProperty("test.src", "."), + "BadPolicyFile.policy").toURI(); + Policy.setPolicy(Policy.getInstance("JavaPolicy", new URIParameter(uri))); + System.setSecurityManager(new SecurityManager()); + try { + String javahome = System.getProperty("java.home"); + throw new Exception("Expected AccessControlException"); + } catch (AccessControlException ace) { + System.out.println("Test PASSED"); + } + } +} diff --git a/jdk/test/sun/security/provider/PolicyFile/BadPolicyFile.policy b/jdk/test/sun/security/provider/PolicyFile/BadPolicyFile.policy new file mode 100644 index 00000000000..b5abfaf8f42 --- /dev/null +++ b/jdk/test/sun/security/provider/PolicyFile/BadPolicyFile.policy @@ -0,0 +1,4 @@ +grant { + // permission statement is missing trailing semi-colon + permission "java.util.PropertyPermission" "java.home", "read" +}; diff --git a/jdk/test/sun/security/provider/SecureRandom/StrongSecureRandom.java b/jdk/test/sun/security/provider/SecureRandom/StrongSecureRandom.java index 2a45522cad8..fd0b20cfdb2 100644 --- a/jdk/test/sun/security/provider/SecureRandom/StrongSecureRandom.java +++ b/jdk/test/sun/security/provider/SecureRandom/StrongSecureRandom.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,11 +21,11 @@ * questions. */ -/** +/* * @test - * @bug 6425477 + * @bug 6425477 8141039 * @summary Better support for generation of high entropy random numbers - * @run main/othervm StrongSecureRandom + * @run main StrongSecureRandom */ import java.security.*; import java.util.*; @@ -35,7 +35,10 @@ import java.util.*; */ public class StrongSecureRandom { - private static String os = System.getProperty("os.name", "unknown"); + private static final String os = System.getProperty("os.name", "unknown"); + private static final String DRBG_CONFIG = "securerandom.drbg.config"; + private static final String DRBG_CONFIG_VALUE + = Security.getProperty(DRBG_CONFIG); private static void testDefaultEgd() throws Exception { // No SecurityManager installed. @@ -47,31 +50,53 @@ public class StrongSecureRandom { } } - private static void testSHA1PRNGImpl() throws Exception { - SecureRandom sr; + /** + * Verify if the mechanism is DRBG type. + * @param mech Mechanism name + * @return True if the mechanism name is DRBG type else False. + */ + private static boolean isDRBG(String mech) { + return mech.contains("_DRBG"); + } + + private static void testSecureRandomImpl(String algo, boolean drbg) + throws Exception { + byte[] ba; + final String secureRandomSource + = Security.getProperty("securerandom.source"); + try { + String urandom = "file:/dev/urandom"; - String urandom = "file:/dev/urandom"; + System.out.println("Testing new SeedGenerator and EGD"); - System.out.println("Testing new SeedGenerator and EGD"); + Security.setProperty("securerandom.source", urandom); + if (!Security.getProperty("securerandom.source").equals(urandom)) { + throw new Exception("Couldn't set securerandom.source"); + } - Security.setProperty("securerandom.source", urandom); - if (!Security.getProperty("securerandom.source").equals(urandom)) { - throw new Exception("Couldn't set securerandom.source"); + /* + * Take out a large number of bytes in hopes of blocking. + * Don't expect this to happen, unless something is broken on Linux + */ + SecureRandom sr = null; + if (drbg) { + Security.setProperty(DRBG_CONFIG, algo); + sr = SecureRandom.getInstance("DRBG"); + } else { + sr = SecureRandom.getInstance(algo); + } + if (!sr.getAlgorithm().equals(isDRBG(algo) ? "DRBG" : algo)) { + throw new Exception("sr.getAlgorithm(): " + sr.getAlgorithm()); + } + + ba = sr.generateSeed(4096); + sr.nextBytes(ba); + sr.setSeed(ba); + } finally { + Security.setProperty("securerandom.source", secureRandomSource); + Security.setProperty(DRBG_CONFIG, DRBG_CONFIG_VALUE); } - - /* - * Take out a large number of bytes in hopes of blocking. - * Don't expect this to happen, unless something is broken on Linux - */ - sr = SecureRandom.getInstance("SHA1PRNG"); - if (!sr.getAlgorithm().equals("SHA1PRNG")) { - throw new Exception("sr.getAlgorithm(): " + sr.getAlgorithm()); - } - - ba = sr.generateSeed(4096); - sr.nextBytes(ba); - sr.setSeed(ba); } private static void testNativePRNGImpls() throws Exception { @@ -85,7 +110,7 @@ public class StrongSecureRandom { return; } - System.out.println(" Testing regular"); + System.out.println("Testing regular"); sr = SecureRandom.getInstance("NativePRNG"); if (!sr.getAlgorithm().equals("NativePRNG")) { throw new Exception("sr.getAlgorithm(): " + sr.getAlgorithm()); @@ -94,7 +119,7 @@ public class StrongSecureRandom { sr.nextBytes(ba); sr.setSeed(ba); - System.out.println(" Testing NonBlocking"); + System.out.println("Testing NonBlocking"); sr = SecureRandom.getInstance("NativePRNGNonBlocking"); if (!sr.getAlgorithm().equals("NativePRNGNonBlocking")) { throw new Exception("sr.getAlgorithm(): " + sr.getAlgorithm()); @@ -108,7 +133,7 @@ public class StrongSecureRandom { return; } - System.out.println(" Testing Blocking"); + System.out.println("Testing Blocking"); sr = SecureRandom.getInstance("NativePRNGBlocking"); if (!sr.getAlgorithm().equals("NativePRNGBlocking")) { throw new Exception("sr.getAlgorithm(): " + sr.getAlgorithm()); @@ -141,9 +166,15 @@ public class StrongSecureRandom { throws Exception { System.out.println("Testing: '" + property + "' " + expected); - - Security.setProperty("securerandom.strongAlgorithms", property); - testStrongInstance(expected); + final String origStrongAlgoProp + = Security.getProperty("securerandom.strongAlgorithms"); + try { + Security.setProperty("securerandom.strongAlgorithms", property); + testStrongInstance(expected); + } finally { + Security.setProperty( + "securerandom.strongAlgorithms", origStrongAlgoProp); + } } private static void testProperties() throws Exception { @@ -228,7 +259,10 @@ public class StrongSecureRandom { public static void main(String args[]) throws Exception { testDefaultEgd(); - testSHA1PRNGImpl(); + for (String algo : new String[]{ + "SHA1PRNG", "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) { + testSecureRandomImpl(algo, isDRBG(algo)); + } testNativePRNGImpls(); testAllImpls(); diff --git a/jdk/test/sun/security/provider/SeedGenerator/SeedGeneratorChoice.java b/jdk/test/sun/security/provider/SeedGenerator/SeedGeneratorChoice.java index d91ce78db4b..93889729058 100644 --- a/jdk/test/sun/security/provider/SeedGenerator/SeedGeneratorChoice.java +++ b/jdk/test/sun/security/provider/SeedGenerator/SeedGeneratorChoice.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, 2016, Oracle and/or its affiliates. All rights + * reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,10 +24,9 @@ /* * @test - * @bug 6998583 + * @bug 6998583 8141039 * @summary NativeSeedGenerator is making 8192 byte read requests from * entropy pool on each init. - * @run main SeedGeneratorChoice * @run main/othervm -Djava.security.egd=file:/dev/random SeedGeneratorChoice * @run main/othervm -Djava.security.egd=file:filename SeedGeneratorChoice */ @@ -39,14 +39,24 @@ * We should always fall back to the ThreadedSeedGenerator if exceptions * are encountered with user defined source of entropy. */ - import java.security.SecureRandom; +import java.security.Security; public class SeedGeneratorChoice { public static void main(String... arguments) throws Exception { - byte[] bytes; - SecureRandom prng = SecureRandom.getInstance("SHA1PRNG"); - bytes = prng.generateSeed(1); + for (String mech : new String[]{"SHA1PRNG", "Hash_DRBG", "HMAC_DRBG", + "CTR_DRBG"}) { + + SecureRandom prng = null; + if (!mech.contains("_DRBG")) { + prng = SecureRandom.getInstance(mech); + } else { + Security.setProperty("securerandom.drbg.config", mech); + prng = SecureRandom.getInstance("DRBG"); + } + prng.generateSeed(1); + } } + } diff --git a/jdk/test/sun/security/rsa/SpecTest.java b/jdk/test/sun/security/rsa/SpecTest.java index 24cddfe3591..7b3c52e5d1f 100644 --- a/jdk/test/sun/security/rsa/SpecTest.java +++ b/jdk/test/sun/security/rsa/SpecTest.java @@ -24,7 +24,6 @@ /** * @test * @bug 8044199 8137231 - * @key intermittent * @summary Check same KeyPair's private key and public key have same modulus. * also check public key's public exponent equals to given spec's public * exponent. Only key size 1024 is tested with RSAKeyGenParameterSpec.F0 (3). diff --git a/jdk/test/sun/security/tools/keytool/DefaultSignatureAlgorithm.java b/jdk/test/sun/security/tools/keytool/DefaultSignatureAlgorithm.java new file mode 100644 index 00000000000..ad6297f2b21 --- /dev/null +++ b/jdk/test/sun/security/tools/keytool/DefaultSignatureAlgorithm.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8138766 + * @summary New default -sigalg for keytool + * @modules java.base/sun.security.tools.keytool + */ + +import sun.security.tools.keytool.Main; + +import java.io.File; +import java.security.KeyStore; +import java.security.cert.X509Certificate; + +public class DefaultSignatureAlgorithm { + + private static int counter = 0; + + public static void main(String[] args) throws Exception { + + // Calculating large RSA keys are too slow. + run("RSA", 1024, null, "SHA256withRSA"); + run("RSA", 3072, null, "SHA256withRSA"); + run("RSA", 3073, null, "SHA384withRSA"); + + run("DSA", 1024, null, "SHA256withDSA"); + run("DSA", 3072, null, "SHA256withDSA"); + + run("EC", 192, null, "SHA256withECDSA"); + run("EC", 384, null, "SHA384withECDSA"); + run("EC", 571, null, "SHA512withECDSA"); + + // If you specify one, it will be used. + run("EC", 571, "SHA256withECDSA", "SHA256withECDSA"); + } + + private static void run(String keyAlg, int keySize, + String sigAlg, String expectedSigAlg) throws Exception { + String alias = keyAlg + keySize + (counter++); + String cmd = "-keystore ks -storepass changeit" + + " -keypass changeit -alias " + alias + + " -keyalg " + keyAlg + " -keysize " + keySize + + " -genkeypair -dname CN=" + alias + " -debug"; + if (sigAlg != null) { + cmd += " -sigalg " + sigAlg; + } + Main.main(cmd.split(" ")); + + KeyStore ks = KeyStore.getInstance( + new File("ks"), "changeit".toCharArray()); + X509Certificate cert = (X509Certificate)ks.getCertificate(alias); + String actualSigAlg = cert.getSigAlgName(); + if (!actualSigAlg.equals(expectedSigAlg)) { + throw new Exception("Failure at " + alias + ": expected " + + expectedSigAlg + ", actually " + actualSigAlg); + } + } +} diff --git a/jdk/test/tools/jimage/VerifyJimage.java b/jdk/test/tools/jimage/VerifyJimage.java index 9c33cc3fa74..5056e6322a5 100644 --- a/jdk/test/tools/jimage/VerifyJimage.java +++ b/jdk/test/tools/jimage/VerifyJimage.java @@ -188,7 +188,11 @@ public class VerifyJimage { String cn = removeModule(n).replaceAll("\\.class$", "").replace('/', '.'); count.incrementAndGet(); try { + System.out.println("Loading " + cn); Class.forName(cn, false, loader); + } catch (VerifyError ve) { + System.err.println("VerifyError for " + cn); + failed.add(reader.imageName() + ": " + cn + " not verified: " + ve.getMessage()); } catch (ClassNotFoundException e) { failed.add(reader.imageName() + ": " + cn + " not found"); } diff --git a/jdk/test/tools/jlink/DefaultProviderTest.java b/jdk/test/tools/jlink/DefaultProviderTest.java index 22c68287d5c..c10e9d37060 100644 --- a/jdk/test/tools/jlink/DefaultProviderTest.java +++ b/jdk/test/tools/jlink/DefaultProviderTest.java @@ -33,7 +33,7 @@ import java.util.Set; import jdk.tools.jlink.internal.PluginRepository; import jdk.tools.jlink.plugin.Plugin; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; import tests.Helper; @@ -65,26 +65,26 @@ public class DefaultProviderTest { private boolean enabled = true; @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } @Override - public Set getState() { - return enabled ? EnumSet.of(STATE.AUTO_ENABLED, STATE.FUNCTIONAL) - : EnumSet.of(STATE.DISABLED); + public Set getState() { + return enabled ? EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL) + : EnumSet.of(State.DISABLED); } @Override - public void visit(Pool in, Pool out) { + public void visit(ModulePool in, ModulePool out) { if (!enabled) { throw new PluginException(NAME + " was set"); } DefaultProviderTest.isNewPluginsCalled = true; - in.visit((Pool.ModuleData content) -> { + in.transformAndCopy(content -> { return content; }, out); } diff --git a/jdk/test/tools/jlink/ImageFileCreatorTest.java b/jdk/test/tools/jlink/ImageFileCreatorTest.java index 449d950d04d..8e093c69459 100644 --- a/jdk/test/tools/jlink/ImageFileCreatorTest.java +++ b/jdk/test/tools/jlink/ImageFileCreatorTest.java @@ -39,7 +39,7 @@ import jdk.tools.jlink.internal.ImageFileCreator; import jdk.tools.jlink.internal.ImagePluginStack; import jdk.tools.jlink.plugin.ExecutableImage; import jdk.tools.jlink.builder.ImageBuilder; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; /* @@ -47,6 +47,7 @@ import jdk.tools.jlink.plugin.Pool; * @summary ImageFileCreator class test * @author Jean-Francois Denise * @modules jdk.jlink/jdk.tools.jlink.internal + * jdk.jlink/jdk.tools.jlink.builder * java.base/jdk.internal.jimage * @run main/othervm -verbose:gc -Xmx1g ImageFileCreatorTest */ @@ -214,7 +215,7 @@ public class ImageFileCreatorTest { } @Override - public void storeFiles(Pool content) { + public void storeFiles(ModulePool content) { } }; diff --git a/jdk/test/tools/jlink/ImageFilePoolTest.java b/jdk/test/tools/jlink/ImageFilePoolTest.java index 7d35f9da8d6..1ea0fada3d7 100644 --- a/jdk/test/tools/jlink/ImageFilePoolTest.java +++ b/jdk/test/tools/jlink/ImageFilePoolTest.java @@ -31,11 +31,12 @@ */ import java.io.ByteArrayInputStream; -import jdk.tools.jlink.internal.PoolImpl; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; -import jdk.tools.jlink.plugin.Pool.Visitor; +import java.util.Optional; +import java.util.function.Function; +import jdk.tools.jlink.internal.ModuleEntryImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class ImageFilePoolTest { public static void main(String[] args) throws Exception { @@ -50,45 +51,45 @@ public class ImageFilePoolTest { private static final String SUFFIX = "END"; private void checkVisitor() throws Exception { - Pool input = new PoolImpl(); + ModulePool input = new ModulePoolImpl(); for (int i = 0; i < 1000; ++i) { String module = "module" + (i / 100); input.add(new InMemoryImageFile(module, "/" + module + "/java/class" + i, - ModuleDataType.CONFIG, "class" + i)); + ModuleEntry.Type.CONFIG, "class" + i)); } - if (input.getContent().size() != 1000) { + if (input.getEntryCount() != 1000) { throw new AssertionError(); } - Pool output = new PoolImpl(); + ModulePool output = new ModulePoolImpl(); ResourceVisitor visitor = new ResourceVisitor(); - input.visit(visitor, output); + input.transformAndCopy(visitor, output); if (visitor.getAmountBefore() == 0) { throw new AssertionError("Resources not found"); } - if (visitor.getAmountBefore() != input.getContent().size()) { + if (visitor.getAmountBefore() != input.getEntryCount()) { throw new AssertionError("Number of visited resources. Expected: " + - visitor.getAmountBefore() + ", got: " + input.getContent().size()); + visitor.getAmountBefore() + ", got: " + input.getEntryCount()); } - if (visitor.getAmountAfter() != output.getContent().size()) { + if (visitor.getAmountAfter() != output.getEntryCount()) { throw new AssertionError("Number of added resources. Expected: " + - visitor.getAmountAfter() + ", got: " + output.getContent().size()); + visitor.getAmountAfter() + ", got: " + output.getEntryCount()); } - for (ModuleData outFile : output.getContent()) { + output.entries().forEach(outFile -> { String path = outFile.getPath().replaceAll(SUFFIX + "$", ""); - ModuleData inFile = input.get(path); - if (inFile == null) { + Optional inFile = input.findEntry(path); + if (!inFile.isPresent()) { throw new AssertionError("Unknown resource: " + path); } - } + }); } - private static class ResourceVisitor implements Visitor { + private static class ResourceVisitor implements Function { private int amountBefore; private int amountAfter; @Override - public ModuleData visit(ModuleData file) { + public ModuleEntry apply(ModuleEntry file) { int index = ++amountBefore % 3; switch (index) { case 0: @@ -113,7 +114,7 @@ public class ImageFilePoolTest { } private void checkNegative() throws Exception { - PoolImpl input = new PoolImpl(); + ModulePoolImpl input = new ModulePoolImpl(); try { input.add(null); throw new AssertionError("NullPointerException is not thrown"); @@ -126,30 +127,30 @@ public class ImageFilePoolTest { } catch (NullPointerException e) { // expected } - if (input.get("unknown") != null) { - throw new AssertionError("ImageFilePool does not return null for unknown file"); + if (input.findEntry("unknown").isPresent()) { + throw new AssertionError("ImageFileModulePool does not return null for unknown file"); } - if (input.contains(new InMemoryImageFile("", "unknown", ModuleDataType.CONFIG, "unknown"))) { + if (input.contains(new InMemoryImageFile("", "unknown", ModuleEntry.Type.CONFIG, "unknown"))) { throw new AssertionError("'contain' returns true for unknown file"); } - input.add(new InMemoryImageFile("", "/aaa/bbb", ModuleDataType.CONFIG, "")); + input.add(new InMemoryImageFile("", "/aaa/bbb", ModuleEntry.Type.CONFIG, "")); try { - input.add(new InMemoryImageFile("", "/aaa/bbb", ModuleDataType.CONFIG, "")); + input.add(new InMemoryImageFile("", "/aaa/bbb", ModuleEntry.Type.CONFIG, "")); throw new AssertionError("Exception expected"); } catch (Exception e) { // expected } input.setReadOnly(); try { - input.add(new InMemoryImageFile("", "/aaa/ccc", ModuleDataType.CONFIG, "")); + input.add(new InMemoryImageFile("", "/aaa/ccc", ModuleEntry.Type.CONFIG, "")); throw new AssertionError("Exception expected"); } catch (Exception e) { // expected } } - private static class InMemoryImageFile extends ModuleData { - public InMemoryImageFile(String module, String path, ModuleDataType type, String content) { + private static class InMemoryImageFile extends ModuleEntryImpl { + public InMemoryImageFile(String module, String path, ModuleEntry.Type type, String content) { super(module, path, type, new ByteArrayInputStream(content.getBytes()), content.getBytes().length); } } diff --git a/jdk/test/tools/jlink/IntegrationTest.java b/jdk/test/tools/jlink/IntegrationTest.java index 951c16cff74..e5637b421a8 100644 --- a/jdk/test/tools/jlink/IntegrationTest.java +++ b/jdk/test/tools/jlink/IntegrationTest.java @@ -39,7 +39,7 @@ import jdk.tools.jlink.Jlink.JlinkConfiguration; import jdk.tools.jlink.Jlink.PluginsConfiguration; import jdk.tools.jlink.builder.DefaultImageBuilder; import jdk.tools.jlink.plugin.ExecutableImage; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.PostProcessorPlugin; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.internal.plugins.DefaultCompressPlugin; @@ -56,6 +56,8 @@ import tests.JImageGenerator; * @library ../lib * @modules java.base/jdk.internal.jimage * jdk.jdeps/com.sun.tools.classfile + * jdk.jlink/jdk.tools.jlink + * jdk.jlink/jdk.tools.jlink.builder * jdk.jlink/jdk.tools.jlink.internal * jdk.jlink/jdk.tools.jlink.internal.plugins * jdk.jlink/jdk.tools.jmod @@ -88,9 +90,9 @@ public class IntegrationTest { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.PROCESSOR); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.PROCESSOR); return Collections.unmodifiableSet(set); } @@ -128,18 +130,18 @@ public class IntegrationTest { } @Override - public void visit(Pool in, Pool out) { + public void visit(ModulePool in, ModulePool out) { System.err.println(NAME + index); ordered.add(index); - in.visit((file) -> { + in.transformAndCopy((file) -> { return file; }, out); } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } diff --git a/jdk/test/tools/jlink/JLinkOptimTest.java b/jdk/test/tools/jlink/JLinkOptimTest.java index 82c5431f034..acc089c89c0 100644 --- a/jdk/test/tools/jlink/JLinkOptimTest.java +++ b/jdk/test/tools/jlink/JLinkOptimTest.java @@ -23,15 +23,15 @@ import jdk.internal.org.objectweb.asm.tree.MethodInsnNode; import jdk.internal.org.objectweb.asm.tree.MethodNode; import jdk.internal.org.objectweb.asm.tree.TryCatchBlockNode; import jdk.tools.jlink.internal.PluginRepository; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.plugins.OptimizationPlugin; import jdk.tools.jlink.internal.plugins.asm.AsmModulePool; import jdk.tools.jlink.internal.plugins.asm.AsmPlugin; import jdk.tools.jlink.internal.plugins.asm.AsmPools; import jdk.tools.jlink.internal.plugins.optim.ControlFlow; import jdk.tools.jlink.internal.plugins.optim.ControlFlow.Block; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import tests.Helper; import tests.JImageGenerator; @@ -134,9 +134,9 @@ public class JLinkOptimTest { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } } @@ -150,13 +150,13 @@ public class JLinkOptimTest { FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); Path root = fs.getPath("/modules/java.base"); // Access module-info.class to be reused as fake module-info.class - List javabaseResources = new ArrayList<>(); + List javabaseResources = new ArrayList<>(); try (Stream stream = Files.walk(root)) { for (Iterator iterator = stream.iterator(); iterator.hasNext();) { Path p = iterator.next(); if (Files.isRegularFile(p)) { try { - javabaseResources.add(Pool.newResource(p.toString(). + javabaseResources.add(ModuleEntry.create(p.toString(). substring("/modules".length()), Files.readAllBytes(p))); } catch (Exception ex) { throw new RuntimeException(ex); @@ -166,18 +166,18 @@ public class JLinkOptimTest { } //forName folding - PoolImpl pool = new PoolImpl(); + ModulePoolImpl pool = new ModulePoolImpl(); byte[] content = Files.readAllBytes(classes. resolve("optim").resolve("ForNameTestCase.class")); byte[] content2 = Files.readAllBytes(classes. resolve("optim").resolve("AType.class")); byte[] mcontent = Files.readAllBytes(classes.resolve("module-info.class")); - pool.add(Pool.newResource("/optimplugin/optim/ForNameTestCase.class", content)); - pool.add(Pool.newResource("/optimplugin/optim/AType.class", content2)); - pool.add(Pool.newResource("/optimplugin/module-info.class", mcontent)); + pool.add(ModuleEntry.create("/optimplugin/optim/ForNameTestCase.class", content)); + pool.add(ModuleEntry.create("/optimplugin/optim/AType.class", content2)); + pool.add(ModuleEntry.create("/optimplugin/module-info.class", mcontent)); - for (ModuleData r : javabaseResources) { + for (ModuleEntry r : javabaseResources) { pool.add(r); } @@ -186,10 +186,10 @@ public class JLinkOptimTest { optional.put(OptimizationPlugin.NAME, OptimizationPlugin.FORNAME_REMOVAL); optional.put(OptimizationPlugin.LOG, "forName.log"); plugin.configure(optional); - Pool out = new PoolImpl(); + ModulePool out = new ModulePoolImpl(); plugin.visit(pool, out); - ModuleData result = out.getContent().iterator().next(); + ModuleEntry result = out.entries().iterator().next(); ClassReader optimReader = new ClassReader(result.getBytes()); ClassNode optimClass = new ClassNode(); diff --git a/jdk/test/tools/jlink/JLinkOptionsTest.java b/jdk/test/tools/jlink/JLinkOptionsTest.java index 8c8d241f5b7..565c58bffa9 100644 --- a/jdk/test/tools/jlink/JLinkOptionsTest.java +++ b/jdk/test/tools/jlink/JLinkOptionsTest.java @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.internal.PluginRepository; import jdk.tools.jlink.plugin.TransformerPlugin; @@ -62,7 +62,7 @@ public class JLinkOptionsTest { } @Override - public void visit(Pool in, Pool out) { + public void visit(ModulePool in, ModulePool out) { } diff --git a/jdk/test/tools/jlink/JLinkPostProcessingTest.java b/jdk/test/tools/jlink/JLinkPostProcessingTest.java index b32bf207ff2..abc2b58142e 100644 --- a/jdk/test/tools/jlink/JLinkPostProcessingTest.java +++ b/jdk/test/tools/jlink/JLinkPostProcessingTest.java @@ -75,9 +75,9 @@ public class JLinkPostProcessingTest { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.PROCESSOR); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.PROCESSOR); return Collections.unmodifiableSet(set); } diff --git a/jdk/test/tools/jlink/ResourcePoolTest.java b/jdk/test/tools/jlink/ResourcePoolTest.java index 77a82e5c1b2..523503c996a 100644 --- a/jdk/test/tools/jlink/ResourcePoolTest.java +++ b/jdk/test/tools/jlink/ResourcePoolTest.java @@ -37,14 +37,14 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; - -import jdk.tools.jlink.internal.PoolImpl; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.Module; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; -import jdk.tools.jlink.plugin.Pool.Visitor; +import java.util.function.Function; +import jdk.tools.jlink.internal.ModulePoolImpl; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.plugin.LinkModule; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class ResourcePoolTest { @@ -61,54 +61,53 @@ public class ResourcePoolTest { private static final String SUFFIX = "END"; private void checkResourceVisitor() throws Exception { - Pool input = new PoolImpl(); + ModulePool input = new ModulePoolImpl(); for (int i = 0; i < 1000; ++i) { String module = "/module" + (i / 10); String resourcePath = module + "/java/package" + i; byte[] bytes = resourcePath.getBytes(); - input.add(new ModuleData(module, resourcePath, - ModuleDataType.CLASS_OR_RESOURCE, + input.add(ModuleEntry.create(module, resourcePath, + ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(bytes), bytes.length)); } - Pool output = new PoolImpl(); + ModulePool output = new ModulePoolImpl(); ResourceVisitor visitor = new ResourceVisitor(); - input.visit(visitor, output); + input.transformAndCopy(visitor, output); if (visitor.getAmountBefore() == 0) { throw new AssertionError("Resources not found"); } - if (visitor.getAmountBefore() != input.getContent().size()) { + if (visitor.getAmountBefore() != input.getEntryCount()) { throw new AssertionError("Number of visited resources. Expected: " + - visitor.getAmountBefore() + ", got: " + input.getContent().size()); + visitor.getAmountBefore() + ", got: " + input.getEntryCount()); } - if (visitor.getAmountAfter() != output.getContent().size()) { + if (visitor.getAmountAfter() != output.getEntryCount()) { throw new AssertionError("Number of added resources. Expected: " + - visitor.getAmountAfter() + ", got: " + output.getContent().size()); + visitor.getAmountAfter() + ", got: " + output.getEntryCount()); } - for (ModuleData outResource : output.getContent()) { + output.entries().forEach(outResource -> { String path = outResource.getPath().replaceAll(SUFFIX + "$", ""); - ModuleData inResource = input.get(path); - if (inResource == null) { + if (!input.findEntry(path).isPresent()) { throw new AssertionError("Unknown resource: " + path); } - } + }); } - private static class ResourceVisitor implements Visitor { + private static class ResourceVisitor implements Function { private int amountBefore; private int amountAfter; @Override - public ModuleData visit(ModuleData resource) { + public ModuleEntry apply(ModuleEntry resource) { int index = ++amountBefore % 3; switch (index) { case 0: ++amountAfter; - return new ModuleData(resource.getModule(), resource.getPath() + SUFFIX, + return ModuleEntry.create(resource.getModule(), resource.getPath() + SUFFIX, resource.getType(), resource.stream(), resource.getLength()); case 1: ++amountAfter; - return new ModuleData(resource.getModule(), resource.getPath(), + return ModuleEntry.create(resource.getModule(), resource.getPath(), resource.getType(), resource.stream(), resource.getLength()); } return null; @@ -133,8 +132,8 @@ public class ResourcePoolTest { samples.add("javax/management/ObjectName"); test(samples, (resources, module, path) -> { try { - resources.add(new ModuleData(module, path, - ModuleDataType.CLASS_OR_RESOURCE, + resources.add(ModuleEntry.create(module, path, + ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[0]), 0)); } catch (Exception ex) { throw new RuntimeException(ex); @@ -142,12 +141,12 @@ public class ResourcePoolTest { }); test(samples, (resources, module, path) -> { try { - resources.add(PoolImpl. - newCompressedResource(new ModuleData(module, path, - ModuleDataType.CLASS_OR_RESOURCE, + resources.add(ModulePoolImpl. + newCompressedResource(ModuleEntry.create(module, path, + ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[0]), 0), ByteBuffer.allocate(99), "bitcruncher", null, - ((PoolImpl)resources).getStringTable(), ByteOrder.nativeOrder())); + ((ModulePoolImpl)resources).getStringTable(), ByteOrder.nativeOrder())); } catch (Exception ex) { throw new RuntimeException(ex); } @@ -158,7 +157,7 @@ public class ResourcePoolTest { if (samples.isEmpty()) { throw new AssertionError("No sample to test"); } - Pool resources = new PoolImpl(); + ModulePool resources = new ModulePoolImpl(); Set modules = new HashSet<>(); for (int i = 0; i < samples.size(); i++) { String module = samples.get(i); @@ -173,70 +172,69 @@ public class ResourcePoolTest { i++; String clazz = samples.get(i); String path = "/" + module + "/" + clazz + ".class"; - ModuleData res = resources.get(path); - checkModule(resources, res); - if (res == null) { + Optional res = resources.findEntry(path); + if (!res.isPresent()) { throw new AssertionError("Resource not found " + path); } - ModuleData res2 = resources.get(clazz); - if (res2 != null) { + checkModule(resources, res.get()); + if (resources.findEntry(clazz).isPresent()) { throw new AssertionError("Resource found " + clazz); } } - if (resources.getContent().size() != samples.size() / 2) { + if (resources.getEntryCount() != samples.size() / 2) { throw new AssertionError("Invalid number of resources"); } } - private void checkModule(Pool resources, ModuleData res) { - Module m = resources.getModule(res.getModule()); - if (m == null) { + private void checkModule(ModulePool resources, ModuleEntry res) { + Optional optMod = resources.findModule(res.getModule()); + if (!optMod.isPresent()) { throw new AssertionError("No module " + res.getModule()); } + LinkModule m = optMod.get(); if (!m.getName().equals(res.getModule())) { throw new AssertionError("Not right module name " + res.getModule()); } - if (m.get(res.getPath()) == null) { + if (!m.findEntry(res.getPath()).isPresent()) { throw new AssertionError("resource " + res.getPath() + " not in module " + m.getName()); } } private void checkResourcesAfterCompression() throws Exception { - PoolImpl resources1 = new PoolImpl(); - ModuleData res1 = new ModuleData("module1", "/module1/toto1", - ModuleDataType.CLASS_OR_RESOURCE, + ModulePoolImpl resources1 = new ModulePoolImpl(); + ModuleEntry res1 = ModuleEntry.create("module1", "/module1/toto1", + ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[0]), 0); - ModuleData res2 = new ModuleData("module2", "/module2/toto1", - ModuleDataType.CLASS_OR_RESOURCE, + ModuleEntry res2 = ModuleEntry.create("module2", "/module2/toto1", + ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[0]), 0); resources1.add(res1); resources1.add(res2); checkResources(resources1, res1, res2); - Pool resources2 = new PoolImpl(); - ModuleData res3 = new ModuleData("module2", "/module2/toto1", - ModuleDataType.CLASS_OR_RESOURCE, + ModulePool resources2 = new ModulePoolImpl(); + ModuleEntry res3 = ModuleEntry.create("module2", "/module2/toto1", + ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[7]), 7); resources2.add(res3); - resources2.add(PoolImpl.newCompressedResource(res1, + resources2.add(ModulePoolImpl.newCompressedResource(res1, ByteBuffer.allocate(7), "zip", null, resources1.getStringTable(), ByteOrder.nativeOrder())); checkResources(resources2, res1, res2); } - private void checkResources(Pool resources, ModuleData... expected) { - Collection ms = resources.getModules(); + private void checkResources(ModulePool resources, ModuleEntry... expected) { List modules = new ArrayList(); - for(Module m : ms) { + resources.modules().forEach(m -> { modules.add(m.getName()); - } - for (ModuleData res : expected) { + }); + for (ModuleEntry res : expected) { if (!resources.contains(res)) { throw new AssertionError("Resource not found: " + res); } - if (resources.get(res.getPath()) == null) { + if (!resources.findEntry(res.getPath()).isPresent()) { throw new AssertionError("Resource not found: " + res); } @@ -244,7 +242,7 @@ public class ResourcePoolTest { throw new AssertionError("Module not found: " + res.getModule()); } - if (!resources.getContent().contains(res)) { + if (!resources.contains(res)) { throw new AssertionError("Resources not found: " + res); } @@ -260,17 +258,17 @@ public class ResourcePoolTest { throw new AssertionError("ReadOnly resources"); } - ((PoolImpl) resources).setReadOnly(); + ((ModulePoolImpl) resources).setReadOnly(); try { - resources.add(new ModuleData("module2", "/module2/toto1", - ModuleDataType.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[0]), 0)); - throw new AssertionError("Pool is read-only, but an exception is not thrown"); + resources.add(ModuleEntry.create("module2", "/module2/toto1", + ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[0]), 0)); + throw new AssertionError("ModulePool is read-only, but an exception is not thrown"); } catch (Exception ex) { // Expected } } interface ResourceAdder { - void add(Pool resources, String module, String path); + void add(ModulePool resources, String module, String path); } } diff --git a/jdk/test/tools/jlink/SecurityTest.java b/jdk/test/tools/jlink/SecurityTest.java index 9497d6f3f34..dbf593bccc0 100644 --- a/jdk/test/tools/jlink/SecurityTest.java +++ b/jdk/test/tools/jlink/SecurityTest.java @@ -25,6 +25,7 @@ * @test * @summary Test JlinkPermission * @author Jean-Francois Denise + * @modules jdk.jlink/jdk.tools.jlink * @run main/othervm SecurityTest */ diff --git a/jdk/test/tools/jlink/asmplugin/AddForgetResourcesTest.java b/jdk/test/tools/jlink/asmplugin/AddForgetResourcesTest.java index 6a414b57d63..4385534e07f 100644 --- a/jdk/test/tools/jlink/asmplugin/AddForgetResourcesTest.java +++ b/jdk/test/tools/jlink/asmplugin/AddForgetResourcesTest.java @@ -55,8 +55,8 @@ import jdk.tools.jlink.internal.plugins.asm.AsmPool.ResourceFile; import jdk.tools.jlink.internal.plugins.asm.AsmPool.WritableClassPool; import jdk.tools.jlink.internal.plugins.asm.AsmPool.WritableResourcePool; import jdk.tools.jlink.internal.plugins.asm.AsmPools; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class AddForgetResourcesTest extends AsmPluginTestBase { @@ -82,7 +82,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { new ComboPlugin() }; for (TestPlugin p : plugins) { - Pool out = p.visit(getPool()); + ModulePool out = p.visit(getPool()); p.test(getPool(), out); } } @@ -124,7 +124,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { AsmGlobalPool globalPool = pools.getGlobalPool(); WritableClassPool transformedClasses = globalPool.getTransformedClasses(); expected = globalPool.getClasses().size(); - for (ModuleData res : globalPool.getClasses()) { + for (ModuleEntry res : globalPool.getClasses()) { ClassReader reader = globalPool.getClassReader(res); String className = reader.getClassName(); if (!className.endsWith("module-info")) { @@ -137,14 +137,14 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) { - Collection inClasses = extractClasses(inResources); - Collection outClasses = extractClasses(outResources); + public void test(ModulePool inResources, ModulePool outResources) { + Collection inClasses = extractClasses(inResources); + Collection outClasses = extractClasses(outResources); if (expected != outClasses.size()) { throw new AssertionError("Classes were not added. Expected: " + expected + ", got: " + outClasses.size()); } - for (ModuleData in : inClasses) { + for (ModuleEntry in : inClasses) { String path = in.getPath(); if (!outClasses.contains(in)) { throw new AssertionError("Class not found: " + path); @@ -153,7 +153,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { continue; } String modifiedPath = path.replace(".class", SUFFIX + ".class"); - if (!outClasses.contains(Pool.newResource(modifiedPath, new byte[0]))) { + if (!outClasses.contains(ModuleEntry.create(modifiedPath, new byte[0]))) { throw new AssertionError("Class not found: " + modifiedPath); } } @@ -166,7 +166,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { public void visit() { AsmPools pools = getPools(); AsmGlobalPool globalPool = pools.getGlobalPool(); - for (ModuleData res : globalPool.getResourceFiles()) { + for (ModuleEntry res : globalPool.getResourceFiles()) { String path = res.getPath(); String moduleName = getModule(path); AsmModulePool modulePool = pools.getModulePool(moduleName); @@ -177,20 +177,20 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool in, Pool out) throws Exception { - Collection inResources = extractResources(in); - Collection outResources = extractResources(out); + public void test(ModulePool in, ModulePool out) throws Exception { + Collection inResources = extractResources(in); + Collection outResources = extractResources(out); if (2 * inResources.size() != outResources.size()) { throw new AssertionError("Classes were not added. Expected: " + (2 * inResources.size()) + ", got: " + outResources.size()); } - for (ModuleData r : inResources) { + for (ModuleEntry r : inResources) { String path = r.getPath(); if (!outResources.contains(r)) { throw new AssertionError("Class not found: " + path); } String modifiedPath = path + SUFFIX; - if (!outResources.contains(Pool.newResource(modifiedPath, new byte[0]))) { + if (!outResources.contains(ModuleEntry.create(modifiedPath, new byte[0]))) { throw new AssertionError("Class not found: " + modifiedPath); } } @@ -204,7 +204,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { AsmPools pools = getPools(); AsmGlobalPool globalPool = pools.getGlobalPool(); WritableClassPool transformedClasses = globalPool.getTransformedClasses(); - for (ModuleData res : globalPool.getClasses()) { + for (ModuleEntry res : globalPool.getClasses()) { ClassReader reader = globalPool.getClassReader(res); ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES); reader.accept(new AddMethodClassVisitor(writer), ClassReader.EXPAND_FRAMES); @@ -213,14 +213,14 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) throws Exception { - Collection inClasses = extractClasses(inResources); - Collection outClasses = extractClasses(outResources); + public void test(ModulePool inResources, ModulePool outResources) throws Exception { + Collection inClasses = extractClasses(inResources); + Collection outClasses = extractClasses(outResources); if (inClasses.size() != outClasses.size()) { throw new AssertionError("Number of classes. Expected: " + (inClasses.size()) + ", got: " + outClasses.size()); } - for (ModuleData out : outClasses) { + for (ModuleEntry out : outClasses) { String path = out.getPath(); if (!inClasses.contains(out)) { throw new AssertionError("Class not found: " + path); @@ -248,7 +248,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { public void visit() { AsmPools pools = getPools(); AsmGlobalPool globalPool = pools.getGlobalPool(); - for (ModuleData res : globalPool.getResourceFiles()) { + for (ModuleEntry res : globalPool.getResourceFiles()) { String path = res.getPath(); AsmModulePool modulePool = pools.getModulePool(getModule(path)); modulePool.getTransformedResourceFiles().addResourceFile(new ResourceFile(removeModule(path), @@ -257,14 +257,14 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool in, Pool out) throws Exception { - Collection inResources = extractResources(in); - Collection outResources = extractResources(out); + public void test(ModulePool in, ModulePool out) throws Exception { + Collection inResources = extractResources(in); + Collection outResources = extractResources(out); if (inResources.size() != outResources.size()) { throw new AssertionError("Number of resources. Expected: " + inResources.size() + ", got: " + outResources.size()); } - for (ModuleData r : outResources) { + for (ModuleEntry r : outResources) { String path = r.getPath(); if (!inResources.contains(r)) { throw new AssertionError("Resource not found: " + path); @@ -287,7 +287,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { AsmGlobalPool globalPool = pools.getGlobalPool(); WritableClassPool transformedClasses = globalPool.getTransformedClasses(); int i = 0; - for (ModuleData res : globalPool.getClasses()) { + for (ModuleEntry res : globalPool.getClasses()) { String path = removeModule(res.getPath()); String className = path.replace(".class", ""); if ((i & 1) == 0 && !className.endsWith("module-info")) { @@ -300,8 +300,8 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) throws Exception { - Collection outClasses = extractClasses(outResources); + public void test(ModulePool inResources, ModulePool outResources) throws Exception { + Collection outClasses = extractClasses(outResources); if (expected != outClasses.size()) { throw new AssertionError("Number of classes. Expected: " + expected + ", got: " + outClasses.size()); @@ -318,7 +318,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { AsmPools pools = getPools(); AsmGlobalPool globalPool = pools.getGlobalPool(); int i = 0; - for (ModuleData res : globalPool.getResourceFiles()) { + for (ModuleEntry res : globalPool.getResourceFiles()) { String path = res.getPath(); if (!path.contains("META-INF/services")) { if ((i & 1) == 0) { @@ -335,8 +335,8 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool in, Pool out) throws Exception { - Collection outResources = extractResources(out); + public void test(ModulePool in, ModulePool out) throws Exception { + Collection outResources = extractResources(out); if (expectedAmount != outResources.size()) { throw new AssertionError("Number of classes. Expected: " + expectedAmount + ", got: " + outResources.size()); @@ -354,7 +354,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { AsmGlobalPool globalPool = pools.getGlobalPool(); WritableClassPool transformedClasses = globalPool.getTransformedClasses(); int i = 0; - for (ModuleData res : globalPool.getClasses()) { + for (ModuleEntry res : globalPool.getClasses()) { ClassReader reader = globalPool.getClassReader(res); String className = reader.getClassName(); ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES); @@ -374,8 +374,8 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) throws Exception { - Collection outClasses = extractClasses(outResources); + public void test(ModulePool inResources, ModulePool outResources) throws Exception { + Collection outClasses = extractClasses(outResources); if (expected != outClasses.size()) { throw new AssertionError("Number of classes. Expected: " + expected + ", got: " + outClasses.size()); @@ -392,7 +392,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { AsmPools pools = getPools(); AsmGlobalPool globalPool = pools.getGlobalPool(); int i = 0; - for (ModuleData res : globalPool.getResourceFiles()) { + for (ModuleEntry res : globalPool.getResourceFiles()) { String path = res.getPath(); String moduleName = getModule(path); if (!path.contains("META-INF")) { @@ -412,8 +412,8 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool out) throws Exception { - Collection outResources = extractResources(out); + public void test(ModulePool inResources, ModulePool out) throws Exception { + Collection outResources = extractResources(out); if (expectedAmount != outResources.size()) { throw new AssertionError("Number of classes. Expected: " + expectedAmount + ", got: " + outResources.size()); @@ -446,7 +446,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) throws Exception { + public void test(ModulePool inResources, ModulePool outResources) throws Exception { if (!isVisitCalled()) { throw new AssertionError("Resources not visited"); } @@ -455,7 +455,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { throw new AssertionError("Number of transformed classes not equal to expected"); } // Check that only renamed classes and resource files are in the result. - for (ModuleData r : outResources.getContent()) { + outResources.entries().forEach(r -> { String resourceName = r.getPath(); if (resourceName.endsWith(".class") && !resourceName.endsWith("module-info.class")) { if (!resourceName.endsWith(SUFFIX + ".class")) { @@ -467,7 +467,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { throw new AssertionError("Resource file not renamed " + resourceName); } } - } + }); } private void renameResources() throws IOException { @@ -476,7 +476,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { for (Map.Entry> mod : MODULES.entrySet()) { String moduleName = mod.getKey(); AsmModulePool modulePool = pools.getModulePool(moduleName); - for (ModuleData res : modulePool.getResourceFiles()) { + for (ModuleEntry res : modulePool.getResourceFiles()) { ResourceFile resFile = modulePool.getResourceFile(res); if (resFile.getPath().startsWith("META-INF/services/")) { String newContent = new String(resFile.getContent()) + SUFFIX; @@ -492,7 +492,7 @@ public class AddForgetResourcesTest extends AsmPluginTestBase { AsmPools pools = getPools(); AsmGlobalPool globalPool = pools.getGlobalPool(); WritableClassPool transformedClasses = globalPool.getTransformedClasses(); - for (ModuleData res : globalPool.getClasses()) { + for (ModuleEntry res : globalPool.getClasses()) { if (res.getPath().endsWith("module-info.class")) { continue; } diff --git a/jdk/test/tools/jlink/asmplugin/AsmPluginTestBase.java b/jdk/test/tools/jlink/asmplugin/AsmPluginTestBase.java index d5c035562fa..c51419e682c 100644 --- a/jdk/test/tools/jlink/asmplugin/AsmPluginTestBase.java +++ b/jdk/test/tools/jlink/asmplugin/AsmPluginTestBase.java @@ -38,23 +38,23 @@ import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.StringTable; import jdk.tools.jlink.internal.plugins.asm.AsmPlugin; import jdk.tools.jlink.internal.plugins.asm.AsmPools; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public abstract class AsmPluginTestBase { protected static final String TEST_MODULE = "jlink.test"; protected static final Map> MODULES; - private static final Predicate isClass = r -> r.getPath().endsWith(".class"); + private static final Predicate isClass = r -> r.getPath().endsWith(".class"); private final List classes; private final List resources; - private final Pool pool; + private final ModulePool pool; static { Map> map = new HashMap<>(); @@ -75,7 +75,7 @@ public abstract class AsmPluginTestBase { List classes = new ArrayList<>(); List resources = new ArrayList<>(); - pool = new PoolImpl(); + pool = new ModulePoolImpl(); FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); Path root = fs.getPath("/modules"); @@ -100,7 +100,7 @@ public abstract class AsmPluginTestBase { MODULES.get(module).add(toResourceFile(p)); } resources.add(toPath(p.toString())); - ModuleData res = Pool.newResource(toPath(p.toString()), content); + ModuleEntry res = ModuleEntry.create(toPath(p.toString()), content); pool.add(res); } catch (Exception ex) { throw new RuntimeException(ex); @@ -110,17 +110,17 @@ public abstract class AsmPluginTestBase { } } // There is more than 10 classes in java.base... - if (classes.size() < 10 || pool.getContent().size() < 10) { + if (classes.size() < 10 || pool.getEntryCount() < 10) { throw new AssertionError("Not expected resource or class number"); } //Add a fake resource file String content = "java.lang.Object"; String path = "META-INF/services/com.foo.BarProvider"; - ModuleData resFile = Pool.newResource("/" + TEST_MODULE + "/" + + ModuleEntry resFile = ModuleEntry.create("/" + TEST_MODULE + "/" + path, content.getBytes()); pool.add(resFile); - ModuleData fakeInfoFile = Pool.newResource("/" + TEST_MODULE + ModuleEntry fakeInfoFile = ModuleEntry.create("/" + TEST_MODULE + "/module-info.class", moduleInfos.get(0)); pool.add(fakeInfoFile); MODULES.get(TEST_MODULE).add(path); @@ -144,20 +144,20 @@ public abstract class AsmPluginTestBase { return resources; } - public Pool getPool() { + public ModulePool getPool() { return pool; } public abstract void test() throws Exception; - public Collection extractClasses(Pool pool) { - return pool.getContent().stream() + public Collection extractClasses(ModulePool pool) { + return pool.entries() .filter(isClass) .collect(Collectors.toSet()); } - public Collection extractResources(Pool pool) { - return pool.getContent().stream() + public Collection extractResources(ModulePool pool) { + return pool.entries() .filter(isClass.negate()) .collect(Collectors.toSet()); } @@ -209,9 +209,9 @@ public abstract class AsmPluginTestBase { return pools != null; } - public Pool visit(Pool inResources) throws IOException { + public ModulePool visit(ModulePool inResources) throws IOException { try { - Pool outResources = new PoolImpl(inResources.getByteOrder(), new StringTable() { + ModulePool outResources = new ModulePoolImpl(inResources.getByteOrder(), new StringTable() { @Override public int addString(String str) { return -1; @@ -239,7 +239,7 @@ public abstract class AsmPluginTestBase { } public abstract void visit(); - public abstract void test(Pool inResources, Pool outResources) throws Exception; + public abstract void test(ModulePool inResources, ModulePool outResources) throws Exception; @Override public String getName() { diff --git a/jdk/test/tools/jlink/asmplugin/BasicTest.java b/jdk/test/tools/jlink/asmplugin/BasicTest.java index 0c42d4cfb99..afc5fd5f634 100644 --- a/jdk/test/tools/jlink/asmplugin/BasicTest.java +++ b/jdk/test/tools/jlink/asmplugin/BasicTest.java @@ -45,8 +45,8 @@ import java.util.logging.Logger; import jdk.internal.org.objectweb.asm.ClassReader; import jdk.tools.jlink.internal.plugins.asm.AsmModulePool; import jdk.tools.jlink.internal.plugins.asm.AsmPool; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class BasicTest extends AsmPluginTestBase { @@ -61,7 +61,7 @@ public class BasicTest extends AsmPluginTestBase { @Override public void test() throws Exception { BasicPlugin basicPlugin = new BasicPlugin(getClasses()); - Pool res = basicPlugin.visit(getPool()); + ModulePool res = basicPlugin.visit(getPool()); basicPlugin.test(getPool(), res); } @@ -107,13 +107,13 @@ public class BasicTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) throws Exception { + public void test(ModulePool inResources, ModulePool outResources) throws Exception { if (!isVisitCalled()) { throw new AssertionError("Resources not visited"); } - if (inResources.getContent().size() != outResources.getContent().size()) { - throw new AssertionError("Input size " + inResources.getContent().size() + - " != to " + outResources.getContent().size()); + if (inResources.getEntryCount() != outResources.getEntryCount()) { + throw new AssertionError("Input size " + inResources.getEntryCount() + + " != to " + outResources.getEntryCount()); } } @@ -142,7 +142,7 @@ public class BasicTest extends AsmPluginTestBase { private void testPools() throws IOException { Set remain = new HashSet<>(classes); - for (ModuleData res : getPools().getGlobalPool().getClasses()) { + for (ModuleEntry res : getPools().getGlobalPool().getClasses()) { ClassReader reader = getPools().getGlobalPool().getClassReader(res); String className = reader.getClassName(); // Wrong naming of module-info.class in ASM diff --git a/jdk/test/tools/jlink/asmplugin/IdentityPluginTest.java b/jdk/test/tools/jlink/asmplugin/IdentityPluginTest.java index ceb2e50f9b9..416d3581552 100644 --- a/jdk/test/tools/jlink/asmplugin/IdentityPluginTest.java +++ b/jdk/test/tools/jlink/asmplugin/IdentityPluginTest.java @@ -35,14 +35,15 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.UncheckedIOException; import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.org.objectweb.asm.ClassVisitor; import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.Opcodes; import jdk.tools.jlink.internal.plugins.asm.AsmPool.WritableClassPool; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class IdentityPluginTest extends AsmPluginTestBase { @@ -56,7 +57,7 @@ public class IdentityPluginTest extends AsmPluginTestBase { public void test() throws Exception { IdentityPlugin asm = new IdentityPlugin(); - Pool resourcePool = asm.visit(getPool()); + ModulePool resourcePool = asm.visit(getPool()); asm.test(getPool(), resourcePool); } @@ -64,7 +65,7 @@ public class IdentityPluginTest extends AsmPluginTestBase { @Override public void visit() { - for (ModuleData res : getPools().getGlobalPool().getClasses()) { + for (ModuleEntry res : getPools().getGlobalPool().getClasses()) { if (res.getPath().endsWith("module-info.class")) { continue; } @@ -77,7 +78,7 @@ public class IdentityPluginTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) throws IOException { + public void test(ModulePool inResources, ModulePool outResources) throws IOException { if (outResources.isEmpty()) { throw new AssertionError("Empty result"); } @@ -93,13 +94,17 @@ public class IdentityPluginTest extends AsmPluginTestBase { throw new AssertionError("Class not transformed " + className); } } - for (ModuleData r : outResources.getContent()) { + outResources.entries().forEach(r -> { if (r.getPath().endsWith(".class") && !r.getPath().endsWith("module-info.class")) { - ClassReader reader = new ClassReader(new ByteArrayInputStream(r.getBytes())); - ClassWriter w = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES); - reader.accept(w, ClassReader.EXPAND_FRAMES); + try { + ClassReader reader = new ClassReader(new ByteArrayInputStream(r.getBytes())); + ClassWriter w = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES); + reader.accept(w, ClassReader.EXPAND_FRAMES); + } catch (IOException exp) { + throw new UncheckedIOException(exp); + } } - } + }); } @Override diff --git a/jdk/test/tools/jlink/asmplugin/NegativeTest.java b/jdk/test/tools/jlink/asmplugin/NegativeTest.java index f95b7c62399..6263fcaaa4a 100644 --- a/jdk/test/tools/jlink/asmplugin/NegativeTest.java +++ b/jdk/test/tools/jlink/asmplugin/NegativeTest.java @@ -43,7 +43,7 @@ import jdk.internal.org.objectweb.asm.ClassVisitor; import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.Opcodes; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.StringTable; import jdk.tools.jlink.internal.plugins.asm.AsmGlobalPool; import jdk.tools.jlink.internal.plugins.asm.AsmModulePool; @@ -51,7 +51,7 @@ import jdk.tools.jlink.internal.plugins.asm.AsmPlugin; import jdk.tools.jlink.internal.plugins.asm.AsmPool.ResourceFile; import jdk.tools.jlink.internal.plugins.asm.AsmPools; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModulePool; public class NegativeTest extends AsmPluginTestBase { public static void main(String[] args) throws Exception { @@ -102,7 +102,7 @@ public class NegativeTest extends AsmPluginTestBase { } } }; - Pool resources = new PoolImpl(ByteOrder.BIG_ENDIAN, new StringTable() { + ModulePool resources = new ModulePoolImpl(ByteOrder.BIG_ENDIAN, new StringTable() { @Override public int addString(String str) { return -1; @@ -136,7 +136,7 @@ public class NegativeTest extends AsmPluginTestBase { action(() -> pools.fillOutputResources(null), "Output resource is null", NullPointerException.class); } }; - Pool resources = new PoolImpl(ByteOrder.BIG_ENDIAN, new StringTable() { + ModulePool resources = new ModulePoolImpl(ByteOrder.BIG_ENDIAN, new StringTable() { @Override public int addString(String str) { return -1; diff --git a/jdk/test/tools/jlink/asmplugin/PackageMappingTest.java b/jdk/test/tools/jlink/asmplugin/PackageMappingTest.java index 9453ac5f917..bd0a8fdbf4d 100644 --- a/jdk/test/tools/jlink/asmplugin/PackageMappingTest.java +++ b/jdk/test/tools/jlink/asmplugin/PackageMappingTest.java @@ -48,8 +48,8 @@ import jdk.tools.jlink.internal.plugins.asm.AsmModulePool; import jdk.tools.jlink.internal.plugins.asm.AsmPool.ResourceFile; import jdk.tools.jlink.internal.plugins.asm.AsmPool.WritableResourcePool; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class PackageMappingTest extends AsmPluginTestBase { @@ -72,7 +72,7 @@ public class PackageMappingTest extends AsmPluginTestBase { new PackageMappingPlugin(newFiles, true) }; for (TestPlugin p : plugins) { - Pool pool = p.visit(getPool()); + ModulePool pool = p.visit(getPool()); p.test(getPool(), pool); } } @@ -105,12 +105,12 @@ public class PackageMappingTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) { + public void test(ModulePool inResources, ModulePool outResources) { Set in = getPools().getGlobalPool().getResourceFiles().stream() - .map(ModuleData::getPath) + .map(ModuleEntry::getPath) .collect(Collectors.toSet()); Set out = extractResources(outResources).stream() - .map(ModuleData::getPath) + .map(ModuleEntry::getPath) .collect(Collectors.toSet()); in.addAll(PackageMappingTest.this.newFiles); if (!Objects.equals(in, out)) { diff --git a/jdk/test/tools/jlink/asmplugin/SortingTest.java b/jdk/test/tools/jlink/asmplugin/SortingTest.java index 0fc4c7a6854..26974b3b065 100644 --- a/jdk/test/tools/jlink/asmplugin/SortingTest.java +++ b/jdk/test/tools/jlink/asmplugin/SortingTest.java @@ -35,12 +35,13 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import jdk.tools.jlink.internal.plugins.asm.AsmModulePool; import jdk.tools.jlink.plugin.PluginException; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class SortingTest extends AsmPluginTestBase { @@ -66,7 +67,7 @@ public class SortingTest extends AsmPluginTestBase { List sorted = new ArrayList<>(getResources()); sorted.sort(null); ClassSorterPlugin sorterPlugin = new ClassSorterPlugin(sorted); - Pool resourcePool = sorterPlugin.visit(getPool()); + ModulePool resourcePool = sorterPlugin.visit(getPool()); sorterPlugin.test(getPool(), resourcePool); } @@ -78,7 +79,7 @@ public class SortingTest extends AsmPluginTestBase { List sorted = new ArrayList<>(getResources()); sorted.sort((s1, s2) -> -getModuleName(s1).compareTo(getModuleName(s2))); ModuleSorterPlugin sorterPlugin = new ModuleSorterPlugin(); - Pool resourcePool = sorterPlugin.visit(getPool()); + ModulePool resourcePool = sorterPlugin.visit(getPool()); sorterPlugin.test(getPool(), resourcePool); } @@ -88,8 +89,8 @@ public class SortingTest extends AsmPluginTestBase { public void visit() { for (AsmModulePool modulePool : getPools().getModulePools()) { modulePool.setSorter(resources -> { - List sort = resources.getContent().stream() - .map(ModuleData::getPath) + List sort = resources.entries() + .map(ModuleEntry::getPath) .collect(Collectors.toList()); sort.sort(null); return sort; @@ -102,21 +103,21 @@ public class SortingTest extends AsmPluginTestBase { } @Override - public void test(Pool inResources, Pool outResources) throws Exception { + public void test(ModulePool inResources, ModulePool outResources) throws Exception { if (!isVisitCalled()) { throw new AssertionError("Resources not visited"); } - List sortedResourcePaths = outResources.getContent().stream() - .map(ModuleData::getPath) + List sortedResourcePaths = outResources.entries() + .map(ModuleEntry::getPath) .collect(Collectors.toList()); List defaultResourceOrder = new ArrayList<>(); - for (ModuleData r : inResources.getContent()) { - if (!inResources.getContent().contains(r)) { + inResources.entries().forEach(r -> { + if (!inResources.contains(r)) { throw new AssertionError("Resource " + r.getPath() + " not in result pool"); } defaultResourceOrder.add(r.getPath()); - } + }); // Check that default sorting is not equal to sorted one if (defaultResourceOrder.equals(sortedResourcePaths)) { throw new AssertionError("Sorting not applied, default ordering"); @@ -147,27 +148,28 @@ public class SortingTest extends AsmPluginTestBase { public void visit() { getPools().getGlobalPool().setSorter( (resources) -> expectedClassesOrder.stream() - .map(resources::get) - .map(ModuleData::getPath) + .map(resources::findEntry) + .map(Optional::get) + .map(ModuleEntry::getPath) .collect(Collectors.toList())); } @Override - public void test(Pool inResources, Pool outResources) throws Exception { + public void test(ModulePool inResources, ModulePool outResources) throws Exception { if (!isVisitCalled()) { throw new AssertionError("Resources not visited"); } - List sortedResourcePaths = outResources.getContent().stream() - .map(ModuleData::getPath) + List sortedResourcePaths = outResources.entries() + .map(ModuleEntry::getPath) .collect(Collectors.toList()); List defaultResourceOrder = new ArrayList<>(); - for (ModuleData r : getPool().getContent()) { - if (!getPool().getContent().contains(r)) { + getPool().entries().forEach(r -> { + if (!getPool().contains(r)) { throw new AssertionError("Resource " + r.getPath() + " not in result pool"); } defaultResourceOrder.add(r.getPath()); - } + }); // Check that default sorting is not equal to sorted one if (defaultResourceOrder.equals(sortedResourcePaths)) { throw new AssertionError("Sorting not applied, default ordering"); diff --git a/jdk/test/tools/jlink/asmplugin/VisitorTest.java b/jdk/test/tools/jlink/asmplugin/VisitorTest.java index 1b278a8bd48..500d415bc50 100644 --- a/jdk/test/tools/jlink/asmplugin/VisitorTest.java +++ b/jdk/test/tools/jlink/asmplugin/VisitorTest.java @@ -46,8 +46,8 @@ import jdk.tools.jlink.internal.plugins.asm.AsmPool.ClassReaderVisitor; import jdk.tools.jlink.internal.plugins.asm.AsmPool.ResourceFile; import jdk.tools.jlink.internal.plugins.asm.AsmPool.ResourceFileVisitor; import jdk.tools.jlink.internal.plugins.asm.AsmPools; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class VisitorTest extends AsmPluginTestBase { @@ -69,7 +69,7 @@ public class VisitorTest extends AsmPluginTestBase { }; for (TestPlugin p : plugins) { System.err.println("Testing: " + p.getName()); - Pool out = p.visit(getPool()); + ModulePool out = p.visit(getPool()); p.test(getPool(), out); } } @@ -149,15 +149,15 @@ public class VisitorTest extends AsmPluginTestBase { } @Override - public void test(Pool in, Pool out) throws Exception { - Collection inClasses = getPool.apply(getPools()).getClasses(); + public void test(ModulePool in, ModulePool out) throws Exception { + Collection inClasses = getPool.apply(getPools()).getClasses(); if (inClasses.size() != classReaderVisitor.getAmount()) { throw new AssertionError("Testing " + name + ". Number of visited classes. Expected: " + inClasses.size() + ", got: " + classReaderVisitor.getAmount()); } - Collection outClasses = extractClasses(out); + Collection outClasses = extractClasses(out); int changedClasses = 0; - for (ModuleData r : outClasses) { + for (ModuleEntry r : outClasses) { if (r.getPath().endsWith("Changed.class")) { ++changedClasses; } @@ -192,15 +192,15 @@ public class VisitorTest extends AsmPluginTestBase { } @Override - public void test(Pool in, Pool out) throws Exception { - Collection inResources = getPool.apply(getPools()).getResourceFiles(); + public void test(ModulePool in, ModulePool out) throws Exception { + Collection inResources = getPool.apply(getPools()).getResourceFiles(); if (inResources.size() != resourceFileVisitor.getAmount()) { throw new AssertionError("Testing " + name + ". Number of visited resources. Expected: " + inResources.size() + ", got: " + resourceFileVisitor.getAmount()); } - Collection outResources = extractResources(out); + Collection outResources = extractResources(out); int changedClasses = 0; - for (ModuleData r : outResources) { + for (ModuleEntry r : outResources) { if (r.getPath().endsWith("Changed")) { ++changedClasses; } diff --git a/jdk/test/tools/jlink/customplugin/plugin/CustomPlugin.java b/jdk/test/tools/jlink/customplugin/plugin/CustomPlugin.java index 38054ec2015..781039a517a 100644 --- a/jdk/test/tools/jlink/customplugin/plugin/CustomPlugin.java +++ b/jdk/test/tools/jlink/customplugin/plugin/CustomPlugin.java @@ -26,7 +26,9 @@ import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; -import jdk.tools.jlink.plugin.Pool; +import java.util.function.Function; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; public class CustomPlugin implements TransformerPlugin { @@ -37,13 +39,8 @@ public class CustomPlugin implements TransformerPlugin { } @Override - public void visit(Pool in, Pool out) { - in.visit(new Pool.Visitor() { - @Override - public Pool.ModuleData visit(Pool.ModuleData content) { - return content; - } - }, out); + public void visit(ModulePool in, ModulePool out) { + in.transformAndCopy(Function.identity(), out); } @Override @@ -61,9 +58,9 @@ public class CustomPlugin implements TransformerPlugin { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.PROCESSOR); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.PROCESSOR); return Collections.unmodifiableSet(set); } } diff --git a/jdk/test/tools/jlink/customplugin/plugin/HelloPlugin.java b/jdk/test/tools/jlink/customplugin/plugin/HelloPlugin.java index d06f99050b1..aa150350d7f 100644 --- a/jdk/test/tools/jlink/customplugin/plugin/HelloPlugin.java +++ b/jdk/test/tools/jlink/customplugin/plugin/HelloPlugin.java @@ -29,8 +29,8 @@ import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; /** @@ -49,23 +49,23 @@ public final class HelloPlugin implements TransformerPlugin { } @Override - public void visit(Pool inResources, Pool outResources) { + public void visit(ModulePool inResources, ModulePool outResources) { try { System.out.println("Hello!!!!!!!!!!"); File f = new File(OUTPUT_FILE); f.createNewFile(); - for (ModuleData res : inResources.getContent()) { + inResources.entries().forEach(res -> { outResources.add(res); - } + }); } catch (IOException ex) { throw new UncheckedIOException(ex); } } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } diff --git a/jdk/test/tools/jlink/plugins/CompressorPluginTest.java b/jdk/test/tools/jlink/plugins/CompressorPluginTest.java index cd01b93836b..d37bf1b73d2 100644 --- a/jdk/test/tools/jlink/plugins/CompressorPluginTest.java +++ b/jdk/test/tools/jlink/plugins/CompressorPluginTest.java @@ -53,14 +53,14 @@ import jdk.internal.jimage.decompressor.ResourceDecompressor; import jdk.internal.jimage.decompressor.ResourceDecompressorFactory; import jdk.internal.jimage.decompressor.StringSharingDecompressorFactory; import jdk.internal.jimage.decompressor.ZipDecompressorFactory; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.StringTable; import jdk.tools.jlink.internal.plugins.DefaultCompressPlugin; import jdk.tools.jlink.internal.plugins.StringSharingPlugin; import jdk.tools.jlink.internal.plugins.ZipPlugin; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; public class CompressorPluginTest { @@ -86,7 +86,7 @@ public class CompressorPluginTest { new ZipDecompressorFactory() }); - Pool classes = gatherClasses(javabase); + ModulePool classes = gatherClasses(javabase); // compress = String sharing checkCompress(classes, new StringSharingPlugin(), null, new ResourceDecompressorFactory[]{ @@ -173,8 +173,8 @@ public class CompressorPluginTest { Collections.singletonList(".*IOException.class")); } - private Pool gatherResources(Path module) throws Exception { - Pool pool = new PoolImpl(ByteOrder.nativeOrder(), new StringTable() { + private ModulePool gatherResources(Path module) throws Exception { + ModulePool pool = new ModulePoolImpl(ByteOrder.nativeOrder(), new StringTable() { @Override public int addString(String str) { @@ -191,15 +191,15 @@ public class CompressorPluginTest { Path p = iterator.next(); if (Files.isRegularFile(p)) { byte[] content = Files.readAllBytes(p); - pool.add(Pool.newResource(p.toString(), content)); + pool.add(ModuleEntry.create(p.toString(), content)); } } } return pool; } - private Pool gatherClasses(Path module) throws Exception { - Pool pool = new PoolImpl(ByteOrder.nativeOrder(), new StringTable() { + private ModulePool gatherClasses(Path module) throws Exception { + ModulePool pool = new ModulePoolImpl(ByteOrder.nativeOrder(), new StringTable() { @Override public int addString(String str) { @@ -216,27 +216,27 @@ public class CompressorPluginTest { Path p = iterator.next(); if (Files.isRegularFile(p) && p.toString().endsWith(".class")) { byte[] content = Files.readAllBytes(p); - pool.add(Pool.newResource(p.toString(), content)); + pool.add(ModuleEntry.create(p.toString(), content)); } } } return pool; } - private void checkCompress(Pool resources, Plugin prov, + private void checkCompress(ModulePool resources, Plugin prov, Properties config, ResourceDecompressorFactory[] factories) throws Exception { checkCompress(resources, prov, config, factories, Collections.emptyList(), Collections.emptyList()); } - private void checkCompress(Pool resources, Plugin prov, + private void checkCompress(ModulePool resources, Plugin prov, Properties config, ResourceDecompressorFactory[] factories, List includes, List excludes) throws Exception { - long original = 0; - long compressed = 0; - for (ModuleData resource : resources.getContent()) { + long[] original = new long[1]; + long[] compressed = new long[1]; + resources.entries().forEach(resource -> { List includesPatterns = includes.stream() .map(Pattern::compile) .collect(Collectors.toList()); @@ -252,7 +252,7 @@ public class CompressorPluginTest { } prov.configure(props); final Map strings = new HashMap<>(); - PoolImpl inputResources = new PoolImpl(ByteOrder.nativeOrder(), new StringTable() { + ModulePoolImpl inputResources = new ModulePoolImpl(ByteOrder.nativeOrder(), new StringTable() { @Override public int addString(String str) { int id = strID; @@ -267,32 +267,32 @@ public class CompressorPluginTest { } }); inputResources.add(resource); - Pool compressedResources = applyCompressor(prov, inputResources, resource, includesPatterns, excludesPatterns); - original += resource.getLength(); - compressed += compressedResources.get(resource.getPath()).getLength(); + ModulePool compressedResources = applyCompressor(prov, inputResources, resource, includesPatterns, excludesPatterns); + original[0] += resource.getLength(); + compressed[0] += compressedResources.findEntry(resource.getPath()).get().getLength(); applyDecompressors(factories, inputResources, compressedResources, strings, includesPatterns, excludesPatterns); - } + }); String compressors = Stream.of(factories) .map(Object::getClass) .map(Class::getSimpleName) .collect(Collectors.joining(", ")); - String size = "Compressed size: " + compressed + ", original size: " + original; + String size = "Compressed size: " + compressed[0] + ", original size: " + original[0]; System.out.println("Used " + compressors + ". " + size); - if (original <= compressed) { + if (original[0] <= compressed[0]) { throw new AssertionError("java.base not compressed."); } } - private Pool applyCompressor(Plugin plugin, - PoolImpl inputResources, - ModuleData res, + private ModulePool applyCompressor(Plugin plugin, + ModulePoolImpl inputResources, + ModuleEntry res, List includesPatterns, - List excludesPatterns) throws Exception { + List excludesPatterns) { TransformerPlugin compressor = (TransformerPlugin) plugin; - Pool compressedPool = new PoolImpl(ByteOrder.nativeOrder(), inputResources.getStringTable()); - compressor.visit(inputResources, compressedPool); + ModulePool compressedModulePool = new ModulePoolImpl(ByteOrder.nativeOrder(), inputResources.getStringTable()); + compressor.visit(inputResources, compressedModulePool); String path = res.getPath(); - ModuleData compressed = compressedPool.get(path); + ModuleEntry compressed = compressedModulePool.findEntry(path).get(); CompressedResourceHeader header = CompressedResourceHeader.readFromResource(ByteOrder.nativeOrder(), compressed.getBytes()); if (isIncluded(includesPatterns, excludesPatterns, path)) { @@ -310,29 +310,33 @@ public class CompressorPluginTest { } else if (header != null) { throw new AssertionError("Path should not be compressed: " + path); } - return compressedPool; + return compressedModulePool; } private void applyDecompressors(ResourceDecompressorFactory[] decompressors, - Pool inputResources, - Pool compressedResources, + ModulePool inputResources, + ModulePool compressedResources, Map strings, List includesPatterns, - List excludesPatterns) throws Exception { - for (ModuleData compressed : compressedResources.getContent()) { + List excludesPatterns) { + compressedResources.entries().forEach(compressed -> { CompressedResourceHeader header = CompressedResourceHeader.readFromResource( ByteOrder.nativeOrder(), compressed.getBytes()); String path = compressed.getPath(); - ModuleData orig = inputResources.get(path); + ModuleEntry orig = inputResources.findEntry(path).get(); if (!isIncluded(includesPatterns, excludesPatterns, path)) { - continue; + return; } byte[] decompressed = compressed.getBytes(); for (ResourceDecompressorFactory factory : decompressors) { - ResourceDecompressor decompressor = factory.newDecompressor(new Properties()); - decompressed = decompressor.decompress( + try { + ResourceDecompressor decompressor = factory.newDecompressor(new Properties()); + decompressed = decompressor.decompress( strings::get, decompressed, CompressedResourceHeader.getSize(), header.getUncompressedSize()); + } catch (Exception exp) { + throw new RuntimeException(exp); + } } if (decompressed.length != orig.getLength()) { @@ -345,7 +349,7 @@ public class CompressorPluginTest { throw new AssertionError("Decompressed and original differ at index " + i); } } - } + }); } private boolean isIncluded(List includesPatterns, List excludesPatterns, String path) { diff --git a/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java b/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java index cde83aa2761..744d7a2ba25 100644 --- a/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java +++ b/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java @@ -35,12 +35,11 @@ import java.io.File; import java.nio.file.Files; import java.util.HashMap; import java.util.Map; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.plugins.ExcludeFilesPlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; public class ExcludeFilesPluginTest { @@ -73,20 +72,20 @@ public class ExcludeFilesPluginTest { prop.put(ExcludeFilesPlugin.NAME, s); ExcludeFilesPlugin fplug = new ExcludeFilesPlugin(); fplug.configure(prop); - PoolImpl files = new PoolImpl(); - PoolImpl fresult = new PoolImpl(); - ModuleData f = Pool.newImageFile(module, "/" + module + "/" + sample, - ModuleDataType.CONFIG, new ByteArrayInputStream(new byte[0]), 0); + ModulePoolImpl files = new ModulePoolImpl(); + ModulePoolImpl fresult = new ModulePoolImpl(); + ModuleEntry f = ModuleEntry.create(module, "/" + module + "/" + sample, + ModuleEntry.Type.CONFIG, new ByteArrayInputStream(new byte[0]), 0); files.add(f); fplug.visit(files, fresult); if (exclude) { - if (fresult.getContent().contains(f)) { + if (fresult.contains(f)) { throw new Exception(sample + " should be excluded by " + s); } } else { - if (!fresult.getContent().contains(f)) { + if (!fresult.contains(f)) { throw new Exception(sample + " shouldn't be excluded by " + s); } } diff --git a/jdk/test/tools/jlink/plugins/ExcludePluginTest.java b/jdk/test/tools/jlink/plugins/ExcludePluginTest.java index 0f508073288..c39e738e079 100644 --- a/jdk/test/tools/jlink/plugins/ExcludePluginTest.java +++ b/jdk/test/tools/jlink/plugins/ExcludePluginTest.java @@ -34,11 +34,11 @@ import java.io.File; import java.nio.file.Files; import java.util.HashMap; import java.util.Map; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.plugins.ExcludePlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class ExcludePluginTest { @@ -75,17 +75,17 @@ public class ExcludePluginTest { prop.put(ExcludePlugin.NAME, s); ExcludePlugin excludePlugin = new ExcludePlugin(); excludePlugin.configure(prop); - Pool resources = new PoolImpl(); - ModuleData resource = Pool.newResource(sample, new byte[0]); + ModulePool resources = new ModulePoolImpl(); + ModuleEntry resource = ModuleEntry.create(sample, new byte[0]); resources.add(resource); - Pool result = new PoolImpl(); + ModulePool result = new ModulePoolImpl(); excludePlugin.visit(resources, result); if (exclude) { - if (result.getContent().contains(resource)) { + if (result.contains(resource)) { throw new AssertionError(sample + " should be excluded by " + s); } } else { - if (!result.getContent().contains(resource)) { + if (!result.contains(resource)) { throw new AssertionError(sample + " shouldn't be excluded by " + s); } } diff --git a/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java b/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java index 701368c3dd0..edc10702eb3 100644 --- a/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java +++ b/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java @@ -32,13 +32,12 @@ import java.io.ByteArrayInputStream; import java.util.HashMap; import java.util.Map; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.plugins.ExcludeVMPlugin; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModulePool; +import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.TransformerPlugin; public class ExcludeVMPluginTest { @@ -165,14 +164,14 @@ public class ExcludeVMPluginTest { private void doCheckVM(String vm, String[] input, String jvmcfg, String[] expectedOutput, String expectdJvmCfg) throws Exception { // Create a pool with jvm.cfg and the input paths. byte[] jvmcfgContent = jvmcfg.getBytes(); - Pool pool = new PoolImpl(); - pool.add(Pool.newImageFile("java.base", "/java.base/native/jvm.cfg", - ModuleDataType.NATIVE_LIB, new ByteArrayInputStream(jvmcfgContent), jvmcfgContent.length)); + ModulePool pool = new ModulePoolImpl(); + pool.add(ModuleEntry.create("java.base", "/java.base/native/jvm.cfg", + ModuleEntry.Type.NATIVE_LIB, new ByteArrayInputStream(jvmcfgContent), jvmcfgContent.length)); for (String in : input) { - pool.add(Pool.newImageFile("java.base", in, - ModuleDataType.NATIVE_LIB, new ByteArrayInputStream(new byte[0]), 0)); + pool.add(ModuleEntry.create("java.base", in, + ModuleEntry.Type.NATIVE_LIB, new ByteArrayInputStream(new byte[0]), 0)); } - Pool out = new PoolImpl(); + ModulePool out = new ModulePoolImpl(); TransformerPlugin p = new ExcludeVMPlugin(); Map config = new HashMap<>(); @@ -182,22 +181,22 @@ public class ExcludeVMPluginTest { p.configure(config); p.visit(pool, out); - String newContent = new String(out.get("/java.base/native/jvm.cfg").stream().readAllBytes()); + String newContent = new String(out.findEntry("/java.base/native/jvm.cfg").get().stream().readAllBytes()); if (!expectdJvmCfg.equals(newContent)) { throw new Exception("Got content " + newContent + " expected " + expectdJvmCfg); } - if (out.getContent().size() != (expectedOutput.length + 1)) { - for (ModuleData m : out.getContent()) { + if (out.getEntryCount() != (expectedOutput.length + 1)) { + out.entries().forEach(m -> { System.err.println(m.getPath()); - } - throw new Exception("Invalid output size " + out.getContent().size() + " expected " + (expectedOutput.length + 1)); + }); + throw new Exception("Invalid output size " + out.getEntryCount() + " expected " + (expectedOutput.length + 1)); } - for (ModuleData md : out.getContent()) { + out.entries().forEach(md -> { if (md.getPath().equals("/java.base/native/jvm.cfg")) { - continue; + return; } boolean contained = false; for (String o : expectedOutput) { @@ -207,9 +206,9 @@ public class ExcludeVMPluginTest { } } if (!contained) { - throw new Exception(md.getPath() + " not expected"); + throw new RuntimeException(md.getPath() + " not expected"); } - } + }); } diff --git a/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java b/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java index 5fecfec388b..a6fb749ba7f 100644 --- a/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java +++ b/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java @@ -26,6 +26,7 @@ * @summary Test files copy plugin * @author Jean-Francois Denise * @modules jdk.jlink/jdk.tools.jlink.internal + * jdk.jlink/jdk.tools.jlink.builder * jdk.jlink/jdk.tools.jlink.internal.plugins * @run main FileCopierPluginTest */ @@ -36,13 +37,12 @@ import java.nio.file.Path; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.builder.DefaultImageBuilder; import jdk.tools.jlink.internal.plugins.FileCopierPlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; -import jdk.tools.jlink.plugin.Pool.ModuleDataType; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; public class FileCopierPluginTest { @@ -85,21 +85,20 @@ public class FileCopierPluginTest { Map conf = new HashMap<>(); conf.put(FileCopierPlugin.NAME, builder.toString()); plug.configure(conf); - Pool pool = new PoolImpl(); - plug.visit(new PoolImpl(), pool); - if (pool.getContent().size() != expected) { + ModulePool pool = new ModulePoolImpl(); + plug.visit(new ModulePoolImpl(), pool); + if (pool.getEntryCount() != expected) { throw new AssertionError("Wrong number of added files"); } - for (ModuleData f : pool.getContent()) { - if (!f.getType().equals(ModuleDataType.OTHER)) { + pool.entries().forEach(f -> { + if (!f.getType().equals(ModuleEntry.Type.OTHER)) { throw new AssertionError("Invalid type " + f.getType() + " for file " + f.getPath()); } if (f.stream() == null) { throw new AssertionError("Null stream for file " + f.getPath()); } - - } + }); Path root = new File(".").toPath(); DefaultImageBuilder imgbuilder = new DefaultImageBuilder(root); imgbuilder.storeFiles(pool); diff --git a/jdk/test/tools/jlink/plugins/LastSorterTest.java b/jdk/test/tools/jlink/plugins/LastSorterTest.java index 100ca1e4674..0dc27b44ec8 100644 --- a/jdk/test/tools/jlink/plugins/LastSorterTest.java +++ b/jdk/test/tools/jlink/plugins/LastSorterTest.java @@ -26,6 +26,7 @@ * @summary Test last sorter property * @author Jean-Francois Denise * @modules jdk.jlink/jdk.tools.jlink.internal + * jdk.jlink/jdk.tools.jlink * @run main/othervm LastSorterTest */ @@ -40,12 +41,12 @@ import java.util.Set; import jdk.tools.jlink.internal.ImagePluginConfiguration; import jdk.tools.jlink.internal.PluginRepository; import jdk.tools.jlink.internal.ImagePluginStack; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.Jlink; import jdk.tools.jlink.Jlink.PluginsConfiguration; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; public class LastSorterTest { @@ -80,7 +81,7 @@ public class LastSorterTest { ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(config); // check order - PoolImpl res = fillOutResourcePool(); + ModulePoolImpl res = fillOutResourceModulePool(); try { stack.visitResources(res); @@ -91,18 +92,18 @@ public class LastSorterTest { } } - private PoolImpl fillOutResourcePool() throws Exception { - PoolImpl res = new PoolImpl(); - res.add(Pool.newResource("/eee/bbb/res1.class", new byte[90])); - res.add(Pool.newResource("/aaaa/bbb/res2.class", new byte[90])); - res.add(Pool.newResource("/bbb/aa/res1.class", new byte[90])); - res.add(Pool.newResource("/aaaa/bbb/res3.class", new byte[90])); - res.add(Pool.newResource("/bbb/aa/res2.class", new byte[90])); - res.add(Pool.newResource("/fff/bbb/res1.class", new byte[90])); - res.add(Pool.newResource("/aaaa/bbb/res1.class", new byte[90])); - res.add(Pool.newResource("/bbb/aa/res3.class", new byte[90])); - res.add(Pool.newResource("/ccc/bbb/res1.class", new byte[90])); - res.add(Pool.newResource("/ddd/bbb/res1.class", new byte[90])); + private ModulePoolImpl fillOutResourceModulePool() throws Exception { + ModulePoolImpl res = new ModulePoolImpl(); + res.add(ModuleEntry.create("/eee/bbb/res1.class", new byte[90])); + res.add(ModuleEntry.create("/aaaa/bbb/res2.class", new byte[90])); + res.add(ModuleEntry.create("/bbb/aa/res1.class", new byte[90])); + res.add(ModuleEntry.create("/aaaa/bbb/res3.class", new byte[90])); + res.add(ModuleEntry.create("/bbb/aa/res2.class", new byte[90])); + res.add(ModuleEntry.create("/fff/bbb/res1.class", new byte[90])); + res.add(ModuleEntry.create("/aaaa/bbb/res1.class", new byte[90])); + res.add(ModuleEntry.create("/bbb/aa/res3.class", new byte[90])); + res.add(ModuleEntry.create("/ccc/bbb/res1.class", new byte[90])); + res.add(ModuleEntry.create("/ddd/bbb/res1.class", new byte[90])); return res; } @@ -124,7 +125,7 @@ public class LastSorterTest { ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(config); // check order - PoolImpl res = fillOutResourcePool(); + ModulePoolImpl res = fillOutResourceModulePool(); stack.visitResources(res); } @@ -159,7 +160,7 @@ public class LastSorterTest { ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(config); // check order - PoolImpl res = fillOutResourcePool(); + ModulePoolImpl res = fillOutResourceModulePool(); try { stack.visitResources(res); throw new AssertionError("Order was changed after the last sorter, but no exception occurred"); @@ -178,17 +179,17 @@ public class LastSorterTest { } @Override - public void visit(Pool resources, Pool output) { - List paths = new ArrayList<>(); - for (ModuleData res : resources.getContent()) { + public void visit(ModulePool resources, ModulePool output) { + List paths = new ArrayList<>(); + resources.entries().forEach(res -> { if (res.getPath().startsWith(starts)) { paths.add(0, res); } else { paths.add(res); } - } + }); - for (ModuleData r : paths) { + for (ModuleEntry r : paths) { output.add(r); } } @@ -199,9 +200,9 @@ public class LastSorterTest { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } diff --git a/jdk/test/tools/jlink/plugins/OrderResourcesPluginTest.java b/jdk/test/tools/jlink/plugins/OrderResourcesPluginTest.java index cbf418669c0..701736139c6 100644 --- a/jdk/test/tools/jlink/plugins/OrderResourcesPluginTest.java +++ b/jdk/test/tools/jlink/plugins/OrderResourcesPluginTest.java @@ -36,11 +36,12 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import jdk.tools.jlink.internal.PoolImpl; +import java.util.stream.Collectors; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.plugins.OrderResourcesPlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; public class OrderResourcesPluginTest { @@ -50,52 +51,52 @@ public class OrderResourcesPluginTest { } public void test() throws Exception { - ModuleData[] array = { - Pool.newResource("/module1/toto1.class", new byte[0]), - Pool.newResource("/module2/toto2.class", new byte[0]), - Pool.newResource("/module3/toto3.class", new byte[0]), - Pool.newResource("/module3/toto3/module-info.class", new byte[0]), - Pool.newResource("/zazou/toto.class", new byte[0]), - Pool.newResource("/module4/zazou.class", new byte[0]), - Pool.newResource("/module5/toto5.class", new byte[0]), - Pool.newResource("/module6/toto6/module-info.class", new byte[0]) + ModuleEntry[] array = { + ModuleEntry.create("/module1/toto1.class", new byte[0]), + ModuleEntry.create("/module2/toto2.class", new byte[0]), + ModuleEntry.create("/module3/toto3.class", new byte[0]), + ModuleEntry.create("/module3/toto3/module-info.class", new byte[0]), + ModuleEntry.create("/zazou/toto.class", new byte[0]), + ModuleEntry.create("/module4/zazou.class", new byte[0]), + ModuleEntry.create("/module5/toto5.class", new byte[0]), + ModuleEntry.create("/module6/toto6/module-info.class", new byte[0]) }; - ModuleData[] sorted = { - Pool.newResource("/zazou/toto.class", new byte[0]), - Pool.newResource("/module3/toto3/module-info.class", new byte[0]), - Pool.newResource("/module6/toto6/module-info.class", new byte[0]), - Pool.newResource("/module1/toto1.class", new byte[0]), - Pool.newResource("/module2/toto2.class", new byte[0]), - Pool.newResource("/module3/toto3.class", new byte[0]), - Pool.newResource("/module4/zazou.class", new byte[0]), - Pool.newResource("/module5/toto5.class", new byte[0]) + ModuleEntry[] sorted = { + ModuleEntry.create("/zazou/toto.class", new byte[0]), + ModuleEntry.create("/module3/toto3/module-info.class", new byte[0]), + ModuleEntry.create("/module6/toto6/module-info.class", new byte[0]), + ModuleEntry.create("/module1/toto1.class", new byte[0]), + ModuleEntry.create("/module2/toto2.class", new byte[0]), + ModuleEntry.create("/module3/toto3.class", new byte[0]), + ModuleEntry.create("/module4/zazou.class", new byte[0]), + ModuleEntry.create("/module5/toto5.class", new byte[0]) }; - ModuleData[] sorted2 = { - Pool.newResource("/module5/toto5.class", new byte[0]), - Pool.newResource("/module6/toto6/module-info.class", new byte[0]), - Pool.newResource("/module4/zazou.class", new byte[0]), - Pool.newResource("/module3/toto3.class", new byte[0]), - Pool.newResource("/module3/toto3/module-info.class", new byte[0]), - Pool.newResource("/module1/toto1.class", new byte[0]), - Pool.newResource("/module2/toto2.class", new byte[0]), - Pool.newResource("/zazou/toto.class", new byte[0]) + ModuleEntry[] sorted2 = { + ModuleEntry.create("/module5/toto5.class", new byte[0]), + ModuleEntry.create("/module6/toto6/module-info.class", new byte[0]), + ModuleEntry.create("/module4/zazou.class", new byte[0]), + ModuleEntry.create("/module3/toto3.class", new byte[0]), + ModuleEntry.create("/module3/toto3/module-info.class", new byte[0]), + ModuleEntry.create("/module1/toto1.class", new byte[0]), + ModuleEntry.create("/module2/toto2.class", new byte[0]), + ModuleEntry.create("/zazou/toto.class", new byte[0]) }; - Pool resources = new PoolImpl(); - for (ModuleData r : array) { + ModulePool resources = new ModulePoolImpl(); + for (ModuleEntry r : array) { resources.add(r); } { - Pool out = new PoolImpl(); + ModulePool out = new ModulePoolImpl(); Map config = new HashMap<>(); config.put(OrderResourcesPlugin.NAME, "/zazou/*,*/module-info.class"); TransformerPlugin p = new OrderResourcesPlugin(); p.configure(config); p.visit(resources, out); - check(out.getContent(), sorted); + check(out.entries().collect(Collectors.toList()), sorted); } { @@ -112,26 +113,26 @@ public class OrderResourcesPluginTest { } Files.write(order.toPath(), builder.toString().getBytes()); - Pool out = new PoolImpl(); + ModulePool out = new ModulePoolImpl(); Map config = new HashMap<>(); config.put(OrderResourcesPlugin.NAME, "@" + order.getAbsolutePath()); TransformerPlugin p = new OrderResourcesPlugin(); p.configure(config); p.visit(resources, out); - check(out.getContent(), sorted2); + check(out.entries().collect(Collectors.toList()), sorted2); } } - private void check(Collection outResources, - ModuleData[] sorted) { + private void check(Collection outResources, + ModuleEntry[] sorted) { if (outResources.size() != sorted.length) { throw new AssertionError("Wrong number of resources:\n" + "expected: " + Arrays.toString(sorted) + ",\n" + " got: " + outResources); } int i = 0; - for (ModuleData r : outResources) { + for (ModuleEntry r : outResources) { System.err.println("Resource: " + r); if (!sorted[i].getPath().equals(r.getPath())) { throw new AssertionError("Resource not properly sorted, difference at: " + i + "\n" diff --git a/jdk/test/tools/jlink/plugins/PluginOrderTest.java b/jdk/test/tools/jlink/plugins/PluginOrderTest.java index 42655d408fe..4c9f2c2241d 100644 --- a/jdk/test/tools/jlink/plugins/PluginOrderTest.java +++ b/jdk/test/tools/jlink/plugins/PluginOrderTest.java @@ -44,8 +44,8 @@ import java.util.Set; import jdk.tools.jlink.internal.PluginOrderingGraph; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.Plugin.CATEGORY; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.Plugin.Category; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; public class PluginOrderTest { @@ -96,8 +96,8 @@ public class PluginOrderTest { set.add("plug2"); List plugins = new ArrayList<>(); plugins.add(new Plug("plug2", Collections.emptySet(), Collections.emptySet(), - CATEGORY.TRANSFORMER)); - plugins.add(new Plug("plug1", set, Collections.emptySet(), CATEGORY.TRANSFORMER)); + Category.TRANSFORMER)); + plugins.add(new Plug("plug1", set, Collections.emptySet(), Category.TRANSFORMER)); List ordered = PluginOrderingGraph.sort(plugins); if (ordered.get(0) != plugins.get(1) || ordered.get(1) != plugins.get(0)) { throw new Exception("Invalid sorting"); @@ -108,32 +108,32 @@ public class PluginOrderTest { Set lst1 = new HashSet<>(); lst1.add("plug2"); lst1.add("plug3"); - Plugin p1 = new Plug("plug1", lst1, Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p1 = new Plug("plug1", lst1, Collections.emptySet(), Category.TRANSFORMER); - Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); Set lst3 = new HashSet<>(); lst3.add("plug4"); lst3.add("plug6"); - Plugin p3 = new Plug("plug3", lst3, Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p3 = new Plug("plug3", lst3, Collections.emptySet(), Category.TRANSFORMER); - Plugin p4 = new Plug("plug4", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p4 = new Plug("plug4", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); Set lst5 = new HashSet<>(); lst5.add("plug3"); lst5.add("plug1"); lst5.add("plug2"); lst5.add("plug6"); - Plugin p5 = new Plug("plug5", lst5, Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p5 = new Plug("plug5", lst5, Collections.emptySet(), Category.TRANSFORMER); Set lst6 = new HashSet<>(); lst6.add("plug4"); lst6.add("plug2"); - Plugin p6 = new Plug("plug6", lst6, Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p6 = new Plug("plug6", lst6, Collections.emptySet(), Category.TRANSFORMER); - Plugin p7 = new Plug("plug7", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p7 = new Plug("plug7", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); - Plugin p8 = new Plug("plug8", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p8 = new Plug("plug8", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); List plugins = new ArrayList<>(); plugins.add(p1); @@ -153,11 +153,11 @@ public class PluginOrderTest { set2.add("plug1"); List plugins = new ArrayList<>(); plugins.add(new Plug("plug2", set2, Collections.emptySet(), - CATEGORY.TRANSFORMER)); + Category.TRANSFORMER)); Set set1 = new HashSet<>(); set1.add("plug2"); - plugins.add(new Plug("plug1", set1, Collections.emptySet(), CATEGORY.TRANSFORMER)); + plugins.add(new Plug("plug1", set1, Collections.emptySet(), Category.TRANSFORMER)); PluginOrderingGraph.sort(plugins); } @@ -166,31 +166,31 @@ public class PluginOrderTest { Set lst1 = new HashSet<>(); lst1.add("plug2"); lst1.add("plug3"); - Plugin p1 = new Plug("plug1", lst1, Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p1 = new Plug("plug1", lst1, Collections.emptySet(), Category.TRANSFORMER); - Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); Set lst3 = new HashSet<>(); lst3.add("plug4"); lst3.add("plug6"); - Plugin p3 = new Plug("plug3", lst3, Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p3 = new Plug("plug3", lst3, Collections.emptySet(), Category.TRANSFORMER); - Plugin p4 = new Plug("plug4", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p4 = new Plug("plug4", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); Set lst5 = new HashSet<>(); lst5.add("plug3"); lst5.add("plug1"); lst5.add("plug2"); - Plugin p5 = new Plug("plug5", lst5, Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p5 = new Plug("plug5", lst5, Collections.emptySet(), Category.TRANSFORMER); Set lst6 = new HashSet<>(); lst6.add("plug4"); lst6.add("plug1"); - Plugin p6 = new Plug("plug6", lst6, Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p6 = new Plug("plug6", lst6, Collections.emptySet(), Category.TRANSFORMER); - Plugin p7 = new Plug("plug7", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p7 = new Plug("plug7", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); - Plugin p8 = new Plug("plug8", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p8 = new Plug("plug8", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); List plugins = new ArrayList<>(); plugins.add(p1); @@ -208,8 +208,8 @@ public class PluginOrderTest { Set lst1 = new HashSet<>(); lst1.add("plug2"); lst1.add("plug3"); - Plugin p = new Plug("plug1", lst1, Collections.emptySet(), CATEGORY.TRANSFORMER); - Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), CATEGORY.TRANSFORMER); + Plugin p = new Plug("plug1", lst1, Collections.emptySet(), Category.TRANSFORMER); + Plugin p2 = new Plug("plug2", Collections.emptySet(), Collections.emptySet(), Category.TRANSFORMER); Set lst3 = new HashSet<>(); lst3.add("plug2"); @@ -217,7 +217,7 @@ public class PluginOrderTest { Set lst4 = new HashSet<>(); lst4.add("plug1"); - Plugin p3 = new Plug("plug3", lst4, lst3, CATEGORY.TRANSFORMER); + Plugin p3 = new Plug("plug3", lst4, lst3, Category.TRANSFORMER); List plugins = new ArrayList<>(); plugins.add(p); plugins.add(p2); @@ -229,10 +229,10 @@ public class PluginOrderTest { private final Set isBefore; private final Set isAfter; - private final CATEGORY category; + private final Category category; private final String name; - private Plug(String name, Set isBefore, Set isAfter, CATEGORY category) { + private Plug(String name, Set isBefore, Set isAfter, Category category) { this.name = name; this.isBefore = isBefore; this.isAfter = isAfter; @@ -255,12 +255,12 @@ public class PluginOrderTest { } @Override - public void visit(Pool in, Pool out) { + public void visit(ModulePool in, ModulePool out) { } @Override - public Set getType() { + public Set getType() { return Collections.singleton(category); } diff --git a/jdk/test/tools/jlink/plugins/PluginsNegativeTest.java b/jdk/test/tools/jlink/plugins/PluginsNegativeTest.java index 525fb0b5ce2..5b8ed2d6c83 100644 --- a/jdk/test/tools/jlink/plugins/PluginsNegativeTest.java +++ b/jdk/test/tools/jlink/plugins/PluginsNegativeTest.java @@ -26,6 +26,7 @@ * @summary Negative test for ImagePluginStack. * @author Andrei Eremeev * @modules jdk.jlink/jdk.tools.jlink.internal + * jdk.jlink/jdk.tools.jlink * @run main/othervm PluginsNegativeTest */ import java.lang.reflect.Layer; @@ -39,11 +40,12 @@ import java.util.Set; import jdk.tools.jlink.internal.ImagePluginConfiguration; import jdk.tools.jlink.internal.PluginRepository; import jdk.tools.jlink.internal.ImagePluginStack; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.Jlink; import jdk.tools.jlink.Jlink.PluginsConfiguration; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.Pool; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; public class PluginsNegativeTest { @@ -96,8 +98,8 @@ public class PluginsNegativeTest { plugins.add(createPlugin("plugin")); ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(new PluginsConfiguration(plugins, null, null)); - PoolImpl inResources = new PoolImpl(); - inResources.add(Pool.newResource("/aaa/bbb/A", new byte[10])); + ModulePoolImpl inResources = new ModulePoolImpl(); + inResources.add(ModuleEntry.create("/aaa/bbb/A", new byte[10])); try { stack.visitResources(inResources); throw new AssertionError("Exception expected when output resource is empty"); @@ -110,8 +112,8 @@ public class PluginsNegativeTest { plugins.add(createPlugin("plugin")); ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(new PluginsConfiguration(plugins, null, null)); - PoolImpl inResources = new PoolImpl(); - PoolImpl outResources = (PoolImpl) stack.visitResources(inResources); + ModulePoolImpl inResources = new ModulePoolImpl(); + ModulePoolImpl outResources = (ModulePoolImpl) stack.visitResources(inResources); if (!outResources.isEmpty()) { throw new AssertionError("Output resource is not empty"); } @@ -126,7 +128,7 @@ public class PluginsNegativeTest { } @Override - public void visit(Pool inResources, Pool outResources) { + public void visit(ModulePool inResources, ModulePool outResources) { // do nothing } @@ -136,9 +138,9 @@ public class PluginsNegativeTest { } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } diff --git a/jdk/test/tools/jlink/plugins/PrevisitorTest.java b/jdk/test/tools/jlink/plugins/PrevisitorTest.java index 16d79f0c068..1f721d66d5f 100644 --- a/jdk/test/tools/jlink/plugins/PrevisitorTest.java +++ b/jdk/test/tools/jlink/plugins/PrevisitorTest.java @@ -26,6 +26,7 @@ * @summary Test previsitor * @author Andrei Eremeev * @modules jdk.jlink/jdk.tools.jlink.internal + * jdk.jlink/jdk.tools.jlink * @run main/othervm PrevisitorTest */ import java.nio.ByteOrder; @@ -36,19 +37,20 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import jdk.tools.jlink.internal.ImagePluginConfiguration; import jdk.tools.jlink.internal.PluginRepository; import jdk.tools.jlink.internal.ImagePluginStack; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.ResourcePrevisitor; import jdk.tools.jlink.internal.StringTable; import jdk.tools.jlink.Jlink; import jdk.tools.jlink.plugin.Plugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; public class PrevisitorTest { @@ -68,17 +70,17 @@ public class PrevisitorTest { plugins.add(createPlugin(CustomPlugin.NAME)); ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(new Jlink.PluginsConfiguration(plugins, null, null)); - PoolImpl inResources = new PoolImpl(ByteOrder.nativeOrder(), new CustomStringTable()); - inResources.add(Pool.newResource("/aaa/bbb/res1.class", new byte[90])); - inResources.add(Pool.newResource("/aaa/bbb/res2.class", new byte[90])); - inResources.add(Pool.newResource("/aaa/bbb/res3.class", new byte[90])); - inResources.add(Pool.newResource("/aaa/ddd/res1.class", new byte[90])); - inResources.add(Pool.newResource("/aaa/res1.class", new byte[90])); - Pool outResources = stack.visitResources(inResources); - Collection input = inResources.getContent().stream() + ModulePoolImpl inResources = new ModulePoolImpl(ByteOrder.nativeOrder(), new CustomStringTable()); + inResources.add(ModuleEntry.create("/aaa/bbb/res1.class", new byte[90])); + inResources.add(ModuleEntry.create("/aaa/bbb/res2.class", new byte[90])); + inResources.add(ModuleEntry.create("/aaa/bbb/res3.class", new byte[90])); + inResources.add(ModuleEntry.create("/aaa/ddd/res1.class", new byte[90])); + inResources.add(ModuleEntry.create("/aaa/res1.class", new byte[90])); + ModulePool outResources = stack.visitResources(inResources); + Collection input = inResources.entries() .map(Object::toString) .collect(Collectors.toList()); - Collection output = outResources.getContent().stream() + Collection output = outResources.entries() .map(Object::toString) .collect(Collectors.toList()); if (!input.equals(output)) { @@ -114,19 +116,20 @@ public class PrevisitorTest { private boolean isPrevisitCalled = false; @Override - public void visit(Pool inResources, Pool outResources) { + public void visit(ModulePool inResources, ModulePool outResources) { if (!isPrevisitCalled) { throw new AssertionError("Previsit was not called"); } CustomStringTable table = (CustomStringTable) - ((PoolImpl) inResources).getStringTable(); + ((ModulePoolImpl) inResources).getStringTable(); if (table.size() == 0) { throw new AssertionError("Table is empty"); } Map count = new HashMap<>(); for (int i = 0; i < table.size(); ++i) { String s = table.getString(i); - if (inResources.get(s) != null) { + Optional e = inResources.findEntry(s); + if (e.isPresent()) { throw new AssertionError(); } count.compute(s, (k, c) -> 1 + (c == null ? 0 : c)); @@ -136,9 +139,9 @@ public class PrevisitorTest { throw new AssertionError("Expected one entry in the table, got: " + v + " for " + k); } }); - for (ModuleData r : inResources.getContent()) { + inResources.entries().forEach(r -> { outResources.add(r); - } + }); } @Override @@ -147,21 +150,21 @@ public class PrevisitorTest { } @Override - public void previsit(Pool resources, StringTable strings) { + public void previsit(ModulePool resources, StringTable strings) { isPrevisitCalled = true; - for (ModuleData r : resources.getContent()) { + resources.entries().forEach(r -> { String s = r.getPath(); int lastIndexOf = s.lastIndexOf('/'); if (lastIndexOf >= 0) { strings.addString(s.substring(0, lastIndexOf)); } - } + }); } @Override - public Set getType() { - Set set = new HashSet<>(); - set.add(CATEGORY.TRANSFORMER); + public Set getType() { + Set set = new HashSet<>(); + set.add(Category.TRANSFORMER); return Collections.unmodifiableSet(set); } } diff --git a/jdk/test/tools/jlink/plugins/StringSharingPluginTest.java b/jdk/test/tools/jlink/plugins/StringSharingPluginTest.java index 786da460990..c02a8e6db0c 100644 --- a/jdk/test/tools/jlink/plugins/StringSharingPluginTest.java +++ b/jdk/test/tools/jlink/plugins/StringSharingPluginTest.java @@ -38,6 +38,8 @@ * @run main StringSharingPluginTest */ +import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.file.Files; @@ -50,11 +52,11 @@ import java.util.function.Consumer; import jdk.internal.jimage.decompressor.CompressedResourceHeader; import jdk.internal.jimage.decompressor.StringSharingDecompressor; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.StringTable; import jdk.tools.jlink.internal.plugins.StringSharingPlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; import tests.Helper; import tests.JImageValidator; @@ -78,7 +80,7 @@ public class StringSharingPluginTest { Map map = new HashMap<>(); Map reversedMap = new HashMap<>(); - PoolImpl resources = new PoolImpl(ByteOrder.nativeOrder(), new StringTable() { + ModulePoolImpl resources = new ModulePoolImpl(ByteOrder.nativeOrder(), new StringTable() { @Override public int addString(String str) { Integer id = map.get(str); @@ -104,7 +106,7 @@ public class StringSharingPluginTest { byte[] content = Files.readAllBytes(p); String path = p.toString().replace('\\', '/'); path = path.substring("/modules".length()); - ModuleData res = Pool.newResource(path, content); + ModuleEntry res = ModuleEntry.create(path, content); resources.add(res); } catch (Exception ex) { throw new RuntimeException(ex); @@ -115,19 +117,23 @@ public class StringSharingPluginTest { stream.forEach(c); } TransformerPlugin plugin = new StringSharingPlugin(); - PoolImpl result = new PoolImpl(resources.getByteOrder(), resources.getStringTable()); + ModulePoolImpl result = new ModulePoolImpl(resources.getByteOrder(), resources.getStringTable()); plugin.visit(resources, result); if (result.isEmpty()) { throw new AssertionError("No result"); } - for (ModuleData res : result.getContent()) { + result.entries().forEach(res -> { if (res.getPath().endsWith(".class")) { - byte[] uncompacted = StringSharingDecompressor.normalize(reversedMap::get, res.getBytes(), + try { + byte[] uncompacted = StringSharingDecompressor.normalize(reversedMap::get, res.getBytes(), CompressedResourceHeader.getSize()); - JImageValidator.readClass(uncompacted); + JImageValidator.readClass(uncompacted); + } catch (IOException exp) { + throw new UncheckedIOException(exp); + } } - } + }); } } diff --git a/jdk/test/tools/jlink/plugins/StripDebugPluginTest.java b/jdk/test/tools/jlink/plugins/StripDebugPluginTest.java index fd8acae896c..d3617db6f8a 100644 --- a/jdk/test/tools/jlink/plugins/StripDebugPluginTest.java +++ b/jdk/test/tools/jlink/plugins/StripDebugPluginTest.java @@ -54,10 +54,10 @@ import com.sun.tools.classfile.ConstantPoolException; import com.sun.tools.classfile.Method; import java.util.HashMap; import java.util.Map; -import jdk.tools.jlink.internal.PoolImpl; +import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.internal.plugins.StripDebugPlugin; -import jdk.tools.jlink.plugin.Pool; -import jdk.tools.jlink.plugin.Pool.ModuleData; +import jdk.tools.jlink.plugin.ModuleEntry; +import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; import tests.Helper; @@ -106,7 +106,7 @@ public class StripDebugPluginTest { path = path.replace('\\', '/'); StripDebugPlugin debug = new StripDebugPlugin(); debug.configure(new HashMap<>()); - ModuleData result1 = stripDebug(debug, Pool.newResource(path,content), path, infoPath, moduleInfo); + ModuleEntry result1 = stripDebug(debug, ModuleEntry.create(path,content), path, infoPath, moduleInfo); if (!path.endsWith("module-info.class")) { if (result1.getLength() >= content.length) { @@ -116,7 +116,7 @@ public class StripDebugPluginTest { checkDebugAttributes(result1.getBytes()); } - ModuleData result2 = stripDebug(debug, result1, path, infoPath, moduleInfo); + ModuleEntry result2 = stripDebug(debug, result1, path, infoPath, moduleInfo); if (result1.getLength() != result2.getLength()) { throw new AssertionError("removing debug info twice reduces class size of " + path); @@ -124,18 +124,18 @@ public class StripDebugPluginTest { checkDebugAttributes(result1.getBytes()); } - private ModuleData stripDebug(TransformerPlugin debug, ModuleData classResource, + private ModuleEntry stripDebug(TransformerPlugin debug, ModuleEntry classResource, String path, String infoPath, byte[] moduleInfo) throws Exception { - Pool resources = new PoolImpl(); + ModulePool resources = new ModulePoolImpl(); resources.add(classResource); if (!path.endsWith("module-info.class")) { - ModuleData res2 = Pool.newResource(infoPath, moduleInfo); + ModuleEntry res2 = ModuleEntry.create(infoPath, moduleInfo); resources.add(res2); } - Pool results = new PoolImpl(); + ModulePool results = new ModulePoolImpl(); debug.visit(resources, results); System.out.println(classResource.getPath()); - return results.get(classResource.getPath()); + return results.findEntry(classResource.getPath()).get(); } private void checkDebugAttributes(byte[] strippedClassFile) throws IOException, ConstantPoolException { diff --git a/jdk/test/tools/launcher/FXLauncherTest.java b/jdk/test/tools/launcher/FXLauncherTest.java index 0ee9d981cda..7fec8d59d36 100644 --- a/jdk/test/tools/launcher/FXLauncherTest.java +++ b/jdk/test/tools/launcher/FXLauncherTest.java @@ -29,6 +29,7 @@ * jfx app class, a main-class for the manifest, a bogus one and none. * All should execute except the incorrect fx app class entries. * @run main/othervm FXLauncherTest + * @key intermittent */ import java.io.File; import java.io.IOException; diff --git a/jdk/test/tools/launcher/modules/patch/PatchTest.java b/jdk/test/tools/launcher/modules/patch/basic/PatchTest.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/PatchTest.java rename to jdk/test/tools/launcher/modules/patch/basic/PatchTest.java diff --git a/jdk/test/tools/launcher/modules/patch/src/test/jdk/test/Main.java b/jdk/test/tools/launcher/modules/patch/basic/src/test/jdk/test/Main.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src/test/jdk/test/Main.java rename to jdk/test/tools/launcher/modules/patch/basic/src/test/jdk/test/Main.java diff --git a/jdk/test/tools/launcher/modules/patch/src/test/module-info.java b/jdk/test/tools/launcher/modules/patch/basic/src/test/module-info.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src/test/module-info.java rename to jdk/test/tools/launcher/modules/patch/basic/src/test/module-info.java diff --git a/jdk/test/tools/launcher/modules/patch/src1/java.base/java/text/Annotation.java b/jdk/test/tools/launcher/modules/patch/basic/src1/java.base/java/text/Annotation.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src1/java.base/java/text/Annotation.java rename to jdk/test/tools/launcher/modules/patch/basic/src1/java.base/java/text/Annotation.java diff --git a/jdk/test/tools/launcher/modules/patch/src1/java.base/java/text/AnnotationBuddy.java b/jdk/test/tools/launcher/modules/patch/basic/src1/java.base/java/text/AnnotationBuddy.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src1/java.base/java/text/AnnotationBuddy.java rename to jdk/test/tools/launcher/modules/patch/basic/src1/java.base/java/text/AnnotationBuddy.java diff --git a/jdk/test/tools/launcher/modules/patch/src1/jdk.compiler/com/sun/tools/javac/Main.java b/jdk/test/tools/launcher/modules/patch/basic/src1/jdk.compiler/com/sun/tools/javac/Main.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src1/jdk.compiler/com/sun/tools/javac/Main.java rename to jdk/test/tools/launcher/modules/patch/basic/src1/jdk.compiler/com/sun/tools/javac/Main.java diff --git a/jdk/test/tools/launcher/modules/patch/src1/jdk.compiler/com/sun/tools/javac/MainBuddy.java b/jdk/test/tools/launcher/modules/patch/basic/src1/jdk.compiler/com/sun/tools/javac/MainBuddy.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src1/jdk.compiler/com/sun/tools/javac/MainBuddy.java rename to jdk/test/tools/launcher/modules/patch/basic/src1/jdk.compiler/com/sun/tools/javac/MainBuddy.java diff --git a/jdk/test/tools/launcher/modules/patch/src1/jdk.naming.dns/com/sun/jndi/dns/DnsClient.java b/jdk/test/tools/launcher/modules/patch/basic/src1/jdk.naming.dns/com/sun/jndi/dns/DnsClient.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src1/jdk.naming.dns/com/sun/jndi/dns/DnsClient.java rename to jdk/test/tools/launcher/modules/patch/basic/src1/jdk.naming.dns/com/sun/jndi/dns/DnsClient.java diff --git a/jdk/test/tools/launcher/modules/patch/src1/jdk.naming.dns/com/sun/jndi/dns/DnsClientBuddy.java b/jdk/test/tools/launcher/modules/patch/basic/src1/jdk.naming.dns/com/sun/jndi/dns/DnsClientBuddy.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src1/jdk.naming.dns/com/sun/jndi/dns/DnsClientBuddy.java rename to jdk/test/tools/launcher/modules/patch/basic/src1/jdk.naming.dns/com/sun/jndi/dns/DnsClientBuddy.java diff --git a/jdk/test/tools/launcher/modules/patch/src2/java.base/java/lang2/Object.java b/jdk/test/tools/launcher/modules/patch/basic/src2/java.base/java/lang2/Object.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src2/java.base/java/lang2/Object.java rename to jdk/test/tools/launcher/modules/patch/basic/src2/java.base/java/lang2/Object.java diff --git a/jdk/test/tools/launcher/modules/patch/src2/jdk.compiler/com/sun/tools/javac2/Main.java b/jdk/test/tools/launcher/modules/patch/basic/src2/jdk.compiler/com/sun/tools/javac2/Main.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src2/jdk.compiler/com/sun/tools/javac2/Main.java rename to jdk/test/tools/launcher/modules/patch/basic/src2/jdk.compiler/com/sun/tools/javac2/Main.java diff --git a/jdk/test/tools/launcher/modules/patch/src2/jdk.naming.dns/com/sun/jndi/dns2/Zone.java b/jdk/test/tools/launcher/modules/patch/basic/src2/jdk.naming.dns/com/sun/jndi/dns2/Zone.java similarity index 100% rename from jdk/test/tools/launcher/modules/patch/src2/jdk.naming.dns/com/sun/jndi/dns2/Zone.java rename to jdk/test/tools/launcher/modules/patch/basic/src2/jdk.naming.dns/com/sun/jndi/dns2/Zone.java diff --git a/jdk/test/tools/launcher/modules/patch/systemmodules/PatchSystemModules.java b/jdk/test/tools/launcher/modules/patch/systemmodules/PatchSystemModules.java new file mode 100644 index 00000000000..0e5345aefb3 --- /dev/null +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/PatchSystemModules.java @@ -0,0 +1,225 @@ +/** + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8157068 + * @summary Patch java.base and user module with Hashes attribute tied with + * other module. + * @library /lib/testlibrary + * @modules jdk.compiler + * @build CompilerUtils + * @run testng PatchSystemModules + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.FileUtils; +import jdk.testlibrary.JDKToolFinder; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import static jdk.testlibrary.ProcessTools.executeCommand; +import static org.testng.Assert.*; + +public class PatchSystemModules { + private static final String JAVA_HOME = System.getProperty("java.home"); + + private static final Path TEST_SRC = Paths.get(System.getProperty("test.src")); + private static final Path PATCH_SRC_DIR = TEST_SRC.resolve("src1"); + + private static final Path JMODS = Paths.get(JAVA_HOME, "jmods"); + private static final Path MODS_DIR = Paths.get("mods"); + private static final Path JARS_DIR = Paths.get("jars"); + private static final Path PATCH_DIR = Paths.get("patches"); + private static final Path IMAGE = Paths.get("image"); + + private static final String JAVA_BASE = "java.base"; + private final String[] modules = new String[] { "m1", "m2" }; + + @BeforeTest + private void setup() throws Throwable { + Path src = TEST_SRC.resolve("src"); + for (String name : modules) { + assertTrue(CompilerUtils.compile(src.resolve(name), + MODS_DIR, + "-modulesourcepath", src.toString())); + } + + // compile patched source + assertTrue(CompilerUtils.compile(PATCH_SRC_DIR.resolve(JAVA_BASE), + PATCH_DIR.resolve(JAVA_BASE), + "-Xmodule:java.base")); + assertTrue(CompilerUtils.compile(PATCH_SRC_DIR.resolve("m2"), + PATCH_DIR.resolve("m2"))); + + // create an image with only m1 and m2 + if (Files.exists(JMODS)) { + // create an image with m1,m2 + createImage(); + } + } + + @Test + public void test() throws Throwable { + Path patchedJavaBase = PATCH_DIR.resolve(JAVA_BASE); + Path patchedM2 = PATCH_DIR.resolve("m2"); + + Path home = Paths.get(JAVA_HOME); + runTest(home, + "-mp", MODS_DIR.toString(), + "-m", "m1/p1.Main", "1"); + runTest(home, + "-Xpatch:java.base=" + patchedJavaBase.toString(), + "-mp", MODS_DIR.toString(), + "-m", "m1/p1.Main", "1"); + + runTest(home, + "-Xpatch:m2=" + patchedM2.toString(), + "-mp", MODS_DIR.toString(), + "-m", "m1/p1.Main", "2"); + } + + @Test + public void testImage() throws Throwable { + if (Files.notExists(JMODS)) + return; + + Path patchedJavaBase = PATCH_DIR.resolve(JAVA_BASE); + Path patchedM2 = PATCH_DIR.resolve("m2"); + + runTest(IMAGE, + "-m", "m1/p1.Main", "1"); + runTest(IMAGE, + "-Xpatch:java.base=" + patchedJavaBase.toString(), + "-m", "m1/p1.Main", "1"); + runTest(IMAGE, + "-Xpatch:m2=" + patchedM2.toString(), + "-m", "m1/p1.Main", "2"); + } + + @Test + public void upgradeTiedModule() throws Throwable { + if (Files.notExists(JMODS)) + return; + + Path m1 = MODS_DIR.resolve("m1.jar"); + + // create another m1.jar + jar("--create", + "--file=" + m1.toString(), + "-C", MODS_DIR.resolve("m1").toString(), "."); + + // Fail to upgrade m1.jar with mismatched hash + runTestWithExitCode(getJava(IMAGE), + "-upgrademodulepath", m1.toString(), + "-m", "m1/p1.Main"); + + runTestWithExitCode(getJava(IMAGE), + "-Xpatch:java.base=" + PATCH_DIR.resolve(JAVA_BASE).toString(), + "-upgrademodulepath", m1.toString(), + "-m", "m1/p1.Main", "1"); + } + + private void runTestWithExitCode(String... options) throws Throwable { + assertTrue(executeCommand(options) + .outputTo(System.out) + .errorTo(System.out) + .shouldContain("differs to expected hash") + .getExitValue() != 0); + } + + private void runTest(Path image, String... opts) throws Throwable { + String[] options = + Stream.concat(Stream.of(getJava(image)), + Stream.of(opts)) + .toArray(String[]::new); + + ProcessBuilder pb = new ProcessBuilder(options); + int exitValue = executeCommand(pb) + .outputTo(System.out) + .errorTo(System.out) + .getExitValue(); + + assertTrue(exitValue == 0); + } + + static void createImage() throws Throwable { + FileUtils.deleteFileTreeUnchecked(JARS_DIR); + FileUtils.deleteFileTreeUnchecked(IMAGE); + + Files.createDirectories(JARS_DIR); + Path m1 = JARS_DIR.resolve("m1.jar"); + Path m2 = JARS_DIR.resolve("m2.jar"); + + // hash m1 in m2's Hashes attribute + jar("--create", + "--file=" + m1.toString(), + "-C", MODS_DIR.resolve("m1").toString(), "."); + + jar("--create", + "--file=" + m2.toString(), + "--modulepath", JARS_DIR.toString(), + "--hash-modules", "m1", + "-C", MODS_DIR.resolve("m2").toString(), "."); + + + String mpath = JARS_DIR.toString() + File.pathSeparator + JMODS.toString(); + execTool("jlink", "--modulepath", mpath, + "--addmods", "m1", + "--output", IMAGE.toString()); + } + + static void jar(String... args) throws Throwable { + execTool("jar", args); + } + + static void execTool(String tool, String... args) throws Throwable { + String path = JDKToolFinder.getJDKTool(tool); + List commands = new ArrayList<>(); + commands.add(path); + Stream.of(args).forEach(commands::add); + ProcessBuilder pb = new ProcessBuilder(commands); + int exitValue = executeCommand(pb) + .outputTo(System.out) + .errorTo(System.out) + .shouldNotContain("no module is recorded in hash") + .getExitValue(); + + assertTrue(exitValue == 0); + } + + static String getJava(Path image) { + boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("win"); + Path java = image.resolve("bin").resolve(isWindows ? "java.exe" : "java"); + if (Files.notExists(java)) + throw new RuntimeException(java + " not found"); + return java.toAbsolutePath().toString(); + } +} diff --git a/jdk/test/tools/launcher/modules/patch/systemmodules/src/m1/module-info.java b/jdk/test/tools/launcher/modules/patch/systemmodules/src/m1/module-info.java new file mode 100644 index 00000000000..d23aeb1669b --- /dev/null +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/src/m1/module-info.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module m1 { + requires m2; +} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PluginContextImpl.java b/jdk/test/tools/launcher/modules/patch/systemmodules/src/m1/p1/Main.java similarity index 66% rename from jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PluginContextImpl.java rename to jdk/test/tools/launcher/modules/patch/systemmodules/src/m1/p1/Main.java index 7fe7dcea36e..2329905a0f0 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PluginContextImpl.java +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/src/m1/p1/Main.java @@ -1,12 +1,10 @@ -/* +/** * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. + * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or @@ -22,16 +20,15 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.tools.jlink.internal; -import java.util.Properties; +package p1; -import jdk.tools.jlink.plugin.PluginContext; +public class Main { + public static void main(String[] args) throws Exception { + int version = p2.Lib.version(); + int expected = args.length == 0 ? 1 : Integer.parseInt(args[0]); -public final class PluginContextImpl implements PluginContext { - private final Properties releaseProps = new Properties(); - - public Properties getReleaseProperties() { - return releaseProps; + if (version != expected) + throw new RuntimeException(version + " != " + expected + " (expected)"); } } diff --git a/jdk/test/tools/launcher/modules/patch/systemmodules/src/m2/module-info.java b/jdk/test/tools/launcher/modules/patch/systemmodules/src/m2/module-info.java new file mode 100644 index 00000000000..bc0f12b2204 --- /dev/null +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/src/m2/module-info.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module m2 { + exports p2; +} diff --git a/jdk/test/tools/launcher/modules/patch/systemmodules/src/m2/p2/Lib.java b/jdk/test/tools/launcher/modules/patch/systemmodules/src/m2/p2/Lib.java new file mode 100644 index 00000000000..1d43aedc718 --- /dev/null +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/src/m2/p2/Lib.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package p2; + +public class Lib { + public static int version() { + return 1; + } +} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/PluginContext.java b/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java similarity index 69% rename from jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/PluginContext.java rename to jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java index 9e5a4a7df61..e30761204e1 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/PluginContext.java +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java @@ -4,9 +4,7 @@ * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. + * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or @@ -22,16 +20,13 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.tools.jlink.plugin; -import java.util.Properties; +package jdk.internal.module; -/** - * Interface to plugin (container) context. +/* + * Test -Xpatch:java.base=jdk/modules/java.base to override + * java.base with an exploded image */ -public interface PluginContext { - /** - * Returns 'release' properties - */ - public Properties getReleaseProperties(); +public final class SystemModules { + public static final String[] MODULE_NAMES = new String[0]; } diff --git a/jdk/test/tools/launcher/modules/patch/systemmodules/src1/m2/p2/Lib.java b/jdk/test/tools/launcher/modules/patch/systemmodules/src1/m2/p2/Lib.java new file mode 100644 index 00000000000..5313c7e7aed --- /dev/null +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/src1/m2/p2/Lib.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package p2; + +public class Lib { + public static int version() { + return 2; + } +} diff --git a/jdk/test/tools/pack200/TestNormal.java b/jdk/test/tools/pack200/TestNormal.java index 0172a5e65b6..a85a9d4040f 100644 --- a/jdk/test/tools/pack200/TestNormal.java +++ b/jdk/test/tools/pack200/TestNormal.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,85 +25,37 @@ /* * @test * @run main/timeout=600 TestNormal - * @bug 8020802 + * @bug 8020802 8156807 * @summary Need an ability to create jar files that are invariant to the pack200 packing/unpacking * @author Alexander Zuev */ import java.io.*; -import java.util.Collections; -import java.util.Properties; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; public class TestNormal { private static String FS = File.separator; public static void main(String args[]) throws Exception { - Properties p = System.getProperties(); - String java_home = p.getProperty("test.jdk"); String testdir = Utils.TEST_CLS_DIR.getAbsolutePath(); try { - execJavaCommand(java_home, "jar cnf normalized.jar -C " + testdir + " ."); - execJavaCommand(java_home, "jar cf original.jar -C " + testdir + " ."); - execJavaCommand(java_home, "pack200 -r repacked.jar original.jar"); - compareJars(new JarFile("normalized.jar"), new JarFile("repacked.jar")); + String jarCmd = Utils.getJarCmd(); + String packCmd = Utils.getPack200Cmd(); + + // create the original jar + Utils.runExec(jarCmd, "cf", "original.jar", "-C", testdir, "."); + + // create the reference jar + Utils.runExec(packCmd, "-r", "repacked.jar", "original.jar"); + + // create the normalized jar using jar(1) + Utils.runExec(jarCmd, "cnf", "normalized.jar", "-C", testdir, "."); + + // compare archive contents bit wise, these should be identical! + Utils.doCompareBitWise(new File("repacked.jar"), + new File("normalized.jar")); } finally { - String[] cleanupList = {"normalized.jar", "original.jar", "repacked.jar"}; - for (String s : cleanupList) { - delete(new File(s)); - } - } - } - - public static void execJavaCommand(String java_home, String cmd) throws Exception { - Process proc = Runtime.getRuntime().exec(java_home + FS + "bin" + FS + cmd); - String s; - BufferedReader stdInput = - new BufferedReader(new InputStreamReader(proc.getInputStream())); - BufferedReader stdError = - new BufferedReader(new InputStreamReader(proc.getErrorStream())); - while ((s = stdInput.readLine()) != null) { - System.out.println(s); - } - while ((s = stdError.readLine()) != null) { - System.err.println(s); - } - } - - public static void compareJars(JarFile jf1, JarFile jf2) throws Exception { - try { - if (jf1.size() != jf2.size()) { - throw new Exception("Jars " + jf1.getName() + " and " + jf2.getName() - + " have different number of entries"); - } - for (JarEntry elem1 : Collections.list(jf1.entries())) { - JarEntry elem2 = jf2.getJarEntry(elem1.getName()); - if (elem2 == null) { - throw new Exception("Element " + elem1.getName() + " is missing from " + jf2.getName()); - } - if (!elem1.isDirectory() && elem1.getCrc() != elem2.getCrc()) { - throw new Exception("The crc of " + elem1.getName() + " is different."); - } - } - } finally { - jf1.close(); - jf2.close(); - } - } - - static void delete(File f) throws IOException { - if (!f.exists()) { - return; - } - if (f.isDirectory()) { - for (File c : f.listFiles()) { - delete(c); - } - } - if (!f.delete()) { - throw new FileNotFoundException("Failed to delete file: " + f); + Utils.cleanup(); } } } diff --git a/jdk/test/tools/pack200/Utils.java b/jdk/test/tools/pack200/Utils.java index f4641987e73..45e09c37abc 100644 --- a/jdk/test/tools/pack200/Utils.java +++ b/jdk/test/tools/pack200/Utils.java @@ -33,7 +33,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.URI; -import java.net.URL; import java.nio.charset.Charset; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.FileSystem; @@ -483,9 +482,15 @@ class Utils { } return out; } + + static List runExec(String... cmds) { + return runExec(Arrays.asList(cmds)); + } + static List runExec(List cmdsList) { return runExec(cmdsList, null); } + static List runExec(List cmdsList, Map penv) { ArrayList alist = new ArrayList(); ProcessBuilder pb = diff --git a/langtools/.hgtags b/langtools/.hgtags index ab91141afde..5f7979643e2 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -360,3 +360,4 @@ cba09a2e6ae969b029783eb59bb01017b78f8eef jdk-9+114 31c8b18fdc5b94a2ddd5ea0694f350a2c907e9f7 jdk-9+115 3e3553ee39d9e081573bc7c88a252214a3152763 jdk-9+116 59adcdd0cd3b6724b4fc0083c258bf4682689f2f jdk-9+117 +59a16fa5dedea9ff5bea0a501e4d0d40193426f3 jdk-9+118 diff --git a/langtools/src/java.compiler/share/classes/javax/tools/StandardJavaFileManager.java b/langtools/src/java.compiler/share/classes/javax/tools/StandardJavaFileManager.java index e24d5a2e915..2c33367f7d6 100644 --- a/langtools/src/java.compiler/share/classes/javax/tools/StandardJavaFileManager.java +++ b/langtools/src/java.compiler/share/classes/javax/tools/StandardJavaFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.util.Arrays; +import java.util.Collection; import static javax.tools.FileManagerUtils.*; @@ -176,7 +177,8 @@ public interface StandardJavaFileManager extends JavaFileManager { /** * Returns file objects representing the given paths. * - *

      The default implementation converts each path to a file and calls + * @implSpec + * The default implementation converts each path to a file and calls * {@link #getJavaFileObjectsFromFiles getJavaObjectsFromFiles}. * IllegalArgumentException will be thrown if any of the paths * cannot be converted to a file. @@ -280,10 +282,21 @@ public interface StandardJavaFileManager extends JavaFileManager { * Associates the given search path with the given location. Any * previous value will be discarded. * - *

      The default implementation converts each path to a file and calls + * @apiNote + * The type of the {@code paths} parameter is a {@code Collection} + * and not {@code Iterable}. This is to prevent the possibility of + * accidentally calling the method with a single {@code Path} as + * the second argument, because although {@code Path} implements + * {@code Iterable}, it would almost never be correct to call + * this method with a single {@code Path} and have it be treated as + * an {@code Iterable} of its components. + * + * + * @implSpec + * The default implementation converts each path to a file and calls * {@link #getJavaFileObjectsFromFiles getJavaObjectsFromFiles}. * IllegalArgumentException will be thrown if any of the paths - * cannot be converted to a file.

      + * cannot be converted to a file. * * @param location a location * @param paths a list of paths, if {@code null} use the default @@ -297,8 +310,8 @@ public interface StandardJavaFileManager extends JavaFileManager { * * @since 9 */ - default void setLocationFromPaths(Location location, Iterable paths) - throws IOException { + default void setLocationFromPaths(Location location, Collection paths) + throws IOException { setLocation(location, asFiles(paths)); } @@ -319,6 +332,11 @@ public interface StandardJavaFileManager extends JavaFileManager { /** * Returns the search path associated with the given location. * + * @implSpec + * The default implementation calls {@link #getLocation getLocation} + * and then returns an {@code Iterable} formed by calling {@code toPath()} + * on each {@code File} returned from {@code getLocation}. + * * @param location a location * @return a list of paths or {@code null} if this location has no * associated search path @@ -337,8 +355,9 @@ public interface StandardJavaFileManager extends JavaFileManager { * {@link java.nio.file.Path Path} object. In such cases, this method may be * used to access that object. * - *

      The default implementation throws {@link UnsupportedOperationException} - * for all files.

      + * @implSpec + * The default implementation throws {@link UnsupportedOperationException} + * for all files. * * @param file a file object * @return a path representing the same underlying file system artifact @@ -351,4 +370,36 @@ public interface StandardJavaFileManager extends JavaFileManager { throw new UnsupportedOperationException(); } + /** + * Factory to create {@code Path} objects from strings. + * + * @since 9 + */ + interface PathFactory { + /** + * Converts a path string, or a sequence of strings that when joined form a path string, to a Path. + * + * @param first the path string or initial part of the path string + * @param more additional strings to be joined to form the path string + * @return the resulting {@code Path} + */ + Path getPath(String first, String... more); + } + + /** + * Specify a factory that can be used to generate a path from a string, or series of strings. + * + * If this method is not called, a factory whose {@code getPath} method is + * equivalent to calling + * {@link java.nio.file.Paths#get(String, String...) java.nio.file.Paths.get(first, more)} + * will be used. + * + * @implSpec + * The default implementation of this method ignores the factory that is provided. + * + * @param f the factory + * + * @since 9 + */ + default void setPathFactory(PathFactory f) { } } diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/ClientCodeWrapper.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/ClientCodeWrapper.java index 3bdd3169d9e..5895f2e77ec 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/ClientCodeWrapper.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/ClientCodeWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -492,7 +492,7 @@ public class ClientCodeWrapper { } @Override @DefinedBy(Api.COMPILER) - public void setLocationFromPaths(Location location, Iterable paths) throws IOException { + public void setLocationFromPaths(Location location, Collection paths) throws IOException { try { ((StandardJavaFileManager)clientJavaFileManager).setLocationFromPaths(location, paths); } catch (ClientCodeException e) { @@ -534,6 +534,17 @@ public class ClientCodeWrapper { throw new ClientCodeException(e); } } + + @Override @DefinedBy(Api.COMPILER) + public void setPathFactory(PathFactory f) { + try { + ((StandardJavaFileManager)clientJavaFileManager).setPathFactory(f); + } catch (ClientCodeException e) { + throw e; + } catch (RuntimeException | Error e) { + throw new ClientCodeException(e); + } + } } protected class WrappedFileObject implements FileObject { diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Directive.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Directive.java index 9867b008487..7fc0ffa47dd 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Directive.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Directive.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -98,7 +98,9 @@ public abstract class Directive implements ModuleElement.Directive { @Override @DefinedBy(Api.LANGUAGE_MODEL) public java.util.List getTargetModules() { - return Collections.unmodifiableList(modules); + return modules == null + ? null + : Collections.unmodifiableList(modules); } @Override diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java index 8e8665dd1eb..33e82384993 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java @@ -841,6 +841,28 @@ public class TypeEnter implements Completer { super(CompletionCause.MEMBERS_PHASE, null); } + private boolean completing; + private List> todo = List.nil(); + + @Override + protected void doCompleteEnvs(List> envs) { + todo = todo.prependList(envs); + if (completing) { + return ; //the top-level invocation will handle all envs + } + boolean prevCompleting = completing; + completing = true; + try { + while (todo.nonEmpty()) { + Env head = todo.head; + todo = todo.tail; + super.doCompleteEnvs(List.of(head)); + } + } finally { + completing = prevCompleting; + } + } + @Override protected void runPhase(Env env) { JCClassDecl tree = env.enclClass; diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java index fea4ef7a60a..9d11bb8683a 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package com.sun.tools.javac.file; import java.io.IOException; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -108,7 +109,7 @@ public class FSInfo { for (StringTokenizer st = new StringTokenizer(path); st.hasMoreTokens(); ) { String elt = st.nextToken(); - Path f = Paths.get(elt); + Path f = FileSystems.getDefault().getPath(elt); if (!f.isAbsolute() && parent != null) f = parent.resolve(f).toAbsolutePath(); list.add(f); diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java index fa1a3a5c608..53f515da4eb 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java @@ -109,6 +109,8 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil protected boolean symbolFileEnabled; + private PathFactory pathFactory = Paths::get; + protected enum SortFiles implements Comparator { FORWARD { @Override @@ -166,6 +168,16 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil } } + @Override @DefinedBy(DefinedBy.Api.COMPILER) + public void setPathFactory(PathFactory f) { + pathFactory = Objects.requireNonNull(f); + locations.setPathFactory(f); + } + + private Path getPath(String first, String... more) { + return pathFactory.getPath(first, more); + } + /** * Set whether or not to use ct.sym as an alternate to rt.jar. */ @@ -199,7 +211,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil public Iterable getJavaFileObjectsFromStrings(Iterable names) { ListBuffer paths = new ListBuffer<>(); for (String name : names) - paths.append(Paths.get(nullCheck(name))); + paths.append(getPath(nullCheck(name))); return getJavaFileObjectsFromPaths(paths.toList()); } @@ -837,7 +849,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil if (sibling != null && sibling instanceof PathFileObject) { return ((PathFileObject) sibling).getSibling(baseName); } else { - Path p = Paths.get(baseName); + Path p = getPath(baseName); Path real = fsInfo.getCanonicalFile(p); return PathFileObject.forSimplePath(this, real, p); } @@ -855,7 +867,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil try { if (dir == null) { - dir = Paths.get(System.getProperty("user.dir")); + dir = getPath(System.getProperty("user.dir")); } Path path = fileName.resolveAgainst(fsInfo.getCanonicalFile(dir)); return PathFileObject.forDirectoryPath(this, path, dir, fileName); @@ -918,7 +930,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil @Override @DefinedBy(Api.COMPILER) public void setLocationFromPaths(Location location, - Iterable searchpath) + Collection searchpath) throws IOException { nullCheck(location); diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java index 68f7781b0ef..12106e3ecc1 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java @@ -68,6 +68,7 @@ import javax.lang.model.SourceVersion; import javax.tools.JavaFileManager; import javax.tools.JavaFileManager.Location; import javax.tools.StandardJavaFileManager; +import javax.tools.StandardJavaFileManager.PathFactory; import javax.tools.StandardLocation; import com.sun.tools.javac.code.Lint; @@ -121,7 +122,9 @@ public class Locations { private ModuleNameReader moduleNameReader; - static final Path javaHome = Paths.get(System.getProperty("java.home")); + private PathFactory pathFactory = Paths::get; + + static final Path javaHome = FileSystems.getDefault().getPath(System.getProperty("java.home")); static final Path thisSystemModules = javaHome.resolve("lib").resolve("modules"); Map fileSystems = new LinkedHashMap<>(); @@ -131,6 +134,10 @@ public class Locations { initHandlers(); } + Path getPath(String first, String... more) { + return pathFactory.getPath(first, more); + } + public void close() throws IOException { ListBuffer list = new ListBuffer<>(); closeables.forEach(closeable -> { @@ -155,6 +162,10 @@ public class Locations { this.fsInfo = fsInfo; } + void setPathFactory(PathFactory f) { + pathFactory = f; + } + boolean isDefaultBootClassPath() { BootClassPathLocationHandler h = (BootClassPathLocationHandler) getHandler(PLATFORM_CLASS_PATH); @@ -167,7 +178,7 @@ public class Locations { * @param searchPath The search path to be split * @return The elements of the path */ - private static Iterable getPathEntries(String searchPath) { + private Iterable getPathEntries(String searchPath) { return getPathEntries(searchPath, null); } @@ -181,7 +192,7 @@ public class Locations { * empty path elements * @return The elements of the path */ - private static Iterable getPathEntries(String searchPath, Path emptyPathDefault) { + private Iterable getPathEntries(String searchPath, Path emptyPathDefault) { ListBuffer entries = new ListBuffer<>(); for (String s: searchPath.split(Pattern.quote(File.pathSeparator), -1)) { if (s.isEmpty()) { @@ -189,7 +200,7 @@ public class Locations { entries.add(emptyPathDefault); } } else { - entries.add(Paths.get(s)); + entries.add(getPath(s)); } } return entries; @@ -465,7 +476,7 @@ public class Locations { // need to decide how best to report issue for benefit of // direct API call on JavaFileManager.handleOption(specifies IAE) // vs. command line decoding. - outputDir = (value == null) ? null : Paths.get(value); + outputDir = (value == null) ? null : getPath(value); return true; } @@ -606,7 +617,7 @@ public class Locations { protected SearchPath createPath() { return new SearchPath() .expandJarClassPaths(true) // Only search user jars for Class-Paths - .emptyPathDefault(Paths.get(".")); // Empty path elt ==> current directory + .emptyPathDefault(getPath(".")); // Empty path elt ==> current directory } private void lazy() { @@ -791,7 +802,7 @@ public class Locations { paths.addAll(modules); for (String s : files.split(Pattern.quote(File.pathSeparator))) { - paths.add(Paths.get(s)); + paths.add(getPath(s)); } return paths; @@ -1170,12 +1181,12 @@ public class Locations { for (String seg: segments) { int markStart = seg.indexOf(MARKER); if (markStart == -1) { - add(map, Paths.get(seg), null); + add(map, getPath(seg), null); } else { if (markStart == 0 || !isSeparator(seg.charAt(markStart - 1))) { throw new IllegalArgumentException("illegal use of " + MARKER + " in " + seg); } - Path prefix = Paths.get(seg.substring(0, markStart - 1)); + Path prefix = getPath(seg.substring(0, markStart - 1)); Path suffix; int markEnd = markStart + MARKER.length(); if (markEnd == seg.length()) { @@ -1184,7 +1195,7 @@ public class Locations { || seg.indexOf(MARKER, markEnd) != -1) { throw new IllegalArgumentException("illegal use of " + MARKER + " in " + seg); } else { - suffix = Paths.get(seg.substring(markEnd + 1)); + suffix = getPath(seg.substring(markEnd + 1)); } add(map, prefix, suffix); } @@ -1331,13 +1342,13 @@ public class Locations { } private class SystemModulesLocationHandler extends BasicLocationHandler { - private Path javaHome; + private Path systemJavaHome; private Path modules; private Map systemModules; SystemModulesLocationHandler() { super(StandardLocation.SYSTEM_MODULES, Option.SYSTEM); - javaHome = Paths.get(System.getProperty("java.home")); + systemJavaHome = Locations.javaHome; } @Override @@ -1347,11 +1358,11 @@ public class Locations { } if (value == null) { - javaHome = Paths.get(System.getProperty("java.home")); + systemJavaHome = Locations.javaHome; } else if (value.equals("none")) { - javaHome = null; + systemJavaHome = null; } else { - update(Paths.get(value)); + update(getPath(value)); } modules = null; @@ -1360,13 +1371,13 @@ public class Locations { @Override Collection getPaths() { - return (javaHome == null) ? null : Collections.singleton(javaHome); + return (systemJavaHome == null) ? null : Collections.singleton(systemJavaHome); } @Override void setPaths(Iterable files) throws IOException { if (files == null) { - javaHome = null; + systemJavaHome = null; } else { Iterator pathIter = files.iterator(); if (!pathIter.hasNext()) { @@ -1386,16 +1397,15 @@ public class Locations { } private void update(Path p) { - if (!isCurrentPlatform(p) && !Files.exists(p.resolve("jrt-fs.jar")) && !Files.exists(javaHome.resolve("modules"))) + if (!isCurrentPlatform(p) && !Files.exists(p.resolve("jrt-fs.jar")) && !Files.exists(systemJavaHome.resolve("modules"))) throw new IllegalArgumentException(p.toString()); - javaHome = p; + systemJavaHome = p; modules = null; } private boolean isCurrentPlatform(Path p) { - Path jh = Paths.get(System.getProperty("java.home")); try { - return Files.isSameFile(p, jh); + return Files.isSameFile(p, Locations.javaHome); } catch (IOException ex) { throw new IllegalArgumentException(p.toString(), ex); } @@ -1421,7 +1431,7 @@ public class Locations { return; } - if (javaHome == null) { + if (systemJavaHome == null) { systemModules = Collections.emptyMap(); return; } @@ -1431,15 +1441,15 @@ public class Locations { URI jrtURI = URI.create("jrt:/"); FileSystem jrtfs; - if (isCurrentPlatform(javaHome)) { + if (isCurrentPlatform(systemJavaHome)) { jrtfs = FileSystems.getFileSystem(jrtURI); } else { try { Map attrMap = - Collections.singletonMap("java.home", javaHome.toString()); + Collections.singletonMap("java.home", systemJavaHome.toString()); jrtfs = FileSystems.newFileSystem(jrtURI, attrMap); } catch (ProviderNotFoundException ex) { - URL javaHomeURL = javaHome.resolve("jrt-fs.jar").toUri().toURL(); + URL javaHomeURL = systemJavaHome.resolve("jrt-fs.jar").toUri().toURL(); ClassLoader currentLoader = Locations.class.getClassLoader(); URLClassLoader fsLoader = new URLClassLoader(new URL[] {javaHomeURL}, currentLoader); @@ -1454,7 +1464,7 @@ public class Locations { modules = jrtfs.getPath("/modules"); } catch (FileSystemNotFoundException | ProviderNotFoundException e) { - modules = javaHome.resolve("modules"); + modules = systemJavaHome.resolve("modules"); if (!Files.exists(modules)) throw new IOException("can't find system classes", e); } diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/PathFileObject.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/PathFileObject.java index 73be502e052..f30896c2cbc 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/PathFileObject.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/PathFileObject.java @@ -109,7 +109,7 @@ public abstract class PathFileObject implements JavaFileObject { private DirectoryFileObject(BaseFileManager fileManager, Path path, Path userPackageRootDir, RelativePath relativePath) { super(fileManager, path); - this.userPackageRootDir = userPackageRootDir; + this.userPackageRootDir = Objects.requireNonNull(userPackageRootDir); this.relativePath = relativePath; } diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/RelativePath.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/RelativePath.java index 3e541b884f1..75fdcf1b031 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/RelativePath.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/RelativePath.java @@ -26,10 +26,8 @@ package com.sun.tools.javac.file; import java.nio.file.FileSystem; -import java.nio.file.FileSystems; import java.nio.file.InvalidPathException; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -58,13 +56,8 @@ public abstract class RelativePath implements Comparable { public abstract String basename(); public Path resolveAgainst(Path directory) throws /*unchecked*/ InvalidPathException { - if (directory == null) { - String sep = FileSystems.getDefault().getSeparator(); - return Paths.get(path.replace("/", sep)); - } else { - String sep = directory.getFileSystem().getSeparator(); - return directory.resolve(path.replace("/", sep)); - } + String sep = directory.getFileSystem().getSeparator(); + return directory.resolve(path.replace("/", sep)); } public Path resolveAgainst(FileSystem fs) throws /*unchecked*/ InvalidPathException { diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassFile.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassFile.java index 3ef115ff8dd..62bfd05484c 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassFile.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,7 +108,7 @@ public class ClassFile { V50(50, 0), // JDK 1.6: stackmaps V51(51, 0), // JDK 1.7 V52(52, 0), // JDK 1.8: lambda, type annos, param names - V53(52, 0); // JDK 1.9: modules **** FIXME TO 53 BEFORE RELEASE ***** + V53(53, 0); // JDK 1.9: modules, indy string concat Version(int major, int minor) { this.major = major; this.minor = minor; diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Target.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Target.java index 75f314b1912..b0737558596 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Target.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Target.java @@ -60,8 +60,8 @@ public enum Target { /** JDK 8. */ JDK1_8("1.8", 52, 0), - /** JDK 9, initially an alias for 8. */ - JDK1_9("1.9", 52, 0); + /** JDK 9. */ + JDK1_9("1.9", 53, 0); private static final Context.Key targetKey = new Context.Key<>(); diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java index 6eac715fa98..348054f1269 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java @@ -28,7 +28,7 @@ package com.sun.tools.doclets.formats.html; import java.util.*; import com.sun.javadoc.*; -import com.sun.tools.javadoc.RootDocImpl; +import com.sun.tools.javadoc.main.RootDocImpl; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.builders.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java index 5751a70807b..83fc46a34e0 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java @@ -40,7 +40,7 @@ import com.sun.tools.doclint.DocLint; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.StringUtils; -import com.sun.tools.javadoc.RootDocImpl; +import com.sun.tools.javadoc.main.RootDocImpl; /** * Configure the output based on the command line options. diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java index 2c8f185d981..216f0f7886a 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java @@ -149,8 +149,8 @@ public class SourceToHTMLConverter { return; Reader r; // temp hack until we can update SourcePosition API. - if (sp instanceof com.sun.tools.javadoc.SourcePositionImpl) { - FileObject fo = ((com.sun.tools.javadoc.SourcePositionImpl) sp).fileObject(); + if (sp instanceof com.sun.tools.javadoc.main.SourcePositionImpl) { + FileObject fo = ((com.sun.tools.javadoc.main.SourcePositionImpl) sp).fileObject(); if (fo == null) return; r = fo.openReader(true); diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Main.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Main.java index dfc21b27702..467fd2d34e0 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Main.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Main.java @@ -27,6 +27,8 @@ package com.sun.tools.javadoc; import java.io.PrintWriter; +import com.sun.tools.javadoc.main.Start; + /** * Provides external entry points (tool and programmatic) * for the javadoc program. diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AbstractTypeImpl.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AbstractTypeImpl.java index 856cd558ea8..c0570aa7516 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AbstractTypeImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotatedTypeImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotatedTypeImpl.java index 3ee1c0a99c1..982b8744ed5 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotatedTypeImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationDescImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationDescImpl.java index 2647d9983be..d348f35ec02 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationDescImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeDocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeDocImpl.java index 2ff3ba6d971..d691959f4c3 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeElementDocImpl.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeElementDocImpl.java index 230542958f0..bd0f8284c2d 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeElementDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationValueImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationValueImpl.java index b79a19ce8ff..036f2b40a88 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationValueImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ClassDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ClassDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java index acebdb840f6..c1437e007ed 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ClassDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.File; import java.io.IOException; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Comment.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Comment.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Comment.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Comment.java index e2e29007874..ade553baba9 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Comment.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Comment.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ConstructorDocImpl.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ConstructorDocImpl.java index d0a0853dc3f..ca53d182e6c 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ConstructorDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocEnv.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocEnv.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocEnv.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocEnv.java index 2ac36520cd6..d123013013b 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocEnv.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocEnv.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.lang.reflect.Modifier; import java.util.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocImpl.java index bf77bd089e0..0f085e7eeef 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.DataInputStream; import java.io.IOException; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocLocale.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocLocale.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocLocale.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocLocale.java index 5dcd1b72201..4460d7e311c 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocLocale.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocLocale.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.text.BreakIterator; import java.text.Collator; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocletInvoker.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocletInvoker.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocletInvoker.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocletInvoker.java index 91e333e8ccb..402e67ef70b 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/DocletInvoker.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocletInvoker.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.File; import java.io.IOException; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ExecutableMemberDocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ExecutableMemberDocImpl.java index cfbc0cb4001..30075a96d78 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ExecutableMemberDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.lang.reflect.Modifier; import java.text.CollationKey; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/FieldDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/FieldDocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/FieldDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/FieldDocImpl.java index 8317128c945..c3432633dc8 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/FieldDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/FieldDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.source.util.TreePath; import java.lang.reflect.Modifier; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocClassFinder.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocClassFinder.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocClassFinder.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocClassFinder.java index ecb3659f174..997b8d97759 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocClassFinder.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocClassFinder.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.util.EnumSet; import javax.tools.JavaFileObject; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocEnter.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocEnter.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocEnter.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocEnter.java index 3732098289f..a49abaeabb6 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocEnter.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocEnter.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import javax.tools.JavaFileObject; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocMemberEnter.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocMemberEnter.java index 220ffb5504e..452cc614938 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocMemberEnter.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.source.util.TreePath; import com.sun.tools.javac.code.Flags; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocTodo.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTodo.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocTodo.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTodo.java index cbeaf699376..88ab1ad1dd2 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocTodo.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTodo.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.tools.javac.comp.*; import com.sun.tools.javac.util.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocTool.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTool.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocTool.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTool.java index b29c2899222..fa358ddf47d 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/JavadocTool.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTool.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.File; import java.io.IOException; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/MemberDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/MemberDocImpl.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/MemberDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/MemberDocImpl.java index 37c7c66eb46..d87c0ae01f1 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/MemberDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/MemberDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Messager.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Messager.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Messager.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Messager.java index 2a97cd0ff25..d181fb2a82d 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Messager.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Messager.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.PrintWriter; import java.util.Locale; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/MethodDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/MethodDocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/MethodDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/MethodDocImpl.java index b624694a771..391eab2b8d3 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/MethodDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/MethodDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.lang.reflect.Modifier; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ModifierFilter.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ModifierFilter.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ModifierFilter.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ModifierFilter.java index 40a9040971c..76624e64f60 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ModifierFilter.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ModifierFilter.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import static com.sun.tools.javac.code.Flags.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/PackageDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/PackageDocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/PackageDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/PackageDocImpl.java index 13753959b3e..a5683240e67 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/PackageDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/PackageDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.IOException; import java.io.InputStream; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParamTagImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParamTagImpl.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParamTagImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParamTagImpl.java index e8775393776..56cf966f62f 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParamTagImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParamTagImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.util.regex.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParameterImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParameterImpl.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParameterImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParameterImpl.java index 14de4a2f43a..ce047b59c37 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParameterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParameterImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParameterizedTypeImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParameterizedTypeImpl.java index 2fac11119d3..e7c8875f76b 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ParameterizedTypeImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/PrimitiveType.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/PrimitiveType.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/PrimitiveType.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/PrimitiveType.java index a3a81983734..79d2a3a246f 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/PrimitiveType.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/PrimitiveType.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ProgramElementDocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ProgramElementDocImpl.java index d647b491639..663263ee166 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ProgramElementDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.lang.reflect.Modifier; import java.text.CollationKey; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/RootDocImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/RootDocImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/RootDocImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/RootDocImpl.java index d4b0da6d03d..03157373e7f 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/RootDocImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/RootDocImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.IOException; import java.util.Collection; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SeeTagImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SeeTagImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SeeTagImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SeeTagImpl.java index de73bc87b6a..626a54d81b1 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SeeTagImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SeeTagImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.File; import java.util.Locale; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SerialFieldTagImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SerialFieldTagImpl.java index e89866d9de9..a7dc95da462 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SerialFieldTagImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SerializedForm.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SerializedForm.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SerializedForm.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SerializedForm.java index f6d056a52c7..f06987ce89e 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SerializedForm.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SerializedForm.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; import com.sun.tools.javac.code.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SourcePositionImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SourcePositionImpl.java index b508b615ea6..911e57c8f99 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/SourcePositionImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.File; import javax.tools.FileObject; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Start.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Start.java similarity index 98% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Start.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Start.java index c05762504e5..188c6b5fd84 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Start.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Start.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.io.File; import java.io.FileNotFoundException; @@ -95,7 +95,7 @@ public class Start extends ToolOption.Helper { private JavaFileManager fileManager; - Start(String programName, + public Start(String programName, PrintWriter errWriter, PrintWriter warnWriter, PrintWriter noticeWriter, @@ -119,11 +119,11 @@ public class Start extends ToolOption.Helper { this.docletParentClassLoader = docletParentClassLoader; } - Start(String programName, String defaultDocletClassName) { + public Start(String programName, String defaultDocletClassName) { this(programName, defaultDocletClassName, null); } - Start(String programName, String defaultDocletClassName, + public Start(String programName, String defaultDocletClassName, ClassLoader docletParentClassLoader) { context = new Context(); messager = new Messager(context, programName); @@ -131,15 +131,15 @@ public class Start extends ToolOption.Helper { this.docletParentClassLoader = docletParentClassLoader; } - Start(String programName, ClassLoader docletParentClassLoader) { + public Start(String programName, ClassLoader docletParentClassLoader) { this(programName, standardDocletClassName, docletParentClassLoader); } - Start(String programName) { + public Start(String programName) { this(programName, standardDocletClassName); } - Start(ClassLoader docletParentClassLoader) { + public Start(ClassLoader docletParentClassLoader) { this(javadocName, docletParentClassLoader); } diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TagImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TagImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TagImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TagImpl.java index a106bb68f40..352c9fc7152 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TagImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TagImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ThrowsTagImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ThrowsTagImpl.java index 6da454fdbb8..e92d871263b 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ThrowsTagImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ToolOption.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ToolOption.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ToolOption.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ToolOption.java index 18ab44f3c06..180f99b5162 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/ToolOption.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ToolOption.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import java.util.LinkedHashMap; import java.util.Map; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TypeMaker.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TypeMaker.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TypeMaker.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TypeMaker.java index aae1917d573..7c18ce120b2 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TypeMaker.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TypeMaker.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; import com.sun.tools.javac.code.Symbol; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TypeVariableImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TypeVariableImpl.java index 93d4e31dd20..8207695e285 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/TypeVariableImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/WildcardTypeImpl.java similarity index 99% rename from langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java rename to langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/WildcardTypeImpl.java index cf458d2335c..f3b4138e9d7 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/WildcardTypeImpl.java @@ -23,7 +23,7 @@ * questions. */ -package com.sun.tools.javadoc; +package com.sun.tools.javadoc.main; import com.sun.javadoc.*; diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java index 3d6a248da57..61b101ce5e6 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java @@ -90,6 +90,19 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter this.next = nextType; } + /** + * Get the module link. + * + * @return a content tree for the module link + */ + @Override + protected Content getNavLinkModule() { + Content linkContent = getModuleLink(utils.elementUtils.getModuleOf(annotationType), + moduleLabel); + Content li = HtmlTree.LI(linkContent); + return li; + } + /** * Get this package link. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java index 9e3834dffba..61993e1490b 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java @@ -504,6 +504,19 @@ public class ClassUseWriter extends SubWriterHolderWriter { return bodyTree; } + /** + * Get the module link. + * + * @return a content tree for the module link + */ + @Override + protected Content getNavLinkModule() { + Content linkContent = getModuleLink(utils.elementUtils.getModuleOf(typeElement), + moduleLabel); + Content li = HtmlTree.LI(linkContent); + return li; + } + /** * Get this package link. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 4137cefb6f7..3758a0bd665 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -104,6 +104,19 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite this.next = nextClass; } + /** + * Get the module link. + * + * @return a content tree for the module link + */ + @Override + protected Content getNavLinkModule() { + Content linkContent = getModuleLink(utils.elementUtils.getModuleOf(typeElement), + moduleLabel); + Content li = HtmlTree.LI(linkContent); + return li; + } + /** * Get this package link. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 71eedc88e42..c5af88209b9 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -570,6 +570,11 @@ public class HtmlDocletWriter extends HtmlDocWriter { if (configuration.createoverview) { navList.addContent(getNavLinkContents()); } + if (configuration.modules.size() == 1) { + navList.addContent(getNavLinkModule(configuration.modules.first())); + } else if (!configuration.modules.isEmpty()) { + navList.addContent(getNavLinkModule()); + } if (configuration.packages.size() == 1) { navList.addContent(getNavLinkPackage(configuration.packages.first())); } else if (!configuration.packages.isEmpty()) { @@ -678,6 +683,28 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } + /** + * Get link to the module summary page for the module passed. + * + * @param mdle Module to which link will be generated + * @return a content tree for the link + */ + protected Content getNavLinkModule(ModuleElement mdle) { + Content linkContent = getModuleLink(mdle, moduleLabel); + Content li = HtmlTree.LI(linkContent); + return li; + } + + /** + * Get the word "Module", to indicate that link is not available here. + * + * @return a content tree for the link + */ + protected Content getNavLinkModule() { + Content li = HtmlTree.LI(moduleLabel); + return li; + } + /** * Get link to the "package-summary.html" page for the package passed. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java index 555f0dcb03d..0a61c05fb76 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java @@ -267,6 +267,17 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW } } + /** + * Get this module link. + * + * @return a content tree for the module link + */ + @Override + protected Content getNavLinkModule() { + Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, moduleLabel); + return li; + } + /** * Get "PREV MODULE" link in the navigation bar. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageTreeWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageTreeWriter.java index 9dac9a3bf18..4db9a00c804 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageTreeWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageTreeWriter.java @@ -223,6 +223,19 @@ public class PackageTreeWriter extends AbstractTreeWriter { } } + /** + * Get the module link. + * + * @return a content tree for the module link + */ + @Override + protected Content getNavLinkModule() { + Content linkContent = getModuleLink(utils.elementUtils.getModuleOf(packageElement), + moduleLabel); + Content li = HtmlTree.LI(linkContent); + return li; + } + /** * Get link to the package summary page for the package of this tree. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java index 3763e725892..d73fab18f8d 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java @@ -303,6 +303,19 @@ public class PackageUseWriter extends SubWriterHolderWriter { return bodyTree; } + /** + * Get the module link. + * + * @return a content tree for the module link + */ + @Override + protected Content getNavLinkModule() { + Content linkContent = getModuleLink(utils.elementUtils.getModuleOf(packageElement), + moduleLabel); + Content li = HtmlTree.LI(linkContent); + return li; + } + /** * Get this package link. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index 64d76a0743c..438687b0d6c 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -375,6 +375,19 @@ public class PackageWriterImpl extends HtmlDocletWriter return li; } + /** + * Get the module link. + * + * @return a content tree for the module link + */ + @Override + protected Content getNavLinkModule() { + Content linkContent = getModuleLink(utils.elementUtils.getModuleOf(packageElement), + moduleLabel); + Content li = HtmlTree.LI(linkContent); + return li; + } + /** * Highlight "Package" in the navigation bar, as this is the package page. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java index 917063e98ae..34eced11854 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java @@ -329,6 +329,7 @@ public abstract class Configuration { public abstract MessageRetriever getDocletSpecificMsg(); public CommentUtils cmtUtils; + public SortedSet modules; /** * A sorted set of packages specified on the command-line merged with a @@ -395,6 +396,8 @@ public abstract class Configuration { s.add(p); } } + modules = new TreeSet<>(utils.makeModuleComparator()); + modules.addAll(modulePackages.keySet()); showModules = (modulePackages.size() > 1); } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java index 2cca6849e26..a0058e15b0d 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java @@ -283,8 +283,8 @@ public class Start extends ToolOption.Helper { } } else { if (this.apiMode) { - com.sun.tools.javadoc.Start ostart - = new com.sun.tools.javadoc.Start(context); + com.sun.tools.javadoc.main.Start ostart + = new com.sun.tools.javadoc.main.Start(context); return ostart.begin(docletClass, options, fileObjects); } warn("main.legacy_api"); diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java index ca6b08612b9..50959ba539a 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,10 +40,13 @@ import com.sun.source.tree.Scope; import com.sun.source.tree.Tree; import com.sun.source.tree.Tree.Kind; import com.sun.source.tree.VariableTree; +import com.sun.source.util.JavacTask; import com.sun.source.util.SourcePositions; import com.sun.source.util.TreePath; import com.sun.source.util.TreePathScanner; +import com.sun.source.util.Trees; import com.sun.tools.javac.api.JavacScope; +import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Symbol.CompletionFailure; import com.sun.tools.javac.code.Symbol.VarSymbol; @@ -119,8 +122,12 @@ import javax.lang.model.type.ExecutableType; import javax.lang.model.type.TypeKind; import javax.lang.model.util.ElementFilter; import javax.lang.model.util.Types; +import javax.tools.JavaCompiler; import javax.tools.JavaFileManager.Location; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; +import javax.tools.ToolProvider; import static jdk.jshell.Util.REPL_DOESNOTMATTER_CLASS_NAME; @@ -932,6 +939,12 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis { } } + //tweaked by tests to disable reading parameter names from classfiles so that tests using + //JDK's classes are stable for both release and fastdebug builds: + private final String[] keepParameterNames = new String[] { + "-XDsave-parameter-names=true" + }; + private String documentationImpl(String code, int cursor) { code = code.substring(0, cursor); if (code.trim().isEmpty()) { //TODO: comment handling @@ -942,7 +955,7 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis { return null; OuterWrap codeWrap = proc.outerMap.wrapInTrialClass(Wrap.methodWrap(code)); - AnalyzeTask at = proc.taskFactory.new AnalyzeTask(codeWrap); + AnalyzeTask at = proc.taskFactory.new AnalyzeTask(codeWrap, keepParameterNames); SourcePositions sp = at.trees().getSourcePositions(); CompilationUnitTree topLevel = at.firstCuTree(); TreePath tp = pathFor(topLevel, sp, codeWrap.snippetIndexToWrapIndex(cursor)); @@ -983,9 +996,11 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis { .collect(Collectors.toList()); } - return Util.stream(candidates) - .map(method -> Util.expunge(element2String(method.fst))) - .collect(joining("\n")); + try (SourceCache sourceCache = new SourceCache(at)) { + return Util.stream(candidates) + .map(method -> Util.expunge(element2String(sourceCache, method.fst))) + .collect(joining("\n")); + } } private boolean isEmptyArgumentsContext(List arguments) { @@ -996,19 +1011,173 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis { return false; } - private String element2String(Element el) { + private String element2String(SourceCache sourceCache, Element el) { + try { + if (hasSyntheticParameterNames(el)) { + el = sourceCache.getSourceMethod(el); + } + } catch (IOException ex) { + proc.debug(ex, "SourceCodeAnalysisImpl.element2String(..., " + el + ")"); + } + + return Util.expunge(elementHeader(el)); + } + + private boolean hasSyntheticParameterNames(Element el) { + if (el.getKind() != ElementKind.CONSTRUCTOR && el.getKind() != ElementKind.METHOD) + return false; + + ExecutableElement ee = (ExecutableElement) el; + + if (ee.getParameters().isEmpty()) + return false; + + return ee.getParameters() + .stream() + .allMatch(param -> param.getSimpleName().toString().startsWith("arg")); + } + + private final class SourceCache implements AutoCloseable { + private final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + private final Map> topLevelName2Signature2Method = new HashMap<>(); + private final AnalyzeTask originalTask; + private final StandardJavaFileManager fm; + + public SourceCache(AnalyzeTask originalTask) { + this.originalTask = originalTask; + List sources = findSources(); + if (sources.iterator().hasNext()) { + StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null); + try { + fm.setLocationFromPaths(StandardLocation.SOURCE_PATH, sources); + } catch (IOException ex) { + proc.debug(ex, "SourceCodeAnalysisImpl.SourceCache.(...)"); + fm = null; + } + this.fm = fm; + } else { + //don't waste time if there are no sources + this.fm = null; + } + } + + public Element getSourceMethod(Element method) throws IOException { + if (fm == null) + return method; + + TypeElement type = topLevelType(method); + + if (type == null) + return method; + + String binaryName = originalTask.task.getElements().getBinaryName(type).toString(); + + Map cache = topLevelName2Signature2Method.get(binaryName); + + if (cache == null) { + topLevelName2Signature2Method.put(binaryName, cache = createMethodCache(binaryName)); + } + + String handle = elementHeader(method, false); + + return cache.getOrDefault(handle, method); + } + + private TypeElement topLevelType(Element el) { + while (el != null && el.getEnclosingElement().getKind() != ElementKind.PACKAGE) { + el = el.getEnclosingElement(); + } + + return el != null && (el.getKind().isClass() || el.getKind().isInterface()) ? (TypeElement) el : null; + } + + private Map createMethodCache(String binaryName) throws IOException { + Pair source = findSource(binaryName); + + if (source == null) + return Collections.emptyMap(); + + Map signature2Method = new HashMap<>(); + Trees trees = Trees.instance(source.fst); + + new TreePathScanner() { + @Override @DefinedBy(Api.COMPILER_TREE) + public Void visitMethod(MethodTree node, Void p) { + Element currentMethod = trees.getElement(getCurrentPath()); + + if (currentMethod != null) { + signature2Method.put(elementHeader(currentMethod, false), currentMethod); + } + + return null; + } + }.scan(source.snd, null); + + return signature2Method; + } + + private Pair findSource(String binaryName) throws IOException { + JavaFileObject jfo = fm.getJavaFileForInput(StandardLocation.SOURCE_PATH, + binaryName, + JavaFileObject.Kind.SOURCE); + + if (jfo == null) + return null; + + List jfos = Arrays.asList(jfo); + JavacTaskImpl task = (JavacTaskImpl) compiler.getTask(null, fm, d -> {}, null, null, jfos); + Iterable cuts = task.parse(); + + task.enter(); + + return Pair.of(task, cuts.iterator().next()); + } + + @Override + public void close() { + try { + if (fm != null) { + fm.close(); + } + } catch (IOException ex) { + proc.debug(ex, "SourceCodeAnalysisImpl.SourceCache.close()"); + } + } + } + + private List availableSources; + + private List findSources() { + if (availableSources != null) { + return availableSources; + } + List result = new ArrayList<>(); + Path home = Paths.get(System.getProperty("java.home")); + Path srcZip = home.resolve("src.zip"); + if (!Files.isReadable(srcZip)) + srcZip = home.getParent().resolve("src.zip"); + if (Files.isReadable(srcZip)) + result.add(srcZip); + return availableSources = result; + } + + private String elementHeader(Element el) { + return elementHeader(el, true); + } + + private String elementHeader(Element el, boolean includeParameterNames) { switch (el.getKind()) { case ANNOTATION_TYPE: case CLASS: case ENUM: case INTERFACE: return ((TypeElement) el).getQualifiedName().toString(); case FIELD: - return element2String(el.getEnclosingElement()) + "." + el.getSimpleName() + ":" + el.asType(); + return elementHeader(el.getEnclosingElement()) + "." + el.getSimpleName() + ":" + el.asType(); case ENUM_CONSTANT: - return element2String(el.getEnclosingElement()) + "." + el.getSimpleName(); + return elementHeader(el.getEnclosingElement()) + "." + el.getSimpleName(); case EXCEPTION_PARAMETER: case LOCAL_VARIABLE: case PARAMETER: case RESOURCE_VARIABLE: return el.getSimpleName() + ":" + el.asType(); case CONSTRUCTOR: case METHOD: StringBuilder header = new StringBuilder(); - header.append(element2String(el.getEnclosingElement())); + header.append(elementHeader(el.getEnclosingElement())); if (el.getKind() == ElementKind.METHOD) { header.append("."); header.append(el.getSimpleName()); @@ -1026,8 +1195,10 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis { } else { header.append(p.asType()); } - header.append(" "); - header.append(p.getSimpleName()); + if (includeParameterNames) { + header.append(" "); + header.append(p.getSimpleName()); + } sep = ", "; } header.append(")"); diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java index ce34f5f16a6..fe0a3b73f74 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java @@ -215,17 +215,21 @@ class TaskFactory { private final Iterable cuts; - AnalyzeTask(final OuterWrap wrap) { - this(Collections.singletonList(wrap)); + AnalyzeTask(final OuterWrap wrap, String... extraArgs) { + this(Collections.singletonList(wrap), extraArgs); } - AnalyzeTask(final Collection wraps) { + AnalyzeTask(final Collection wraps, String... extraArgs) { this(wraps.stream(), new WrapSourceHandler(), - "-XDshouldStopPolicy=FLOW", "-Xlint:unchecked", "-XaddExports:jdk.jshell/jdk.internal.jshell.remote=ALL-UNNAMED", "-proc:none"); + Util.join(new String[] { + "-XDshouldStopPolicy=FLOW", "-Xlint:unchecked", + "-XaddExports:jdk.jshell/jdk.internal.jshell.remote=ALL-UNNAMED", + "-proc:none" + }, extraArgs)); } - AnalyzeTask(final Stream stream, SourceHandler sourceHandler, + private AnalyzeTask(final Stream stream, SourceHandler sourceHandler, String... extraOptions) { super(stream, sourceHandler, extraOptions); cuts = analyze(); @@ -264,7 +268,7 @@ class TaskFactory { CompileTask(final Collection wraps) { super(wraps.stream(), new WrapSourceHandler(), - "-Xlint:unchecked", "-XaddExports:jdk.jshell/jdk.internal.jshell.remote=ALL-UNNAMED", "-proc:none"); + "-Xlint:unchecked", "-XaddExports:jdk.jshell/jdk.internal.jshell.remote=ALL-UNNAMED", "-proc:none", "-parameters"); } boolean compile() { diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/Util.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/Util.java index 553e6c97fb3..413c30baa13 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/Util.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/Util.java @@ -25,6 +25,9 @@ package jdk.jshell; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -95,6 +98,15 @@ class Util { return StreamSupport.stream(iterable.spliterator(), false); } + static String[] join(String[] a1, String[] a2) { + List result = new ArrayList<>(); + + result.addAll(Arrays.asList(a1)); + result.addAll(Arrays.asList(a2)); + + return result.toArray(new String[0]); + } + static class Pair { final T first; final U second; diff --git a/langtools/test/Makefile b/langtools/test/Makefile index 0940c512fdc..f5b43ab0b0b 100644 --- a/langtools/test/Makefile +++ b/langtools/test/Makefile @@ -86,6 +86,8 @@ endif # Default JTREG to run ifdef JPRT_JTREG_HOME JTREG_HOME = $(JPRT_JTREG_HOME) +else ifdef JT_HOME + JTREG_HOME = $(JT_HOME) else JTREG_HOME = $(SLASH_JAVA)/re/jtreg/4.1-jigsaw/nightly/binaries/jtreg/ endif @@ -113,10 +115,12 @@ endif # # JT_JAVA is the version of java used to run jtreg/JCK. # -ifdef JPRT_JAVA_HOME - JT_JAVA = $(JPRT_JAVA_HOME) -else - JT_JAVA = $(SLASH_JAVA)/re/jdk/1.9.0/archive/fcs/binaries/$(PLATFORM)-$(ARCH) +ifndef JT_JAVA + ifdef JPRT_JAVA_HOME + JT_JAVA = $(JPRT_JAVA_HOME) + else + JT_JAVA = $(SLASH_JAVA)/re/jdk/1.9.0/archive/fcs/binaries/$(PLATFORM)-$(ARCH) + endif endif # Default JDK to test @@ -149,6 +153,10 @@ ifdef TESTBOOTCLASSPATH -refvmoptions:-Xbootclasspath/p:$(TESTBOOTCLASSPATH) endif +ifdef EXTRA_JTREG_OPTIONS + JTREG_OPTIONS += $(EXTRA_JTREG_OPTIONS) +endif + # Concurrency is the number of tests that can execute at once. # On an otherwise empty machine, suggest setting to (#cpus + 2) # If unset, the default is (#cpus) @@ -262,6 +270,12 @@ javah: JTREG_TESTDIRS = tools/javah javap: JTREG_TESTDIRS = tools/javap jdeps: JTREG_TESTDIRS = tools/jdeps +# a way to select jtreg tests from outside +ifdef TEST_SELECTION + JTREG_TESTDIRS = $(TEST_SELECTION) +endif + + # Run jtreg tests # # JTREG_HOME @@ -290,13 +304,13 @@ jtreg-tests: check-jtreg FRC -J-Xmx512m \ -vmoption:-Xmx768m \ -a -ignore:quiet $(if $(JTREG_VERBOSE),-v:$(JTREG_VERBOSE)) \ - -r:$(JTREG_OUTPUT_DIR)/JTreport \ - -w:$(JTREG_OUTPUT_DIR)/JTwork \ - -jdk:$(TESTJAVA) \ - $(JAVA_ARGS:%=-vmoption:%) \ - $(JTREG_EXCLUSIONS) \ + -r:$(JTREG_OUTPUT_DIR)/JTreport \ + -w:$(JTREG_OUTPUT_DIR)/JTwork \ + -jdk:$(TESTJAVA) \ + $(JAVA_ARGS:%=-vmoption:%) \ + $(JTREG_EXCLUSIONS) \ $(JTREG_OPTIONS) \ - $(JTREG_TESTDIRS) \ + $(JTREG_TESTDIRS) \ || ( $(call EXIT_IF_FATAL,$(FATAL_JTREG_EXIT)) ; \ echo $$status > $(JTREG_OUTPUT_DIR)/status.txt \ ) diff --git a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java index d887c0933a7..1848e172ab7 100644 --- a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java +++ b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8154119 + * @bug 8154119 8154262 * @summary Test modules support in javadoc. * @author bpatel * @library ../lib @@ -41,46 +41,58 @@ public class TestModules extends JavadocTester { @Test void test1() { - javadoc("-d", "out", + javadoc("-d", "out", "-use", "-modulesourcepath", testSrc, "-addmods", "module1,module2", "testpkgmdl1", "testpkgmdl2"); checkExit(Exit.OK); testDescription(true); testNoDescription(false); + testModuleLink(); } @Test void test2() { - javadoc("-d", "out-html5", "-html5", + javadoc("-d", "out-html5", "-html5", "-use", "-modulesourcepath", testSrc, "-addmods", "module1,module2", "testpkgmdl1", "testpkgmdl2"); checkExit(Exit.OK); testHtml5Description(true); testHtml5NoDescription(false); + testModuleLink(); } @Test void test3() { - javadoc("-d", "out-nocomment", "-nocomment", + javadoc("-d", "out-nocomment", "-nocomment", "-use", "-modulesourcepath", testSrc, "-addmods", "module1,module2", "testpkgmdl1", "testpkgmdl2"); checkExit(Exit.OK); testDescription(false); testNoDescription(true); + testModuleLink(); } @Test void test4() { - javadoc("-d", "out-html5-nocomment", "-nocomment", "-html5", + javadoc("-d", "out-html5-nocomment", "-nocomment", "-html5", "-use", "-modulesourcepath", testSrc, "-addmods", "module1,module2", "testpkgmdl1", "testpkgmdl2"); checkExit(Exit.OK); testHtml5Description(false); testHtml5NoDescription(true); + testModuleLink(); + } + + @Test + void test5() { + javadoc("-d", "out-nomodule", "-use", + "-sourcepath", testSrc, + "testpkgnomodule"); + checkExit(Exit.OK); } void testDescription(boolean found) { @@ -142,4 +154,37 @@ public class TestModules extends JavadocTester { + "
    • \n" + ""); } + + void testModuleLink() { + checkOutput("overview-summary.html", true, + "
    • Module
    • "); + checkOutput("module1-summary.html", true, + "
    • Module
    • "); + checkOutput("module2-summary.html", true, + "
    • Module
    • "); + checkOutput("testpkgmdl1/package-summary.html", true, + "
    • Module
    • "); + checkOutput("testpkgmdl1/TestClassInModule1.html", true, + "
    • Module
    • "); + checkOutput("testpkgmdl1/class-use/TestClassInModule1.html", true, + "
    • Module
    • "); + checkOutput("testpkgmdl2/package-summary.html", true, + "
    • Module
    • "); + checkOutput("testpkgmdl2/TestClassInModule2.html", true, + "
    • Module
    • "); + checkOutput("testpkgmdl2/class-use/TestClassInModule2.html", true, + "
    • Module
    • "); + } + + void testNoModuleLink() { + checkOutput("testpkgnomodule/package-summary.html", true, + "
        \n" + + "
      • Package
      • "); + checkOutput("testpkgnomodule/TestClassNoModule.html", true, + "
          \n" + + "
        • Package
        • "); + checkOutput("testpkgnomodule/class-use/TestClassNoModule.html", true, + "
            \n" + + "
          • Package
          • "); + } } diff --git a/jdk/src/java.httpclient/share/classes/java/net/http/HttpHeaders1.java b/langtools/test/jdk/javadoc/doclet/testModules/testpkgnomodule/TestClassNoModule.java similarity index 85% rename from jdk/src/java.httpclient/share/classes/java/net/http/HttpHeaders1.java rename to langtools/test/jdk/javadoc/doclet/testModules/testpkgnomodule/TestClassNoModule.java index c9ff689a931..018413ec8a0 100644 --- a/jdk/src/java.httpclient/share/classes/java/net/http/HttpHeaders1.java +++ b/langtools/test/jdk/javadoc/doclet/testModules/testpkgnomodule/TestClassNoModule.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -20,10 +20,9 @@ * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any + * questions. */ +package testpkgnomodule; -package java.net.http; - -public interface HttpHeaders1 extends HttpHeaders { - public void makeUnmodifiable(); +public class TestClassNoModule { } diff --git a/langtools/test/jdk/jshell/CompletionSuggestionTest.java b/langtools/test/jdk/jshell/CompletionSuggestionTest.java index 10b7b94a2aa..beb5a783a00 100644 --- a/langtools/test/jdk/jshell/CompletionSuggestionTest.java +++ b/langtools/test/jdk/jshell/CompletionSuggestionTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8141092 + * @bug 8141092 8153761 * @summary Test Completion * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -34,14 +34,20 @@ * @run testng CompletionSuggestionTest */ +import java.io.IOException; +import java.lang.reflect.Field; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; import java.util.Set; import java.util.HashSet; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; import jdk.jshell.Snippet; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static jdk.jshell.Snippet.Status.VALID; @@ -295,10 +301,11 @@ public class CompletionSuggestionTest extends KullaTesting { assertCompletion("import inner.|"); } - public void testDocumentation() { + public void testDocumentation() throws Exception { + dontReadParameterNamesFromClassFile(); assertDocumentation("System.getProperty(|", - "java.lang.System.getProperty(java.lang.String arg0)", - "java.lang.System.getProperty(java.lang.String arg0, java.lang.String arg1)"); + "java.lang.System.getProperty(java.lang.String key)", + "java.lang.System.getProperty(java.lang.String key, java.lang.String def)"); assertEval("char[] chars = null;"); assertDocumentation("new String(chars, |", "java.lang.String(char[] arg0, int arg1, int arg2)"); @@ -313,7 +320,8 @@ public class CompletionSuggestionTest extends KullaTesting { "java.lang.String.getBytes(java.nio.charset.Charset arg0)"); } - public void testMethodsWithNoArguments() { + public void testMethodsWithNoArguments() throws Exception { + dontReadParameterNamesFromClassFile(); assertDocumentation("System.out.println(|", "java.io.PrintStream.println()", "java.io.PrintStream.println(boolean arg0)", @@ -442,29 +450,30 @@ public class CompletionSuggestionTest extends KullaTesting { public void testDocumentationOfUserDefinedMethods() { assertEval("void f() {}"); assertDocumentation("f(|", "f()"); - assertEval("void f(int a) {}"); - assertDocumentation("f(|", "f()", "f(int arg0)"); - assertEval(" void f(T... a) {}", DiagCheck.DIAG_WARNING, DiagCheck.DIAG_OK); - assertDocumentation("f(|", "f()", "f(int arg0)", "f(T... arg0)"); + assertEval("void f(int i) {}"); + assertDocumentation("f(|", "f()", "f(int i)"); + assertEval(" void f(T... ts) {}", DiagCheck.DIAG_WARNING, DiagCheck.DIAG_OK); + assertDocumentation("f(|", "f()", "f(int i)", "f(T... ts)"); assertEval("class A {}"); assertEval("void f(A a) {}"); - assertDocumentation("f(|", "f()", "f(int arg0)", "f(T... arg0)", "f(A arg0)"); + assertDocumentation("f(|", "f()", "f(int i)", "f(T... ts)", "f(A a)"); } public void testDocumentationOfUserDefinedConstructors() { Snippet a = classKey(assertEval("class A {}")); assertDocumentation("new A(|", "A()"); - Snippet a2 = classKey(assertEval("class A { A() {} A(int a) {}}", + Snippet a2 = classKey(assertEval("class A { A() {} A(int i) {}}", ste(MAIN_SNIPPET, VALID, VALID, true, null), ste(a, VALID, OVERWRITTEN, false, MAIN_SNIPPET))); - assertDocumentation("new A(|", "A()", "A(int arg0)"); - assertEval("class A { A(T a) {} A(int a) {}}", + assertDocumentation("new A(|", "A()", "A(int i)"); + assertEval("class A { A(T t) {} A(int i) {}}", ste(MAIN_SNIPPET, VALID, VALID, true, null), ste(a2, VALID, OVERWRITTEN, false, MAIN_SNIPPET)); - assertDocumentation("new A(|", "A(T arg0)", "A(int arg0)"); + assertDocumentation("new A(|", "A(T t)", "A(int i)"); } - public void testDocumentationOfOverriddenMethods() { + public void testDocumentationOfOverriddenMethods() throws Exception { + dontReadParameterNamesFromClassFile(); assertDocumentation("\"\".wait(|", "java.lang.Object.wait(long arg0)", "java.lang.Object.wait(long arg0, int arg1)", @@ -502,13 +511,13 @@ public class CompletionSuggestionTest extends KullaTesting { assertEval("void method(int n, Object o) { }"); assertEval("void method(Object n, int o) { }"); assertDocumentation("method(primitive,|", - "method(int arg0, java.lang.Object arg1)", - "method(java.lang.Object arg0, int arg1)"); + "method(int n, java.lang.Object o)", + "method(java.lang.Object n, int o)"); assertDocumentation("method(boxed,|", - "method(int arg0, java.lang.Object arg1)", - "method(java.lang.Object arg0, int arg1)"); + "method(int n, java.lang.Object o)", + "method(java.lang.Object n, int o)"); assertDocumentation("method(object,|", - "method(java.lang.Object arg0, int arg1)"); + "method(java.lang.Object n, int o)"); } public void testVarArgs() { @@ -546,4 +555,36 @@ public class CompletionSuggestionTest extends KullaTesting { assertEval("class Foo { static void m(String str) {} static void m(Baz baz) {} }"); assertCompletion("Foo.m(new Baz<>(|", true, "str"); } + + @BeforeMethod + public void setUp() { + super.setUp(); + + Path srcZip = Paths.get("src.zip"); + + try (JarOutputStream out = new JarOutputStream(Files.newOutputStream(srcZip))) { + out.putNextEntry(new JarEntry("java/lang/System.java")); + out.write(("package java.lang;\n" + + "public class System {\n" + + " public String getProperty(String key) { return null; }\n" + + " public String getProperty(String key, String def) { return def; }\n" + + "}\n").getBytes()); + } catch (IOException ex) { + throw new IllegalStateException(ex); + } + + try { + Field availableSources = getAnalysis().getClass().getDeclaredField("availableSources"); + availableSources.setAccessible(true); + availableSources.set(getAnalysis(), Arrays.asList(srcZip)); + } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException ex) { + throw new IllegalStateException(ex); + } + } + + private void dontReadParameterNamesFromClassFile() throws Exception { + Field keepParameterNames = getAnalysis().getClass().getDeclaredField("keepParameterNames"); + keepParameterNames.setAccessible(true); + keepParameterNames.set(getAnalysis(), new String[0]); + } } diff --git a/langtools/test/tools/javac/6330997/T6330997.java b/langtools/test/tools/javac/6330997/T6330997.java index c5de10eefba..8fa38415296 100644 --- a/langtools/test/tools/javac/6330997/T6330997.java +++ b/langtools/test/tools/javac/6330997/T6330997.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,8 +32,8 @@ * jdk.compiler/com.sun.tools.javac.main * jdk.compiler/com.sun.tools.javac.util * @clean T1 T2 - * @compile -source 8 -target 8 T1.java - * @compile -source 8 -target 8 T2.java + * @compile -source 9 -target 9 T1.java + * @compile -source 9 -target 9 T2.java * @run main/othervm T6330997 */ diff --git a/langtools/test/tools/javac/classfiles/ClassVersionChecker.java b/langtools/test/tools/javac/classfiles/ClassVersionChecker.java index 0ab5aee4a0a..419ec1313da 100644 --- a/langtools/test/tools/javac/classfiles/ClassVersionChecker.java +++ b/langtools/test/tools/javac/classfiles/ClassVersionChecker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,7 @@ import java.util.regex.*; public class ClassVersionChecker { int errors; - String[] jdk = {"","1.6","1.7","1.8"}; + String[] jdk = {"", "1.6", "1.7", "1.8", "1.9"}; File javaFile = null; public static void main(String[] args) throws Throwable { @@ -58,10 +58,10 @@ public class ClassVersionChecker { * -1 => invalid combinations */ int[][] ver = - {{52, -1, -1, -1}, - {52, 50, 51, 52}, - {52, -1, 51, 52}, - {52, -1, -1, 52}}; + {{53, -1, -1, -1, -1}, + {53, 50, 51, 52, 53}, + {53, -1, 51, 52, 53}, + {53, -1, -1, 52, 53}}; // Loop to run all possible combinations of source/target values for (int i = 0; i< ver.length; i++) { diff --git a/langtools/test/tools/javac/importscope/TestDeepFinishClassStack.java b/langtools/test/tools/javac/importscope/TestDeepFinishClassStack.java new file mode 100644 index 00000000000..0b7bc3e18b3 --- /dev/null +++ b/langtools/test/tools/javac/importscope/TestDeepFinishClassStack.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8156097 + * @summary Check that nested TypeEnter.MembersPhase invocations don't cause StackOverflowError + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + */ +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import toolbox.JavacTask; +import toolbox.ToolBox; + +public class TestDeepFinishClassStack { + public static void main(String... args) throws IOException { + new TestDeepFinishClassStack().run(); + } + + int depth = 1000; + + void run() throws IOException { + Path src = Paths.get("src"); + + Files.createDirectories(src); + + ToolBox tb = new ToolBox(); + + for (int i = 0; i < depth; i++) { + tb.writeJavaFiles(src, "public class C" + i + " { public void test(C" + (i + 1) + " c) { } }"); + } + + tb.writeJavaFiles(src, "public class C" + depth + " { }"); + + new JavacTask(tb).files(src.resolve("C0.java")) + .sourcepath(src) + .outdir(".") + .run() + .writeAll(); + } + +} diff --git a/langtools/test/tools/javac/versions/Versions.java b/langtools/test/tools/javac/versions/Versions.java index f4a6eaeb26f..f90f44935c9 100644 --- a/langtools/test/tools/javac/versions/Versions.java +++ b/langtools/test/tools/javac/versions/Versions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,16 +61,14 @@ public class Versions { void run() { - String jdk9cv = "52.0"; // class version.change when ./dev pushed to 53 - String TC = ""; System.out.println("Version.java: Starting"); - check("52.0"); - check("52.0", "-source 1.6"); - check("52.0", "-source 1.7"); - check("52.0", "-source 1.8"); - check(jdk9cv, "-source 1.9"); + check("53.0"); + check("53.0", "-source 1.6"); + check("53.0", "-source 1.7"); + check("53.0", "-source 1.8"); + check("53.0", "-source 1.9"); check_source_target("50.0", "6", "6"); check_source_target("51.0", "6", "7"); @@ -78,10 +76,10 @@ public class Versions { check_source_target("52.0", "6", "8"); check_source_target("52.0", "7", "8"); check_source_target("52.0", "8", "8"); - check_source_target(jdk9cv, "6", "9"); - check_source_target(jdk9cv, "7", "9"); - check_source_target(jdk9cv, "8", "9"); - check_source_target(jdk9cv, "9", "9"); + check_source_target("53.0", "6", "9"); + check_source_target("53.0", "7", "9"); + check_source_target("53.0", "8", "9"); + check_source_target("53.0", "9", "9"); checksrc16("-source 1.6"); checksrc16("-source 6"); diff --git a/make/Images.gmk b/make/Images.gmk index 302bc2b3e42..564f2b27ddb 100644 --- a/make/Images.gmk +++ b/make/Images.gmk @@ -114,8 +114,18 @@ JMODS := $(wildcard $(IMAGES_OUTPUTDIR)/jmods/*.jmod) # Use this file inside the image as target for make rule JIMAGE_TARGET_FILE := bin/java$(EXE_SUFFIX) +JLINK_ORDER_RESOURCES := \ + *module-info.class* \ + @$(SUPPORT_OUTPUTDIR)/classlist/classlist,/java.base/java/* \ + /java.base/jdk/* \ + /java.base/sun/* \ + /java.base/com/* \ + /jdk.localedata/* \ + # + JLINK_TOOL := $(JLINK) --modulepath $(IMAGES_OUTPUTDIR)/jmods \ --endian $(OPENJDK_BUILD_CPU_ENDIAN) \ + --order-resources=$(call CommaList, $(JLINK_ORDER_RESOURCES)) \ --release-info $(BASE_RELEASE_FILE) ifeq ($(JLINK_KEEP_PACKAGED_MODULES), true) diff --git a/make/common/NativeCompilation.gmk b/make/common/NativeCompilation.gmk index d595e044013..db09eb5bbf3 100644 --- a/make/common/NativeCompilation.gmk +++ b/make/common/NativeCompilation.gmk @@ -770,13 +770,20 @@ define SetupNativeCompilationBody $$(call ExecuteWithLog, $$@, \ $$($1_RC) $$($1_RC_FLAGS) $$($1_SYSROOT_CFLAGS) $(CC_OUT_OPTION)$$@ \ $$($1_VERSIONINFO_RESOURCE)) - # Windows RC compiler does not support -showIncludes, so we mis-use CL for this. + # Windows RC compiler does not support -showIncludes, so we mis-use CL + # for this. Filter out RC specific arguments that are unknown to CL. + # For some unknown reason, in this case CL actually outputs the show + # includes to stderr so need to redirect it to hide the output from the + # main log. $$(call ExecuteWithLog, $$($1_RES_DEP).obj, \ - $$($1_CC) $$($1_RC_FLAGS) $$($1_SYSROOT_CFLAGS) -showIncludes -nologo -TC \ - $(CC_OUT_OPTION)$$($1_RES_DEP).obj -P -Fi$$($1_RES_DEP).pp \ - $$($1_VERSIONINFO_RESOURCE)) > $$($1_RES_DEP).raw 2>&1 || true ; \ + $$($1_CC) $$(filter-out -l%, $$($1_RC_FLAGS)) \ + $$($1_SYSROOT_CFLAGS) -showIncludes -nologo -TC \ + $(CC_OUT_OPTION)$$($1_RES_DEP).obj -P -Fi$$($1_RES_DEP).pp \ + $$($1_VERSIONINFO_RESOURCE)) 2>&1 \ + | $(GREP) -v -e "^Note: including file:" \ + -e "^$$(notdir $$($1_VERSIONINFO_RESOURCE))$$$$" || test "$$$$?" = "1" ; \ $(ECHO) $$($1_RES): \\ > $$($1_RES_DEP) ; \ - $(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN) $$($1_RES_DEP).raw >> $$($1_RES_DEP) ; \ + $(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN) $$($1_RES_DEP).obj.log >> $$($1_RES_DEP) ; \ $(SED) $(DEPENDENCY_TARGET_SED_PATTERN) $$($1_RES_DEP) > $$($1_RES_DEP_TARGETS) endif endif diff --git a/make/idea/idea.gmk b/make/idea/idea.gmk new file mode 100644 index 00000000000..329c01cd5ea --- /dev/null +++ b/make/idea/idea.gmk @@ -0,0 +1,39 @@ +include Makefile +include make/MainSupport.gmk + +.PHONY: idea + +ifeq ($(SPEC),) + ifneq ($(words $(SPECS)),1) + @echo "Error: Multiple build specification files found. Please select one explicitly." + @exit 2 + endif + idea: + @cd $(topdir) + @$(MAKE) $(MFLAGS) $(MAKE_LOG_FLAGS) -r -R -j 1 -f $(topdir)/make/idea/idea.gmk SPEC=$(SPECS) HAS_SPEC=true ACTUAL_TOPDIR=$(topdir) MODULES="$(MODULES)" idea +else #with SPEC + include make/common/Modules.gmk + + ifeq ($(MODULES),) + SEL_MODULES := $(call FindAllModules) + else + SEL_MODULES := $(MODULES) + endif + + # Find all source dirs for a particular module + # $1 - Module to find source dirs for + FindIdeaModuleSrcDirs = \ + $(strip $(addsuffix /$(strip $1), $(GENERATED_SRC_DIRS) $(IMPORT_MODULES_SRC)) \ + $(wildcard $(foreach sub, $(SRC_SUBDIRS), $(addsuffix /$(strip $1)/$(sub), $(TOP_SRC_DIRS))))) + + + idea: + $(ECHO) "SUPPORT=$(SUPPORT_OUTPUTDIR)" >> $(OUT) + $(ECHO) "MODULE_ROOTS=\"$(foreach mod, $(SEL_MODULES), $(call FindIdeaModuleSrcDirs,$(mod)))\"" >> $(OUT) + $(ECHO) "MODULE_NAMES=\"$(strip $(foreach mod, $(SEL_MODULES), $(mod)))\"" >> $(OUT) + $(ECHO) "SEL_MODULES=\"$(SEL_MODULES)\"" >> $(OUT) + $(ECHO) "BOOT_JDK=\"$(BOOT_JDK)\"" >> $(OUT) + $(ECHO) "CYGPATH=\"$(CYGPATH)\"" >> $(OUT) + $(ECHO) "SPEC=\"$(SPEC)\"" >> $(OUT) + +endif diff --git a/make/idea/template/.name b/make/idea/template/.name new file mode 100644 index 00000000000..b4835685793 --- /dev/null +++ b/make/idea/template/.name @@ -0,0 +1 @@ +jdk diff --git a/make/idea/template/ant.xml b/make/idea/template/ant.xml new file mode 100644 index 00000000000..6e72e478cbc --- /dev/null +++ b/make/idea/template/ant.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/make/idea/template/build.xml b/make/idea/template/build.xml new file mode 100644 index 00000000000..ed62f296726 --- /dev/null +++ b/make/idea/template/build.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/make/idea/template/compiler.xml b/make/idea/template/compiler.xml new file mode 100644 index 00000000000..f801895e7f7 --- /dev/null +++ b/make/idea/template/compiler.xml @@ -0,0 +1,35 @@ + + + + + \ No newline at end of file diff --git a/make/idea/template/copyright/profiles_settings.xml b/make/idea/template/copyright/profiles_settings.xml new file mode 100644 index 00000000000..7d61b5cdf1f --- /dev/null +++ b/make/idea/template/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + diff --git a/make/idea/template/jdk.iml b/make/idea/template/jdk.iml new file mode 100644 index 00000000000..5e1436c949a --- /dev/null +++ b/make/idea/template/jdk.iml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/make/idea/template/misc.xml b/make/idea/template/misc.xml new file mode 100644 index 00000000000..e5caa22e0d6 --- /dev/null +++ b/make/idea/template/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/make/idea/template/modules.xml b/make/idea/template/modules.xml new file mode 100644 index 00000000000..2d8401d0398 --- /dev/null +++ b/make/idea/template/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/make/idea/template/scopes/scope_settings.xml b/make/idea/template/scopes/scope_settings.xml new file mode 100644 index 00000000000..db1b8ba4462 --- /dev/null +++ b/make/idea/template/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + diff --git a/make/idea/template/src/idea/JdkIdeaAntLogger.java b/make/idea/template/src/idea/JdkIdeaAntLogger.java new file mode 100644 index 00000000000..9913499e7a0 --- /dev/null +++ b/make/idea/template/src/idea/JdkIdeaAntLogger.java @@ -0,0 +1,373 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package idea; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.BuildListener; +import org.apache.tools.ant.DefaultLogger; +import org.apache.tools.ant.Project; + +import java.util.EnumSet; +import java.util.Stack; + +import static org.apache.tools.ant.Project.*; + +/** + * This class is used to wrap the IntelliJ ant logger in order to provide more meaningful + * output when building langtools. The basic ant output in IntelliJ can be quite cumbersome to + * work with, as it provides two separate views: (i) a tree view, which is good to display build task + * in a hierarchical fashion as they are processed; and a (ii) plain text view, which gives you + * the full ant output. The main problem is that javac-related messages are buried into the + * ant output (which is made very verbose by IntelliJ in order to support the tree view). It is + * not easy to figure out which node to expand in order to see the error message; switching + * to plain text doesn't help either, as now the output is totally flat. + * + * This logger class removes a lot of verbosity from the IntelliJ ant logger by not propagating + * all the events to the IntelliJ's logger. In addition, certain events are handled in a custom + * fashion, to generate better output during the build. + */ +public final class JdkIdeaAntLogger extends DefaultLogger { + + /** + * This is just a way to pass in customized binary string predicates; + * + * TODO: replace with @code{BiPredicate} and method reference when moving to 8 + */ + enum StringBinaryPredicate { + CONTAINS() { + @Override + boolean apply(String s1, String s2) { + return s1.contains(s2); + } + }, + STARTS_WITH { + @Override + boolean apply(String s1, String s2) { + return s1.startsWith(s2); + } + }, + MATCHES { + @Override + boolean apply(String s1, String s2) { + return s1.matches(s2); + } + }; + + abstract boolean apply(String s1, String s2); + } + + /** + * Various kinds of ant messages that we shall intercept + */ + enum MessageKind { + + /** a make error */ + MAKE_ERROR(StringBinaryPredicate.CONTAINS, MSG_ERR, "error:", "compiler.err"), + /** a make warning */ + MAKE_WARNING(StringBinaryPredicate.CONTAINS, MSG_WARN, "warning:", "compiler.warn"), + /** a make note */ + MAKE_NOTE(StringBinaryPredicate.CONTAINS, MSG_INFO, "note:", "compiler.note"), + /** std make output */ + MAKE_OTHER(StringBinaryPredicate.MATCHES, MSG_INFO, ".*"), + /** a javac crash */ + JAVAC_CRASH(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "An exception has occurred in the compiler"), + /** jtreg test success */ + JTREG_TEST_PASSED(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "Passed: "), + /** jtreg test failure */ + JTREG_TEST_FAILED(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "FAILED: "), + /** jtreg test error */ + JTREG_TEST_ERROR(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "Error: "); + + StringBinaryPredicate sbp; + int priority; + String[] keys; + + MessageKind(StringBinaryPredicate sbp, int priority, String... keys) { + this.sbp = sbp; + this.priority = priority; + this.keys = keys; + } + + /** + * Does a given message string matches this kind? + */ + boolean matches(String s) { + for (String key : keys) { + if (sbp.apply(s, key)) { + return true; + } + } + return false; + } + } + + /** + * This enum is used to represent the list of tasks we need to keep track of during logging. + */ + enum Task { + /** javac task - invoked during compilation */ + MAKE("exec", MessageKind.MAKE_ERROR, MessageKind.MAKE_WARNING, MessageKind.MAKE_NOTE, + MessageKind.MAKE_OTHER, MessageKind.JAVAC_CRASH), + /** jtreg task - invoked during test execution */ + JTREG("jtreg", MessageKind.JTREG_TEST_PASSED, MessageKind.JTREG_TEST_FAILED, MessageKind.JTREG_TEST_ERROR), + /** initial synthetic task when the logger is created */ + ROOT("") { + @Override + boolean matches(String s) { + return false; + } + }, + /** synthetic task catching any other tasks not in this list */ + ANY("") { + @Override + boolean matches(String s) { + return true; + } + }; + + String taskName; + MessageKind[] msgs; + + Task(String taskName, MessageKind... msgs) { + this.taskName = taskName; + this.msgs = msgs; + } + + boolean matches(String s) { + return s.equals(taskName); + } + } + + /** + * This enum is used to represent the list of targets we need to keep track of during logging. + * A regular expression is used to match a given target name. + */ + enum Target { + /** jtreg target - executed when launching tests */ + JTREG("jtreg") { + @Override + String getDisplayMessage(BuildEvent e) { + return "Running jtreg tests: " + e.getProject().getProperty("jtreg.tests"); + } + }, + /** build selected modules */ + BUILD_MODULE("build-module") { + @Override + String getDisplayMessage(BuildEvent e) { + return "Building modules: " + e.getProject().getProperty("module.name") + "..."; + } + }, + /** build images */ + BUILD_IMAGES("images") { + @Override + String getDisplayMessage(BuildEvent e) { + return "Building images..."; + } + }, + /** build images */ + CONFIGURE("-do-configure") { + @Override + String getDisplayMessage(BuildEvent e) { + return "Configuring build..."; + } + }, + /** synthetic target catching any other target not in this list */ + ANY("") { + @Override + String getDisplayMessage(BuildEvent e) { + return "Executing Ant target(s): " + e.getProject().getProperty("ant.project.invoked-targets"); + } + @Override + boolean matches(String msg) { + return true; + } + }; + + String targetRegex; + + Target(String targetRegex) { + this.targetRegex = targetRegex; + } + + boolean matches(String msg) { + return msg.matches(targetRegex); + } + + abstract String getDisplayMessage(BuildEvent e); + } + + /** + * A custom build event used to represent status changes which should be notified inside + * Intellij + */ + static class StatusEvent extends BuildEvent { + + /** the target to which the status update refers */ + Target target; + + StatusEvent(BuildEvent e, Target target) { + super(new StatusTask(e, target.getDisplayMessage(e))); + this.target = target; + setMessage(getTask().getTaskName(), 2); + } + + /** + * A custom task used to channel info regarding a status change + */ + static class StatusTask extends org.apache.tools.ant.Task { + StatusTask(BuildEvent event, String msg) { + setProject(event.getProject()); + setOwningTarget(event.getTarget()); + setTaskName(msg); + } + } + } + + /** wrapped ant logger (IntelliJ's own logger) */ + DefaultLogger logger; + + /** flag - is this the first target we encounter? */ + boolean firstTarget = true; + + /** flag - should subsequenet failures be suppressed ? */ + boolean suppressTaskFailures = false; + + /** flag - have we ran into a javac crash ? */ + boolean crashFound = false; + + /** stack of status changes associated with pending targets */ + Stack statusEvents = new Stack<>(); + + /** stack of pending tasks */ + Stack tasks = new Stack<>(); + + public JdkIdeaAntLogger(Project project) { + for (Object o : project.getBuildListeners()) { + if (o instanceof DefaultLogger) { + this.logger = (DefaultLogger)o; + project.removeBuildListener((BuildListener)o); + project.addBuildListener(this); + } + } + tasks.push(Task.ROOT); + } + + @Override + public void buildStarted(BuildEvent event) { + //do nothing + } + + @Override + public void buildFinished(BuildEvent event) { + //do nothing + } + + @Override + public void targetStarted(BuildEvent event) { + EnumSet statusKinds = firstTarget ? + EnumSet.allOf(Target.class) : + EnumSet.complementOf(EnumSet.of(Target.ANY)); + + String targetName = event.getTarget().getName(); + + for (Target statusKind : statusKinds) { + if (statusKind.matches(targetName)) { + StatusEvent statusEvent = new StatusEvent(event, statusKind); + statusEvents.push(statusEvent); + logger.taskStarted(statusEvent); + firstTarget = false; + return; + } + } + } + + @Override + public void targetFinished(BuildEvent event) { + if (!statusEvents.isEmpty()) { + StatusEvent lastEvent = statusEvents.pop(); + if (lastEvent.target.matches(event.getTarget().getName())) { + logger.taskFinished(lastEvent); + } + } + } + + @Override + public void taskStarted(BuildEvent event) { + String taskName = event.getTask().getTaskName(); + System.err.println("task started " + taskName); + for (Task task : Task.values()) { + if (task.matches(taskName)) { + tasks.push(task); + return; + } + } + } + + @Override + public void taskFinished(BuildEvent event) { + if (tasks.peek() == Task.ROOT) { + //we need to 'close' the root task to get nicer output + logger.taskFinished(event); + } else if (!suppressTaskFailures && event.getException() != null) { + //the first (innermost) task failure should always be logged + event.setMessage(event.getException().toString(), 0); + event.setException(null); + //note: we turn this into a plain message to avoid stack trace being logged by Idea + logger.messageLogged(event); + suppressTaskFailures = true; + } + tasks.pop(); + } + + @Override + public void messageLogged(BuildEvent event) { + String msg = event.getMessage(); + + boolean processed = false; + + if (!tasks.isEmpty()) { + Task task = tasks.peek(); + for (MessageKind messageKind : task.msgs) { + if (messageKind.matches(msg)) { + event.setMessage(msg, messageKind.priority); + processed = true; + if (messageKind == MessageKind.JAVAC_CRASH) { + crashFound = true; + } + break; + } + } + } + + if (event.getPriority() == MSG_ERR || crashFound) { + //we log errors regardless of owning task + logger.messageLogged(event); + suppressTaskFailures = true; + } else if (processed) { + logger.messageLogged(event); + } + } +} diff --git a/make/idea/template/vcs.xml b/make/idea/template/vcs.xml new file mode 100644 index 00000000000..876d3cd2ef8 --- /dev/null +++ b/make/idea/template/vcs.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/make/idea/template/workspace.xml b/make/idea/template/workspace.xml new file mode 100644 index 00000000000..2423c3d41fb --- /dev/null +++ b/make/idea/template/workspace.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nashorn/.hgtags b/nashorn/.hgtags index 3a4c6daf2fb..2140054b988 100644 --- a/nashorn/.hgtags +++ b/nashorn/.hgtags @@ -351,3 +351,4 @@ ba21793a0e4816283cc0ecdab5142a4959363529 jdk-9+114 295ac208a4443d433214d0c1f32d2ea45a3a32d2 jdk-9+115 208388a5622dcca8227d6ad6c268f2c88087d283 jdk-9+116 5267e91811614bac129817e566f730e9d63cf22a jdk-9+117 +05679aac2f7ec3d8dd2a96d7e7899906224bf5cf jdk-9+118 diff --git a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/DynamicLinker.java b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/DynamicLinker.java index be981997107..703fd6ced2c 100644 --- a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/DynamicLinker.java +++ b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/DynamicLinker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -83,6 +83,7 @@ package jdk.dynalink; +import java.lang.StackWalker.StackFrame; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -172,6 +173,8 @@ public final class DynamicLinker { private static final String INITIAL_LINK_METHOD_NAME = "linkCallSite"; private static final String INVOKE_PACKAGE_PREFIX = "java.lang.invoke."; + private static final StackWalker stackWalker = StackWalker.getInstance(StackWalker.Option.SHOW_HIDDEN_FRAMES); + private final LinkerServices linkerServices; private final GuardedInvocationTransformer prelinkTransformer; private final boolean syncOnRelink; @@ -300,21 +303,16 @@ public final class DynamicLinker { * site is being linked. */ public static StackTraceElement getLinkedCallSiteLocation() { - final StackTraceElement[] trace = new Throwable().getStackTrace(); - for(int i = 0; i < trace.length - 1; ++i) { - final StackTraceElement frame = trace[i]; - // If we found any of our linking entry points on the stack... - if(isRelinkFrame(frame) || isInitialLinkFrame(frame)) { + return stackWalker.walk(s -> s + // Find one of our linking entry points on the stack... + .dropWhile(f -> !(isRelinkFrame(f) || isInitialLinkFrame(f))) + .skip(1) // ... then look for the first thing calling it that isn't j.l.invoke - for (int j = i + 1; j < trace.length; ++j) { - final StackTraceElement frame2 = trace[j]; - if (!frame2.getClassName().startsWith(INVOKE_PACKAGE_PREFIX)) { - return frame2; - } - } - } - } - return null; + .dropWhile(f -> f.getClassName().startsWith(INVOKE_PACKAGE_PREFIX)) + .findFirst() + .map(StackFrame::toStackTraceElement) + .orElse(null) + ); } /** @@ -326,7 +324,7 @@ public final class DynamicLinker { * * @return {@code true} if this frame represents {@code MethodHandleNatives.linkCallSite()}. */ - private static boolean isInitialLinkFrame(final StackTraceElement frame) { + private static boolean isInitialLinkFrame(final StackFrame frame) { return testFrame(frame, INITIAL_LINK_METHOD_NAME, INITIAL_LINK_CLASS_NAME); } @@ -339,11 +337,11 @@ public final class DynamicLinker { * * @return {@code true} if this frame represents {@code DynamicLinker.relink()}. */ - private static boolean isRelinkFrame(final StackTraceElement frame) { + private static boolean isRelinkFrame(final StackFrame frame) { return testFrame(frame, RELINK_METHOD_NAME, CLASS_NAME); } - private static boolean testFrame(final StackTraceElement frame, final String methodName, final String className) { + private static boolean testFrame(final StackFrame frame, final String methodName, final String className) { return methodName.equals(frame.getMethodName()) && className.equals(frame.getClassName()); } } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornException.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornException.java index fc1a7464df0..b082076e593 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornException.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornException.java @@ -174,10 +174,8 @@ public abstract class NashornException extends RuntimeException { String methodName = st.getMethodName(); if (methodName.equals(CompilerConstants.PROGRAM.symbolName())) { methodName = ""; - } - - if (methodName.contains(CompilerConstants.ANON_FUNCTION_PREFIX.symbolName())) { - methodName = ""; + } else { + methodName = stripMethodName(methodName); } filtered.add(new StackTraceElement(className, methodName, @@ -187,6 +185,22 @@ public abstract class NashornException extends RuntimeException { return filtered.toArray(new StackTraceElement[0]); } + private static String stripMethodName(final String methodName) { + String name = methodName; + + final int nestedSeparator = name.lastIndexOf(CompilerConstants.NESTED_FUNCTION_SEPARATOR.symbolName()); + if (nestedSeparator >= 0) { + name = name.substring(nestedSeparator + 1); + } + + final int idSeparator = name.indexOf(CompilerConstants.ID_FUNCTION_SEPARATOR.symbolName()); + if (idSeparator >= 0) { + name = name.substring(0, idSeparator); + } + + return name.contains(CompilerConstants.ANON_FUNCTION_PREFIX.symbolName()) ? "" : name; + } + /** * Return a formatted script stack trace string with frames information separated by '\n' * diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java index 0d64ac2ef64..28bd19f8709 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java @@ -78,6 +78,12 @@ public enum CompilerConstants { /** function prefix for anonymous functions */ ANON_FUNCTION_PREFIX("L:"), + /** separator for method names of nested functions */ + NESTED_FUNCTION_SEPARATOR("#"), + + /** separator for making method names unique by appending numeric ids */ + ID_FUNCTION_SEPARATOR("-"), + /** method name for Java method that is the program entry point */ PROGRAM(":program"), diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Namespace.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Namespace.java index 17304a905ab..08ae356ed64 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Namespace.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Namespace.java @@ -68,7 +68,7 @@ public class Namespace { } /** - * Create a uniqueName name in the namespace in the form base$n where n varies. + * Create a uniqueName name in the namespace in the form base-n where n varies. * Also truncates very long names that would otherwise break ASM. * * @param base Base of name. Base will be returned if uniqueName. @@ -83,7 +83,7 @@ public class Namespace { if (counter != null) { final int count = counter + 1; namespaceDirectory.put(truncatedBase, count); - return truncatedBase + '-' + count; + return truncatedBase + CompilerConstants.ID_FUNCTION_SEPARATOR.symbolName() + count; } } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/AbstractParser.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/AbstractParser.java index da61ff7ff5a..1b239da48aa 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/AbstractParser.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/AbstractParser.java @@ -203,8 +203,10 @@ public abstract class AbstractParser { * @return tokenType of next token. */ private TokenType nextToken() { - // Capture last token tokenType. - last = type; + // Capture last token type, but ignore comments (which are irrelevant for the purpose of newline detection). + if (type != COMMENT) { + last = type; + } if (type != EOF) { // Set up next token. diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java index dde20817853..6527f6be8d0 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java @@ -534,7 +534,7 @@ public class Parser extends AbstractParser implements Loggable { final ParserContextFunctionNode parentFunction = lc.getCurrentFunction(); if (parentFunction != null && !parentFunction.isProgram()) { - sb.append(parentFunction.getName()).append('$'); + sb.append(parentFunction.getName()).append(CompilerConstants.NESTED_FUNCTION_SEPARATOR.symbolName()); } assert ident.getName() != null; @@ -1827,7 +1827,7 @@ public class Parser extends AbstractParser implements Loggable { /** * ExpressionStatement : - * Expression ; // [lookahead ~( or function )] + * Expression ; // [lookahead ~({ or function )] * * See 12.4 * diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java index 767989531e1..9ac75ecd217 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java @@ -313,18 +313,8 @@ public final class ScriptRuntime { } } - /** - * Returns an iterator over property values used in the {@code for each...in} statement. Aside from built-in JS - * objects, it also operates on Java arrays, any {@link Iterable}, as well as on {@link Map} objects, iterating over - * map values. - * @param obj object to iterate on. - * @return iterator over the object's property values. - */ - public static Iterator toValueIterator(final Object obj) { - if (obj instanceof ScriptObject) { - return ((ScriptObject)obj).valueIterator(); - } - + // value Iterator for important Java objects - arrays, maps, iterables. + private static Iterator iteratorForJavaArrayOrList(final Object obj) { if (obj != null && obj.getClass().isArray()) { final Object array = obj; final int length = Array.getLength(obj); @@ -352,16 +342,36 @@ public final class ScriptRuntime { }; } + if (obj instanceof Iterable) { + return ((Iterable)obj).iterator(); + } + + return null; + } + + /** + * Returns an iterator over property values used in the {@code for each...in} statement. Aside from built-in JS + * objects, it also operates on Java arrays, any {@link Iterable}, as well as on {@link Map} objects, iterating over + * map values. + * @param obj object to iterate on. + * @return iterator over the object's property values. + */ + public static Iterator toValueIterator(final Object obj) { + if (obj instanceof ScriptObject) { + return ((ScriptObject)obj).valueIterator(); + } + if (obj instanceof JSObject) { return ((JSObject)obj).values().iterator(); } - if (obj instanceof Map) { - return ((Map)obj).values().iterator(); + final Iterator itr = iteratorForJavaArrayOrList(obj); + if (itr != null) { + return itr; } - if (obj instanceof Iterable) { - return ((Iterable)obj).iterator(); + if (obj instanceof Map) { + return ((Map)obj).values().iterator(); } final Object wrapped = Global.instance().wrapAsObject(obj); @@ -380,6 +390,14 @@ public final class ScriptRuntime { * @return iterator based on the ECMA 6 Iterator interface. */ public static Iterator toES6Iterator(final Object obj) { + // if not a ScriptObject, try convenience iterator for Java objects! + if (!(obj instanceof ScriptObject)) { + final Iterator itr = iteratorForJavaArrayOrList(obj); + if (itr != null) { + return itr; + } + } + final Global global = Global.instance(); final Object iterator = AbstractIterator.getIterator(Global.toObject(obj), global); diff --git a/nashorn/test/Makefile b/nashorn/test/Makefile new file mode 100644 index 00000000000..d4f5afe6da1 --- /dev/null +++ b/nashorn/test/Makefile @@ -0,0 +1,371 @@ +# +# Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# +# Makefile to run various nashorn tests +# + +.DEFAULT : all + +# Empty these to get rid of some default rules +.SUFFIXES: +.SUFFIXES: .java +CO= +GET= + +# Utilities used +AWK = awk +CAT = cat +CD = cd +CHMOD = chmod +CP = cp +CUT = cut +DIRNAME = dirname +ECHO = echo +EGREP = egrep +EXPAND = expand +FIND = find +MKDIR = mkdir +PWD = pwd +SED = sed +SORT = sort +TEE = tee +UNAME = uname +UNIQ = uniq +WC = wc +ZIP = zip + +# Get OS name from uname (Cygwin inexplicably adds _NT-5.1) +UNAME_S := $(shell $(UNAME) -s | $(CUT) -f1 -d_) + +# Commands to run on paths to make mixed paths for java on windows +ifeq ($(UNAME_S), CYGWIN) + # Location of developer shared files + SLASH_JAVA = J: + GETMIXEDPATH = cygpath -m +else + # Location of developer shared files + SLASH_JAVA = /java + + GETMIXEDPATH=$(ECHO) +endif + +# Root of this test area (important to use full paths in some places) +TEST_ROOT := $(shell $(PWD)) + +# Root of all test results +ifdef TEST_OUTPUT_DIR + $(shell $(MKDIR) -p $(TEST_OUTPUT_DIR)/jtreg) + ABS_TEST_OUTPUT_DIR := \ + $(shell $(CD) $(TEST_OUTPUT_DIR)/jtreg && $(PWD)) +else + ifdef ALT_OUTPUTDIR + ABS_OUTPUTDIR = $(shell $(CD) $(ALT_OUTPUTDIR) && $(PWD)) + else + ABS_OUTPUTDIR = $(shell $(CD) $(TEST_ROOT)/.. && $(PWD)) + endif + + ABS_PLATFORM_BUILD_ROOT = $(ABS_OUTPUTDIR) + ABS_TEST_OUTPUT_DIR := $(ABS_PLATFORM_BUILD_ROOT)/testoutput/$(UNIQUE_DIR) +endif + +# Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test) +ifndef PRODUCT_HOME + # Try to use images/jdk if it exists + ABS_JDK_IMAGE = $(ABS_PLATFORM_BUILD_ROOT)/images/jdk + PRODUCT_HOME := \ + $(shell \ + if [ -d $(ABS_JDK_IMAGE) ] ; then \ + $(ECHO) "$(ABS_JDK_IMAGE)"; \ + else \ + $(ECHO) "$(ABS_PLATFORM_BUILD_ROOT)"; \ + fi) + PRODUCT_HOME := $(PRODUCT_HOME) +endif + +# Expect JPRT to set JPRT_PRODUCT_ARGS (e.g. -server etc.) +# Should be passed into 'java' only. +# Could include: -d64 -server -client OR any java option +ifdef JPRT_PRODUCT_ARGS + JAVA_ARGS = $(JPRT_PRODUCT_ARGS) +endif + +# Expect JPRT to set JPRT_PRODUCT_VM_ARGS (e.g. -Xcomp etc.) +# Should be passed into anything running the vm (java, javac, javadoc, ...). +ifdef JPRT_PRODUCT_VM_ARGS + JAVA_VM_ARGS = $(JPRT_PRODUCT_VM_ARGS) +endif + +# jtreg -nativepath +# +# Local make tests will be TEST_IMAGE_DIR and JPRT with jprt.use.reg.test.bundle=true +# should be JPRT_TESTNATIVE_PATH +ifdef TEST_IMAGE_DIR + TESTNATIVE_DIR = $(TEST_IMAGE_DIR) +else ifdef JPRT_TESTNATIVE_PATH + TESTNATIVE_DIR = $(JPRT_TESTNATIVE_PATH) +endif +ifdef TESTNATIVE_DIR + JTREG_NATIVE_PATH = -nativepath:$(shell $(GETMIXEDPATH) "$(TESTNATIVE_DIR)/nashorn/jtreg/native") +endif + +# jtreg failure handler config +ifeq ($(FAILURE_HANDLER_DIR), ) + ifneq ($(TESTNATIVE_DIR), ) + FAILURE_HANDLER_DIR := $(TESTNATIVE_DIR)/failure_handler + endif +endif +ifneq ($(FAILURE_HANDLER_DIR), ) + FAILURE_HANDLER_DIR_MIXED := $(shell $(GETMIXEDPATH) "$(FAILURE_HANDLER_DIR)") + JTREG_FAILURE_HANDLER_OPTIONS := \ + -timeoutHandlerDir:$(FAILURE_HANDLER_DIR_MIXED)/jtregFailureHandler.jar \ + -observerDir:$(FAILURE_HANDLER_DIR_MIXED)/jtregFailureHandler.jar \ + -timeoutHandler:jdk.test.failurehandler.jtreg.GatherProcessInfoTimeoutHandler \ + -observer:jdk.test.failurehandler.jtreg.GatherDiagnosticInfoObserver + ifeq ($(UNAME_S), CYGWIN) + JTREG_FAILURE_HANDLER_OPTIONS += -J-Djava.library.path="$(FAILURE_HANDLER_DIR_MIXED)" + endif +endif + +# Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results) +ifdef JPRT_ARCHIVE_BUNDLE + ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE) +else + ARCHIVE_BUNDLE = $(ABS_TEST_OUTPUT_DIR)/ARCHIVE_BUNDLE.zip +endif + +# How to create the test bundle (pass or fail, we want to create this) +# Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed. +ZIP_UP_RESULTS = ( $(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)` \ + && $(CD) $(ABS_TEST_OUTPUT_DIR) \ + && $(CHMOD) -R a+r . \ + && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . ) + +# important results files +SUMMARY_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport/text/summary.txt") +STATS_TXT_NAME = Stats.txt +STATS_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/$(STATS_TXT_NAME)") +RUNLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/runlist.txt") +PASSLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/passlist.txt") +FAILLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/faillist.txt") +EXITCODE = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/exitcode.txt") + +TESTEXIT = \ + if [ ! -s $(EXITCODE) ] ; then \ + $(ECHO) "ERROR: EXITCODE file not filled in."; \ + $(ECHO) "1" > $(EXITCODE); \ + fi ; \ + testExitCode=`$(CAT) $(EXITCODE)`; \ + $(ECHO) "EXIT CODE: $${testExitCode}"; \ + exit $${testExitCode} + +BUNDLE_UP_AND_EXIT = \ +( \ + jtregExitCode=$$? && \ + _summary="$(SUMMARY_TXT)"; \ + $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \ + $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \ + if [ -r "$${_summary}" ] ; then \ + $(ECHO) "Summary: $(UNIQUE_DIR)" > $(STATS_TXT); \ + $(EXPAND) $${_summary} | $(EGREP) -v ' Not run\.' > $(RUNLIST); \ + $(EGREP) ' Passed\.' $(RUNLIST) \ + | $(EGREP) -v ' Error\.' \ + | $(EGREP) -v ' Failed\.' > $(PASSLIST); \ + ( $(EGREP) ' Failed\.' $(RUNLIST); \ + $(EGREP) ' Error\.' $(RUNLIST); \ + $(EGREP) -v ' Passed\.' $(RUNLIST) ) \ + | $(SORT) | $(UNIQ) > $(FAILLIST); \ + if [ $${jtregExitCode} != 0 -o -s $(FAILLIST) ] ; then \ + $(EXPAND) $(FAILLIST) \ + | $(CUT) -d' ' -f1 \ + | $(SED) -e 's@^@FAILED: @' >> $(STATS_TXT); \ + if [ $${jtregExitCode} = 0 ] ; then \ + jtregExitCode=1; \ + fi; \ + fi; \ + runc="`$(CAT) $(RUNLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ + passc="`$(CAT) $(PASSLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ + failc="`$(CAT) $(FAILLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ + exclc="FIXME CODETOOLS-7900176"; \ + $(ECHO) "TEST STATS: name=$(UNIQUE_DIR) run=$${runc} pass=$${passc} fail=$${failc}" \ + >> $(STATS_TXT); \ + else \ + $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \ + fi; \ + if [ -f $(STATS_TXT) ] ; then \ + $(CAT) $(STATS_TXT); \ + fi; \ + $(ZIP_UP_RESULTS) ; \ + $(TESTEXIT) \ +) + +################################################################ + +# Default make rule (runs default nashorn tests) +all: nashorn_default + @$(ECHO) "Testing completed successfully" + +# Prep for output +# Change execute permissions on shared library files. +# Files in repositories should never have execute permissions, but +# there are some tests that have pre-built shared libraries, and these +# windows dll files must have execute permission. Adding execute +# permission may happen automatically on windows when using certain +# versions of mercurial but it cannot be guaranteed. And blindly +# adding execute permission might be seen as a mercurial 'change', so +# we avoid adding execute permission to repository files. But testing +# from a plain source tree needs the chmod a+rx. Applying the chmod to +# all shared libraries not just dll files. And with CYGWIN and sshd +# service, you may need CYGWIN=ntsec for this to work. +prep: + @$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR) + @$(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)` + @if [ ! -d $(TEST_ROOT)/../.hg ] ; then \ + $(FIND) $(TEST_ROOT) \( -name \*.dll -o -name \*.DLL -o -name \*.so \) \ + -exec $(CHMOD) a+rx {} \; ; \ + fi + +# Cleanup +clean: + @$(RM) -r $(ABS_TEST_OUTPUT_DIR) + @$(RM) $(ARCHIVE_BUNDLE) + +################################################################ + +# jtreg tests + +# Expect JT_HOME to be set for jtreg tests. (home for jtreg) +ifndef JT_HOME + JT_HOME = $(SLASH_JAVA)/re/jtreg/4.2/promoted/latest/binaries/jtreg + ifdef JPRT_JTREG_HOME + JT_HOME = $(JPRT_JTREG_HOME) + endif +endif + +# Problematic tests to be excluded +PROBLEM_LISTS=$(call MixedDirs,$(wildcard ProblemList.txt closed/ProblemList.txt)) + +# Create exclude list for this platform and arch +ifdef NO_EXCLUDES + JTREG_EXCLUSIONS = +else + JTREG_EXCLUSIONS = $(PROBLEM_LISTS:%=-exclude:%) +endif + +# convert list of directories to dos paths +define MixedDirs +$(foreach i,$1,$(shell $(GETMIXEDPATH) "${i}")) +endef + +define SummaryInfo +$(ECHO) "########################################################" +$(CAT) $(?:%=$(ABS_TEST_OUTPUT_DIR)/%/$(STATS_TXT_NAME)) +$(ECHO) "########################################################" +endef + +# ------------------------------------------------------------------ + +nashorn_%: + $(ECHO) "Running tests: $@" + for each in $@; do \ + $(MAKE) -j 1 TEST_SELECTION=":$$each" UNIQUE_DIR=$$each jtreg_tests; \ + done + +# ------------------------------------------------------------------ + +# When called from JPRT the TESTDIRS variable is set to the jtreg tests to run +ifdef TESTDIRS + TEST_SELECTION = $(TESTDIRS) +endif + +ifdef CONCURRENCY + EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY) +endif + +# Default JTREG to run +JTREG = $(JT_HOME)/bin/jtreg +# run in agentvm mode +JTREG_BASIC_OPTIONS += -agentvm +# Only run automatic tests +JTREG_BASIC_OPTIONS += -a +# Always turn on assertions +JTREG_ASSERT_OPTION = -ea -esa +JTREG_BASIC_OPTIONS += $(JTREG_ASSERT_OPTION) +# Report details on all failed or error tests, times too +JTREG_BASIC_OPTIONS += -v:fail,error,time +# Retain all files for failing tests +JTREG_BASIC_OPTIONS += -retain:fail,error +# Ignore tests are not run and completely silent about it +JTREG_IGNORE_OPTION = -ignore:quiet +JTREG_BASIC_OPTIONS += $(JTREG_IGNORE_OPTION) +# Multiple by 4 the timeout numbers +JTREG_TIMEOUT_OPTION = -timeoutFactor:4 +JTREG_BASIC_OPTIONS += $(JTREG_TIMEOUT_OPTION) +# Set the max memory for jtreg control vm +JTREG_MEMORY_OPTION = -J-Xmx512m +JTREG_BASIC_OPTIONS += $(JTREG_MEMORY_OPTION) +# Give tests access to JT_JAVA, see JDK-8141609 +JTREG_BASIC_OPTIONS += -e:JDK8_HOME=${JT_JAVA} +# Add any extra options +JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS) +# Set other vm and test options +JTREG_TEST_OPTIONS = $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_VM_ARGS:%=-vmoption:%) +# Set the GC options for test vms +#JTREG_GC_OPTION = -vmoption:-XX:+UseSerialGC +#JTREG_TEST_OPTIONS += $(JTREG_GC_OPTION) +# Set the max memory for jtreg target test vms +JTREG_TESTVM_MEMORY_OPTION = -vmoption:-Xmx512m +JTREG_TEST_OPTIONS += $(JTREG_TESTVM_MEMORY_OPTION) + +# Make sure jtreg exists +$(JTREG): $(JT_HOME) + +# Run jtreg +jtreg_tests: prep $(PRODUCT_HOME) $(JTREG) + ( \ + ( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)"); \ + export JT_HOME; \ + $(shell $(GETMIXEDPATH) "$(JTREG)") \ + $(JTREG_BASIC_OPTIONS) \ + -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport") \ + -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTwork") \ + -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)") \ + $(JTREG_NATIVE_PATH) \ + $(JTREG_FAILURE_HANDLER_OPTIONS) \ + $(JTREG_EXCLUSIONS) \ + $(JTREG_TEST_OPTIONS) \ + $(TEST_SELECTION) \ + ) ; \ + $(BUNDLE_UP_AND_EXIT) \ + ) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt ; $(TESTEXIT) + +PHONY_LIST += jtreg_tests + +################################################################ + +# Phony targets (e.g. these are not filenames) +.PHONY: all clean prep $(PHONY_LIST) + +################################################################ diff --git a/nashorn/test/script/basic/JDK-8025515.js b/nashorn/test/script/basic/JDK-8025515.js index b88897b654b..6538f54f247 100644 --- a/nashorn/test/script/basic/JDK-8025515.js +++ b/nashorn/test/script/basic/JDK-8025515.js @@ -61,8 +61,8 @@ testMethodName(function() { throw new Error() }, "L:59"); var f = (function() { return function() { a.b.c; }; })(); -testMethodName(f, "f$L:62"); +testMethodName(f, "f#L:62"); testMethodName((function() { return function() { return a.b.c; }; -})(), "L:66$L:67"); +})(), "L:66#L:67"); diff --git a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageBlendTable.h b/nashorn/test/script/basic/JDK-8156714.js similarity index 57% rename from jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageBlendTable.h rename to nashorn/test/script/basic/JDK-8156714.js index 2e95d502478..93a4e906f5f 100644 --- a/jdk/src/java.desktop/share/native/libmlib_image/mlib_c_ImageBlendTable.h +++ b/nashorn/test/script/basic/JDK-8156714.js @@ -1,41 +1,50 @@ /* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * + * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * + * published by the Free Software Foundation. + * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). - * + * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * + * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ -/* - * These tables are used by C versions of the - * mlib_ImageBlend_... functions. +/** + * JDK-8156714: Parsing issue with automatic semicolon insertion + * + * @test + * @run */ -#ifndef MLIB_C_IMAGE_BLEND_TABLE_H -#define MLIB_C_IMAGE_BLEND_TABLE_H +a = function() { +} -#include "mlib_image.h" +/* */ function b() { +} -extern const mlib_f32 mlib_c_blend_u8[]; -extern const mlib_f32 mlib_U82F32[]; -extern const mlib_f32 mlib_c_blend_Q8[]; -extern const mlib_f32 mlib_c_blend_u8_sat[]; +c = function() { +} /* -#endif /* MLIB_C_IMAGEF_BLEND_TABLE_H */ +*/ function d() { +} + +try { + eval("x = function() {} /* */ function y() {}"); + throw new Error("Error expected"); +} catch (e) { + if (!(e instanceof SyntaxError)) { + throw new Error("Unexpected error: " + e); + } +} diff --git a/nashorn/test/script/basic/JDK-8156896.js b/nashorn/test/script/basic/JDK-8156896.js new file mode 100644 index 00000000000..fc71f07c941 --- /dev/null +++ b/nashorn/test/script/basic/JDK-8156896.js @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8156896: Script stack trace should display function names + * + * @test + * @run + */ + +function checkNamedFunction(stack) { + Assert.assertTrue(stack.indexOf("Error\n\tat bar (") === 0); +} + +function checkAnonymousFunction(stack) { + Assert.assertTrue(stack.indexOf("Error\n\tat (") === 0); +} + +// Named functions +function bar() { try { throw new Error(); } catch(e) { return e.stack; } } +checkNamedFunction(bar()); + +bar = function() { try { throw new Error(); } catch(e) { return e.stack; } }; +checkNamedFunction(bar()); + +f = (function() {return function bar() { try { throw new Error(); } catch(e) { return e.stack; } } })(); +checkNamedFunction(f()); + +f = new Function("return function bar() { try { throw new Error(); } catch(e) { return e.stack; } }")(); +checkNamedFunction(f()); + +// Anonymous functions +checkAnonymousFunction((function() { try { throw new Error(); } catch(e) { return e.stack; } })()); + +f = (function() {return function() { try { throw new Error(); } catch(e) { return e.stack; } } })(); +checkAnonymousFunction(f()); + +f = new Function("return function() { try { throw new Error(); } catch(e) { return e.stack; } }")(); +checkAnonymousFunction(f()); diff --git a/nashorn/test/script/basic/es6/JDK-8156665.js b/nashorn/test/script/basic/es6/JDK-8156665.js new file mode 100644 index 00000000000..d405b188be5 --- /dev/null +++ b/nashorn/test/script/basic/es6/JDK-8156665.js @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8156665: ES6 for..of should work on Java Iterables and Java arrays + * + * @test + * @run + * @option --language=es6 + */ + +var ca = new (Java.type("char[]"))(3); +ca[0] = 'a', ca[1] = 'b', ca[2] = 'c'; +for (i of ca) print(i); + +var al = new java.util.ArrayList(); +al.add("hello"); +al.add("world"); + +for (i of al) print(i); diff --git a/nashorn/test/script/basic/es6/JDK-8156665.js.EXPECTED b/nashorn/test/script/basic/es6/JDK-8156665.js.EXPECTED new file mode 100644 index 00000000000..ddf6f6d20ba --- /dev/null +++ b/nashorn/test/script/basic/es6/JDK-8156665.js.EXPECTED @@ -0,0 +1,5 @@ +a +b +c +hello +world diff --git a/nashorn/test/script/nosecurity/parserapi.js.EXPECTED b/nashorn/test/script/nosecurity/parserapi.js.EXPECTED index 8fbd95117da..82f4506ed69 100644 --- a/nashorn/test/script/nosecurity/parserapi.js.EXPECTED +++ b/nashorn/test/script/nosecurity/parserapi.js.EXPECTED @@ -4864,7 +4864,7 @@ "kind": "COMPILATION_UNIT", "sourceElements": [ { - "endPosition": "1242", + "endPosition": "1222", "kind": "FUNCTION", "name": "Parser", "body": { @@ -5419,7 +5419,7 @@ }, "startPosition": "1809" }, - "endPosition": "1973", + "endPosition": "1901", "kind": "EXPRESSION_STATEMENT", "startPosition": "1809" }, @@ -6310,7 +6310,7 @@ "startPosition": "1974" }, { - "endPosition": "3767", + "endPosition": "3726", "kind": "FUNCTION", "name": "processFiles", "body": { diff --git a/nashorn/test/src/jdk/dynalink/test/LinkedCallSiteLocationTest.java b/nashorn/test/src/jdk/dynalink/test/LinkedCallSiteLocationTest.java new file mode 100644 index 00000000000..8e2b03b6a67 --- /dev/null +++ b/nashorn/test/src/jdk/dynalink/test/LinkedCallSiteLocationTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.dynalink.test; + +import static jdk.dynalink.StandardOperation.CALL_METHOD; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import jdk.dynalink.CallSiteDescriptor; +import jdk.dynalink.DynamicLinker; +import jdk.dynalink.DynamicLinkerFactory; +import jdk.dynalink.NamedOperation; +import jdk.dynalink.linker.GuardingDynamicLinker; +import jdk.dynalink.support.SimpleRelinkableCallSite; +import org.testng.Assert; +import org.testng.annotations.Test; + +public class LinkedCallSiteLocationTest { + @Test + public void testLinkedCallSiteLocation() throws Throwable { + final StackTraceElement[] lastLinked = new StackTraceElement[1]; + + final GuardingDynamicLinker testLinker = + (r, s) -> { lastLinked[0] = DynamicLinker.getLinkedCallSiteLocation(); return null; }; + + final DynamicLinkerFactory factory = new DynamicLinkerFactory(); + factory.setPrioritizedLinker(testLinker); + final DynamicLinker linker = factory.createLinker(); + final SimpleRelinkableCallSite callSite = new SimpleRelinkableCallSite( + new CallSiteDescriptor( + MethodHandles.lookup(), + new NamedOperation(CALL_METHOD, "foo"), + MethodType.methodType(void.class, Object.class))); + linker.link(callSite); + + // Test initial linking + callSite.dynamicInvoker().invoke(new TestClass1()); final int l1 = getLineNumber(); + assertLocation(lastLinked[0], l1); + + // Test relinking + callSite.dynamicInvoker().invoke(new TestClass2()); final int l2 = getLineNumber(); + assertLocation(lastLinked[0], l2); + } + + private void assertLocation(final StackTraceElement frame, final int lineNumber) { + Assert.assertNotNull(frame); + Assert.assertEquals(frame.getLineNumber(), lineNumber); + Assert.assertEquals(frame.getClassName(), this.getClass().getName()); + } + + private static int getLineNumber() { + return StackWalker.getInstance().walk(s -> s.skip(1).findFirst().get().getLineNumber()); + } + + public static class TestClass1 { + public void foo() { + } + } + + public static class TestClass2 { + public void foo() { + } + } +} diff --git a/test/Makefile b/test/Makefile index e31dbedea87..41a20170e0e 100644 --- a/test/Makefile +++ b/test/Makefile @@ -87,7 +87,7 @@ hotspot_%: # # Invocation: # -# make jtreg_tests TESTDIRS= +# make jtreg_tests TESTDIRS= TEST_SELECTION= TEST_OUTPUT_DIR= # # where is something like '..//test/runtime', # in turn being one of the top level directories (for diff --git a/jdk/test/javax/xml/bind/xjc/8032884/compile-schema.sh b/test/make/TestIdea.gmk similarity index 58% rename from jdk/test/javax/xml/bind/xjc/8032884/compile-schema.sh rename to test/make/TestIdea.gmk index 8051abf438a..39d93c5cdaf 100644 --- a/jdk/test/javax/xml/bind/xjc/8032884/compile-schema.sh +++ b/test/make/TestIdea.gmk @@ -1,12 +1,12 @@ -#! /bin/sh -# # Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. # # This code is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or @@ -23,17 +23,24 @@ # questions. # -# +include $(SPEC) +include MakeBase.gmk -if [ "x$TESTJAVA" = x ]; then - TESTJAVA=$1; shift - TESTCLASSES=. -fi +default: all -echo "cleaning generated files ..." -rm -rfv ${TESTSRC}/generated +IDEA_OUTPUT_DIR := $(TESTMAKE_OUTPUTDIR)/verify-idea -echo "compiling [optional-property-schema.xsd] schema ..." -$TESTJAVA/bin/xjc -p generated -d ${TESTSRC} ${TESTSRC}/optional-property-schema.xsd +clean-idea: + $(RM) -r $(IDEA_OUTPUT_DIR) -echo "Schema compiled. Verification of generated files can be done now." +verify-idea: + $(MKDIR) -p $(IDEA_OUTPUT_DIR) + $(BASH) $(TOPDIR)/common/bin/idea.sh -o $(IDEA_OUTPUT_DIR)/idea1 + $(BASH) $(TOPDIR)/common/bin/idea.sh -o $(IDEA_OUTPUT_DIR)/idea2 java.base + $(BASH) $(TOPDIR)/common/bin/idea.sh -o $(IDEA_OUTPUT_DIR)/idea3 java.base jdk.compiler + +TEST_TARGETS += verify-idea + +all: $(TEST_TARGETS) + +.PHONY: default all verify-idea diff --git a/test/make/TestMake.gmk b/test/make/TestMake.gmk index 1f33e1786a7..f3676a00153 100644 --- a/test/make/TestMake.gmk +++ b/test/make/TestMake.gmk @@ -33,7 +33,10 @@ make-base: java-compilation: +$(MAKE) -f TestJavaCompilation.gmk $(TEST_SUBTARGET) +test-idea: + +$(MAKE) -f TestIdea.gmk $(TEST_SUBTARGET) -all: make-base java-compilation -.PHONY: default all make-base java-compilation +all: make-base java-compilation test-idea + +.PHONY: default all make-base java-compilation test-idea