changeset 9251:85bcd2abf0a2

Merge jdk7u151-b01
author andrew
date Tue, 22 Aug 2017 02:03:52 +0100
parents 350a10c3a425 (diff) ad08fea7cd1a (current diff)
children c2314c8d2b47
files .hgtags make/sun/splashscreen/FILES_c.gmk src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java src/share/classes/com/sun/jndi/ldap/LdapClient.java src/share/classes/com/sun/jndi/ldap/LdapCtx.java src/share/classes/java/nio/Bits.java src/share/classes/java/util/zip/ZipFile.java src/share/classes/sun/rmi/registry/RegistryImpl.java src/share/classes/sun/rmi/server/LoaderHandler.java src/share/classes/sun/rmi/server/UnicastServerRef.java src/share/classes/sun/security/provider/ByteArrayAccess.java src/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java src/share/classes/sun/security/util/HostnameChecker.java src/share/lib/security/java.security-linux src/share/lib/security/java.security-macosx src/share/lib/security/java.security-solaris src/share/lib/security/java.security-windows src/share/native/com/sun/java/util/jar/pack/coding.cpp src/share/native/com/sun/java/util/jar/pack/defines.h src/share/native/common/check_code.c src/share/native/java/net/net_util.h src/share/native/sun/awt/image/awt_ImageRep.c src/share/native/sun/awt/image/jpeg/imageioJPEG.c src/share/native/sun/awt/image/jpeg/jpegdecoder.c src/share/native/sun/awt/libpng/pngtest.c src/share/native/sun/awt/libpng/pngwio.c src/share/native/sun/awt/libpng/pngwrite.c src/share/native/sun/awt/libpng/pngwtran.c src/share/native/sun/awt/libpng/pngwutil.c src/share/native/sun/security/ec/ECC_JNI.cpp src/share/native/sun/security/ec/ecc_impl.h src/windows/native/sun/windows/awt_Component.cpp
diffstat 678 files changed, 44961 insertions(+), 46280 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Thu Aug 03 07:28:01 2017 +0100
+++ b/.hgtags	Tue Aug 22 02:03:52 2017 +0100
@@ -50,6 +50,7 @@
 f708138c9aca4b389872838fe6773872fce3609e jdk7-b73
 eacb36e30327e7ae33baa068e82ddccbd91eaae2 jdk7-b74
 8885b22565077236a927e824ef450742e434a230 jdk7-b75
+fb2ee5e96b171ae9db67274d87ffaba941e8bfa6 icedtea7-1.12
 8fb602395be0f7d5af4e7e93b7df2d960faf9d17 jdk7-b76
 e6a5d095c356a547cf5b3c8885885aca5e91e09b jdk7-b77
 1143e498f813b8223b5e3a696d79da7ff7c25354 jdk7-b78
@@ -63,6 +64,7 @@
 eae6e9ab26064d9ba0e7665dd646a1fd2506fcc1 jdk7-b86
 2cafbbe9825e911a6ca6c17d9a18eb1f0bf0873c jdk7-b87
 b3c69282f6d3c90ec21056cd1ab70dc0c895b069 jdk7-b88
+2017795af50aebc00f500e58f708980b49bc7cd1 icedtea7-1.13
 4a6abb7e224cc8d9a583c23c5782e4668739a119 jdk7-b89
 7f90d0b9dbb7ab4c60d0b0233e4e77fb4fac597c jdk7-b90
 08a31cab971fcad4695e913d0f3be7bde3a90747 jdk7-b91
@@ -111,6 +113,7 @@
 554adcfb615e63e62af530b1c10fcf7813a75b26 jdk7-b134
 d8ced728159fbb2caa8b6adb477fd8efdbbdf179 jdk7-b135
 aa13e7702cd9d8aca9aa38f1227f966990866944 jdk7-b136
+1571aa7abe47a54510c62a5b59a8c343cdaf67cb icedtea-1.14
 29296ea6529a418037ccce95903249665ef31c11 jdk7-b137
 60d3d55dcc9c31a30ced9caa6ef5c0dcd7db031d jdk7-b138
 d80954a89b49fda47c0c5cace65a17f5a758b8bd jdk7-b139
@@ -123,6 +126,7 @@
 539e576793a8e64aaf160e0d6ab0b9723cd0bef0 jdk7-b146
 69e973991866c948cf1808b06884ef2d28b64fcb jdk7u1-b01
 f097ca2434b1412b12ab4a5c2397ce271bf681e7 jdk7-b147
+7ec1845521edfb1843cad3868217983727ece53d icedtea-2.0-branchpoint
 2baf612764d215e6f3a5b48533f74c6924ac98d7 jdk7u1-b02
 a4781b6d9cfb6901452579adee17c9a17c1b584c jdk7u1-b03
 b223ed9a5fdf8ce3af42adfa8815975811d70eae jdk7u1-b04
@@ -141,6 +145,7 @@
 79c8c4608f60e1f981b17ba4077dfcaa2ed67be4 jdk7u2-b12
 fb2980d7c9439e3d62ab12f40506a2a2db2df0f4 jdk7u2-b13
 24e42f1f9029f9f5a9b1481d523facaf09452e5b jdk7u2-b21
+a75913596199fbb8583f9d74021f54dc76f87b14 icedtea-2.1-branchpoint
 e3790f3ce50aa4e2a1b03089ac0bcd48f9d1d2c2 jdk7u3-b02
 7e8351342f0b22b694bd3c2db979643529f32e71 jdk7u3-b03
 fc6b7b6ac837c9e867b073e13fc14e643f771028 jdk7u3-b04
@@ -157,6 +162,7 @@
 6485e842d7f736b6ca3d7e4a7cdc5de6bbdd870c jdk7u4-b10
 d568e85567ccfdd75f3f0c42aa0d75c440422827 jdk7u4-b11
 16781e84dcdb5f82c287a3b5387dde9f8aaf74e0 jdk7u4-b12
+907555f6191a0cd84886b07c4c40bc6ce498b8b1 icedtea-2.2-branchpoint
 c929e96aa059c8b79ab94d5b0b1a242ca53a5b32 jdk7u4-b13
 09f612bac047b132bb9bf7d4aa8afe6ea4d5b938 jdk7u4-b14
 9e15d1f3fa4b35b8c950323c76b9ed094d434b97 jdk7u5-b01
@@ -186,11 +192,15 @@
 a2bd61800667c38d759a0e02a756063d47dbcdc0 jdk7u6-b10
 18a1b4f0681ae6e748fc60162dd76e357de3304b jdk7u6-b11
 76306dce87104d9f333db3371ca97c80cac9674a jdk7u6-b12
+35172a51cc7639a44fe06ffbd5be471e48b71a88 ppc-aix-port-b01
+3097457689ba2d41b1d692191c5ba2f2b30aff9e ppc-aix-port-b02
+3097457689ba2d41b1d692191c5ba2f2b30aff9e ppc-aix-port-b03
 aa49fe7490963f0c53741fbca3a175e0fec93951 jdk7u6-b13
 3ce621d9b988abcccd86b52a97ea39133006c245 jdk7u6-b14
 e50c9a5f001c61f49e7e71b25b97ed4095d3557b jdk7u6-b15
 966e21feb7f088e318a35b069c1a61ff6363e554 jdk7u6-b16
 aa0ad405f70bc7a7af95fef109f114ceecf31232 jdk7u6-b17
+8ff5fca08814f1f0eeda40aaec6f2936076b7444 icedtea-2.3-branchpoint
 4a6917092af80481c1fa5b9ec8ccae75411bb72c jdk7u6-b18
 a263f787ced5bc7c14078ae552c82de6bd011611 jdk7u6-b19
 09145b546a2b6ae1f44d5c8a7d2a37d48e4b39e2 jdk7u6-b20
@@ -258,11 +268,13 @@
 cb81ee79a72d84f99b8e7d73b5ae73124b661fe7 jdk7u12-b07
 b5e180ef18a0c823675bcd32edfbf2f5122d9722 jdk7u12-b08
 2e7fe0208e9c928f2f539fecb6dc8a1401ecba9e jdk7u12-b09
+b171007921c3d01066848c88cbcb6a376df3f01c icedtea-2.4-branchpoint
 e012aace90500a88f51ce83fcd27791f5dbf493f jdk7u14-b10
 9eb82fb221f3b34a5df97e7db3c949fdb0b6fee0 jdk7u14-b11
 ee3ab2ed2371dd72ad5a75ebb6b6b69071e29390 jdk7u14-b12
 7c0d4bfd9d2c183ebf8566013af5111927b472f6 jdk7u14-b13
 3982fc37bc256b07a710f25215e5525cfbefe2ed jdk7u14-b14
+739869c45976bb154908af5d145b7ed98c6a7d47 ppc-aix-port-b04
 2eb3ac105b7fe7609a20c9986ecbccab71f1609f jdk7u14-b15
 835448d525a10bb826f4f7ebe272fc410bdb0f5d jdk7u15-b01
 0443fe2d8023111b52f4c8db32e038f4a5a9f373 jdk7u15-b02
@@ -365,6 +377,7 @@
 c5ca4daec23b5e7f99ac8d684f5016ff8bfebbb0 jdk7u45-b18
 4797f984f6c93c433aa797e9b2d8f904cf083f96 jdk7u45-b30
 8c343a783777b8728cb819938f387db0acf7f3ac jdk7u45-b31
+db5a29c812ee25c34ce9cd97de6e0dae284a4e34 jdk7u60-b00
 402d54c7d8ce95f3945cc3d698e528e4adec7b9b jdk7u45-b33
 34e8f9f26ae612ebac36357eecbe70ea20e0233c jdk7u45-b34
 3dbb06a924cdf73d39b8543824ec88ae501ba5c6 jdk7u45-b35
@@ -414,8 +427,11 @@
 db5a29c812ee25c34ce9cd97de6e0dae284a4e34 jdk7u60-b00
 def34c4a798678c424786a8f0d0508e90185958d jdk7u60-b01
 ff67c89658525e8903fb870861ed3645befd6bc5 jdk7u60-b02
+7d5b758810c20af12c6576b7d570477712360744 icedtea-2.5pre01
+3162252ff26b4e6788b0c79405b035b535afa018 icedtea-2.5pre02
 b1bcc999a8f1b4b4452b59c6636153bb0154cf5a jdk7u60-b03
 efc8886310cbccb941f826acfad2ad51a2891be5 jdk7u60-b04
+9b6aff2241bf0d6fa9eab38a75a4eccdf9bb7335 icedtea-2.6pre01
 4fb749a3110727d5334c69793578a3254a053bf5 jdk7u60-b05
 46ca1ce7550f1463d60c3eacaf7b8cdc44b0c66e jdk7u60-b06
 d5a2f60006e3c4243abeee0f623e5c3f79372fd8 jdk7u60-b07
@@ -425,7 +441,11 @@
 c2bb87dae8a08eab6f4f336ce5a59865aa0214d6 jdk7u60-b11
 1a90de8005e3de2475fd9355dcdb6f5e60bf89cc jdk7u60-b12
 b06d4ed71ae0bc6e13f5a8437cb6388f17c66e84 jdk7u60-b13
+6f22501ca73cc21960cfe45a2684a0c902f46133 icedtea-2.6pre02
+068d2b78bd73fc2159a1c8a88dca3ca2841c4e16 icedtea-2.6pre03
 b7fbd9b4febf8961091fdf451d3da477602a8f1d jdk7u60-b14
+b69f22ae0ef3ddc153d391ee30efd95e4417043c icedtea-2.6pre04
+605610f355ce3f9944fe33d9e5e66631843beb8d icedtea-2.6pre05
 04882f9a073e8de153ec7ad32486569fd9a087ec jdk7u60-b15
 41547583c3a035c3924ffedfa8704e58d69e5c50 jdk7u60-b16
 e484202d9a4104840d758a21b2bba1250e766343 jdk7u60-b17
@@ -553,8 +573,20 @@
 09f3004e9b123b457da8f314aec027a5f4c3977f jdk7u76-b31
 efc8886310cbccb941f826acfad2ad51a2891be5 jdk7u80-b00
 bc7f9d966c1df3748ef9c148eab25976cd065963 jdk7u80-b01
+0cc91db3a787da44e3775bdde4c3c222d3cd529f icedtea-2.6pre07
+21eee0ed9be97d4e283cdf626971281481e711f1 icedtea-2.6pre06
+9702c7936ed8da9befdc27d30b2cbf51718d810a icedtea-2.6pre08
 2590a9c18fdba19086712bb91a28352e9239a2be jdk7u80-b02
+1ceeb31e72caa1b458194f7ae776cf4ec29731e7 icedtea-2.6pre09
+33a33bbea1ae3a7feef5f3216e85c56b708444f4 icedtea-2.6pre10
+8a445d1b5af50e8628b8b1367f734d4e5741d12a icedtea-2.6pre11
 3796111298d5b013e46d5ce49f17c16fc3197be8 jdk7u80-b03
+3620a98d0295f2b5ba4483483e61bfc386e734c1 icedtea-2.6pre12
+13bd267f397d41749dcd08576a80f368cf3aaad7 icedtea-2.6pre13
+ccdc37cdfaa891e3c14174378a8e7a5871e8893b icedtea-2.6pre14
+6dd583aadca80b71e8c004d9f4f3deb1d779ccfb icedtea-2.6pre15
+2e8f3cd07f149eab799f60db51ff3629f6ab0664 icedtea-2.6pre16
+3ce28e98738c7f9bb238378a991d4708598058a2 icedtea-2.6pre17
 54acd5cd04856e80a3c7d5d38ef9c7a44d1e215a jdk7u80-b04
 45f30f5524d4eef7aa512e35d5399cc4d84af174 jdk7u79-b00
 2879572fbbb7be4d44e2bcd815711590cc6538e9 jdk7u79-b01
@@ -572,6 +604,11 @@
 da34e5f77e9e922844e7eb8d1e165d25245a8b40 jdk7u79-b30
 ea77b684d424c40f983d1aff2c9f4ef6a9c572b0 jdk7u79-b15
 d4bd8bd71ca7233c806357bd39514dcaeebaa0ee jdk7u80-b05
+19a30444897fca52d823d63f6e2fbbfac74e8b34 icedtea-2.6pre18
+29fdd3e4a4321604f113df9573b9d4d215cf1b1d icedtea-2.6pre19
+95e2e973f2708306632792991502a86907a8e2ca icedtea-2.6pre20
+533e9029af3503d09a95b70abb4c21ca3fc9ac89 icedtea-2.6pre21
+d17bcae64927f33e6e7e0e6132c62a7bf523dbc3 icedtea-2.6pre22
 f33e6ea5f4832468dd86a8d48ef50479ce91111e jdk7u80-b06
 feb04280659bf05b567dc725ff53e2a2077bdbb7 jdk7u80-b07
 f1334857fa99e6472870986b6071f9405c29ced4 jdk7u80-b08
@@ -584,9 +621,19 @@
 75fb0553cc146fb238df4e93dbe90791435e84f9 jdk7u80-b30
 daa5092b07a75c17356bb438adba03f83f94ef17 jdk7u80-b15
 a942e0b5247772ea326705c717c5cd0ad1572aaa jdk7u80-b32
-a4521bae269393be804805432429c3f996239c1a jdk7u85-b00
-47954a92adb039f893e4732017213d8488b22a58 jdk7u85-b01
+ec336c81a5455ef96a20cff4716603e7f6ca01ad icedtea-2.6pre23
+444d55ffed65907640aad374ce84e7a01ba8dbe7 icedtea-2.6pre24
+2db5e90a399beb96d82086d2d961894246d0bfe5 icedtea-2.6.0
+ec192fcd997198899cc376b0afad2c53893dedad jdk7u85-b00
+fc2855d592b09fe16d0d47a24d09466f776dcb54 jdk7u85-b01
+2db5e90a399beb96d82086d2d961894246d0bfe5 icedtea-2.6-branchpoint
+15db078b2bfde69f953bcf7a69273aff495a4701 icedtea-2.7.0pre01
+6a8bf2d8048964b384b20c71bf441f113193a81b icedtea-2.7.0pre02
 66eea0d727761bfbee10784baa6941f118bc06d1 jdk7u85-b02
+dbb972937b50ccd7edc4534d74b91eb66fe6cf0b icedtea-2.7.0pre03
+91216176dcc70528412a937e962bcc7221322701 icedtea-2.7.0pre04
+3fc5cbcd46dd9ac3c7a8eae4758e067eb701d129 icedtea-2.7.0pre05
+d35404fe959028c7238a63d611d6278a1de0a216 icedtea-2.7.0pre06
 295856e8680fa7248dac54bc15b3d6ef697b27ce jdk7u91-b00
 9fc5d7338840ef6b73d28290735bab11395824b0 jdk7u91-b01
 c434c67b8189677dec0a0034a109fb261497cd92 jdk7u91-b02
@@ -595,10 +642,17 @@
 bdcfc4d9ab9f52fbf37db876c08a1846765627c4 jdk7u101-b00
 a7267e8244b9418af15b1103b4d906e8c6a61bc0 jdk7u111-b00
 cc1ed9a351886645eb729144696e41d187564ec2 jdk7u111-b01
+5e3d7e2b2a002891085b3483d204bdd9f85af395 icedtea-2.7.0pre07
+15b47679f447bb41684452a043c230e334222329 icedtea-2.7.0pre08
+2f95b16f0065477e54b1601b5da0907812176446 icedtea-2.7.0pre09
 c16fb4099a2bafe701d533d9a0fd869e7f8e5408 jdk7u121-b00
 86d0df91308912e45e1b00f8699e0b157a8857af jdk7u131-b00
+d6392d3c3e8dedd968c8301d2dfa4dc98c39e353 icedtea-2.7.0pre10
+e14bbf59343de7bfbc5927499983d34ce588ac79 icedtea-2.7.0pre11
 e890a6aef6223d428376aac846c1d1f3e40dbda7 jdk7u141-b00
 a319566e15f5611bae9cfda2696e8217020a9269 jdk7u141-b01
+5af12d99fb1ea4642305058adb1f3f771d8b5eff icedtea-2.7.0pre12
+0e380c5a1bff8694655fa262a110f347a77da044 icedtea-2.7.0pre13
 19a085e656145471455d7fbd648717f94281a729 jdk7u141-b02
 871e3350966f67b95768a94c1854f1515cfa56ca jdk7u151-b00
 da1c09ab9b742fa77c0e667c2218b8d626432656 jdk7u151-b01
--- a/.jcheck/conf	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-project=jdk7
-bugids=dup
--- a/make/com/sun/java/pack/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/com/sun/java/pack/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -76,7 +76,7 @@
   OTHER_CXXFLAGS += $(ZINCLUDE)
   LDDFLAGS += $(ZIPOBJS)
  else
-  LDDFLAGS += $(ZLIB_LIBS)
+  OTHER_LDLIBS += $(ZLIB_LIBS)
   OTHER_CXXFLAGS += $(ZLIB_CFLAGS) -DSYSTEM_ZLIB
  endif
 else
@@ -100,8 +100,7 @@
   RES = $(OBJDIR)/$(PGRM).res
 else
   LDOUTPUT = -o #Have a space 
-  LDDFLAGS += -lc
-  OTHER_LDLIBS  += $(LIBCXX)
+  OTHER_LDLIBS  += -lc $(LIBCXX)
 # setup the list of libraries to link in...
 ifeq ($(PLATFORM), linux)
 ifeq ("$(CC_VER_MAJOR)", "3")
@@ -158,7 +157,7 @@
 	$(prep-target)
 	$(RM) $(TEMPDIR)/mapfile-vers
 	$(CP) mapfile-vers-unpack200 $(TEMPDIR)/mapfile-vers
-	$(LINKER)  $(LDDFLAGS) $(UNPACK_EXE_FILES_o) $(RES) $(LIBCXX) $(LDOUTPUT)$(TEMPDIR)/unpack200$(EXE_SUFFIX)
+	$(LINKER)  $(LDDFLAGS) $(UNPACK_EXE_FILES_o) $(RES) $(OTHER_LDLIBS) $(LDOUTPUT)$(TEMPDIR)/unpack200$(EXE_SUFFIX)
 ifdef MT
 	$(MT) /manifest $(OBJDIR)/unpack200$(EXE_SUFFIX).manifest /outputresource:$(TEMPDIR)/unpack200$(EXE_SUFFIX);#1
 endif
--- a/make/com/sun/nio/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/com/sun/nio/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
--- a/make/com/sun/nio/sctp/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/com/sun/nio/sctp/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -29,7 +29,7 @@
 
 BUILDDIR = ../../../..
 PACKAGE = com.sun.nio.sctp
-LIBRARY = sctp
+LIBRARY = javasctp
 PRODUCT = sun
 #OTHER_JAVACFLAGS += -Xmaxwarns 1000 -Xlint
 include $(BUILDDIR)/common/Defs.gmk
@@ -67,10 +67,16 @@
   -I$(PLATFORM_SRC)/native/java/net \
   -I$(CLASSHDRDIR)/../../../../java/java.nio/nio/CClassHeaders
 
+ifeq ($(SYSTEM_SCTP), true)
+  OTHER_INCLUDES += $(SCTP_CFLAGS)
+endif
+
 ifeq ($(PLATFORM), linux)
+ifneq ($(COMPILER_WARNINGS_FATAL),false)
 COMPILER_WARNINGS_FATAL=true
+endif
 #OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread -ldl
-OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -lnio -lnet -lpthread -ldl
+OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -lnio -lnet -lpthread
 endif
 ifeq ($(PLATFORM), solaris)
 #LIBSCTP = -lsctp
@@ -79,6 +85,13 @@
 endif # macosx
 endif # windows
 
+ifeq ($(SYSTEM_SCTP), true)
+  OTHER_LDLIBS += $(SCTP_LIBS)
+  OTHER_CFLAGS += -DUSE_SYSTEM_SCTP
+else
+  OTHER_LDLIBS += -ldl
+endif
+
 clean clobber::
 	$(RM) -r $(CLASSDESTDIR)/com/sun/nio/sctp
 	$(RM) -r $(CLASSDESTDIR)/sun/nio/ch
--- a/make/com/sun/security/auth/module/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/com/sun/security/auth/module/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -78,7 +78,3 @@
 #
 include $(BUILDDIR)/common/Library.gmk
 
-#
-# JVMDI implementation lives in the VM.
-#
-OTHER_LDLIBS = $(JVMLIB)
--- a/make/common/Defs-embedded.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/Defs-embedded.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -64,7 +64,9 @@
 ifeq ($(ZERO_BUILD), )
 # NIO Platform specific source file location
 ifdef CROSS_COMPILE_ARCH
-  NIO_PLATFORM_CLASSES_ROOT_DIR = $(CLOSED_PLATFORM_SRC)/classes/
+  ifndef OPENJDK
+    NIO_PLATFORM_CLASSES_ROOT_DIR = $(CLOSED_PLATFORM_SRC)/classes/
+  endif
 endif
 
 # For ARM sflt we need to link to a library with improved FP accuracy
--- a/make/common/Defs-linux.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/Defs-linux.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -188,32 +188,54 @@
 #    We need this frame pointer to make it easy to walk the stacks.
 #    This should be the default on X86, but ia64 and amd64 may not have this
 #    as the default.
+CFLAGS_REQUIRED_aarch64 += -fno-omit-frame-pointer -fsigned-char -D_LITTLE_ENDIAN
+CFLAGS_REQUIRED_alpha   += -mieee -D_LITTLE_ENDIAN
 CFLAGS_REQUIRED_amd64   += -fno-omit-frame-pointer -D_LITTLE_ENDIAN
+CFLAGS_REQUIRED_arm     += -fsigned-char -D_LITTLE_ENDIAN
+CFLAGS_REQUIRED_hppa    +=
 CFLAGS_REQUIRED_i586    += -fno-omit-frame-pointer -D_LITTLE_ENDIAN
 CFLAGS_REQUIRED_ia64    += -fno-omit-frame-pointer -D_LITTLE_ENDIAN
+CFLAGS_REQUIRED_m68k    +=
+CFLAGS_REQUIRED_mips    +=
+CFLAGS_REQUIRED_mipsel  += -D_LITTLE_ENDIAN
+CFLAGS_REQUIRED_ppc     += -m32 -fsigned-char -D_BIG_ENDIAN
+CFLAGS_REQUIRED_ppc64   += -m64 -D_BIG_ENDIAN
+LDFLAGS_COMMON_ppc64    += -m64 -L/lib64 -Wl,-melf64ppc
+CFLAGS_REQUIRED_ppc64le += -D_LITTLE_ENDIAN -DABI_ELFv2
+CFLAGS_REQUIRED_s390    +=
+CFLAGS_REQUIRED_s390x   += -m64
+CFLAGS_REQUIRED_sh      += -mieee
 CFLAGS_REQUIRED_sparcv9 += -m64 -mcpu=v9 -D_BIG_ENDIAN
 LDFLAGS_COMMON_sparcv9  += -m64 -mcpu=v9
 CFLAGS_REQUIRED_sparc   += -m32 -mcpu=v9 -D_BIG_ENDIAN
 LDFLAGS_COMMON_sparc    += -m32 -mcpu=v9
-CFLAGS_REQUIRED_arm     += -fsigned-char -D_LITTLE_ENDIAN
-CFLAGS_REQUIRED_ppc     += -fsigned-char -D_BIG_ENDIAN
-ifeq ($(ARCH),ppc64)
-  ifeq ($(OPENJDK_TARGET_CPU_ENDIAN),big)
-    CFLAGS_REQUIRED_ppc64   += -m64 -D_BIG_ENDIAN
-    LDFLAGS_COMMON_ppc64    += -m64 -L/lib64 -Wl,-melf64ppc
-  else ifeq ($(OPENJDK_TARGET_CPU_ENDIAN),little)
-    CFLAGS_REQUIRED_ppc64   += -D_LITTLE_ENDIAN -DABI_ELFv2
-  else
-    $(error Expected big/little for ARCH=ppc64, got OPENJDK_TARGET_CPU_ENDIAN=$(OPENJDK_TARGET_CPU_ENDIAN))
-  endif
-endif
 ifeq ($(ZERO_BUILD), true)
   CFLAGS_REQUIRED       =  $(ZERO_ARCHFLAG)
   ifeq ($(ZERO_ENDIANNESS), little)
     CFLAGS_REQUIRED     += -D_LITTLE_ENDIAN
   endif
   LDFLAGS_COMMON        += $(ZERO_ARCHFLAG)
+  ifeq ($(ZERO_ARCHDEF),PPC) 
+# gcc bug http://gcc.gnu.org/PR63341 in ppc code generation requires -fno-tree-vectorize for now
+    ifeq ($(ARCH_DATA_MODEL), 32)
+      CFLAGS_REQUIRED   += -DPPC -DPPC32 -fno-tree-vectorize
+    else
+      CFLAGS_REQUIRED   += -DPPC -DPPC64 -fno-tree-vectorize
+    endif
+  else
+    ifeq ($(ZERO_ARCHDEF),PPC32)
+      CFLAGS_REQUIRED   += -DPPC -DPPC32 -fno-tree-vectorize
+    else
+      ifeq  ($(ZERO_ARCHDEF),PPC64)
+        CFLAGS_REQUIRED   += -DPPC -DPPC64 -fno-tree-vectorize
+      endif
+    endif
+  endif
 else
+# gcc bug http://gcc.gnu.org/PR63341 in ppc code generation requires -fno-tree-vectorize for now
+CFLAGS_REQUIRED_ppc     += -fno-tree-vectorize
+CFLAGS_REQUIRED_ppc64   += -fno-tree-vectorize
+#
   CFLAGS_REQUIRED       =  $(CFLAGS_REQUIRED_$(ARCH))
   LDFLAGS_COMMON        += $(LDFLAGS_COMMON_$(ARCH))
 endif
@@ -249,9 +271,7 @@
 #
 # Misc compiler options
 #
-ifneq ($(ARCH),ppc)
-  CFLAGS_COMMON   = -fno-strict-aliasing
-endif 
+CFLAGS_COMMON   = -fno-strict-aliasing
 PIC_CODE_LARGE = -fPIC
 PIC_CODE_SMALL = -fpic
 GLOBAL_KPIC = $(PIC_CODE_LARGE)
@@ -302,11 +322,15 @@
 
 CPP_ARCH_FLAGS = -DARCH='"$(ARCH)"'
 
-# Alpha arch does not like "alpha" defined (potential general arch cleanup issue here)
-ifneq ($(ARCH),alpha)
+# Alpha and sh archs do not like "alpha" or "sh" defined (potential general arch cleanup issue here)
+ifeq ($(ARCH),alpha)
+  CPP_ARCH_FLAGS += -D_$(ARCH)_
+else
+ifeq ($(ARCH),sh)
+  CPP_ARCH_FLAGS += -D_$(ARCH)_
+else
   CPP_ARCH_FLAGS += -D$(ARCH)
-else
-  CPP_ARCH_FLAGS += -D_$(ARCH)_
+endif
 endif
 
 CPPFLAGS_COMMON = $(CPP_ARCH_FLAGS) -DLINUX $(VERSION_DEFINES) \
@@ -347,8 +371,13 @@
 
   LDFLAG_Z_ORIGIN = $(Z_ORIGIN_FLAG/$(ARCH_FAMILY))
 
+ifneq ($(INSTALL_LOCATION),)
+  LDFLAGS_COMMON += $(LDFLAG_Z_ORIGIN) -Xlinker -rpath -Xlinker \$$ORIGIN:$(INSTALL_LOCATION)/jre/lib/$(LIBARCH)
+  LDFLAGS_COMMON += $(LD_RUNPATH_EXTRAS:%=$(LDFLAG_Z_ORIGIN) -Xlinker -rpath -Xlinker \$$ORIGIN/:$(INSTALL_LOCATION)/jre/lib/$(LIBARCH)%)
+else
   LDFLAGS_COMMON += $(LDFLAG_Z_ORIGIN) -Xlinker -rpath -Xlinker \$$ORIGIN
   LDFLAGS_COMMON += $(LD_RUNPATH_EXTRAS:%=$(LDFLAG_Z_ORIGIN) -Xlinker -rpath -Xlinker \$$ORIGIN/%)
+endif
 
 endif
 
--- a/make/common/Defs-macosx.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/Defs-macosx.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -407,4 +407,9 @@
 OTHER_CXXFLAGS += -D_DARWIN_UNLIMITED_SELECT
 OTHER_CPPFLAGS += -D_DARWIN_UNLIMITED_SELECT
 
+# Use unlimited select
+OTHER_CFLAGS += -D_DARWIN_UNLIMITED_SELECT
+OTHER_CXXFLAGS += -D_DARWIN_UNLIMITED_SELECT
+OTHER_CPPFLAGS += -D_DARWIN_UNLIMITED_SELECT
+
 LIB_LOCATION ?= $(LIBDIR)
--- a/make/common/Defs.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/Defs.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -234,14 +234,30 @@
 JRE_NONEXIST_LOCALES = en en_US de_DE es_ES fr_FR it_IT ja_JP ko_KR sv_SE zh
 
 #
-# All libraries except libjava and libjvm itself link against libjvm and
-# libjava, the latter for its exported common utilities.  libjava only links
-# against libjvm.  Programs' makefiles take their own responsibility for
+# For now, most libraries except libjava and libjvm itself link against libjvm
+# and libjava, the latter for its exported common utilities. libjava only
+# links against libjvm. Programs' makefiles take their own responsibility for
 # adding other libs.
 #
+# The makefiles for these packages do not link against libjvm and libjava.
+# This list will eventually go away and each Programs' makefiles
+# will have to explicitly declare that they want to link to libjava/libjvm
+#
+NO_JAVALIB_PKGS = \
+		sun.security.mscapi \
+		sun.security.krb5 \
+		sun.security.pkcs11 \
+		sun.security.jgss \
+		sun.security.jgss.wrapper \
+		sun.security.ec \
+		sun.security.smartcardio \
+		com.sun.security.auth.module
+
 ifdef PACKAGE
 # put JAVALIB first, but do not lose any platform specific values....
-  LDLIBS_COMMON = $(JAVALIB)
+  ifeq (,$(findstring $(PACKAGE),$(NO_JAVALIB_PKGS)))
+    LDLIBS_COMMON = $(JAVALIB)
+  endif
 endif # PACKAGE
 
 #
--- a/make/common/Demo.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/Demo.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -27,7 +27,7 @@
   
 # Some names are defined with LIBRARY inside the Defs.gmk file
 LIBRARY=$(DEMONAME)
-OBJDIR=$(TEMPDIR)/$(DEMONAME)
+OBJDIR=$(TEMPDIR)/$(DEMONAME)/$(OBJDIRNAME)
 
 # Input:
 #    DEMONAME           - name of the demo
--- a/make/common/Library.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/Library.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -180,7 +180,7 @@
 	$(LINK) -dll -out:$(OBJDIR)/$(@F) \
 	  $(MAP_OPTION) \
 	  $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \
-	  $(OTHER_LCF) $(JAVALIB) $(LDLIBS)
+	  $(OTHER_LCF) $(LDLIBS)
 	$(CP) $(OBJDIR)/$(@F) $@
 	@$(call binary_file_verification,$@)
 ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
@@ -269,6 +269,7 @@
   ifneq ($(PLATFORM), macosx)
     ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
       ifeq ($(LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS),1)
+      ifneq ($(STRIP_POLICY),no_strip)
         ifeq ($(PLATFORM), solaris)
 # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
 # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
@@ -279,19 +280,20 @@
 #
 # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
 # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
-	(set -e ; \
-	 $(CD) $(@D) ; \
-	 $(FIX_EMPTY_SEC_HDR_FLAGS) $(@F) ; \
-	 $(OBJCOPY) --only-keep-debug $(@F) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \
-         $(ADD_GNU_DEBUGLINK) $(LIB_PREFIX)$(LIBRARY).debuginfo $(@F) ; \
-	)
+	  (set -e ; \
+	   $(CD) $(@D) ; \
+	   $(FIX_EMPTY_SEC_HDR_FLAGS) $(@F) ; \
+	   $(OBJCOPY) --only-keep-debug $(@F) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \
+           $(ADD_GNU_DEBUGLINK) $(LIB_PREFIX)$(LIBRARY).debuginfo $(@F) ; \
+	  )
         else # PLATFORM != solaris
-	(set -e ; \
-	 $(CD) $(@D) ; \
-	 $(OBJCOPY) --only-keep-debug $(@F) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \
-	 $(OBJCOPY) --add-gnu-debuglink=$(LIB_PREFIX)$(LIBRARY).debuginfo $(@F) ; \
-	)
-        endif # PLATFORM == solaris
+	  (set -e ; \
+	   $(CD) $(@D) ; \
+	   $(OBJCOPY) --only-keep-debug $(@F) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \
+	   $(OBJCOPY) --add-gnu-debuglink=$(LIB_PREFIX)$(LIBRARY).debuginfo $(@F) ; \
+	  )
+          endif # PLATFORM == solaris
+        endif # STRIP_POLICY != no_strip
         ifeq ($(STRIP_POLICY),all_strip)
 	  $(STRIP) $@
         else
@@ -305,12 +307,14 @@
           # implied else here is no stripping at all
           endif
         endif
-        ifeq ($(ZIP_DEBUGINFO_FILES),1)
-	  (set -e ; \
-	   $(CD) $(@D) ; \
-	   $(ZIPEXE) -q $(LIB_PREFIX)$(LIBRARY).diz $(LIB_PREFIX)$(LIBRARY).debuginfo ; \
-	   $(RM) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \
-	  )
+        ifneq ($(STRIP_POLICY),no_strip)
+          ifeq ($(ZIP_DEBUGINFO_FILES),1)
+	    (set -e ; \
+	     $(CD) $(@D) ; \
+	     $(ZIPEXE) -q $(LIB_PREFIX)$(LIBRARY).diz $(LIB_PREFIX)$(LIBRARY).debuginfo ; \
+	     $(RM) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \
+	    )
+          endif
         endif
       endif # LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS
     endif # ENABLE_FULL_DEBUG_SYMBOLS
--- a/make/common/Program.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/Program.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -62,12 +62,14 @@
 program: $(ACTUAL_PROGRAM)
 
 # Work-around for missing processor specific mapfiles
+ifneq (,$(filter $(ARCH), amd64 i586 sparc sparcv9))
 ifndef CROSS_COMPILE_ARCH
   # reuse the mapfiles in the launcher's directory, the same should
   # be applicable to the tool launchers as well.
   FILES_m = $(BUILDDIR)/java/main/java/mapfile-$(ARCH)
   include $(BUILDDIR)/common/Mapfile-vers.gmk
 endif
+endif
 
 include $(JDK_TOPDIR)/make/common/Rules.gmk
 
@@ -108,7 +110,11 @@
   ifeq ($(PLATFORM), linux)
     LDFLAGS += $(LDFLAG_Z_ORIGIN)
     LDFLAGS += -Wl,--allow-shlib-undefined
-    LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH)/jli
+    ifneq ($(INSTALL_LOCATION),)
+      LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH)/jli:$(INSTALL_LOCATION)/jre/lib/$(LIBARCH)/jli
+    else
+      LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH)/jli
+    endif
   endif # PLATFORM LINUX
 endif # PLATFORM linux solaris
 
@@ -132,6 +138,31 @@
 endif # PLATFORM
 
 #
+# Applications expect to be able to link against libjawt without invoking
+# System.loadLibrary("jawt") first. This was the behaviour described in the
+# devloper documentation of JAWT and what worked with OpenJDK6.
+#
+ifeq ($(PLATFORM), solaris)
+  ifeq ($(ARCH_DATA_MODEL), 32)
+    LDFLAGS += -R \$$ORIGIN/../lib/$(LIBARCH)
+    LDFLAGS += -R \$$ORIGIN/../jre/lib/$(LIBARCH)
+  else # ! ARCH_DATA_MODEL 64-bit
+    LDFLAGS += -R \$$ORIGIN/../../lib/$(LIBARCH)
+    LDFLAGS += -R \$$ORIGIN/../../jre/lib/$(LIBARCH)
+  endif # ARCH_DATA_MODEL
+endif # PLATFORM SOLARIS
+ifeq ($(PLATFORM), linux)
+  ifneq ($(INSTALL_LOCATION),)
+    LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH):$(INSTALL_LOCATION)/lib/$(LIBARCH)
+    LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../jre/lib/$(LIBARCH):$(INSTALL_LOCATION)/jre/lib/$(LIBARCH)
+  else
+    LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH)
+    LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../jre/lib/$(LIBARCH)
+  endif
+endif # PLATFORM LINUX
+
+
+#
 # Launcher specific files.
 #
 FILES_o = $(OBJDIR)/main.$(OBJECT_SUFFIX)
@@ -261,7 +292,8 @@
   ifneq ($(PLATFORM), macosx)
     ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
       ifeq ($(PROGRAM_SUPPORTS_FULL_DEBUG_SYMBOLS),1)
-        ifeq ($(PLATFORM), solaris)
+        ifneq ($(STRIP_POLICY),no_strip)
+          ifeq ($(PLATFORM), solaris)
 # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
 # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
 # empty section headers until a fixed $(OBJCOPY) is available.
@@ -271,19 +303,20 @@
 #
 # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
 # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
-	(set -e ; \
-	 $(CD) $(@D) ; \
-	 $(FIX_EMPTY_SEC_HDR_FLAGS) $(@F) ; \
-	 $(OBJCOPY) --only-keep-debug $(@F) $(@F).debuginfo ; \
-         $(ADD_GNU_DEBUGLINK) $(@F).debuginfo $(@F) ; \
-	)
-        else # PLATFORM != solaris
-	(set -e ; \
-	 $(CD) $(@D) ; \
-	 $(OBJCOPY) --only-keep-debug $(@F) $(@F).debuginfo ; \
-	 $(OBJCOPY) --add-gnu-debuglink=$(@F).debuginfo $(@F) ; \
-	)
-        endif # PLATFORM == solaris
+	  (set -e ; \
+	   $(CD) $(@D) ; \
+	   $(FIX_EMPTY_SEC_HDR_FLAGS) $(@F) ; \
+	   $(OBJCOPY) --only-keep-debug $(@F) $(@F).debuginfo ; \
+           $(ADD_GNU_DEBUGLINK) $(@F).debuginfo $(@F) ; \
+	  )
+          else # PLATFORM != solaris
+	  (set -e ; \
+	   $(CD) $(@D) ; \
+	   $(OBJCOPY) --only-keep-debug $(@F) $(@F).debuginfo ; \
+	   $(OBJCOPY) --add-gnu-debuglink=$(@F).debuginfo $(@F) ; \
+	  )
+          endif # PLATFORM == solaris
+        endif
         ifeq ($(STRIP_POLICY),all_strip)
 	  $(STRIP) $@
         else
@@ -297,17 +330,19 @@
           # implied else here is no stripping at all
           endif
         endif
-        ifeq ($(ZIP_DEBUGINFO_FILES),1)
-	  (set -e ; \
-	   $(CD) $(@D) ; \
-	   $(ZIPEXE) -q $(@F).diz $(@F).debuginfo ; \
-	   $(RM) $(@F).debuginfo ; \
-	  )
-          # save ZIP'ed debug info with rest of the program's build artifacts
-	  $(MV) $@.diz $(OBJDIR)
-        else
-          # save debug info with rest of the program's build artifacts
-	  $(MV) $@.debuginfo $(OBJDIR)
+        ifneq ($(STRIP_POLICY),no_strip)
+          ifeq ($(ZIP_DEBUGINFO_FILES),1)
+	    (set -e ; \
+	     $(CD) $(@D) ; \
+	     $(ZIPEXE) -q $(@F).diz $(@F).debuginfo ; \
+	     $(RM) $(@F).debuginfo ; \
+	    )
+            # save ZIP'ed debug info with rest of the program's build artifacts
+	    $(MV) $@.diz $(OBJDIR)
+          else
+            # save debug info with rest of the program's build artifacts
+	    $(MV) $@.debuginfo $(OBJDIR)
+          endif
         endif
       endif # PROGRAM_SUPPORTS_FULL_DEBUG_SYMBOLS
     endif # ENABLE_FULL_DEBUG_SYMBOLS
@@ -374,7 +409,9 @@
     OTHER_INCLUDES += -I$(SHARE_SRC)/native/java/util/zip/zlib-1.2.8
   endif # SYSTEM_ZLIB
 else # PLATFORM !MACOSX
-  OTHER_INCLUDES += -I$(SHARE_SRC)/native/java/util/zip/zlib-1.2.8
+  ifneq ($(SYSTEM_ZLIB), true)
+    OTHER_INCLUDES += -I$(SHARE_SRC)/native/java/util/zip/zlib-1.2.8
+  endif
 endif
 
 OTHER_CPPFLAGS  += -DPROGNAME='"$(PROGRAM)"'
--- a/make/common/Release.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/Release.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -215,12 +215,14 @@
 
 
 # no compression unless requested
-ifndef COMPRESS_JARS
+ifneq ($(COMPRESS_JARS), true)
   CREATE_JAR_OPTS = c0mf
   CREATE_JAR_OPTS_NOMANIFEST = c0f
+  UPDATE_JAR_OPTS = u0f
 else
   CREATE_JAR_OPTS = cmf
   CREATE_JAR_OPTS_NOMANIFEST = cf
+  UPDATE_JAR_OPTS = uf
 endif
 
 #
@@ -632,7 +634,21 @@
 	$(ECHO) "jdk/internal/jfr/events/" >> $@
 endif
 
+######################################################
+# List of directories in impsrc directory that should NOT be in resources.jar
+######################################################
 
+NOT_RESOURCE_JAR_LIST = $(ABS_TEMPDIR)/not_resource_jar.list
+
+$(NOT_RESOURCE_JAR_LIST): FRC
+	$(prep-target)
+	$(ECHO) "#\n" >> $@
+	$(ECHO) "# List of subdirectories not to include in resources.jar" >> $@
+	$(ECHO) "# Directories must contain trailing '/'." >> $@
+	$(ECHO) "com/" >> $@
+	$(ECHO) "javax/" >> $@
+	$(ECHO) "org/" >> $@
+	$(ECHO) "sun/" >> $@
 
 # File order list for rt.jar
 #     - sun.applet is included, till hotjava stops relying on it.
@@ -644,6 +660,7 @@
 JARFILELISTS_TEMPDIR=$(ABS_TEMPDIR)/jarfilelists
 RT_JAR_FILELIST=$(JARFILELISTS_TEMPDIR)/rt_jar_list
 RES_JAR_FILELIST=$(JARFILELISTS_TEMPDIR)/resources_jar_list
+IMPORT_JAR_FILELIST=$(JARFILELISTS_TEMPDIR)/imp_file_list
 
 JARREORDER_JARFILE = $(ABS_BUILDTOOLJARDIR)/jarreorder.jar
 
@@ -656,6 +673,15 @@
 	$(MV) $@.temp $@
 	@($(CD) $(CLASSBINDIR) && $(java-vm-cleanup))
 
+$(IMPORT_JAR_FILELIST): $(JARREORDER_JARFILE) $(NOT_RESOURCE_JAR_LIST)
+	$(prep-target)
+	$(RM) $@.temp
+	($(CD) $(IMPORTSRCDIR) && \
+	    $(BOOT_JAVA_CMD) -jar $(JARREORDER_JARFILE) \
+		-o  $@.temp - $(NOT_RESOURCE_JAR_LIST) . )
+	$(MV) $@.temp $@
+	@($(CD) $(IMPORTSRCDIR) && $(java-vm-cleanup))
+
 # Create jfr.jar
 JFR_JAR=
 ifeq ($(BUILD_JFR), true)
@@ -700,12 +726,16 @@
 
 # Create resources.jar containing non-class files
 RESOURCES_JAR=$(ABS_TEMPDIR)/resources-orig.jar
-$(RESOURCES_JAR): $(RES_JAR_FILELIST) $(OTHER_JAR_MANIFEST_FILE)
+$(RESOURCES_JAR): $(RES_JAR_FILELIST) $(OTHER_JAR_MANIFEST_FILE) $(IMPORT_JAR_FILELIST)
 	$(prep-target)
 	$(CD) $(CLASSBINDIR) && \
 	    $(BOOT_JAR_CMD) $(CREATE_JAR_OPTS) $(OTHER_JAR_MANIFEST_FILE) $@ \
 	        @$(RES_JAR_FILELIST) $(BOOT_JAR_JFLAGS)
+	$(CD) $(IMPORTSRCDIR) && \
+	    $(BOOT_JAR_CMD) $(UPDATE_JAR_OPTS) $@ \
+	        @$(IMPORT_JAR_FILELIST) $(BOOT_JAR_JFLAGS)
 	@$(CD) $(CLASSBINDIR) && $(java-vm-cleanup)
+	@$(CD) $(IMPORTSRCDIR) && $(java-vm-cleanup)
 
 # Create jsse.jar containing SunJSSE implementation classes
 JSSE_JAR=$(ABS_TEMPDIR)/jsse-orig.jar
@@ -1107,13 +1137,9 @@
 	for d in $(SOURCE_DIRS); do \
 	  $(RM) $(ABS_TEMPDIR)/src-files.list; \
 	  ($(CD) $$d &&  \
-	    for sd in $(SOURCES) ; do \
-              if [ -d $$sd ] ; then \
-	        $(FIND) $$sd $(SOURCE_FILES_filter) \
-		        -name '*.java' -print \
-		        >> $(ABS_TEMPDIR)/src-files.list ; \
-	      fi; \
-	    done ; \
+	    $(FIND) . $(SOURCE_FILES_filter) \
+	    -name '*.java' -print \
+	    >> $(ABS_TEMPDIR)/src-files.list ; \
 	  ) ; \
 	  if [ -f  $(ABS_TEMPDIR)/src-files.list ] ; then \
 	    ($(CD) $$d && $(TAR) cf - -T $(ABS_TEMPDIR)/src-files.list ) \
@@ -1124,13 +1150,9 @@
 	for d in $(SOURCE_DIRS); do \
 	  $(RM) $(ABS_TEMPDIR)/src-files.list; \
 	  ($(CD) $$d && \
-	    for sd in $(SOURCES) ; do \
-              if [ -d $$sd ] ; then \
-	        $(FIND) $$sd $(SOURCE_FILES_filter) \
-		        -name '*.java' -print \
-		        >> $(ABS_TEMPDIR)/src-files.list ; \
-	      fi; \
-	    done ; \
+	    $(FIND) . $(SOURCE_FILES_filter) \
+	    -name '*.java' -print \
+	    >> $(ABS_TEMPDIR)/src-files.list ; \
 	  ) ; \
 	  if [ -f  $(ABS_TEMPDIR)/src-files.list ] ; then \
 	    ($(CD) $$d && $(TAR) cf - `$(CAT) $(ABS_TEMPDIR)/src-files.list`) \
--- a/make/common/shared/Compiler-gcc.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/shared/Compiler-gcc.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -53,18 +53,84 @@
 
 ifeq ($(PLATFORM), linux)
 
+  ifndef BUILD_GCC
+    BUILD_GCC=$(COMPILER_PATH)gcc
+  endif
+
+  ifndef BUILD_CPP
+    BUILD_CPP=$(COMPILER_PATH)g++
+  endif
+
   # Settings specific to Linux
-  CC             = $(COMPILER_PATH)gcc
-  CPP            = $(COMPILER_PATH)gcc -E
+  CC             = $(BUILD_GCC)
+  CPP            = $(BUILD_GCC) -E
   # statically link libstdc++ before C++ ABI is stablized on Linux
-  STATIC_CXX     = true
+  ifneq ($(STATIC_CXX),false)
+    STATIC_CXX     = true
+  endif
   ifeq ($(STATIC_CXX),true)
     # g++ always dynamically links libstdc++, even we use "-Wl,-Bstatic -lstdc++"
     # We need to use gcc to statically link the C++ runtime. gcc and g++ use
     # the same subprocess to compile C++ files, so it is OK to build using gcc.
-    CXX            = $(COMPILER_PATH)gcc
+    CXX            = $(BUILD_GCC)
   else
-    CXX            = $(COMPILER_PATH)g++
+    CXX            = $(BUILD_CPP)
+  endif
+  ifeq ($(ARCH), alpha)
+    # alpha
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 3.2.*
+  endif
+  ifeq ($(ARCH), amd64)
+    # amd64
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 3.2.*
+  endif
+  ifeq ($(ARCH), arm)
+    # arm
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 3.2.*
+  endif
+  ifeq ($(ARCH), i586)
+    # i586
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 3.2.1*
+    REQUIRED_GCC_VER_INT = 3.2.1-7a
+  endif
+  ifeq ($(ARCH), ia64)
+    # ia64
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 2.9[56789].*
+  endif
+  ifneq ("$(findstring m68k,$(ARCH))", "")
+    # m68k
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 3.2.*
+  endif
+  ifneq ("$(findstring mips,$(ARCH))", "")
+    # mips
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 3.2.*
+  endif
+  ifneq ("$(findstring parisc,$(ARCH))", "")
+    # mips
+    REQUIRED_CC_VER = 4.4
+    REQUIRED_GCC_VER = 4.4.*
+  endif
+  ifneq ("$(findstring ppc,$(ARCH))", "")
+    # ppc or ppc64
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 3.2.*
+  endif
+  ifneq ("$(findstring s390,$(ARCH))", "")
+    # s390 or s390x
+    REQUIRED_CC_VER = 3.2
+    REQUIRED_GCC_VER = 3.2.*
+  endif
+  ifneq ("$(findstring sh,$(ARCH))", "")
+    # sh4*, sh3*
+    REQUIRED_CC_VER = 4.0
+    REQUIRED_GCC_VER = 4.0.*
   endif
   # Option used to create a shared library
   SHARED_LIBRARY_FLAG = -shared
--- a/make/common/shared/Defs-java.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/shared/Defs-java.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -88,9 +88,17 @@
 
 # 64-bit builds require a larger thread stack size.
 ifeq ($(ARCH_DATA_MODEL), 32)
-  JAVAC_JVM_FLAGS    += -J-XX:ThreadStackSize=768
+  ifeq ($(ARCH), ppc)
+    JAVAC_JVM_FLAGS    += -J-XX:ThreadStackSize=1152
+  else
+    JAVAC_JVM_FLAGS    += -J-XX:ThreadStackSize=768
+  endif
 else
-  JAVAC_JVM_FLAGS    += -J-XX:ThreadStackSize=2096
+  ifeq ($(ARCH), ppc64)
+    JAVAC_JVM_FLAGS    += -J-XX:ThreadStackSize=2096
+  else
+    JAVAC_JVM_FLAGS    += -J-XX:ThreadStackSize=1664
+  endif
 endif
 JAVAC_JVM_FLAGS    += $(JAVA_TOOLS_FLAGS:%=-J%)
 
@@ -233,9 +241,16 @@
 
 BOOT_JAVACFLAGS  += $(NO_PROPRIETARY_API_WARNINGS)
 
+BOOT_LIB = $(BOOTDIR)/jre/lib/rt.jar
+BOOT_JAVACFLAGS += -bootclasspath $(BOOT_LIB)
+
 BOOT_JAVA_CMD      = $(BOOTDIR)/bin/java $(JAVA_TOOLS_FLAGS)
 BOOT_JAVAC_CMD     = $(BOOTDIR)/bin/javac $(JAVAC_JVM_FLAGS) $(BOOT_JAVACFLAGS)
-BOOT_JAR_CMD       = $(BOOTDIR)/bin/jar
+ifdef ALT_JAR_CMD
+  BOOT_JAR_CMD       = $(ALT_JAR_CMD)
+else
+  BOOT_JAR_CMD       = $(BOOTDIR)/bin/jar
+endif
 BOOT_JARSIGNER_CMD = $(BOOTDIR)/bin/jarsigner
 
 # Various tools we need to run (FIXUP: Are these the right ones?)
--- a/make/common/shared/Defs-versions.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/shared/Defs-versions.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -213,7 +213,7 @@
 # Generic
 REQUIRED_ANT_VER          = 1.7.1
 REQUIRED_BOOT_VER         = 1.6
-REQUIRED_FREETYPE_VERSION = 2.3.0
+REQUIRED_FREETYPE_VERSION = 2.2.1
 REQUIRED_MAKE_VER         = 3.81
 REQUIRED_UNZIP_VER        = 5.12
 REQUIRED_ZIP_VER          = 2.2
--- a/make/common/shared/Defs.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/shared/Defs.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -223,7 +223,7 @@
 
 # Default names
 ifdef OPENJDK
-  LAUNCHER_NAME = openjdk
+  LAUNCHER_NAME = java
   PRODUCT_NAME = OpenJDK
   PRODUCT_SUFFIX = Runtime Environment
   JDK_RC_PLATFORM_NAME = Platform
--- a/make/common/shared/Platform.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/shared/Platform.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -170,6 +170,9 @@
   else
     mach := $(shell uname -m)
   endif
+  ifneq (,$(wildcard /usr/bin/dpkg-architecture))
+    mach := $(shell (dpkg-architecture -qDEB_HOST_ARCH_CPU 2>/dev/null || echo $(mach)) | sed 's/arm64/aarch64/;s/powerpc$$/ppc/;s/hppa/parisc/;s/ppc64el/ppc64le/')
+  endif
   archExpr = case "$(mach)" in \
                 i[3-9]86) \
                     echo i586 \
@@ -186,6 +189,9 @@
                 arm*) \
                     echo arm \
                     ;; \
+                sh*) \
+                    echo sh \
+                    ;; \
                 *) \
                     echo $(mach) \
                     ;; \
@@ -211,17 +217,19 @@
   else ifeq ($(ARCH), ppc64le)
     ARCH_DATA_MODEL=64
     OPENJDK_TARGET_CPU_ENDIAN=little
-    ARCH := ppc64
   else
     # Most archs are 32-bit
     ifndef ARCH_DATA_MODEL
       ARCH_DATA_MODEL=32
-      ifeq ($(ARCH), amd64)
+      ifneq (,$(findstring 64,$(ARCH)))
         ARCH_DATA_MODEL=64
       endif
-      ifeq ($(ARCH), ia64)
+      ifeq ($(ARCH), s390x)
         ARCH_DATA_MODEL=64
       endif
+      ifeq ($(ARCH), sh)
+        ARCH_DATA_MODEL=32
+      endif
     endif
   endif
 
--- a/make/common/shared/Sanity.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/common/shared/Sanity.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -95,6 +95,10 @@
       echo "RedHat"; \
     elif [ -f /etc/SuSE-release ] ; then \
       echo "SuSE"; \
+    elif [ -f /etc/gentoo-release ] ; then \
+      echo "Gentoo"; \
+    elif [ -f /etc/debian_version ] ; then \
+      echo "Debian"; \
     elif [ -f /etc/lsb-release ] ; then \
       $(EGREP) DISTRIB_ID /etc/lsb-release | $(SED) -e 's@.*DISTRIB_ID=\(.*\)@\1@'; \
     else \
@@ -103,6 +107,10 @@
   OS_VARIANT_VERSION := $(shell \
     if [ "$(OS_VARIANT_NAME)" = "Fedora" ] ; then \
       $(CAT) /etc/fedora-release | $(HEAD) -1 | $(NAWK) '{ print $$3; }' ; \
+    elif [ "$(OS_VARIANT_NAME)" = "Gentoo" ] ; then \
+      $(CAT) /etc/gentoo-release | $(HEAD) -1 | $(NAWK) '{ print $$5; }' ; \
+    elif [ "$(OS_VARIANT_NAME)" = "Debian" ] ; then \
+      $(CAT) /etc/debian_version ; \
     elif [ -f /etc/lsb-release ] ; then \
       $(EGREP) DISTRIB_RELEASE /etc/lsb-release | $(SED) -e 's@.*DISTRIB_RELEASE=\(.*\)@\1@'; \
     fi)
--- a/make/docs/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/docs/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -69,11 +69,11 @@
 #    NOTE: javadoc will not complete without these larger settings.
 #    WARNING: This could cause thrashing on low memory machines.
 ifeq ($(ARCH_DATA_MODEL),64)
-  MAX_VM_MEMORY = 1024
+  MAX_VM_MEMORY = 1536
 else ifeq ($(ARCH),universal)
-  MAX_VM_MEMORY = 1024
+  MAX_VM_MEMORY = 1536
 else
-  MAX_VM_MEMORY = 512
+  MAX_VM_MEMORY = 768
 endif
 
 # List of all possible directories for javadoc to look for sources
--- a/make/java/instrument/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/instrument/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -123,7 +123,11 @@
   ifeq ($(PLATFORM), linux)
     LDFLAGS += $(LDFLAG_Z_ORIGIN)
     LDFLAGS += -Wl,--allow-shlib-undefined
-    LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/jli
+    ifneq ($(INSTALL_LOCATION),)
+      LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/jli:$(INSTALL_LOCATION)/jre/lib/$(LIBARCH)/jli
+    else
+      LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/jli
+    endif
   endif
 endif
 endif
--- a/make/java/java/FILES_c.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/java/FILES_c.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -72,7 +72,6 @@
 	GC.c \
 	NativeAccessors.c \
 	Reflection.c \
-	Bits.c \
 	AtomicLong.c \
 	Version.c \
 	VM.c \
--- a/make/java/java/mapfile-vers	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/java/mapfile-vers	Tue Aug 22 02:03:52 2017 +0100
@@ -220,12 +220,6 @@
 		Java_java_lang_UNIXProcess_waitForProcessExit;
 		Java_java_lang_UNIXProcess_forkAndExec;
 		Java_java_lang_UNIXProcess_destroyProcess;
-                Java_java_nio_Bits_copyFromShortArray;
-                Java_java_nio_Bits_copyToShortArray;
-                Java_java_nio_Bits_copyFromIntArray;
-                Java_java_nio_Bits_copyToIntArray;
-                Java_java_nio_Bits_copyFromLongArray;
-                Java_java_nio_Bits_copyToLongArray;
 		Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2;
 		Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2Ljava_security_AccessControlContext_2;
 		Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/java/main/java/mapfile-aarch64	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2004, 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.
+#
+#
+# Specify what global symbols we export.  Note that we're not really
+# interested in declaring a version, simply scoping the file is sufficient.
+#
+
+SUNWprivate_1.1 {
+	global:
+		main;		# Provides basic adb symbol offsets
+		environ;	# Public symbols and required by Java run time
+		_environ;
+		__environ_lock;
+
+	local:
+		*;
+};
--- a/make/java/net/FILES_c.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/net/FILES_c.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -24,7 +24,6 @@
 #
 
 FILES_c = \
-        AbstractPlainDatagramSocketImpl.c \
         DatagramPacket.c \
         ExtendedOptionsImpl.c \
         InetAddress.c \
@@ -64,3 +63,10 @@
     FILES_c += PlainDatagramSocketImpl.c
 endif
 
+ifneq ($(SYSTEM_GCONF), true)
+   FILES_c += gconf_fp.c
+endif
+
+ifneq ($(SYSTEM_GIO)$(SYSTEM_GSETTINGS), truetrue)
+   FILES_c += gio_fp.c
+endif
--- a/make/java/net/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/net/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -88,6 +88,14 @@
     $(PLATFORM_SRC)/native/sun/net/sdp $(PLATFORM_SRC)/native/sun/net/spi \
     $(PLATFORM_SRC)/native/sun/net
 
+ifneq ($(SYSTEM_GCONF), true)
+  vpath %.c	$(PLATFORM_SRC)/native/common/deps/gconf2
+endif
+
+ifneq ($(SYSTEM_GIO)$(SYSTEM_GSETTINGS), truetrue)
+  vpath %.c     $(PLATFORM_SRC)/native/common/deps/glib2
+endif
+
 #
 # Include rules
 #
@@ -95,6 +103,10 @@
 
 include $(BUILDDIR)/common/Library.gmk
 
+ifeq ($(NATIVE_SUPPORT_DEBUG), true)
+  OTHER_CFLAGS += -DNATIVE_SUPPORT_DEBUG
+endif
+
 ifeq ($(PLATFORM), macosx)
 ifdef DONT_ENABLE_IPV6
   OTHER_CFLAGS += -DDONT_ENABLE_IPV6
@@ -106,13 +118,29 @@
                  secur32.lib iphlpapi.lib delayimp.lib \
                  /DELAYLOAD:secur32.dll /DELAYLOAD:iphlpapi.dll
 else
-  OTHER_LDLIBS = $(LIBSOCKET) $(LIBNSL) $(LIBDL) $(JVMLIB)
+  OTHER_LDLIBS = $(LIBSOCKET) $(LIBNSL) $(JVMLIB)
 endif
 ifeq ($(PLATFORM), linux)
   OTHER_LDLIBS += -lpthread
 endif
 endif # PLATFORM
 
+ifeq ($(SYSTEM_GCONF), true)
+  OTHER_LDLIBS += $(GCONF_LIBS) $(GOBJECT_LIBS)
+  CPPFLAGS += $(GCONF_CFLAGS) $(GOBJECT_CFLAGS) -DUSE_SYSTEM_GCONF
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps/gconf2 -I$(PLATFORM_SRC)/native/common/deps/glib2
+  OTHER_LDLIBS += $(LIBDL)
+endif
+
+ifeq ($(SYSTEM_GIO)$(SYSTEM_GSETTINGS), truetrue)
+  OTHER_LDLIBS += $(GIO_LIBS)
+  CPPFLAGS += $(GIO_CFLAGS) -DUSE_SYSTEM_GIO -DUSE_SYSTEM_GSETTINGS
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps/glib2
+  OTHER_LDLIBS += $(LIBDL)
+endif
+
 CLASSES.export += java.lang.Integer java.io.FileDescriptor java.net.InetAddressImplFactory java.net.Inet4AddressImpl java.net.Inet6AddressImpl
 
 #
--- a/make/java/net/mapfile-vers	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/net/mapfile-vers	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 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
@@ -28,8 +28,7 @@
 SUNWprivate_1.1 {
         global:
                 JNI_OnLoad;
-                Java_java_net_AbstractPlainDatagramSocketImpl_init;
-                Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable;
+		Java_java_net_PlainDatagramSocketImpl_dataAvailable;
                 Java_java_net_PlainSocketImpl_socketListen;
                 Java_java_net_PlainDatagramSocketImpl_getTTL;
                 Java_java_net_PlainDatagramSocketImpl_init;
--- a/make/java/nio/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/nio/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -31,7 +31,7 @@
 PACKAGE = java.nio
 LIBRARY = nio
 PRODUCT = java
-OTHER_JAVACFLAGS += -Xmaxwarns 1000 -Xlint:serial -Werror
+OTHER_JAVACFLAGS += -Xmaxwarns 1000 -Xlint:serial
 include $(BUILDDIR)/common/Defs.gmk
 
 NIO_SRC = $(SHARE_SRC)/classes/java/nio
@@ -48,87 +48,6 @@
 include FILES_c.gmk
 include Exportedfiles.gmk
 
-ifeq ($(PLATFORM), solaris)
-FILES_java += \
-        sun/nio/ch/AbstractPollSelectorImpl.java \
-	sun/nio/ch/DevPollArrayWrapper.java \
-	sun/nio/ch/DevPollSelectorImpl.java \
-        sun/nio/ch/DevPollSelectorProvider.java \
-	sun/nio/ch/EventPortSelectorImpl.java \
-	sun/nio/ch/EventPortSelectorProvider.java \
-	sun/nio/ch/EventPortWrapper.java \
-	sun/nio/ch/InheritedChannel.java \
-        sun/nio/ch/PollSelectorProvider.java \
-        sun/nio/ch/PollSelectorImpl.java \
-	sun/nio/ch/Port.java \
-	sun/nio/ch/SimpleAsynchronousFileChannelImpl.java \
-	sun/nio/ch/SolarisAsynchronousChannelProvider.java \
-	sun/nio/ch/SolarisEventPort.java \
-	sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \
-	sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
-	\
-	sun/nio/fs/GnomeFileTypeDetector.java \
-	sun/nio/fs/PollingWatchService.java \
-	sun/nio/fs/SolarisAclFileAttributeView.java \
-	sun/nio/fs/SolarisFileStore.java \
-	sun/nio/fs/SolarisFileSystem.java \
-	sun/nio/fs/SolarisFileSystemProvider.java \
-	sun/nio/fs/SolarisUserDefinedFileAttributeView.java \
-	sun/nio/fs/SolarisNativeDispatcher.java \
-	sun/nio/fs/SolarisWatchService.java \
-	sun/nio/fs/UnixChannelFactory.java \
-	sun/nio/fs/UnixCopyFile.java \
-	sun/nio/fs/UnixDirectoryStream.java \
-	sun/nio/fs/UnixException.java \
-	sun/nio/fs/UnixFileAttributeViews.java \
-	sun/nio/fs/UnixFileAttributes.java \
-	sun/nio/fs/UnixFileKey.java \
-	sun/nio/fs/UnixFileModeAttribute.java \
-	sun/nio/fs/UnixFileStore.java \
-	sun/nio/fs/UnixFileStoreAttributes.java \
-	sun/nio/fs/UnixFileSystem.java \
-	sun/nio/fs/UnixFileSystemProvider.java \
-	sun/nio/fs/UnixMountEntry.java \
-	sun/nio/fs/UnixNativeDispatcher.java \
-	sun/nio/fs/UnixPath.java \
-	sun/nio/fs/UnixSecureDirectoryStream.java \
-	sun/nio/fs/UnixUriUtils.java \
-	sun/nio/fs/UnixUserPrincipals.java
-
-FILES_c += \
-        DevPollArrayWrapper.c \
-	InheritedChannel.c \
-	NativeThread.c \
-        PollArrayWrapper.c \
-	SolarisEventPort.c \
-	UnixAsynchronousServerSocketChannelImpl.c \
-	UnixAsynchronousSocketChannelImpl.c \
-	\
-	GnomeFileTypeDetector.c \
-	SolarisNativeDispatcher.c \
-	SolarisWatchService.c \
-	UnixCopyFile.c \
-	UnixNativeDispatcher.c
-
-FILES_export += \
-	sun/nio/ch/DevPollArrayWrapper.java \
-	sun/nio/ch/InheritedChannel.java \
-	sun/nio/ch/NativeThread.java \
-	sun/nio/ch/SolarisEventPort.java \
-	sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \
-	sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
-	\
-	sun/nio/fs/GnomeFileTypeDetector.java \
-	sun/nio/fs/SolarisNativeDispatcher.java \
-	sun/nio/fs/SolarisWatchService.java \
-	sun/nio/fs/UnixCopyFile.java \
-	sun/nio/fs/UnixNativeDispatcher.java
-
-FILES_gen += \
-	sun/nio/fs/SolarisConstants.java \
-	sun/nio/fs/UnixConstants.java
-endif # PLATFORM = solaris
-
 ifeq ($(PLATFORM), windows)
 FILES_java += \
 	sun/nio/ch/Iocp.java \
@@ -164,15 +83,6 @@
 	sun/nio/fs/WindowsUserPrincipals.java \
 	sun/nio/fs/WindowsWatchService.java
 
-FILES_c += \
-	Iocp.c \
-	RegistryFileTypeDetector.c \
-	WindowsAsynchronousFileChannelImpl.c \
-	WindowsAsynchronousServerSocketChannelImpl.c \
-	WindowsAsynchronousSocketChannelImpl.c \
-	WindowsNativeDispatcher.c \
-        WindowsSelectorImpl.c
-
 FILES_export += \
 	sun/nio/ch/Iocp.java \
 	sun/nio/ch/WindowsAsynchronousFileChannelImpl.java \
@@ -181,11 +91,14 @@
 	sun/nio/ch/WindowsSelectorImpl.java \
 	sun/nio/fs/WindowsNativeDispatcher.java \
 	sun/nio/fs/RegistryFileTypeDetector.java
-endif # PLATFORM = windows
 
-ifeq ($(PLATFORM), linux)
+else
+
 FILES_java += \
         sun/nio/ch/AbstractPollSelectorImpl.java \
+	sun/nio/ch/DevPollArrayWrapper.java \
+	sun/nio/ch/DevPollSelectorImpl.java \
+        sun/nio/ch/DevPollSelectorProvider.java \
 	sun/nio/ch/EPoll.java \
 	sun/nio/ch/EPollArrayWrapper.java \
 	sun/nio/ch/EPollPort.java \
@@ -197,6 +110,8 @@
         sun/nio/ch/PollSelectorImpl.java \
 	sun/nio/ch/Port.java \
 	sun/nio/ch/SimpleAsynchronousFileChannelImpl.java \
+	sun/nio/ch/SolarisAsynchronousChannelProvider.java \
+	sun/nio/ch/SolarisEventPort.java \
 	sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \
 	sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
 	\
@@ -209,6 +124,8 @@
 	sun/nio/fs/LinuxNativeDispatcher.java \
 	sun/nio/fs/LinuxWatchService.java \
 	sun/nio/fs/PollingWatchService.java \
+	sun/nio/fs/SolarisNativeDispatcher.java \
+	sun/nio/fs/SolarisWatchService.java \
 	sun/nio/fs/UnixChannelFactory.java \
 	sun/nio/fs/UnixCopyFile.java \
 	sun/nio/fs/UnixDirectoryStream.java \
@@ -228,6 +145,82 @@
 	sun/nio/fs/UnixUriUtils.java \
 	sun/nio/fs/UnixUserPrincipals.java
 
+FILES_export += \
+	sun/nio/ch/DevPollArrayWrapper.java \
+	sun/nio/ch/EPoll.java \
+        sun/nio/ch/EPollArrayWrapper.java \
+	sun/nio/ch/EPollPort.java \
+	sun/nio/ch/InheritedChannel.java \
+	sun/nio/ch/NativeThread.java \
+	sun/nio/ch/SolarisEventPort.java \
+	sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \
+	sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
+	\
+	sun/nio/fs/GnomeFileTypeDetector.java \
+	sun/nio/fs/LinuxNativeDispatcher.java \
+	sun/nio/fs/LinuxWatchService.java \
+	sun/nio/fs/SolarisNativeDispatcher.java \
+	sun/nio/fs/SolarisWatchService.java \
+	sun/nio/fs/UnixCopyFile.java \
+	sun/nio/fs/UnixNativeDispatcher.java
+
+FILES_gen += \
+	sun/nio/fs/UnixConstants.java
+
+ifneq ($(COMPILE_AGAINST_SYSCALLS), true)
+FILES_c += \
+	syscalls_fp.c
+endif
+
+endif
+
+ifeq ($(PLATFORM), solaris)
+
+FILES_c += \
+        DevPollArrayWrapper.c \
+	InheritedChannel.c \
+	NativeThread.c \
+        PollArrayWrapper.c \
+	SolarisEventPort.c \
+	UnixAsynchronousServerSocketChannelImpl.c \
+	UnixAsynchronousSocketChannelImpl.c \
+	\
+	GnomeFileTypeDetector.c \
+	SolarisNativeDispatcher.c \
+	SolarisWatchService.c \
+	UnixCopyFile.c \
+	UnixNativeDispatcher.c
+
+FILES_java += \
+	sun/nio/ch/EventPortSelectorImpl.java \
+	sun/nio/ch/EventPortSelectorProvider.java \
+	sun/nio/ch/EventPortWrapper.java \
+	sun/nio/fs/SolarisAclFileAttributeView.java \
+	sun/nio/fs/SolarisFileStore.java \
+	sun/nio/fs/SolarisFileSystem.java \
+	sun/nio/fs/SolarisFileSystemProvider.java \
+	sun/nio/fs/SolarisUserDefinedFileAttributeView.java
+
+FILES_gen += \
+	sun/nio/fs/SolarisConstants.java
+
+endif # PLATFORM = solaris
+
+ifeq ($(PLATFORM), windows)
+
+FILES_c += \
+	Iocp.c \
+	RegistryFileTypeDetector.c \
+	WindowsAsynchronousFileChannelImpl.c \
+	WindowsAsynchronousServerSocketChannelImpl.c \
+	WindowsAsynchronousSocketChannelImpl.c \
+	WindowsNativeDispatcher.c \
+        WindowsSelectorImpl.c
+
+endif # PLATFORM = windows
+
+ifeq ($(PLATFORM), linux)
+
 FILES_c += \
 	EPoll.c \
 	EPollArrayWrapper.c \
@@ -244,23 +237,11 @@
 	UnixCopyFile.c \
 	UnixNativeDispatcher.c
 
-FILES_export += \
-	sun/nio/ch/EPoll.java \
-        sun/nio/ch/EPollArrayWrapper.java \
-	sun/nio/ch/EPollPort.java \
-	sun/nio/ch/InheritedChannel.java \
-	sun/nio/ch/NativeThread.java \
-	sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \
-	sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
-	\
-	sun/nio/fs/GnomeFileTypeDetector.java \
-	sun/nio/fs/LinuxNativeDispatcher.java \
-	sun/nio/fs/LinuxWatchService.java \
-	sun/nio/fs/UnixCopyFile.java \
-	sun/nio/fs/UnixNativeDispatcher.java
+ifneq ($(SYSTEM_GIO), true)
+FILES_c += \
+	gio_fp.c
+endif
 
-FILES_gen += \
-	sun/nio/fs/UnixConstants.java
 endif # PLATFORM = linux
 
 ifeq ($(PLATFORM), macosx)
@@ -337,41 +318,13 @@
 
 ifeq ($(PLATFORM), aix)
 FILES_java += \
-        sun/nio/ch/AbstractPollSelectorImpl.java \
 	sun/nio/ch/AixAsynchronousChannelProvider.java \
 	sun/nio/ch/AixPollPort.java \
-	sun/nio/ch/InheritedChannel.java \
-        sun/nio/ch/PollSelectorProvider.java \
-        sun/nio/ch/PollSelectorImpl.java \
-	sun/nio/ch/Port.java \
-	sun/nio/ch/SimpleAsynchronousFileChannelImpl.java \
-	sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \
-	sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
 	\
-	sun/nio/fs/GnomeFileTypeDetector.java \
 	sun/nio/fs/AixFileStore.java \
 	sun/nio/fs/AixFileSystem.java \
 	sun/nio/fs/AixFileSystemProvider.java \
-	sun/nio/fs/PollingWatchService.java \
-	sun/nio/fs/UnixChannelFactory.java \
-	sun/nio/fs/UnixCopyFile.java \
-	sun/nio/fs/UnixDirectoryStream.java \
-	sun/nio/fs/UnixException.java \
-	sun/nio/fs/UnixFileAttributeViews.java \
-	sun/nio/fs/UnixFileAttributes.java \
-	sun/nio/fs/UnixFileKey.java \
-	sun/nio/fs/UnixFileModeAttribute.java \
-	sun/nio/fs/UnixFileStore.java \
-	sun/nio/fs/UnixFileStoreAttributes.java \
-	sun/nio/fs/UnixFileSystem.java \
-	sun/nio/fs/UnixFileSystemProvider.java \
-	sun/nio/fs/UnixMountEntry.java \
-	sun/nio/fs/AixNativeDispatcher.java \
-	sun/nio/fs/UnixNativeDispatcher.java \
-	sun/nio/fs/UnixPath.java \
-	sun/nio/fs/UnixSecureDirectoryStream.java \
-	sun/nio/fs/UnixUriUtils.java \
-	sun/nio/fs/UnixUserPrincipals.java
+	sun/nio/fs/AixNativeDispatcher.java
 
 FILES_c += \
 	AixPollPort.c \
@@ -388,18 +341,8 @@
 
 FILES_export += \
 	sun/nio/ch/AixPollPort.java \
-	sun/nio/ch/InheritedChannel.java \
-	sun/nio/ch/NativeThread.java \
-	sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \
-	sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \
-	\
-	sun/nio/fs/GnomeFileTypeDetector.java \
-	sun/nio/fs/UnixCopyFile.java \
-	sun/nio/fs/AixNativeDispatcher.java \
-	sun/nio/fs/UnixNativeDispatcher.java
+	sun/nio/fs/AixNativeDispatcher.java
 
-FILES_gen += \
-	sun/nio/fs/UnixConstants.java
 endif # PLATFORM = aix
 
 
@@ -426,12 +369,24 @@
 
 endif # PLATFORM = macosx
 
+ifneq ($(SYSTEM_GIO), true)
+  vpath %.c	$(PLATFORM_SRC)/native/common/deps/glib2
+endif
+
+ifneq ($(COMPILE_AGAINST_SYSCALLS), true)
+  vpath %.c	$(PLATFORM_SRC)/native/common/deps
+endif
+
 #
 # Various variables
 #
 
 JAVALIB = 		# Don't self-link
 
+ifeq ($(NATIVE_SUPPORT_DEBUG), true)
+  OTHER_CFLAGS += -DNATIVE_SUPPORT_DEBUG
+endif
+
 #
 # Access to io_util.c and net_util.c
 #
@@ -452,12 +407,21 @@
      $(OBJDIR)/../../../java.lang/java/$(OBJDIRNAME)/canonicalize_md.obj \
      $(OBJDIR)/../../../java.lang/java/$(OBJDIRNAME)/FileDescriptor_md.obj
 endif
+
 ifeq ($(PLATFORM), linux)
-OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread $(LIBDL)
+  OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread $(LIBDL)
+  ifeq ($(SYSTEM_GIO), true)
+    OTHER_LDLIBS += $(GIO_LIBS)
+    OTHER_INCLUDES += $(GIO_CFLAGS) -DUSE_SYSTEM_GIO
+  else
+    OTHER_INCLUDES += -I$(PLATFORM_SRC)/native/common/deps/glib2
+  endif
 endif
+
 ifeq ($(PLATFORM), macosx)
 OTHER_LDLIBS += -L$(LIBDIR) -ljava -lnet -pthread -framework CoreFoundation
 endif
+
 ifeq ($(PLATFORM), solaris)
 OTHER_LDLIBS += $(JVMLIB) $(LIBSOCKET) -lposix4 $(LIBDL) -lsendfile \
 		-L$(LIBDIR)/$(LIBARCH) -ljava -lnet
@@ -466,6 +430,12 @@
 OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet
 endif # PLATFORM
 
+ifeq ($(COMPILE_AGAINST_SYSCALLS), true)
+  OTHER_INCLUDES += -DCOMPILE_AGAINST_SYSCALLS
+else
+  OTHER_INCLUDES += -I$(PLATFORM_SRC)/native/common/deps
+endif
+
 #
 # Rules
 #
--- a/make/java/security/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/security/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -63,6 +63,9 @@
 
 PROPS_BUILD = $(LIBDIR)/security/java.security
 
+PKCS11_CONFIG_SRC = $(TOPDIR)/src/share/lib/security/nss.cfg
+PKCS11_CONFIG_BUILD = $(LIBDIR)/security/nss.cfg
+
 POLICY_SRC =	$(TOPDIR)/src/share/lib/security/java.policy
 POLICY_BUILD = $(LIBDIR)/security/java.policy
 
@@ -88,7 +91,7 @@
 include $(BUILDDIR)/common/Rules.gmk
 
 ifdef OPENJDK
-build: properties policy cacerts blacklisted-certs
+build: properties pkcs11config policy cacerts blacklisted-certs
 else
 build: properties policy cacerts blacklist blacklisted-certs trustedlibs
 endif
@@ -97,6 +100,8 @@
 
 properties: classes  $(PROPS_BUILD)
 
+pkcs11config: classes  $(PKCS11_CONFIG_BUILD)
+
 policy: classes  $(POLICY_BUILD)
 
 cacerts: classes $(CACERTS_BUILD)
@@ -110,6 +115,9 @@
 $(PROPS_BUILD): $(PROPS_SRC)
 	$(install-file)
 
+$(PKCS11_CONFIG_BUILD): $(PKCS11_CONFIG_SRC)
+	$(install-file)
+
 $(POLICY_BUILD): $(POLICY_SRC)
 	$(install-file)
 
@@ -136,7 +144,7 @@
 
 clean clobber:: .delete.classlist
 	$(RM) -r $(CLASSBINDIR)/java/security
-	$(RM) $(PROPS_BUILD) $(POLICY_BUILD) $(CACERTS_BUILD) $(BLACKLIST_BUILD) \
+	$(RM) $(PROPS_BUILD) $(PKCS11_CONFIG_BUILD) $(POLICY_BUILD) $(CACERTS_BUILD) $(BLACKLIST_BUILD) \
 	      $(BLACKLISTED_CERTS_BUILD) $(TRUSTEDLIBS_BUILD)
 
 # Additional Rule for building sun.security.util
--- a/make/java/sun_nio/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/sun_nio/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -31,7 +31,7 @@
 PACKAGE = sun.nio
 PRODUCT = sun
 
-OTHER_JAVACFLAGS += -Xlint:serial,-deprecation -Werror
+OTHER_JAVACFLAGS += -Xlint:serial,-deprecation
 include $(BUILDDIR)/common/Defs.gmk
 
 #
--- a/make/java/version/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/java/version/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -39,7 +39,12 @@
 	$(SED) -e 's/@@launcher_name@@/$(LAUNCHER_NAME)/g' \
 	    -e 's/@@java_version@@/$(RELEASE)/g' \
 	    -e 's/@@java_runtime_version@@/$(FULL_VERSION)/g' \
+	    -e 's/@@jdk_derivative_name@@/$(JDK_DERIVATIVE_NAME)/g' \
+	    -e 's/@@distro_name@@/$(DISTRO_NAME)/g' \
+	    -e 's/@@distro_package_version@@/$(DISTRO_PACKAGE_VERSION)/g' \
 	    -e 's/@@java_runtime_name@@/$(RUNTIME_NAME)/g' \
+	    -e 's/@@jdk_revid@@/$(JDK_REVID)/g' \
+	    -e 's/@@hotspot_revid@@/$(HOTSPOT_REVID)/g' \
 	$< > $@.temp
 	@$(MV) $@.temp $@
 
--- a/make/javax/crypto/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/javax/crypto/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -259,6 +259,8 @@
 
 POLICY_DESTDIR			= $(LIBDIR)/security
 UNSIGNED_POLICY_BUILDDIR	= $(UNSIGNED_DIR)/policy
+TEMPDIR_UNLIMITED		= $(TEMPDIR)/unlimited
+TEMPDIR_LIMITED 		= $(TEMPDIR)/limited
 
 build-policy: unlimited limited
 
@@ -271,21 +273,39 @@
 
 $(UNSIGNED_POLICY_BUILDDIR)/unlimited/US_export_policy.jar:		\
 	    policy/unlimited/default_US_export.policy			\
-	    policy/unlimited/UNLIMITED
+	    $(TEMPDIR_UNLIMITED)/META-INF/MANIFEST.MF
 	$(prep-target)
-	$(BOOT_JAR_CMD) cmf policy/unlimited/UNLIMITED $@		\
-	    -C policy/unlimited default_US_export.policy		\
-	    $(BOOT_JAR_JFLAGS)
-	@$(java-vm-cleanup)
+	$(CP) -p policy/unlimited/default_US_export.policy		\
+	    $(TEMPDIR_UNLIMITED)
+	$(TOUCH) -r $(TEMPDIR_UNLIMITED)/META-INF			\
+	    $(TEMPDIR_UNLIMITED)/default_US_export.policy
+	( $(CD) $(TEMPDIR_UNLIMITED) && $(ZIPEXE) -Xr $@ META-INF	\
+	    default_US_export.policy )
+	$(TOUCH) -r $(TEMPDIR_UNLIMITED)/META-INF $@
 
 $(UNSIGNED_POLICY_BUILDDIR)/unlimited/local_policy.jar:			\
 	    policy/unlimited/default_local.policy			\
+	    $(TEMPDIR_UNLIMITED)/META-INF/MANIFEST.MF
+	$(prep-target)
+	$(CP) -p policy/unlimited/default_local.policy			\
+	    $(TEMPDIR_UNLIMITED)
+	$(TOUCH) -r $(TEMPDIR_UNLIMITED)/META-INF			\
+	    $(TEMPDIR_UNLIMITED)/default_local.policy
+	( $(CD) $(TEMPDIR_UNLIMITED) && $(ZIPEXE) -Xr $@ META-INF	\
+	    default_local.policy )
+	$(TOUCH) -r $(TEMPDIR_UNLIMITED)/META-INF $@
+
+$(TEMPDIR_UNLIMITED)/META-INF/MANIFEST.MF:				\
 	    policy/unlimited/UNLIMITED
 	$(prep-target)
-	$(BOOT_JAR_CMD) cmf policy/unlimited/UNLIMITED $@		\
-	    -C policy/unlimited default_local.policy			\
-	    $(BOOT_JAR_JFLAGS)
-	@$(java-vm-cleanup)
+	$(MKDIR) -p $(TEMPDIR_UNLIMITED)/META-INF
+	$(ECHO) "Manifest-Version: 1.0" > 				\
+	    $(TEMPDIR_UNLIMITED)/META-INF/MANIFEST.MF
+	$(CAT) policy/unlimited/UNLIMITED >> 				\
+	    $(TEMPDIR_UNLIMITED)/META-INF/MANIFEST.MF
+	$(TOUCH) -t 200712010000 $(TEMPDIR_UNLIMITED)/META-INF
+	$(TOUCH) -r $(TEMPDIR_UNLIMITED)/META-INF			\
+	    $(TEMPDIR_UNLIMITED)/META-INF/MANIFEST.MF
 
 #
 # Build the unsigned limited policy files.
@@ -299,18 +319,38 @@
 
 $(UNSIGNED_POLICY_BUILDDIR)/limited/US_export_policy.jar:		\
 	    $(UNSIGNED_POLICY_BUILDDIR)/unlimited/US_export_policy.jar
-	$(install-file)
+	$(prep-target)
+	$(CP) -p $< $@
 
 $(UNSIGNED_POLICY_BUILDDIR)/limited/local_policy.jar:			\
 	    policy/limited/default_local.policy				\
 	    policy/limited/exempt_local.policy				\
+	    $(TEMPDIR_LIMITED)/META-INF/MANIFEST.MF
+	$(prep-target)
+	$(CP) -p policy/limited/default_local.policy			\
+	    $(TEMPDIR_LIMITED)
+	$(CP) -p policy/limited/exempt_local.policy			\
+	    $(TEMPDIR_LIMITED)
+	$(TOUCH) -r $(TEMPDIR_LIMITED)/META-INF				\
+	    $(TEMPDIR_LIMITED)/default_local.policy
+	$(TOUCH) -r $(TEMPDIR_LIMITED)/META-INF				\
+	    $(TEMPDIR_LIMITED)/exempt_local.policy
+	( $(CD) $(TEMPDIR_UNLIMITED) && $(ZIPEXE) -Xr $@ META-INF	\
+	    default_local.policy exempt_local.policy )
+	$(TOUCH) -r $(TEMPDIR_UNLIMITED)/META-INF $@
+
+$(TEMPDIR_LIMITED)/META-INF/MANIFEST.MF:				\
 	    policy/limited/LIMITED
 	$(prep-target)
-	$(BOOT_JAR_CMD) cmf policy/limited/LIMITED $@			\
-	    -C policy/limited default_local.policy			\
-	    -C policy/limited exempt_local.policy			\
-	    $(BOOT_JAR_JFLAGS)
-	@$(java-vm-cleanup)
+	$(MKDIR) -p $(TEMPDIR_LIMITED)/META-INF
+	$(ECHO) "Manifest-Version: 1.0" > 				\
+	    $(TEMPDIR_LIMITED)/META-INF/MANIFEST.MF
+	$(CAT) policy/limited/LIMITED >> 				\
+	    $(TEMPDIR_LIMITED)/META-INF/MANIFEST.MF
+	$(TOUCH) -t 200712010000 $(TEMPDIR_LIMITED)/META-INF
+	$(TOUCH) -r $(TEMPDIR_LIMITED)/META-INF 			\
+	    $(TEMPDIR_LIMITED)/META-INF/MANIFEST.MF
+	$(TOUCH) -r $(TEMPDIR_UNLIMITED)/META-INF $@
 
 UNSIGNED_POLICY_FILES = \
     $(UNSIGNED_POLICY_BUILDDIR)/unlimited/US_export_policy.jar		\
@@ -436,7 +476,7 @@
 	$(RM) \
 	    $(POLICY_DESTDIR)/US_export_policy.jar		\
 	    $(POLICY_DESTDIR)/local_policy.jar
-	$(CP) $^ $(POLICY_DESTDIR)
+	$(CP) -p $^ $(POLICY_DESTDIR)
 
 install-limited: install-limited-jars
 ifndef OPENJDK
@@ -450,7 +490,7 @@
 	$(RM) \
 	    $(POLICY_DESTDIR)/US_export_policy.jar		\
 	    $(POLICY_DESTDIR)/local_policy.jar
-	$(CP) $^ $(POLICY_DESTDIR)
+	$(CP) -p $^ $(POLICY_DESTDIR)
 
 install-unlimited: install-unlimited-jars
 ifndef OPENJDK
--- a/make/javax/sound/SoundDefs.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/javax/sound/SoundDefs.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -66,10 +66,66 @@
 ifeq ($(ZERO_BUILD), true)
   CPPFLAGS += -DX_ARCH=X_ZERO
 else
+  ifeq ($(ARCH), aarch64)
+    CPPFLAGS += -DX_ARCH=X_AARCH64
+  endif # ARCH amd64
+
+  ifeq ($(ARCH), alpha)
+    CPPFLAGS += -DX_ARCH=X_ALPHA
+  endif # ARCH alpha
+ 
+  ifeq ($(ARCH), amd64)
+    CPPFLAGS += -DX_ARCH=X_AMD64
+  endif # ARCH amd64
+
+  ifeq ($(ARCH), arm)
+    CPPFLAGS += -DX_ARCH=X_ARM
+  endif # ARCH arm
+
   ifeq ($(ARCH), i586)
     CPPFLAGS += -DX_ARCH=X_I586
   endif # ARCH i586
 
+  ifeq ($(ARCH), ia64)
+    CPPFLAGS += -DX_ARCH=X_IA64
+  endif # ARCH ia64
+
+  ifeq ($(ARCH), m68k)
+    CPPFLAGS += -DX_ARCH=X_M68K
+  endif # ARCH m68k
+
+  ifeq ($(ARCH), mips)
+    CPPFLAGS += -DX_ARCH=X_MIPS
+  endif # ARCH mips
+
+  ifeq ($(ARCH), mipsel)
+    CPPFLAGS += -DX_ARCH=X_MIPSEL
+  endif # ARCH mipsel
+
+  ifeq ($(ARCH), ppc)
+    CPPFLAGS += -DX_ARCH=X_PPC
+  endif # ARCH ppc
+
+  ifeq ($(ARCH), ppc64)
+    CPPFLAGS += -DX_ARCH=X_PPC
+  endif # ARCH ppc64
+
+  ifeq ($(ARCH), ppc64le)
+    CPPFLAGS += -DX_ARCH=X_PPC64LE
+  endif # ARCH ppc64le
+
+  ifeq ($(ARCH), s390)
+    CPPFLAGS += -DX_ARCH=X_S390
+  endif # ARCH s390
+
+  ifeq ($(ARCH), s390x)
+    CPPFLAGS += -DX_ARCH=X_S390X
+  endif # ARCH s390x
+
+  ifeq ($(ARCH), sh)
+    CPPFLAGS += -DX_ARCH=X_SH
+  endif # ARCH Renesas SuperH(sh)
+
   ifeq ($(ARCH), sparc)
     CPPFLAGS += -DX_ARCH=X_SPARC
   endif # ARCH sparc
@@ -78,22 +134,6 @@
     CPPFLAGS += -DX_ARCH=X_SPARCV9
   endif # ARCH sparcv9
 
-  ifeq ($(ARCH), amd64)
-    CPPFLAGS += -DX_ARCH=X_AMD64
-  endif # ARCH amd64
-
-  ifeq ($(ARCH), arm)
-    CPPFLAGS += -DX_ARCH=X_ARM
-  endif # ARCH arm
-
-  ifeq ($(ARCH), ppc)
-    CPPFLAGS += -DX_ARCH=X_PPC
-  endif # ARCH ppc
-
-  ifeq ($(ARCH), ppc64)
-    CPPFLAGS += -DX_ARCH=X_PPC
-  endif # ARCH ppc64
-
 endif
 
 
--- a/make/jdk_generic_profile.sh	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/jdk_generic_profile.sh	Tue Aug 22 02:03:52 2017 +0100
@@ -2,6 +2,7 @@
 
 #
 # Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2011 Red Hat, Inc.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -244,11 +245,27 @@
 PATH="${path4sdk}"
 export PATH
 
+# Obtain pkgconfig for libs
+pkgconfig=$(which pkg-config 2>/dev/null)
+echo "pkgconfig=${pkgconfig}"
+
+# Find source location
+jdk_topdir=$(dirname ${BASH_SOURCE})/..
+if [ ! -e ${jdk_topdir}/src ] ; then
+  jdk_topdir=$(hg root) ;
+fi
+echo "jdk_topdir=${jdk_topdir}"
+
 # Export variables required for Zero
+if [ "x${ZERO_BUILD}" = "x" ] ; then ZERO_BUILD=false; fi
+if [ "x${SHARK_BUILD}" = "x" ] ; then SHARK_BUILD=false; fi
 if [ "${SHARK_BUILD}" = true ] ; then
   ZERO_BUILD=true
   export ZERO_BUILD
 fi
+echo "Building Zero: ${ZERO_BUILD}"
+echo "Building Shark: ${SHARK_BUILD}"
+
 if [ "${ZERO_BUILD}" = true ] ; then
   # ZERO_LIBARCH is the name of the architecture-specific
   # subdirectory under $JAVA_HOME/jre/lib
@@ -258,16 +275,19 @@
     i?86)    ZERO_LIBARCH=i386      ;;
     sparc64) ZERO_LIBARCH=sparcv9   ;;
     arm*)    ZERO_LIBARCH=arm       ;;
+    sh*)     ZERO_LIBARCH=sh        ;;
+    ppc64le) ZERO_LIBARCH=ppc64le   ;;
     *)       ZERO_LIBARCH="$(arch)"
   esac
   export ZERO_LIBARCH
+  echo "Zero library architecture: ${ZERO_LIBARCH}"
 
   # ARCH_DATA_MODEL is the number of bits in a pointer
   case "${ZERO_LIBARCH}" in
-    i386|ppc|s390|sparc|arm)
+    arm|i386|ppc|s390|sh|sparc)
       ARCH_DATA_MODEL=32
       ;;
-    amd64|ppc64|ppc64le|s390x|sparcv9|ia64|alpha)
+    aarch64|alpha|amd64|ia64|ppc64|ppc64le|s390x|sparcv9)
       ARCH_DATA_MODEL=64
       ;;
     *)
@@ -275,10 +295,11 @@
       exit 1
   esac
   export ARCH_DATA_MODEL
+  echo "Zero architecture data model: ${ARCH_DATA_MODEL}"
 
   # ZERO_ENDIANNESS is the endianness of the processor
   case "${ZERO_LIBARCH}" in
-    i386|amd64|ia64|ppc64le)
+    arm|aarch64|amd64|i386|ia64|mipsel|ppc64le)
       ZERO_ENDIANNESS=little
       ;;
     ppc|ppc64|s390*|sparc*|alpha)
@@ -289,6 +310,7 @@
       exit 1
   esac
   export ZERO_ENDIANNESS
+  echo "Zero endianness: ${ZERO_ENDIANNESS}"
 
   # ZERO_ARCHDEF is used to enable architecture-specific code
   case "${ZERO_LIBARCH}" in
@@ -299,20 +321,24 @@
     *)      ZERO_ARCHDEF=$(echo "${ZERO_LIBARCH}" | tr a-z A-Z)
   esac
   export ZERO_ARCHDEF
+  echo "Zero architecture definition: ${ZERO_ARCHDEF}"
 
   # ZERO_ARCHFLAG tells the compiler which mode to build for
   case "${ZERO_LIBARCH}" in
     s390)
       ZERO_ARCHFLAG="-m31"
       ;;
+    arm|aarch64|ppc64le)
+      ZERO_ARCHFLAG="-D_LITTLE_ENDIAN"
+      ;;
     *)
       ZERO_ARCHFLAG="-m${ARCH_DATA_MODEL}"
   esac
   export ZERO_ARCHFLAG
+  echo "Zero architecture flag: ${ZERO_ARCHFLAG}"
 
   # LIBFFI_CFLAGS and LIBFFI_LIBS tell the compiler how to compile and
   # link against libffi
-  pkgconfig=$(which pkg-config 2>/dev/null)
   if [ -x "${pkgconfig}" ] ; then
     if [ "${LIBFFI_CFLAGS}" = "" ] ; then
       LIBFFI_CFLAGS=$("${pkgconfig}" --cflags libffi)
@@ -322,11 +348,14 @@
     fi
   fi
   if [ "${LIBFFI_LIBS}" = "" ] ; then
+      echo "No libffi detected.";
       LIBFFI_LIBS="-lffi"
   fi
   export LIBFFI_CFLAGS
   export LIBFFI_LIBS
-
+  echo "Using LIBFFI_CFLAGS=${LIBFFI_CFLAGS}"
+  echo "Using LIBFFI_LIBS=${LIBFFI_LIBS}"
+  
   # LLVM_CFLAGS, LLVM_LDFLAGS and LLVM_LIBS tell the compiler how to
   # compile and link against LLVM
   if [ "${SHARK_BUILD}" = true ] ; then
@@ -376,13 +405,15 @@
     export LLVM_CFLAGS
     export LLVM_LDFLAGS
     export LLVM_LIBS
+    echo "Using LLVM_CFLAGS=${LLVM_CFLAGS}"
+    echo "Using LLVM_LDFLAGS=${LLVM_LDFLAGS}"
+    echo "Using LLVM_LIBS=${LLVM_LIBS}"
   fi
 fi
 
 # Export variables for system zlib
 # ZLIB_CFLAGS and ZLIB_LIBS tell the compiler how to compile and
 # link against zlib
-pkgconfig=$(which pkg-config 2>/dev/null)
 if [ -x "${pkgconfig}" ] ; then
   if [ "${ZLIB_CFLAGS}" = "" ] ; then
     ZLIB_CFLAGS=$("${pkgconfig}" --cflags zlib)
@@ -392,8 +423,283 @@
   fi
 fi
 if [ "${ZLIB_LIBS}" = "" ] ; then
+    echo "No zlib detected.";
     ZLIB_LIBS="-lz"
 fi
 export ZLIB_CFLAGS
 export ZLIB_LIBS
+echo "Using ZLIB_CFLAGS=${ZLIB_CFLAGS}"
+echo "Using ZLIB_LIBS=${ZLIB_LIBS}"
 
+# Export variables for system LCMS
+# LCMS_CFLAGS and LCMS_LIBS tell the compiler how to compile and
+# link against lcms2
+if [ -x "${pkgconfig}" ] ; then
+  if [ "${LCMS_CFLAGS}" = "" ] ; then
+    LCMS_CFLAGS=$("${pkgconfig}" --cflags lcms2)
+  fi
+  if [ "${LCMS_LIBS}" = "" ] ; then
+    LCMS_LIBS=$("${pkgconfig}" --libs lcms2)
+  fi
+fi
+if [ "${LCMS_LIBS}" = "" ] ; then
+    echo "No LCMS detected.";
+    LCMS_LIBS="-llcms2"
+fi
+export LCMS_CFLAGS
+export LCMS_LIBS
+echo "Using LCMS_CFLAGS=${LCMS_CFLAGS}"
+echo "Using LCMS_LIBS=${LCMS_LIBS}"
+
+# Export variables for system jpeg
+# JPEG_CFLAGS and JPEG_LIBS tell the compiler how to compile and
+# link against libjpeg
+if [ "${JPEG_LIBS}" = "" ] ; then
+    JPEG_LIBS="-ljpeg"
+fi
+export JPEG_LIBS
+echo "Using JPEG_LIBS=${JPEG_LIBS}"
+
+# Export variables for system libpng
+# PNG_CFLAGS and PNG_LIBS tell the compiler how to compile and
+# link against libpng
+if [ -x "${pkgconfig}" ] ; then
+  if [ "${PNG_CFLAGS}" = "" ] ; then
+    PNG_CFLAGS=$("${pkgconfig}" --cflags libpng)
+  fi
+  if [ "${PNG_LIBS}" = "" ] ; then
+    PNG_LIBS=$("${pkgconfig}" --libs libpng)
+  fi
+fi
+if [ "${PNG_LIBS}" = "" ] ; then
+    echo "No libpng detected.";
+    PNG_LIBS="-lpng"
+fi
+export PNG_CFLAGS
+export PNG_LIBS
+echo "Using PNG_CFLAGS=${PNG_CFLAGS}"
+echo "Using PNG_LIBS=${PNG_LIBS}"
+
+# Export variables for system giflib
+# GIF_CFLAGS and GIF_LIBS tell the compiler how to compile and
+# link against giflib
+if [ "${GIF_LIBS}" = "" ] ; then
+    GIF_LIBS="-lgif"
+fi
+export GIF_LIBS
+echo "Using GIF_LIBS=${GIF_LIBS}"
+
+# Export variables for system krb5
+# KRB5_CFLAGS and KRB5_LIBS tell the compiler how to compile and
+# link against Kerberos
+if [ "${KRB5_LIBS}" = "" ] ; then
+    KRB5_LIBS="-lkrb5"
+fi
+export KRB5_LIBS
+echo "Using KRB5_LIBS=${KRB5_LIBS}"
+
+# Export variables for system CUPS
+# CUPS_CFLAGS and CUPS_LIBS tell the compiler how to compile and
+# link against CUPS
+if [ "${CUPS_LIBS}" = "" ] ; then
+    CUPS_LIBS="-lcups"
+fi
+export CUPS_LIBS
+echo "Using CUPS_LIBS=${CUPS_LIBS}"
+
+# Export variables for system libgtk
+# GTK_CFLAGS and GTK_LIBS tell the compiler how to compile and
+# link against libgtk
+if [ -x "${pkgconfig}" ] ; then
+  if "${pkgconfig}" --exists gtk+-2.0 ; then
+    if [ "${GTK_CFLAGS}" = "" ] ; then
+      GTK_CFLAGS=$("${pkgconfig}" --cflags gtk+-2.0 gthread-2.0)
+    fi
+    if [ "${GTK_LIBS}" = "" ] ; then
+      GTK_LIBS=$("${pkgconfig}" --libs gtk+-2.0 gthread-2.0)
+    fi
+  fi
+fi
+export GTK_CFLAGS
+export GTK_LIBS
+echo "Using GTK_CFLAGS=${GTK_CFLAGS}"
+echo "Using GTK_LIBS=${GTK_LIBS}"
+
+# Export variables for system libgio
+# GIO_CFLAGS and GIO_LIBS tell the compiler how to compile and
+# link against libgio
+if [ -x "${pkgconfig}" ] ; then
+  if "${pkgconfig}" --exists gio-2.0 ; then
+    if [ "${GIO_CFLAGS}" = "" ] ; then
+      GIO_CFLAGS=$("${pkgconfig}" --cflags gio-2.0)
+    fi
+    if [ "${GIO_LIBS}" = "" ] ; then
+      GIO_LIBS=$("${pkgconfig}" --libs gio-2.0)
+    fi
+  fi
+fi
+export GIO_CFLAGS
+export GIO_LIBS
+echo "Using GIO_CFLAGS=${GIO_CFLAGS}"
+echo "Using GIO_LIBS=${GIO_LIBS}"
+
+# Export variables for system libpcsc
+# PCSC_CFLAGS and PCSC_LIBS tell the compiler how to compile and
+# link against libpcsc
+if [ -x "${pkgconfig}" ] ; then
+  if [ "${PCSC_CFLAGS}" = "" ] ; then
+    PCSC_CFLAGS=$("${pkgconfig}" --cflags libpcsclite)
+  fi
+  if [ "${PCSC_LIBS}" = "" ] ; then
+    PCSC_LIBS=$("${pkgconfig}" --libs libpcsclite)
+  fi
+fi
+if [ "${PCSC_LIBS}" = "" ] ; then
+    echo "No libpcsclite detected.";
+    PCSC_LIBS="-lpcsclite"
+fi
+export PCSC_CFLAGS
+export PCSC_LIBS
+echo "Using PCSC_CFLAGS=${PCSC_CFLAGS}"
+echo "Using PCSC_LIBS=${PCSC_LIBS}"
+
+# Export variables for system fontconfig
+# FONTCONFIG_CFLAGS and FONTCONFIG_LIBS tell the compiler how to compile and
+# link against libfontconfig
+if [ -x "${pkgconfig}" ] ; then
+  if [ "${FONTCONFIG_CFLAGS}" = "" ] ; then
+    FONTCONFIG_CFLAGS=$("${pkgconfig}" --cflags fontconfig)
+  fi
+  if [ "${FONTCONFIG_LIBS}" = "" ] ; then
+    FONTCONFIG_LIBS=$("${pkgconfig}" --libs fontconfig)
+  fi
+fi
+if [ "${FONTCONFIG_LIBS}" = "" ] ; then
+    echo "No fontconfig detected.";
+    FONTCONFIG_LIBS="-lfontconfig"
+fi
+export FONTCONFIG_CFLAGS
+export FONTCONFIG_LIBS
+echo "Using FONTCONFIG_CFLAGS=${FONTCONFIG_CFLAGS}"
+echo "Using FONTCONFIG_LIBS=${FONTCONFIG_LIBS}"
+
+# Export variables for system gconf
+# GCONF_CFLAGS, GCONF_LIBS, GOBJECT_CFLAGS and
+# GOBJECT_LIBS tell the compiler how to compile and
+# link against gconf
+if [ -x "${pkgconfig}" ] ; then
+  if "${pkgconfig}" --exists gconf-2.0 ; then
+    if [ "${GCONF_CFLAGS}" = "" ] ; then
+      GCONF_CFLAGS=$("${pkgconfig}" --cflags gconf-2.0)
+    fi
+    if [ "${GCONF_LIBS}" = "" ] ; then
+      GCONF_LIBS=$("${pkgconfig}" --libs gconf-2.0)
+    fi
+  fi
+  if "${pkgconfig}" --exists gobject-2.0 ; then
+    if [ "${GOBJECT_CFLAGS}" = "" ] ; then
+      GOBJECT_CFLAGS=$("${pkgconfig}" --cflags gobject-2.0)
+    fi
+    if [ "${GOBJECT_LIBS}" = "" ] ; then
+      GOBJECT_LIBS=$("${pkgconfig}" --libs gobject-2.0)
+    fi
+  fi
+fi
+export GCONF_CFLAGS
+export GCONF_LIBS
+export GOBJECT_CFLAGS
+export GOBJECT_LIBS
+echo "Using GCONF_CFLAGS=${GCONF_CFLAGS}"
+echo "Using GCONF_LIBS=${GCONF_LIBS}"
+echo "Using GOBJECT_CFLAGS=${GOBJECT_CFLAGS}"
+echo "Using GOBJECT_LIBS=${GOBJECT_LIBS}"
+
+# Export variables for system sctp
+# SCTP_CFLAGS and SCTP_LIBS tell the compiler how to compile and
+# link against libsctp
+if [ "${SCTP_LIBS}" = "" ] ; then
+    SCTP_LIBS="-lsctp"
+fi
+export SCTP_LIBS
+echo "Using SCTP_LIBS=${SCTP_LIBS}"
+
+# Setup nss.cfg using location of NSS libraries
+if [ -x "${pkgconfig}" ] ; then
+  if [ "${NSS_LIBDIR}" = "" ] ; then
+    NSS_LIBDIR=$("${pkgconfig}" --variable=libdir nss)
+  fi
+fi
+if [ "${NSS_LIBDIR}" = "" ] ; then
+  NSS_LIBDIR="/usr/lib";
+  echo "No NSS library directory detected.";
+fi
+echo "Using NSS_LIBDIR=${NSS_LIBDIR}"
+sed -e "s#@NSS_LIBDIR@#${NSS_LIBDIR}#" \
+  ${jdk_topdir}/src/share/lib/security/nss.cfg.in \
+  > ${jdk_topdir}/src/share/lib/security/nss.cfg
+
+# IcedTea defaults; use system libraries
+export SYSTEM_LCMS=true
+export SYSTEM_ZLIB=true
+export SYSTEM_JPEG=true
+export SYSTEM_PNG=true
+export SYSTEM_GIF=true
+export SYSTEM_KRB5=true
+export SYSTEM_CUPS=true
+export SYSTEM_FONTCONFIG=true
+export SYSTEM_PCSC=true
+export SYSTEM_SCTP=true
+export COMPILE_AGAINST_SYSCALLS=true
+
+if [ "x${GTK_LIBS}" != "x" ] ; then
+  echo "Gtk+ detected; enabling system linking.";
+  export SYSTEM_GTK=true
+fi
+
+if [ "x${GIO_LIBS}" != "x" ] ; then
+  echo "GIO detected; enabling system linking.";
+  export SYSTEM_GIO=true
+fi
+
+if [ "x${GCONF_LIBS}" != "x" -a "x${GOBJECT_LIBS}" != "x" ] ; then
+  echo "GConf detected; enabling system linking.";
+  export SYSTEM_GCONF=true
+fi
+
+# IcedTea default; turn on the ARM32 JIT
+# Disabled for now due to PR2942
+export ARM32JIT=false
+
+# IcedTea versioning
+export ICEDTEA_NAME="IcedTea"
+export PACKAGE_VERSION="2.7.0pre11"
+export DERIVATIVE_ID="${ICEDTEA_NAME} ${PACKAGE_VERSION}"
+echo "Building ${DERIVATIVE_ID}"
+
+if [ -e ${jdk_topdir} ] ; then
+  if hg -R ${jdk_topdir} id &>/dev/null ; then
+    export JDK_REVID="r$(hg -R ${jdk_topdir} id -i)";
+    echo "JDK Mercurial revision: ${JDK_REVID}"
+  fi
+fi
+hotspot_topdir=${jdk_topdir}/../hotspot
+if [ -e ${hotspot_topdir} ] ; then
+  if hg -R ${hotspot_topdir} id &>/dev/null ; then
+    export HOTSPOT_BUILD_VERSION="r$(hg -R ${hotspot_topdir} id -i)";
+    echo "HotSpot Mercurial revision: ${HOTSPOT_BUILD_VERSION}"
+  fi
+fi
+
+lsbrelease=$(which lsb_release 2>/dev/null)
+echo "lsbrelease=${lsbrelease}"
+if [ -x "${lsbrelease}" ] ; then
+  lsbinfo="$(${lsbrelease} -ds | sed 's/^"//;s/"$//')"
+  if test "x${PKGVERSION}" = "x"; then
+    export DISTRIBUTION_ID="Built on ${lsbinfo} ($(date))"
+  else
+    export DISTRIBUTION_ID="${lsbinfo}, package $PKGVERSION"
+  fi
+  export DISTRO_NAME="$(${lsbrelease} -is | sed 's/^"//;s/"$//')"
+  echo "Distribution ID: ${DISTRIBUTION_ID}"
+  echo "Distribution Name: ${DISTRO_NAME}"
+fi
--- a/make/mkdemo/jvmti/waiters/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/mkdemo/jvmti/waiters/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -41,3 +41,7 @@
 #
 include $(BUILDDIR)/common/Demo.gmk
 
+# Turn off aliasing with GCC
+ifeq ($(PLATFORM), linux)
+  CXXFLAGS += -fno-strict-aliasing
+endif
--- a/make/sun/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -55,7 +55,7 @@
     endif
   endif
   HEADLESS_SUBDIR = headless
-  XAWT_SUBDIR     = xawt
+  XAWT_SUBDIR     = xawt gtk
 endif
 
 ifeq ($(PLATFORM), macosx)
--- a/make/sun/awt/FILES_c_unix.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/awt/FILES_c_unix.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -229,3 +229,13 @@
         GLXSurfaceData.c \
         AccelGlyphCache.c \
 	CUPSfuncs.c
+
+ifneq ($(SYSTEM_CUPS), true)
+FILES_NO_MOTIF_c += \
+	cups_fp.c
+endif
+
+ifneq ($(SYSTEM_FONTCONFIG), true)
+FILES_NO_MOTIF_c += \
+	fontconfig_fp.c
+endif
--- a/make/sun/awt/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/awt/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -174,7 +174,7 @@
   FILES_s += mlib_v_ImageCopy_blk.s
   INLINE_VIS = $(PLATFORM_SRC)/native/sun/awt/medialib/vis_$(ARCH_DATA_MODEL).il
   CFLAGS_sparcv9 = -DMLIB_OS64BIT
-  
+
   CFLAGS += $(CFLAGS_$(ARCH)) -DMLIB_ADD_SUFF $(INLINE_VIS) \
 	    -I$(SHARE_SRC)/native/sun/awt/medialib \
 	    -I$(PLATFORM_SRC)/native/sun/awt/medialib \
@@ -482,7 +482,12 @@
 	fontconfig.properties				\
 	fontconfig.SuSE.properties                      \
 	fontconfig.Ubuntu.properties                    \
-	fontconfig.Fedora.properties
+	fontconfig.Fedora.properties			\
+	fontconfig.Fedora.9.properties			\
+	fontconfig.Fedora.10.properties			\
+	fontconfig.Fedora.11.properties			\
+	fontconfig.Fedora.12.properties			\
+	fontconfig.Gentoo.properties
 else
 
 FONTCONFIGS_SRC	= $(CLOSED_SRC)/solaris/classes/sun/awt/fontconfigs
--- a/make/sun/awt/mawt.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/awt/mawt.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -103,6 +103,14 @@
 vpath %.cpp $(SHARE_SRC)/native/$(PKGDIR)/image
 vpath %.c   $(PLATFORM_SRC)/native/$(PKGDIR)/robot_child
 
+ifneq ($(SYSTEM_CUPS), true)
+vpath %.c   $(PLATFORM_SRC)/native/common/deps
+endif
+
+ifneq ($(SYSTEM_FONTCONFIG), true)
+vpath %.c   $(PLATFORM_SRC)/native/common/deps/fontconfig2
+endif
+
 #
 # Libraries to link in.
 #
@@ -180,7 +188,19 @@
 # !HEADLESS
 
 OTHER_LDLIBS += $(JVMLIB) $(LIBCXX) \
-                -lawt $(LIBM) $(LIBDL)
+                -lawt $(LIBM)
+
+ifeq ($(SYSTEM_CUPS), true)
+  OTHER_LDLIBS += $(CUPS_LIBS)
+else
+  OTHER_LDLIBS += $(LIBDL)
+endif
+
+ifeq ($(SYSTEM_FONTCONFIG), true)
+  OTHER_LDLIBS += $(FONTCONFIG_LIBS)
+else
+  OTHER_LDLIBS += $(LIBDL)
+endif
 
 #
 # Sun CC with -Xa misdefines __STDC__ to 0 (zero).
@@ -193,7 +213,23 @@
 #
 # Other extra flags needed for compiling.
 #
-CPPFLAGS += -I$(CUPS_HEADERS_PATH)
+ifdef CUPS_CFLAGS
+  CPPFLAGS += $(CUPS_CFLAGS)
+else
+  CPPFLAGS += -I$(CUPS_HEADERS_PATH)
+endif
+
+ifeq ($(SYSTEM_CUPS), true)
+  CPPFLAGS += -DUSE_SYSTEM_CUPS
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps
+endif
+
+ifeq ($(SYSTEM_FONTCONFIG), true)
+  CPPFLAGS += $(FONTCONFIG_CFLAGS) -DUSE_SYSTEM_FONTCONFIG
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps/fontconfig2
+endif
 
 ifndef HEADLESS
 CPPFLAGS += -I$(OPENWIN_HOME)/include 
--- a/make/sun/cmm/lcms/FILES_c_unix.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/cmm/lcms/FILES_c_unix.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,6 @@
 #
 # Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2011 Red Hat, Inc.
 # 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 +24,7 @@
 # questions.
 #
 
+ifneq ($(SYSTEM_LCMS),true)
 FILES_c = \
     cmscam02.c \
     cmscgats.c \
@@ -48,5 +50,8 @@
     cmstypes.c \
     cmsvirt.c \
     cmswtpnt.c \
-    cmsxform.c \
+    cmsxform.c
+endif
+
+FILES_c += \
     LCMS.c
--- a/make/sun/cmm/lcms/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/cmm/lcms/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,6 @@
 #
 # Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2011 Red Hat, Inc.
 # 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,9 +26,12 @@
 
 BUILDDIR = ../../..
 PACKAGE = sun.java2d.cmm.lcms
-LIBRARY = lcms
+LIBRARY = javalcms
 PRODUCT = sun
 
+# Use highest level of optimization on this library
+OPTIMIZATION_LEVEL = HIGHEST
+
 include $(BUILDDIR)/common/Defs.gmk
 
 #
@@ -98,8 +102,13 @@
 else
 OTHER_LDLIBS = $(LIBM) -lawt -L$(LIBDIR)/$(LIBARCH)/xawt
 endif
+
 CPPFLAGS += -DCMS_DONT_USE_FAST_FLOOR
 CPPFLAGS += -I$(SHARE_SRC)/native/sun/java2d \
             -I$(SHARE_SRC)/native/sun/awt/debug
 endif
 
+ifeq ($(SYSTEM_LCMS),true)
+  CPPFLAGS += $(LCMS_CFLAGS)
+  OTHER_LDLIBS += $(LCMS_LIBS)
+endif
--- a/make/sun/cmm/lcms/mapfile-vers	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/cmm/lcms/mapfile-vers	Tue Aug 22 02:03:52 2017 +0100
@@ -27,13 +27,11 @@
 
 SUNWprivate_1.1 {
 	global:
-        Java_sun_java2d_cmm_lcms_LCMS_loadProfile;
-        Java_sun_java2d_cmm_lcms_LCMS_freeProfile;
-        Java_sun_java2d_cmm_lcms_LCMS_getProfileSize;
-        Java_sun_java2d_cmm_lcms_LCMS_getProfileData;
-        Java_sun_java2d_cmm_lcms_LCMS_getTagSize;
-        Java_sun_java2d_cmm_lcms_LCMS_getTagData;
-        Java_sun_java2d_cmm_lcms_LCMS_setTagData;
+        Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative;
+        Java_sun_java2d_cmm_lcms_LCMS_getProfileSizeNative;
+        Java_sun_java2d_cmm_lcms_LCMS_getProfileDataNative;
+        Java_sun_java2d_cmm_lcms_LCMS_getTagNative;
+        Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative;
         Java_sun_java2d_cmm_lcms_LCMS_colorConvert;
         Java_sun_java2d_cmm_lcms_LCMS_getProfileID;
         Java_sun_java2d_cmm_lcms_LCMS_initLCMS;
--- a/make/sun/font/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/font/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -112,6 +112,11 @@
 endif
 endif
 
+# Turn on infinality rendering support when requested
+ifeq ($(IMPROVED_FONT_RENDERING),true)
+  OTHER_CFLAGS += $(FONTCONFIG_CFLAGS) -DIMPROVED_FONT_RENDERING
+endif
+
 #In the non-OpenJDK mode we need to build T2K
 ifndef OPENJDK
 t2k:
@@ -150,8 +155,12 @@
   ifeq ($(USING_SYSTEM_FT_LIB), false)
     FREETYPE_LIB = $(LIB_LOCATION)/$(LIB_PREFIX)freetype.$(LIBRARY_SUFFIX).6
   endif
-  OTHER_LDLIBS += -L$(FREETYPE_LIB_PATH) -lfreetype
-endif 
+  OTHER_LDLIBS += -L$(FREETYPE_LIB_PATH) $(FT2_LIBS)
+endif
+
+ifeq ($(IMPROVED_FONT_RENDERING),true)
+OTHER_LDLIBS += $(FONTCONFIG_LIBS)
+endif
 
 library:: $(FREETYPE_LIB)
 
@@ -183,7 +192,7 @@
 ifndef OPENJDK
   CPPFLAGS += -I$(CLOSED_SRC)/share/native/$(PKGDIR)/t2k
 else
-  CPPFLAGS += -I$(FREETYPE_HEADERS_PATH) -I$(FREETYPE_HEADERS_PATH)/freetype2
+  CPPFLAGS += $(FT2_CFLAGS)
 endif
 
 ifeq ($(PLATFORM), windows)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/sun/gtk/FILES_c_unix.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# 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 rules
+#
+
+FILES_c = \
+	gtk2_interface.c \
+        swing_GTKEngine.c \
+        swing_GTKStyle.c \
+	awt_GTKToolkit.c \
+	debug_assert.c \
+	sun_awt_X11_GtkFileDialogPeer.c
+
+ifneq ($(SYSTEM_GTK), true)
+FILES_c += \
+	gtk_fp.c
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/sun/gtk/FILES_export_unix.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# 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 rules
+#
+
+FILES_export =   \
+      sun/awt/X11/GtkFileDialogPeer.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/sun/gtk/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,84 @@
+#
+# Copyright (c) 2002, 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.
+#
+
+BUILDDIR = ../..
+PACKAGE = sun.awt.X11
+LIBRARY = javagtk
+PRODUCT = sun
+
+include $(BUILDDIR)/common/Defs.gmk
+
+#
+# Files
+#
+include FILES_c_unix.gmk
+include FILES_export_unix.gmk
+AUTO_FILES_JAVA_DIRS = sun/awt/X11
+
+
+#
+# Rules.
+#
+include $(BUILDDIR)/common/Mapfile-vers.gmk
+include $(BUILDDIR)/common/Library.gmk
+
+#
+# Add to the ambient vpath to pick up files in subdirectories
+#
+vpath %.c   $(PLATFORM_SRC)/native/sun/awt
+vpath %.c   $(SHARE_SRC)/native/sun/awt/debug
+
+ifneq ($(SYSTEM_GTK), true)
+vpath %.c   $(PLATFORM_SRC)/native/common/deps/gtk2
+endif
+
+OTHER_LDLIBS = -lX11
+
+ifeq ($(SYSTEM_GTK), true)
+  OTHER_LDLIBS += $(GTK_LIBS)
+else
+  OTHER_LDLIBS += $(LIBDL)
+endif
+
+ifeq  ($(PLATFORM), solaris)
+CPPFLAGS += -DFUNCPROTO=15
+dummy := $(shell $(MKDIR) -p $(LIB_LOCATION))
+endif
+
+CPPFLAGS += -DXAWT -DXAWT_HACK \
+        -I$(TEMPDIR)/../../sun.awt/awt/CClassHeaders \
+        -I$(SHARE_SRC)/native/sun/awt/debug \
+        -I$(PLATFORM_SRC)/native/sun/awt
+
+ifeq ($(SYSTEM_GTK), true)
+  CPPFLAGS += $(GTK_CFLAGS) -DUSE_SYSTEM_GTK
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps/gtk2
+endif
+
+ifeq ($(MILESTONE), internal)
+  CPPFLAGS += -DINTERNAL_BUILD
+endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/sun/gtk/mapfile-vers	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2002, 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.
+#
+
+# Define public interface.
+
+SUNWprivate_1.1 {
+        global:
+        JNI_OnLoad;
+
+        Java_sun_awt_UNIXToolkit_load_1gtk;
+        Java_sun_awt_UNIXToolkit_unload_1gtk;
+        Java_sun_awt_UNIXToolkit_load_1stock_1icon;
+        Java_sun_awt_UNIXToolkit_load_1gtk_1icon;
+        Java_sun_awt_UNIXToolkit_gtkCheckVersionImpl;
+
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1arrow;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1box;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1box_1gap;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1check;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1expander;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1extension;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1flat_1box;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1focus;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1handle;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1hline;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1option;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1shadow;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1slider;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1vline;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1background;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_nativeStartPainting;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_nativeFinishPainting;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1switch_1theme;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1get_1gtk_1setting;
+        Java_com_sun_java_swing_plaf_gtk_GTKEngine_nativeSetRangeValue;
+        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetXThickness;
+        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetYThickness;
+        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetColorForState;
+        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetClassValue;
+        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetPangoFontName;
+
+        Java_sun_awt_X11_GtkFileDialogPeer_initIDs;
+        Java_sun_awt_X11_GtkFileDialogPeer_run;
+        Java_sun_awt_X11_GtkFileDialogPeer_quit;
+        Java_sun_awt_X11_GtkFileDialogPeer_toFront;
+        Java_sun_awt_X11_GtkFileDialogPeer_setBounds;
+
+        local:
+                *;
+};
--- a/make/sun/jawt/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/jawt/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -34,6 +34,13 @@
 PLATFORM_EXPORT_BASE = $(PLATFORM_SRC)
 
 #
+# libjawt links to other programs, but nothing links to it directly. An RPATH
+# entry has been added to the launcher so third-party programs linked against
+# it will be able to find it no matter where the JDK or the third-party program
+# is located.
+#
+
+#
 # Files
 #
 ifeq ($(PLATFORM), windows)
--- a/make/sun/jpeg/FILES_c.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/jpeg/FILES_c.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -25,7 +25,10 @@
 
 FILES_c = \
 	imageioJPEG.c \
-	jpegdecoder.c \
+	jpegdecoder.c
+
+ifneq ($(SYSTEM_JPEG), true)
+FILES_c += \
 	jcomapi.c \
 	jdapimin.c \
 	jdapistd.c \
@@ -70,6 +73,7 @@
 	jfdctflt.c \
 	jfdctfst.c \
 	jfdctint.c
+endif
 
 ifndef OPENJDK
 FILES_c += \
--- a/make/sun/jpeg/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/jpeg/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -25,7 +25,7 @@
 
 BUILDDIR = ../..
 PACKAGE = sun.awt
-LIBRARY = jpeg
+LIBRARY = javajpeg
 PRODUCT = sun
 
 # Use highest optimization level
@@ -56,6 +56,9 @@
 endif
 
 OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR)/image/jpeg
+ifneq ($(SYSTEM_JPEG), true)
+OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR)/image/jpeg/jpeg-6b
+endif
 
 # Rules
 #
@@ -90,6 +93,12 @@
 # Add to ambient vpath to get files in a subdirectory
 #
 vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/image/jpeg
+ifneq ($(SYSTEM_JPEG), true)
+vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/image/jpeg/jpeg-6b
+endif
 
 CLASSES.export += java.io.InputStream
 
+ifeq ($(SYSTEM_JPEG), true)
+  OTHER_LDLIBS += $(JPEG_LIBS)
+endif
--- a/make/sun/lwawt/FILES_c_macosx.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/lwawt/FILES_c_macosx.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -98,3 +98,9 @@
         AccelGlyphCache.c \
         CUPSfuncs.c
 
+
+ifneq ($(SYSTEM_CUPS), true)
+FILES_c += \
+        cups_fp.c
+endif
+
--- a/make/sun/lwawt/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/lwawt/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -63,6 +63,10 @@
 vpath %.c   $(SHARE_SRC)/native/sun/font
 vpath %.c   $(call NativeSrcDirList,,native/sun/awt)
 
+ifneq ($(SYSTEM_CUPS), true)
+vpath %.c   $(PLATFORM_SRC)/native/common/deps
+endif
+
 vpath %.cpp $(SHARE_SRC)/native/sun/image
 
 vpath %.m   $(call NativeSrcDirList,,native/sun/awt)
@@ -103,7 +107,8 @@
         $(call NativeSrcDirList,-I,/native/sun/osxapp) \
         $(call NativeSrcDirList,-I,/native/sun/font) \
 	$(call NativeSrcDirList,-I,/native/sun/java2d) \
-	$(call NativeSrcDirList,-I,/native/sun/java2d/opengl)
+	$(call NativeSrcDirList,-I,/native/sun/java2d/opengl) \
+	$(call NativeSrcDirList,-I,/native/common/deps)
 
 ifeq ($(MILESTONE), internal)
   CPPFLAGS += -DINTERNAL_BUILD
--- a/make/sun/native2ascii/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/native2ascii/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -30,7 +30,7 @@
 BUILDDIR = ../..
 PACKAGE = sun.tools.native2ascii
 PRODUCT = sun
-OTHER_JAVACFLAGS += -Xlint:serial -Werror
+OTHER_JAVACFLAGS += -Xlint:serial
 include $(BUILDDIR)/common/Defs.gmk
 
 # This program must contain a manifest that defines the execution level
--- a/make/sun/net/FILES_java.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/net/FILES_java.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -24,121 +24,122 @@
 #
 
 FILES_java = \
+	sun/net/ApplicationProxy.java \
         sun/net/ExtendedOptionsImpl.java \
-        sun/net/InetAddressCachePolicy.java \
-        sun/net/URLCanonicalizer.java \
-        sun/net/NetworkClient.java \
-        sun/net/NetworkServer.java \
-        sun/net/PortConfig.java \
-        sun/net/ProgressMonitor.java \
-        sun/net/ProgressSource.java \
-        sun/net/ProgressEvent.java \
-        sun/net/ProgressListener.java \
-        sun/net/ProgressMeteringPolicy.java \
-        sun/net/SocksProxy.java \
-        sun/net/ResourceManager.java \
-        sun/net/TelnetInputStream.java \
-        sun/net/TelnetOutputStream.java \
-        sun/net/TelnetProtocolException.java \
-        sun/net/TransferProtocolClient.java \
-        sun/net/ConnectionResetException.java \
-        sun/net/NetProperties.java \
-        sun/net/NetHooks.java \
-        sun/net/util/IPAddressUtil.java \
-        sun/net/util/URLUtil.java \
-        sun/net/dns/ResolverConfiguration.java \
-        sun/net/dns/ResolverConfigurationImpl.java \
-        sun/net/ftp/FtpClient.java \
-        sun/net/ftp/FtpClientProvider.java \
-        sun/net/ftp/FtpDirEntry.java \
-        sun/net/ftp/FtpReplyCode.java \
-        sun/net/ftp/FtpDirParser.java \
-        sun/net/ftp/FtpLoginException.java \
-        sun/net/ftp/FtpProtocolException.java \
-        sun/net/ftp/impl/FtpClient.java \
-        sun/net/ftp/impl/DefaultFtpClientProvider.java \
-        sun/net/sdp/SdpSupport.java \
-        sun/net/spi/DefaultProxySelector.java \
-        sun/net/spi/nameservice/NameServiceDescriptor.java \
-        sun/net/spi/nameservice/NameService.java \
-        sun/net/smtp/SmtpClient.java \
-        sun/net/smtp/SmtpProtocolException.java \
-        sun/net/www/content/text/Generic.java \
-        sun/net/www/content/text/plain.java \
-        sun/net/www/content/text/PlainTextInputStream.java \
-        sun/net/www/MessageHeader.java \
-        sun/net/www/HeaderParser.java \
-        sun/net/www/MeteredStream.java \
-        sun/net/www/MimeEntry.java \
-        sun/net/www/MimeLauncher.java \
-        sun/net/www/ApplicationLaunchException.java \
-        sun/net/www/MimeTable.java \
-        sun/net/www/URLConnection.java \
-        sun/net/www/ParseUtil.java \
-        sun/net/www/protocol/file/Handler.java \
-        sun/net/www/protocol/file/FileURLConnection.java \
-        sun/net/www/http/HttpClient.java \
-        sun/net/www/http/HttpCapture.java \
-        sun/net/www/http/HttpCaptureInputStream.java \
-        sun/net/www/http/HttpCaptureOutputStream.java \
-        sun/net/www/http/PosterOutputStream.java \
-        sun/net/www/http/ChunkedInputStream.java \
-        sun/net/www/http/ChunkedOutputStream.java \
-        sun/net/www/http/KeepAliveCache.java \
-        sun/net/www/http/KeepAliveStream.java \
-        sun/net/www/http/KeepAliveStreamCleaner.java \
-        sun/net/www/http/Hurryable.java \
-        sun/net/www/protocol/http/Handler.java \
-        sun/net/www/protocol/http/HttpURLConnection.java \
-        sun/net/www/protocol/http/HttpAuthenticator.java \
-        sun/net/www/protocol/http/AuthenticationHeader.java \
-        sun/net/www/protocol/http/AuthenticationInfo.java \
-        sun/net/www/protocol/http/AuthCache.java \
-        sun/net/www/protocol/http/AuthCacheImpl.java \
-        sun/net/www/protocol/http/AuthCacheValue.java \
-        sun/net/www/protocol/http/AuthScheme.java \
-        sun/net/www/protocol/http/BasicAuthentication.java \
-        sun/net/www/protocol/http/DigestAuthentication.java \
-        sun/net/www/protocol/http/NTLMAuthenticationProxy.java \
-        sun/net/www/protocol/http/NegotiateAuthentication.java \
-        sun/net/www/protocol/http/Negotiator.java \
-        sun/net/www/protocol/http/ntlm/NTLMAuthentication.java \
-        sun/net/www/protocol/http/ntlm/NTLMAuthenticationCallback.java \
-        sun/net/www/protocol/http/spnego/NegotiatorImpl.java \
-        sun/net/www/protocol/http/spnego/NegotiateCallbackHandler.java \
-        sun/net/www/protocol/http/logging/HttpLogFormatter.java \
-        sun/net/www/protocol/https/AbstractDelegateHttpsURLConnection.java \
-        sun/net/www/protocol/https/HttpsClient.java \
-        sun/net/www/protocol/https/DefaultHostnameVerifier.java \
-        sun/net/www/protocol/https/HttpsURLConnectionImpl.java \
-        sun/net/www/protocol/https/DelegateHttpsURLConnection.java \
-        sun/net/www/protocol/https/Handler.java \
-        sun/net/www/protocol/jar/Handler.java \
-        sun/net/www/protocol/jar/URLJarFile.java \
-        sun/net/www/protocol/jar/JarFileFactory.java \
-        sun/net/www/protocol/jar/JarURLConnection.java \
-        sun/net/www/protocol/netdoc/Handler.java \
-        sun/net/www/content/image/gif.java \
-        sun/net/www/content/image/jpeg.java \
-        sun/net/www/content/image/x_xbitmap.java \
-        sun/net/www/content/image/x_xpixmap.java \
-        sun/net/www/content/image/png.java \
-        sun/net/www/content/audio/aiff.java \
-        sun/net/www/content/audio/basic.java \
-        sun/net/www/content/audio/wav.java \
-        sun/net/www/content/audio/x_aiff.java \
-        sun/net/www/content/audio/x_wav.java \
-        sun/net/www/protocol/ftp/Handler.java \
-        sun/net/www/protocol/ftp/FtpURLConnection.java \
-        sun/net/www/protocol/gopher/GopherClient.java \
-        sun/net/www/protocol/gopher/Handler.java \
-        sun/net/www/protocol/mailto/Handler.java \
-        sun/net/www/protocol/mailto/MailToURLConnection.java \
-        sun/net/idn/Punycode.java \
-        sun/net/idn/UCharacterEnums.java \
-        sun/net/idn/UCharacterDirection.java \
-        sun/net/idn/StringPrepDataReader.java \
-        sun/net/idn/StringPrep.java
+	sun/net/InetAddressCachePolicy.java \
+	sun/net/URLCanonicalizer.java \
+	sun/net/NetworkClient.java \
+	sun/net/NetworkServer.java \
+	sun/net/PortConfig.java \
+	sun/net/ProgressMonitor.java \
+	sun/net/ProgressSource.java \
+	sun/net/ProgressEvent.java \
+	sun/net/ProgressListener.java \
+	sun/net/ProgressMeteringPolicy.java \
+	sun/net/SocksProxy.java \
+	sun/net/ResourceManager.java \
+	sun/net/TelnetInputStream.java \
+	sun/net/TelnetOutputStream.java \
+	sun/net/TelnetProtocolException.java \
+	sun/net/TransferProtocolClient.java \
+	sun/net/ConnectionResetException.java \
+	sun/net/NetProperties.java \
+	sun/net/NetHooks.java \
+	sun/net/util/IPAddressUtil.java \
+	sun/net/util/URLUtil.java \
+	sun/net/dns/ResolverConfiguration.java \
+	sun/net/dns/ResolverConfigurationImpl.java \
+	sun/net/ftp/FtpClient.java \
+	sun/net/ftp/FtpClientProvider.java \
+	sun/net/ftp/FtpDirEntry.java \
+	sun/net/ftp/FtpReplyCode.java \
+	sun/net/ftp/FtpDirParser.java \
+	sun/net/ftp/FtpLoginException.java \
+	sun/net/ftp/FtpProtocolException.java \
+	sun/net/ftp/impl/FtpClient.java \
+	sun/net/ftp/impl/DefaultFtpClientProvider.java \
+	sun/net/sdp/SdpSupport.java \
+	sun/net/spi/DefaultProxySelector.java \
+	sun/net/spi/nameservice/NameServiceDescriptor.java \
+	sun/net/spi/nameservice/NameService.java \
+	sun/net/smtp/SmtpClient.java \
+	sun/net/smtp/SmtpProtocolException.java \
+	sun/net/www/content/text/Generic.java \
+	sun/net/www/content/text/plain.java \
+	sun/net/www/content/text/PlainTextInputStream.java \
+	sun/net/www/MessageHeader.java \
+	sun/net/www/HeaderParser.java \
+	sun/net/www/MeteredStream.java \
+	sun/net/www/MimeEntry.java \
+	sun/net/www/MimeLauncher.java \
+	sun/net/www/ApplicationLaunchException.java \
+	sun/net/www/MimeTable.java \
+	sun/net/www/URLConnection.java \
+	sun/net/www/ParseUtil.java \
+	sun/net/www/protocol/file/Handler.java \
+	sun/net/www/protocol/file/FileURLConnection.java \
+	sun/net/www/http/HttpClient.java \
+	sun/net/www/http/HttpCapture.java \
+	sun/net/www/http/HttpCaptureInputStream.java \
+	sun/net/www/http/HttpCaptureOutputStream.java \
+	sun/net/www/http/PosterOutputStream.java \
+	sun/net/www/http/ChunkedInputStream.java \
+	sun/net/www/http/ChunkedOutputStream.java \
+	sun/net/www/http/KeepAliveCache.java \
+	sun/net/www/http/KeepAliveStream.java \
+	sun/net/www/http/KeepAliveStreamCleaner.java \
+	sun/net/www/http/Hurryable.java \
+	sun/net/www/protocol/http/Handler.java \
+	sun/net/www/protocol/http/HttpURLConnection.java \
+	sun/net/www/protocol/http/HttpAuthenticator.java \
+	sun/net/www/protocol/http/AuthenticationHeader.java \
+	sun/net/www/protocol/http/AuthenticationInfo.java \
+	sun/net/www/protocol/http/AuthCache.java \
+	sun/net/www/protocol/http/AuthCacheImpl.java \
+	sun/net/www/protocol/http/AuthCacheValue.java \
+	sun/net/www/protocol/http/AuthScheme.java \
+	sun/net/www/protocol/http/BasicAuthentication.java \
+	sun/net/www/protocol/http/DigestAuthentication.java \
+	sun/net/www/protocol/http/NTLMAuthenticationProxy.java \
+	sun/net/www/protocol/http/NegotiateAuthentication.java \
+	sun/net/www/protocol/http/Negotiator.java \
+	sun/net/www/protocol/http/ntlm/NTLMAuthentication.java \
+	sun/net/www/protocol/http/ntlm/NTLMAuthenticationCallback.java \
+	sun/net/www/protocol/http/spnego/NegotiatorImpl.java \
+	sun/net/www/protocol/http/spnego/NegotiateCallbackHandler.java \
+	sun/net/www/protocol/http/logging/HttpLogFormatter.java \
+	sun/net/www/protocol/https/AbstractDelegateHttpsURLConnection.java \
+	sun/net/www/protocol/https/HttpsClient.java \
+	sun/net/www/protocol/https/DefaultHostnameVerifier.java \
+	sun/net/www/protocol/https/HttpsURLConnectionImpl.java \
+	sun/net/www/protocol/https/DelegateHttpsURLConnection.java \
+	sun/net/www/protocol/https/Handler.java \
+	sun/net/www/protocol/jar/Handler.java \
+	sun/net/www/protocol/jar/URLJarFile.java \
+	sun/net/www/protocol/jar/JarFileFactory.java \
+	sun/net/www/protocol/jar/JarURLConnection.java \
+	sun/net/www/protocol/netdoc/Handler.java \
+	sun/net/www/content/image/gif.java \
+	sun/net/www/content/image/jpeg.java \
+	sun/net/www/content/image/x_xbitmap.java \
+	sun/net/www/content/image/x_xpixmap.java \
+	sun/net/www/content/image/png.java \
+	sun/net/www/content/audio/aiff.java \
+	sun/net/www/content/audio/basic.java \
+	sun/net/www/content/audio/wav.java \
+	sun/net/www/content/audio/x_aiff.java \
+	sun/net/www/content/audio/x_wav.java \
+	sun/net/www/protocol/ftp/Handler.java \
+	sun/net/www/protocol/ftp/FtpURLConnection.java \
+	sun/net/www/protocol/gopher/GopherClient.java \
+	sun/net/www/protocol/gopher/Handler.java \
+	sun/net/www/protocol/mailto/Handler.java \
+	sun/net/www/protocol/mailto/MailToURLConnection.java \
+	sun/net/idn/Punycode.java \
+	sun/net/idn/UCharacterEnums.java \
+	sun/net/idn/UCharacterDirection.java \
+	sun/net/idn/StringPrepDataReader.java \
+	sun/net/idn/StringPrep.java
 
 ifeq ($(PLATFORM), windows)
     FILES_java += sun/net/www/protocol/http/ntlm/NTLMAuthSequence.java
--- a/make/sun/nio/cs/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/nio/cs/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -36,7 +36,7 @@
 # This re-directs all the class files to a separate location
 CLASSDESTDIR = $(TEMPDIR)/classes
 
-OTHER_JAVACFLAGS += -Xlint:serial,-deprecation -Werror
+OTHER_JAVACFLAGS += -Xlint:serial,-deprecation
 include $(BUILDDIR)/common/Defs.gmk
 
 #
@@ -114,7 +114,7 @@
 	$(BOOT_JAVA_CMD) -jar $(CHARSETMAPPING_JARFILE) $(GENCSDATASRC) $(GENCSEXT) dbcs
 
 # no compression unless requested
-ifndef COMPRESS_JARS
+ifneq ($(COMPRESS_JARS), true)
   CREATE_JAR_OPTS_NOMANIFEST = cf0
 else
   CREATE_JAR_OPTS_NOMANIFEST = cf
--- a/make/sun/security/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/security/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,6 @@
 #
-# Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013 Red Hat, Inc. and/or its affiliates.
 # 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,13 +44,14 @@
     JGSS_WRAPPER = jgss/wrapper
 endif
 
-# Build PKCS#11 on all platforms except 64-bit Windows.
-# We exclude windows-amd64 because we don't have any
-# 64-bit PKCS#11 implementations to test with on that platform.
+# Build PKCS#11 on all platforms
 PKCS11 = pkcs11
-ifeq ($(ARCH_DATA_MODEL), 64)
-  ifeq ($(PLATFORM), windows)
-    PKCS11 =
+
+# Build krb5/internal/ccache only on Linux and Solaris platforms.
+KRB5_CCACHE =
+ifeq ($(PLATFORM), $(filter $(PLATFORM),linux solaris))
+  ifeq ($(SYSTEM_KRB5),true)
+    KRB5_CCACHE = krb5/internal/ccache
   endif
 endif
 
@@ -66,7 +68,7 @@
   INTREE_EC =
 endif
 
-SUBDIRS       = $(INTREE_EC) other action util krb5
+SUBDIRS       = $(INTREE_EC) other action util krb5 $(KRB5_CCACHE)
 SUBDIRS_misc  = jgss $(PKCS11) $(JGSS_WRAPPER) $(MSCAPI) smartcardio
 SUBDIRS_tools = tools
 include $(BUILDDIR)/common/Subdirs.gmk
--- a/make/sun/security/ec/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/security/ec/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -145,6 +145,10 @@
 	$(ECHO) false; \
     fi)
 
+ifeq ($(SYSTEM_NSS),true)
+NATIVE_ECC_AVAILABLE = true
+endif
+
 ifeq ($(NATIVE_ECC_AVAILABLE), true)
 
   LIBRARY = sunec
@@ -155,7 +159,8 @@
   FILES_export = \
       $(PKGDIR)/ECDHKeyAgreement.java \
       $(PKGDIR)/ECDSASignature.java \
-      $(PKGDIR)/ECKeyPairGenerator.java
+      $(PKGDIR)/ECKeyPairGenerator.java \
+      $(PKGDIR)/SunEC.java
 
   JAVAHFLAGS = -bootclasspath \
     "$(CLASSDESTDIR)$(CLASSPATH_SEPARATOR)$(CLASSBINDIR)$(JCE_PATH)"
@@ -163,7 +168,9 @@
   #
   # C and C++ files
   #
+ifneq ($(SYSTEM_NSS),true)
   include FILES_c.gmk
+endif
 
   FILES_cpp = ECC_JNI.cpp
 
@@ -176,25 +183,36 @@
   #
   vpath %.cpp $(SHARE_SRC)/native/$(PKGDIR)
 
+ifneq ($(SYSTEM_NSS),true)
   vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/impl
+endif
 
   #
   # Find include files
   #
+ifeq ($(SYSTEM_NSS),true)
+  OTHER_INCLUDES += $(NSS_CFLAGS) -DSYSTEM_NSS -DNSS_ENABLE_ECC
+else
   OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR)/impl
+endif
 
   #
   # Compiler flags
   #
-  OTHER_CFLAGS += -DMP_API_COMPATIBLE -DNSS_ECC_MORE_THAN_SUITE_B
+  OTHER_CFLAGS += -DMP_API_COMPATIBLE
+ifneq ($(ECC_JUST_SUITE_B),true)
+OTHER_CFLAGS += -DNSS_ECC_MORE_THAN_SUITE_B
+endif
 
   #
   # Libraries to link
   #
-  ifeq ($(PLATFORM), windows)
-    OTHER_LDLIBS += $(JVMLIB)
-  else
-    OTHER_LDLIBS = $(LIBDL) $(JVMLIB) $(LIBCXX)
+  ifneq ($(PLATFORM), windows)
+    OTHER_LDLIBS = $(LIBCXX)
+  endif
+
+  ifeq ($(SYSTEM_NSS), true)
+    OTHER_LDLIBS += $(NSS_LIBS)
   endif
 
   include $(BUILDDIR)/common/Mapfile-vers.gmk
--- a/make/sun/security/ec/mapfile-vers	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/security/ec/mapfile-vers	Tue Aug 22 02:03:52 2017 +0100
@@ -31,6 +31,8 @@
 		Java_sun_security_ec_ECDSASignature_signDigest;
 		Java_sun_security_ec_ECDSASignature_verifySignedDigest;
 		Java_sun_security_ec_ECDHKeyAgreement_deriveKey;
+		Java_sun_security_ec_SunEC_initialize;
+		Java_sun_security_ec_SunEC_cleanup;
         local:
                 *;
 };
--- a/make/sun/security/jgss/wrapper/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/security/jgss/wrapper/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -72,5 +72,5 @@
 # Libraries to link
 #
 ifneq ($(PLATFORM), windows)
-  OTHER_LDLIBS = $(LIBDL) $(JVMLIB)
+  OTHER_LDLIBS = $(LIBDL)
 endif
--- a/make/sun/security/krb5/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/security/krb5/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -84,12 +84,8 @@
 #
 # Libraries to link
 #
-ifeq ($(PLATFORM), windows)
-  OTHER_LDLIBS = $(JVMLIB)
-else ifeq ($(PLATFORM), macosx)
-  OTHER_LDLIBS = $(LIBDL) $(JVMLIB) -framework Kerberos
-else
-  OTHER_LDLIBS = $(LIBDL) $(JVMLIB)
+ifeq ($(PLATFORM), macosx)
+  OTHER_LDLIBS = -framework Kerberos
 endif
 
 all:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/sun/security/krb5/internal/ccache/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,49 @@
+#
+# Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013 Red Hat, Inc. and/or its affiliates.
+# 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.
+#
+
+BUILDDIR = ../../../../..
+PACKAGE = sun.security.krb5.internal.ccache
+PRODUCT = sun
+include $(BUILDDIR)/common/Defs.gmk
+
+#
+# Java Files
+#
+AUTO_FILES_JAVA_DIRS = sun/security/krb5/internal/ccache
+
+ifeq ($(PLATFORM), $(filter $(PLATFORM),linux solaris))
+FILES_export = sun/security/krb5/internal/ccache/FileCredentialsCache.java
+FILES_c = krb5ccache.c
+LIBRARY = j2krb5
+
+vpath %.c \
+  $(PLATFORM_SRC)/native/sun/security/krb5/internal/ccache
+
+include $(BUILDDIR)/common/Library.gmk
+
+OTHER_CFLAGS += $(KRB5_CFLAGS)
+OTHER_LDLIBS = $(LIBDL) $(JVMLIB) $(KRB5_LIBS)
+endif # PLATFORM
--- a/make/sun/security/mscapi/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/security/mscapi/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -161,7 +161,7 @@
 # Libraries to link
 #
 ifeq ($(PLATFORM), windows)
-  OTHER_LDLIBS += $(JVMLIB) Crypt32.Lib
+  OTHER_LDLIBS += Crypt32.Lib
 endif
 
 #
--- a/make/sun/security/pkcs11/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/security/pkcs11/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -159,10 +159,8 @@
 #
 # Libraries to link
 #
-ifeq ($(PLATFORM), windows)
-  OTHER_LDLIBS = $(JVMLIB)
-else
-  OTHER_LDLIBS = $(LIBDL) $(JVMLIB)
+ifneq ($(PLATFORM), windows)
+  OTHER_LDLIBS = $(LIBDL)
 endif
 
 # Other config files
--- a/make/sun/security/smartcardio/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/security/smartcardio/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -55,8 +55,14 @@
 #
 OTHER_INCLUDES += \
   -I$(SHARE_SRC)/native/sun/security/smartcardio \
-  -I$(PLATFORM_SRC)/native/sun/security/smartcardio \
+  -I$(PLATFORM_SRC)/native/sun/security/smartcardio
+
+ifeq ($(SYSTEM_PCSC), true)
+OTHER_INCLUDES += $(PCSC_CFLAGS)
+else
+OTHER_INCLUDES += \
   -I$(PLATFORM_SRC)/native/sun/security/smartcardio/MUSCLE
+endif
 
 #
 # Rules
@@ -73,8 +79,13 @@
 # Libraries to link
 #
 ifeq ($(PLATFORM), windows)
-  OTHER_LDLIBS = $(JVMLIB) winscard.lib
+  OTHER_LDLIBS = winscard.lib
 else
-  OTHER_LDLIBS = $(LIBDL) $(JVMLIB)
+ifeq ($(SYSTEM_PCSC), true)
+  OTHER_LDLIBS = $(PCSC_LIBS)
+  OTHER_CFLAGS = -DUSE_SYSTEM_PCSC
+else
+  OTHER_LDLIBS = $(LIBDL)
   OTHER_CFLAGS = -D__sun_jdk
 endif
+endif
--- a/make/sun/splashscreen/FILES_c.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/splashscreen/FILES_c.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -30,21 +30,29 @@
 	splashscreen_impl.c \
 	splashscreen_jpeg.c \
 	splashscreen_png.c \
-	splashscreen_sys.c \
-	png.c \
-	pngerror.c \
-	pngget.c \
-	pngmem.c  \
-	pngpread.c \
-	pngread.c \
-	pngrio.c \
-	pngrtran.c \
-	pngrutil.c \
-	pngset.c \
-	pngtrans.c \
-	dgif_lib.c \
-	gif_err.c \
-	gifalloc.c \
+	splashscreen_sys.c
+
+ifneq ($(SYSTEM_ZLIB),true)
+  FILES_c += \
+	compress.c \
+	deflate.c \
+	gzclose.c \
+	gzlib.c \
+	gzread.c \
+	gzwrite.c \
+	infback.c \
+	inffast.c \
+	inflate.c \
+	inftrees.c \
+	trees.c \
+	uncompr.c \
+	zadler32.c \
+	zcrc32.c \
+	zutil.c
+endif
+
+ifneq ($(SYSTEM_JPEG), true)
+FILES_c += \
 	jcomapi.c \
 	jdapimin.c \
 	jdapistd.c \
@@ -89,22 +97,26 @@
 	jfdctflt.c \
 	jfdctfst.c \
 	jfdctint.c
+endif
 
-ifneq ($(SYSTEM_ZLIB),true)
-  FILES_c += \
-	compress.c \
-	deflate.c \
-	gzclose.c \
-	gzlib.c \
-	gzread.c \
-	gzwrite.c \
-	infback.c \
-	inffast.c \
-	inflate.c \
-	inftrees.c \
-	trees.c \
-	uncompr.c \
-	zadler32.c \
-	zcrc32.c \
-	zutil.c
+ifneq ($(SYSTEM_PNG), true)
+FILES_c += \
+	png.c \
+	pngerror.c \
+	pngget.c \
+	pngmem.c  \
+	pngpread.c \
+	pngread.c \
+	pngrio.c \
+	pngrtran.c \
+	pngrutil.c \
+	pngset.c \
+	pngtrans.c
 endif
+
+ifneq ($(SYSTEM_GIF), true)
+FILES_c += \
+	dgif_lib.c \
+	gif_err.c \
+	gifalloc.c
+endif
--- a/make/sun/splashscreen/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/splashscreen/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -103,12 +103,18 @@
 #
 vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/splashscreen
 vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)
-vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/giflib
+ifneq ($(SYSTEM_GIF), true)
+  vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/giflib
+endif
 ifneq ($(SYSTEM_ZLIB),true)
   vpath %.c   $(SHARE_SRC)/native/java/util/zip/zlib-$(ZLIB_VERSION)
 endif
-vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/libpng
-vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/image/jpeg
+ifneq ($(SYSTEM_PNG), true)
+  vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/libpng
+endif
+ifneq ($(SYSTEM_JPEG), true)
+  vpath %.c   $(SHARE_SRC)/native/$(PKGDIR)/image/jpeg/jpeg-6b
+endif
 ifneq ($(PLATFORM), macosx)
   vpath %.c   $(PLATFORM_SRC)/native/$(PKGDIR)/splashscreen
 else
@@ -122,7 +128,7 @@
   CPPFLAGS += $(call NativeSrcDirList,-I,/native/sun/osxapp)
 endif
 CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/splashscreen
-CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/image/jpeg
+
 ifneq ($(SYSTEM_ZLIB),true)
   CPPFLAGS += -I$(SHARE_SRC)/native/java/util/zip/zlib-$(ZLIB_VERSION)
 else
@@ -130,6 +136,27 @@
   OTHER_LDLIBS += $(ZLIB_LIBS)
 endif
 
+ifeq ($(SYSTEM_JPEG), true)
+  CPPFLAGS += $(JPEG_CFLAGS)
+  OTHER_LDLIBS += $(JPEG_LIBS)
+else
+  CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/image/jpeg/jpeg-6b
+endif
+
+ifeq ($(SYSTEM_PNG), true)
+  CPPFLAGS += $(PNG_CFLAGS)
+  OTHER_LDLIBS += $(PNG_LIBS)
+else
+  CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/libpng
+endif
+
+ifeq ($(SYSTEM_GIF), true)
+  CPPFLAGS += $(GIF_CFLAGS)
+  OTHER_LDLIBS += $(GIF_LIBS)
+else
+  CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/giflib
+endif
+
 # Shun the less than portable MMX assembly code in pnggccrd.c,
 # and use alternative implementations in C.
 CPPFLAGS += -DPNG_NO_MMX_CODE
--- a/make/sun/xawt/FILES_c_unix.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/xawt/FILES_c_unix.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -76,10 +76,27 @@
 	debug_trace.c \
 	debug_util.c \
 	awt_Plugin.c \
-	gtk2_interface.c \
-        swing_GTKEngine.c \
-        swing_GTKStyle.c \
+	gtk2_interface_check.c \
         rect.c \
-	sun_awt_X11_GtkFileDialogPeer.c \
 	XRSurfaceData.c \
 	XRBackendNative.c
+
+ifneq ($(SYSTEM_GTK), true)
+FILES_c += \
+	gtk_fp_check.c
+endif
+
+ifneq ($(SYSTEM_CUPS), true)
+FILES_c += \
+	cups_fp.c
+endif
+
+ifneq ($(SYSTEM_FONTCONFIG), true)
+FILES_c += \
+	fontconfig_fp.c
+endif
+
+ifneq ($(SYSTEM_GIO), true)
+FILES_c += \
+	gio_fp.c
+endif
--- a/make/sun/xawt/FILES_export_unix.gmk	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/xawt/FILES_export_unix.gmk	Tue Aug 22 02:03:52 2017 +0100
@@ -33,5 +33,4 @@
       sun/awt/X11/XDesktopPeer.java \
       sun/awt/X11/XToolkit.java \
       sun/awt/X11/XComponentPeer.java \
-      sun/awt/X11/XInputMethod.java \
-      sun/awt/X11/GtkFileDialogPeer.java
+      sun/awt/X11/XInputMethod.java
--- a/make/sun/xawt/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/xawt/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -109,15 +109,47 @@
 vpath %.c   $(PLATFORM_SRC)/native/sun/java2d/opengl
 vpath %.c   $(PLATFORM_SRC)/native/sun/java2d/x11
 
-OTHER_LDLIBS = $(LIBM) -lawt -lXext -lX11 -lXrender $(LIBDL) \
+ifneq ($(SYSTEM_GIO), true)
+vpath %.c   $(PLATFORM_SRC)/native/common/deps/glib2
+endif
+
+ifneq ($(SYSTEM_GTK), true)
+vpath %.c   $(PLATFORM_SRC)/native/common/deps/gtk2
+endif
+
+ifneq ($(SYSTEM_CUPS), true)
+vpath %.c   $(PLATFORM_SRC)/native/common/deps
+endif
+
+ifneq ($(SYSTEM_FONTCONFIG), true)
+vpath %.c   $(PLATFORM_SRC)/native/common/deps/fontconfig2
+endif
+
+OTHER_LDLIBS = $(LIBM) -lawt -lXext -lX11 -lXrender -lXcomposite $(LIBDL) \
                    $(LDFLAGS_COMMON) $(AWT_RUNPATH) $(OTHER_LDFLAGS) -lXtst -lXi
 
+ifeq ($(SYSTEM_CUPS), true)
+  OTHER_LDLIBS += $(CUPS_LIBS)
+endif
+
+ifeq ($(SYSTEM_FONTCONFIG), true)
+  OTHER_LDLIBS += $(FONTCONFIG_LIBS)
+endif
+
+ifeq ($(SYSTEM_GIO), true)
+  OTHER_LDLIBS += $(GIO_LIBS)
+endif
+
 ifeq  ($(PLATFORM), solaris)
 CPPFLAGS += -DFUNCPROTO=15
 dummy := $(shell $(MKDIR) -p $(LIB_LOCATION))
 endif
 
-CPPFLAGS += -I$(CUPS_HEADERS_PATH)
+ifdef CUPS_CFLAGS
+  CPPFLAGS += $(CUPS_CFLAGS)
+else
+  CPPFLAGS += -I$(CUPS_HEADERS_PATH)
+endif
 
 CPPFLAGS += -DXAWT -DXAWT_HACK \
         -I$(TEMPDIR)/../../sun.awt/awt/CClassHeaders \
@@ -145,6 +177,30 @@
         -I$(SHARE_SRC)/native/sun/awt \
         -I$(PLATFORM_SRC)/native/sun/awt
 
+ifeq ($(SYSTEM_GTK), true)
+  CPPFLAGS += $(GTK_CFLAGS) -DUSE_SYSTEM_GTK
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps/gtk2
+endif
+
+ifeq ($(SYSTEM_CUPS), true)
+  CPPFLAGS += -DUSE_SYSTEM_CUPS
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps
+endif
+
+ifeq ($(SYSTEM_FONTCONFIG), true)
+  CPPFLAGS += $(FONTCONFIG_CFLAGS) -DUSE_SYSTEM_FONTCONFIG
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps/fontconfig2
+endif
+
+ifeq ($(SYSTEM_GIO), true)
+  CPPFLAGS += $(GIO_CFLAGS) -DUSE_SYSTEM_GIO
+else
+  CPPFLAGS += -I$(PLATFORM_SRC)/native/common/deps/glib2
+endif
+
 ifeq ($(PLATFORM), linux)
   ifndef CROSS_COMPILE_ARCH
     # Allows for builds on Debian GNU Linux, X11 is in a different place 
@@ -159,6 +215,10 @@
   endif
 endif
 
+ifeq ($(NATIVE_SUPPORT_DEBUG), true)
+  OTHER_CFLAGS += -DNATIVE_SUPPORT_DEBUG
+endif
+
 # We have some odd logic here because some Solaris 10 updates
 # have a render.h file that suggests gradients are supported, but
 # the Xrender.h doesn't have the corresponding type definitions.
--- a/make/sun/xawt/mapfile-vers	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/sun/xawt/mapfile-vers	Tue Aug 22 02:03:52 2017 +0100
@@ -167,12 +167,7 @@
         Java_java_awt_Frame_initIDs;
 	Java_sun_awt_SunToolkit_closeSplashScreen;
         Java_sun_awt_UNIXToolkit_check_1gtk;
-        Java_sun_awt_UNIXToolkit_load_1gtk;
-        Java_sun_awt_UNIXToolkit_unload_1gtk;
-        Java_sun_awt_UNIXToolkit_load_1stock_1icon;
-        Java_sun_awt_UNIXToolkit_load_1gtk_1icon;
         Java_sun_awt_UNIXToolkit_nativeSync;
-        Java_sun_awt_UNIXToolkit_gtkCheckVersionImpl;
         Java_java_awt_AWTEvent_initIDs;
         Java_java_awt_event_InputEvent_initIDs;
         Java_java_awt_event_KeyEvent_initIDs;
@@ -406,38 +401,6 @@
 	Java_sun_java2d_xr_XRBackendNative_GCRectanglesNative;
 	Java_sun_java2d_xr_XRBackendNative_renderCompositeTrapezoidsNative;
 
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1arrow;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1box;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1box_1gap;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1check;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1expander;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1extension;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1flat_1box;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1focus;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1handle;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1hline;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1option;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1shadow;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1slider;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1vline;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1paint_1background;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_nativeStartPainting;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_nativeFinishPainting;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1switch_1theme;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1get_1gtk_1setting;
-        Java_com_sun_java_swing_plaf_gtk_GTKEngine_nativeSetRangeValue;
-        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetXThickness;
-        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetYThickness;
-        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetColorForState;
-        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetClassValue;
-        Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetPangoFontName;
-
-        Java_sun_awt_X11_GtkFileDialogPeer_initIDs;
-        Java_sun_awt_X11_GtkFileDialogPeer_run;
-        Java_sun_awt_X11_GtkFileDialogPeer_quit;
-        Java_sun_awt_X11_GtkFileDialogPeer_toFront;
-        Java_sun_awt_X11_GtkFileDialogPeer_setBounds;
-
 	Java_sun_print_CUPSPrinter_initIDs;
 	Java_sun_print_CUPSPrinter_getCupsServer;
 	Java_sun_print_CUPSPrinter_getCupsPort;
--- a/make/tools/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -28,6 +28,15 @@
 #
 
 BUILDDIR = ..
+
+ifndef JAVAC_MAX_WARNINGS
+  SUBDIRS_MAKEFLAGS += JAVAC_MAX_WARNINGS=true
+endif
+
+ifndef JAVAC_WARNINGS_FATAL
+  SUBDIRS_MAKEFLAGS += JAVAC_WARNINGS_FATAL=true
+endif
+
 include $(BUILDDIR)/common/Defs.gmk
 
 # Note: freetypecheck is built by Sanity.gmk if needed
--- a/make/tools/freetypecheck/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/freetypecheck/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -48,12 +48,12 @@
   FT_LD_OPTIONS = -L$(FREETYPE_LIB_PATH)
   # Add runtime lib search path to ensure test will be runnable
   ifeq ($(PLATFORM), linux)
-    FT_LD_OPTIONS += -Wl,-rpath -Wl,$(FREETYPE_LIB_PATH) -lfreetype
+    FT_LD_OPTIONS += -Wl,-rpath -Wl,$(FREETYPE_LIB_PATH) $(FT2_LIBS)
   else 
     ifeq ($(PLATFORM), macosx)
       FT_LD_OPTIONS += -lfreetype -lz
     else # everything else
-     FT_LD_OPTIONS += -R $(FREETYPE_LIB_PATH) -lfreetype 
+      FT_LD_OPTIONS += -R $(FREETYPE_LIB_PATH) -lfreetype 
     endif
   endif
 endif
--- a/make/tools/generate_nimbus/Makefile	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/generate_nimbus/Makefile	Tue Aug 22 02:03:52 2017 +0100
@@ -44,6 +44,7 @@
 SOURCE_FILES    = Generator.java \
                   ObjectFactory.java \
                   Paint.java \
+		  Shape.java \
                   SynthModel.java \
                   UIDefault.java \
                   UIStyle.java
--- a/make/tools/src/build/tools/buildmetaindex/BuildMetaIndex.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/buildmetaindex/BuildMetaIndex.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -114,8 +114,8 @@
                  */
 
                 out.println(jmi.getJarFileKind().getMarkerChar() + " " + filename);
-                for (Iterator<String> iter = index.iterator(); iter.hasNext(); ) {
-                    out.println(iter.next());
+                for (String entry : index) {
+                    out.println(entry);
                 }
 
             }
@@ -171,8 +171,7 @@
      * A hashmap contains a mapping from the prefix string to
      * a hashset which contains a set of the second level of prefix string.
      */
-    private HashMap<String, HashSet<String>> knownPrefixMap = new
-        HashMap<String, HashSet<String>>();
+    private HashMap<String, HashSet<String>> knownPrefixMap = new HashMap<String, HashSet<String>>();
 
     /*
      * We add maximum 5 second level entries to "sun", "java" and
@@ -196,11 +195,11 @@
             synchronized(this) {
                 if (indexSet == null) {
                     indexSet = new HashSet<String>();
-                    Enumeration entries = jar.entries();
+                    Enumeration<JarEntry> entries = jar.entries();
                     boolean containsOnlyClass = true;
                     boolean containsOnlyResource = true;
                     while (entries.hasMoreElements()) {
-                        JarEntry entry = (JarEntry) entries.nextElement();
+                        JarEntry entry = entries.nextElement();
                         String name = entry.getName();
                         /* We only look at the non-directory entry.
                            MANIFEST file is also skipped. */
@@ -338,9 +337,7 @@
         /* Iterate through the hash map, add the second level package names
          * to the indexSet if has any.
          */
-        for (Iterator<String> keysIterator = knownPrefixMap.keySet().iterator();
-             keysIterator.hasNext();) {
-            String key = keysIterator.next();
+        for (String key : knownPrefixMap.keySet()) {
             HashSet<String> pkgSetStartsWithKey = knownPrefixMap.get(key);
             int setSize = pkgSetStartsWithKey.size();
 
@@ -353,9 +350,8 @@
                 /* If the set contains less than MAX_PKGS_WITH_KNOWN_PREFIX, add
                  * them to the indexSet of the MetaIndex object.
                  */
-                for (Iterator<String> secondPkgElements = pkgSetStartsWithKey.iterator();
-                     secondPkgElements.hasNext();) {
-                    indexSet.add(key + "/" + secondPkgElements.next());
+                for (String secondPkgElement : pkgSetStartsWithKey) {
+                    indexSet.add(key + "/" + secondPkgElement);
                 }
             }
         } // end the outer "for"
--- a/make/tools/src/build/tools/compileproperties/CompileProperties.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/compileproperties/CompileProperties.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -36,7 +36,6 @@
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
 
@@ -228,13 +227,11 @@
                 sortedKeys.add((String)key);
             }
             Collections.sort(sortedKeys);
-            Iterator keys = sortedKeys.iterator();
 
             StringBuffer data = new StringBuffer();
 
-            while (keys.hasNext()) {
-                Object key = keys.next();
-                data.append("            { \"" + escape((String)key) + "\", \"" +
+            for (String key : sortedKeys) {
+                data.append("            { \"" + escape(key) + "\", \"" +
                         escape((String)p.get(key)) + "\" },\n");
             }
 
--- a/make/tools/src/build/tools/dirdiff/DirDiff.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/dirdiff/DirDiff.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -164,7 +164,7 @@
       }
 
       File[] currentGoldenDirs = null;
-      TreeSet goldDirSet = new TreeSet();
+      TreeSet<String> goldDirSet = new TreeSet<String>();
       if (goldenDir != null) {
           currentGoldenDirs = goldenDir.listFiles();
           for (int i=0; i<currentGoldenDirs.length; i++) {
--- a/make/tools/src/build/tools/dtdbuilder/DTDBuilder.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/dtdbuilder/DTDBuilder.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -63,9 +63,9 @@
     static PublicMapping mapping = null;
 
     // Hash from name to Integer
-    private Hashtable namesHash = new Hashtable();
+    private Hashtable<String, Integer> namesHash = new Hashtable<String, Integer>();
     // Vector of all names
-    private Vector namesVector = new Vector();
+    private Vector<String> namesVector = new Vector<String>();
 
     /**
      * Create a new DTD.
@@ -87,15 +87,15 @@
         int numNames = namesVector.size();
         out.writeShort((short) (namesVector.size()));
         for (int i = 0; i < namesVector.size(); i++) {
-            String nm = (String) namesVector.elementAt(i);
+            String nm = namesVector.elementAt(i);
             out.writeUTF(nm);
         }
 
         saveEntities(out);
 
         out.writeShort((short) (elements.size()));
-        for (Enumeration e = elements.elements() ; e.hasMoreElements() ; ) {
-            saveElement(out, (Element)e.nextElement());
+        for (Enumeration<Element> e = elements.elements() ; e.hasMoreElements() ; ) {
+            saveElement(out, e.nextElement());
         }
 
         if (namesVector.size() != numNames) {
@@ -106,21 +106,21 @@
     }
 
     private void buildNamesTable() {
-        for (Enumeration e = entityHash.elements() ; e.hasMoreElements() ; ) {
-            Entity ent = (Entity) e.nextElement();
+        for (Enumeration<Entity> e = entityHash.elements() ; e.hasMoreElements() ; ) {
+            Entity ent = e.nextElement();
             // Do even if not isGeneral().  That way, exclusions and inclusions
             // will definitely have their element.
             getNameId(ent.getName());
         }
-        for (Enumeration e = elements.elements() ; e.hasMoreElements() ; ) {
-            Element el = (Element) e.nextElement();
+        for (Enumeration<Element> e = elements.elements() ; e.hasMoreElements() ; ) {
+            Element el = e.nextElement();
             getNameId(el.getName());
             for (AttributeList atts = el.getAttributes() ; atts != null ; atts = atts.getNext()) {
                 getNameId(atts.getName());
                 if (atts.getValue() != null) {
                     getNameId(atts.getValue());
                 }
-                Enumeration vals = atts.getValues();
+                Enumeration<?> vals = atts.getValues();
                 while (vals != null && vals.hasMoreElements()) {
                     String s = (String) vals.nextElement();
                     getNameId(s);
@@ -133,9 +133,9 @@
     // The the id of a name from the list of names
     //
     private short getNameId(String name)  {
-        Object o = namesHash.get(name);
+        Integer o = namesHash.get(name);
         if (o != null) {
-            return (short) ((Integer) o).intValue();
+            return (short) o.intValue();
         }
         int i = namesVector.size();
         namesVector.addElement(name);
@@ -149,16 +149,16 @@
      */
     void saveEntities(DataOutputStream out) throws IOException {
         int num = 0;
-        for (Enumeration e = entityHash.elements() ; e.hasMoreElements() ; ) {
-            Entity ent = (Entity) e.nextElement();
+        for (Enumeration<Entity> e = entityHash.elements() ; e.hasMoreElements() ; ) {
+            Entity ent = e.nextElement();
             if (ent.isGeneral()) {
                 num++;
             }
         }
 
         out.writeShort((short) num);
-        for (Enumeration e = entityHash.elements() ; e.hasMoreElements() ; ) {
-            Entity ent = (Entity) e.nextElement();
+        for (Enumeration<Entity> e = entityHash.elements() ; e.hasMoreElements() ; ) {
+            Entity ent = e.nextElement();
             if (ent.isGeneral()) {
                 out.writeShort(getNameId(ent.getName()));
                 out.writeByte(ent.getType() & ~GENERAL);
--- a/make/tools/src/build/tools/dtdbuilder/DTDInputStream.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/dtdbuilder/DTDInputStream.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -48,7 +48,7 @@
 public final
 class DTDInputStream extends FilterReader implements DTDConstants {
     public DTD dtd;
-    public Stack stack = new Stack();
+    public Stack<Object> stack = new Stack<Object>();
     public char str[] = new char[64];
     public int replace = 0;
     public int ln = 1;
@@ -105,6 +105,7 @@
      * parameter entities.
      * [60] 350:22
      */
+    @SuppressWarnings("fallthrough")
     public int read() throws IOException {
         switch (ch) {
           case '%': {
@@ -134,6 +135,7 @@
             switch (ch) {
               case '\r':
                 ln++;
+                /* fall through */
               case ';':
                 ch = in.read();
                 break;
--- a/make/tools/src/build/tools/dtdbuilder/DTDParser.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/dtdbuilder/DTDParser.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2000, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -87,7 +87,7 @@
             return null;
         }
 
-        return MessageFormat.format(prop, args);
+        return MessageFormat.format(prop, (Object[])args);
     }
 
     /**
@@ -201,6 +201,7 @@
      * Parse identifier. Uppercase characters are automatically
      * folded to lowercase. Returns falsed if no identifier is found.
      */
+    @SuppressWarnings("fallthrough")
     boolean parseIdentifier(boolean lower) throws IOException {
         switch (ch) {
           case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
@@ -211,6 +212,7 @@
             if (lower) {
                 ch = 'a' + (ch - 'A');
             }
+            /* fall through */
 
           case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
           case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
@@ -233,6 +235,7 @@
      * Parses name token. If <code>lower</code> is true, upper case letters
      * are folded to lower case. Returns falsed if no token is found.
      */
+    @SuppressWarnings("fallthrough")
     boolean parseNameToken(boolean lower) throws IOException {
         boolean first = true;
 
@@ -246,6 +249,7 @@
                 if (lower) {
                     ch = 'a' + (ch - 'A');
                 }
+                /* fall through */
 
               case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
               case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
@@ -271,8 +275,8 @@
     /**
      * Parse a list of identifiers.
      */
-    Vector parseIdentifierList(boolean lower) throws IOException {
-        Vector elems = new Vector();
+    Vector<String> parseIdentifierList(boolean lower) throws IOException {
+        Vector<String> elems = new Vector<String>();
         skipSpace();
         switch (ch) {
           case '(':
@@ -507,7 +511,7 @@
      * [116] 405:6
      */
     void parseElementDeclaration() throws IOException {
-        Vector elems = parseIdentifierList(true);
+        Vector<String> elems = parseIdentifierList(true);
         BitSet inclusions = null;
         BitSet exclusions = null;
         boolean omitStart = false;
@@ -544,26 +548,26 @@
         if ((type == MODEL) || (type == ANY)) {
             if (ch == '-') {
                 ch = in.read();
-                Vector v = parseIdentifierList(true);
+                Vector<String> v = parseIdentifierList(true);
                 exclusions = new BitSet();
-                for (Enumeration e = v.elements() ; e.hasMoreElements() ;) {
-                    exclusions.set(dtd.getElement((String)e.nextElement()).getIndex());
+                for (Enumeration<String> e = v.elements() ; e.hasMoreElements() ;) {
+                    exclusions.set(dtd.getElement(e.nextElement()).getIndex());
                 }
             }
             if (ch == '+') {
                 ch = in.read();
-                Vector v = parseIdentifierList(true);
+                Vector<String> v = parseIdentifierList(true);
                 inclusions = new BitSet();
-                for (Enumeration e = v.elements() ; e.hasMoreElements() ;) {
-                    inclusions.set(dtd.getElement((String)e.nextElement()).getIndex());
+                for (Enumeration<String> e = v.elements() ; e.hasMoreElements() ;) {
+                    inclusions.set(dtd.getElement(e.nextElement()).getIndex());
                 }
             }
         }
         expect('>');
 
         if (in.replace == 0) {
-            for (Enumeration e = elems.elements() ; e.hasMoreElements() ;) {
-                dtd.defineElement((String)e.nextElement(), type, omitStart, omitEnd, content, exclusions, inclusions, null);
+            for (Enumeration<String> e = elems.elements() ; e.hasMoreElements() ;) {
+                dtd.defineElement(e.nextElement(), type, omitStart, omitEnd, content, exclusions, inclusions, null);
             }
         }
     }
@@ -582,7 +586,7 @@
             error("invalid", "attribute value");
             return;
         }
-        atts.type = atts.name2type(getString(0));
+        atts.type = AttributeList.name2type(getString(0));
         skipParameterSpace();
         if (atts.type == NOTATION) {
             atts.values = parseIdentifierList(true);
@@ -593,6 +597,7 @@
      * Parse an attribute value specification.
      * [33] 331:1
      */
+    @SuppressWarnings("fallthrough")
     String parseAttributeValueSpecification() throws IOException {
         int delim = -1;
         switch (ch) {
@@ -627,6 +632,7 @@
                     ch = in.read();
                     return getString(0);
                 }
+                /* fall through */
 
               default:
                 addString(ch & 0xFF);
@@ -648,7 +654,7 @@
                 return;
             }
             skipParameterSpace();
-            atts.modifier = atts.name2type(getString(0));
+            atts.modifier = AttributeList.name2type(getString(0));
             if (atts.modifier != FIXED) {
                 return;
             }
@@ -663,7 +669,7 @@
      * REMIND: associated notation name
      */
     void parseAttlistDeclaration() throws IOException {
-        Vector elems = parseIdentifierList(true);
+        Vector<String> elems = parseIdentifierList(true);
         AttributeList attlist = null, atts = null;
 
         while (parseIdentifier(true)) {
@@ -685,8 +691,8 @@
         expect('>');
 
         if (in.replace == 0) {
-            for (Enumeration e = elems.elements() ; e.hasMoreElements() ;) {
-                dtd.defineAttributes((String)e.nextElement(), attlist);
+            for (Enumeration<String> e = elems.elements() ; e.hasMoreElements() ;) {
+                dtd.defineAttributes(e.nextElement(), attlist);
             }
         }
     }
@@ -810,6 +816,7 @@
     /**
      * Parse a section of the input upto EOF or ']'.
      */
+    @SuppressWarnings("fallthrough")
     void parseSection() throws IOException {
         while (true) {
             switch (ch) {
@@ -883,6 +890,7 @@
               default:
                 char str[] = {(char)ch};
                 error("invalid.arg", "character", "'" + new String(str) + "' / " + ch);
+                /* fall through */
 
               case ' ':
               case '\t':
--- a/make/tools/src/build/tools/dtdbuilder/PublicMapping.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/dtdbuilder/PublicMapping.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -44,7 +44,7 @@
 final class PublicMapping {
 
     String baseStr;
-    Hashtable tab = new Hashtable();
+    Hashtable<String, String> tab = new Hashtable<String, String>();
 
     /**
      * Create a mapping.
@@ -103,6 +103,6 @@
      */
     public String get(String id) {
         // System.err.println(" id = "+id);
-        return (String) tab.get(id);
+        return tab.get(id);
     }
 }
--- a/make/tools/src/build/tools/generatebreakiteratordata/CharSet.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatebreakiteratordata/CharSet.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -66,7 +66,7 @@
      * A cache which is used to speed up parseString() whenever it is
      * used to parse a description that has been parsed before
      */
-    private static Hashtable expressionCache = null;
+    private static Hashtable<String, CharSet> expressionCache = null;
 
     /**
      * Builds a CharSet based on a textual description.  For the syntax of
@@ -79,7 +79,7 @@
         // if "s" is in the expression cache, pull the result out
         // of the expresison cache
         if (expressionCache != null) {
-            result = (CharSet)expressionCache.get(s);
+            result = expressionCache.get(s);
         }
 
         // otherwise, use doParseString() to actually parse the string,
@@ -87,7 +87,7 @@
         if (result == null) {
             result = doParseString(s);
             if (expressionCache == null) {
-                expressionCache = new Hashtable();
+                expressionCache = new Hashtable<String, CharSet>();
             }
             expressionCache.put(s, result);
         }
@@ -336,8 +336,8 @@
      * Returns a copy of CharSet's expression cache and sets CharSet's
      * expression cache to empty.
      */
-    public static Hashtable releaseExpressionCache() {
-        Hashtable result = expressionCache;
+    public static Hashtable<String, CharSet> releaseExpressionCache() {
+        Hashtable<String, CharSet> result = expressionCache;
         expressionCache = null;
         return result;
     }
@@ -778,7 +778,7 @@
      * An Enumeration that can be used to extract the character ranges
      * from a CharSet one at a time
      */
-    public class Enumeration implements java.util.Enumeration {
+    public class Enumeration implements java.util.Enumeration<int[]> {
         /**
          * Initializes a CharSet.Enumeration
          */
@@ -798,7 +798,7 @@
         /**
          * Returns the next range in the CarSet
          */
-        public Object nextElement() {
+        public int[] nextElement() {
             int[] result = new int[2];
             result[0] = chars[p++];
             result[1] = chars[p++];
--- a/make/tools/src/build/tools/generatebreakiteratordata/DictionaryBasedBreakIteratorBuilder.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatebreakiteratordata/DictionaryBasedBreakIteratorBuilder.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -78,12 +78,12 @@
      * contains "true" for every character category that includes a dictionary
      * character.
      */
-    protected void buildCharCategories(Vector tempRuleList) {
+    protected void buildCharCategories(Vector<String> tempRuleList) {
         super.buildCharCategories(tempRuleList);
 
         categoryFlags = new boolean[categories.size()];
         for (int i = 0; i < categories.size(); i++) {
-            CharSet cs = (CharSet)categories.elementAt(i);
+            CharSet cs = categories.elementAt(i);
             if (!(cs.intersection(dictionaryChars).empty())) {
                 categoryFlags[i] = true;
             }
@@ -95,7 +95,7 @@
     // the function above. This gives us a way to create a separate character
     // category for the dictionary characters even when
     // RuleBasedBreakIteratorBuilder isn't making a distinction.
-    protected void mungeExpressionList(Hashtable expressions) {
+    protected void mungeExpressionList(Hashtable<String, Object> expressions) {
         expressions.put(dictionaryExpression, dictionaryChars);
     }
 
--- a/make/tools/src/build/tools/generatebreakiteratordata/GenerateBreakIteratorData.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatebreakiteratordata/GenerateBreakIteratorData.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -91,9 +91,9 @@
         try {
             info = (ResourceBundle)Class.forName("sun.text.resources.BreakIteratorInfo" + localeName).newInstance();
 
-            Enumeration keys = info.getKeys();
+            Enumeration<String> keys = info.getKeys();
             while (keys.hasMoreElements()) {
-                String key = (String)keys.nextElement();
+                String key = keys.nextElement();
 
                 if (key.equals("CharacterData")) {
                     generateDataFile(info.getString(key),
--- a/make/tools/src/build/tools/generatebreakiteratordata/RuleBasedBreakIteratorBuilder.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatebreakiteratordata/RuleBasedBreakIteratorBuilder.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -110,13 +110,13 @@
      * A temporary holding place used for calculating the character categories.
      * This object contains CharSet objects.
      */
-    protected Vector categories = null;
+    protected Vector<CharSet> categories = null;
 
     /**
      * A table used to map parts of regexp text to lists of character
      * categories, rather than having to figure them out from scratch each time
      */
-    protected Hashtable expressions = null;
+    protected Hashtable<String, Object> expressions = null;
 
     /**
      * A temporary holding place for the list of ignore characters
@@ -126,32 +126,32 @@
     /**
      * A temporary holding place where the forward state table is built
      */
-    protected Vector tempStateTable = null;
+    protected Vector<short[]> tempStateTable = null;
 
     /**
      * A list of all the states that have to be filled in with transitions to
      * the next state that is created.  Used when building the state table from
      * the regular expressions.
      */
-    protected Vector decisionPointList = null;
+    protected Vector<Integer> decisionPointList = null;
 
     /**
      * A stack for holding decision point lists.  This is used to handle nested
      * parentheses and braces in regexps.
      */
-    protected Stack decisionPointStack = null;
+    protected Stack<Vector<Integer>> decisionPointStack = null;
 
     /**
      * A list of states that loop back on themselves.  Used to handle .*?
      */
-    protected Vector loopingStates = null;
+    protected Vector<Integer> loopingStates = null;
 
     /**
      * Looping states actually have to be backfilled later in the process
      * than everything else.  This is where a the list of states to backfill
      * is accumulated.  This is also used to handle .*?
      */
-    protected Vector statesToBackfill = null;
+    protected Vector<Integer> statesToBackfill = null;
 
     /**
      * A list mapping pairs of state numbers for states that are to be combined
@@ -159,7 +159,7 @@
      * in the process of making the state table deterministic to prevent
      * infinite recursion.
      */
-    protected Vector mergeList = null;
+    protected Vector<int[]> mergeList = null;
 
     /**
      * A flag that is used to indicate when the list of looping states can
@@ -198,7 +198,7 @@
      * just vectors different parts of the job off to other functions.
      */
     public RuleBasedBreakIteratorBuilder(String description) {
-        Vector tempRuleList = buildRuleList(description);
+        Vector<String> tempRuleList = buildRuleList(description);
         buildCharCategories(tempRuleList);
         buildStateTable(tempRuleList);
         buildBackwardsStateTable(tempRuleList);
@@ -213,7 +213,7 @@
      * variable names)
      * </ul>
      */
-    private Vector buildRuleList(String description) {
+    private Vector<String> buildRuleList(String description) {
         // invariants:
         // - parentheses must be balanced: ()[]{}<>
         // - nothing can be nested inside <>
@@ -240,8 +240,8 @@
         // set up a vector to contain the broken-up description (each entry in the
         // vector is a separate rule) and a stack for keeping track of opening
         // punctuation
-        Vector tempRuleList = new Vector();
-        Stack parenStack = new Stack();
+        Vector<String> tempRuleList = new Vector<String>();
+        Stack<Character> parenStack = new Stack<Character>();
 
         int p = 0;
         int ruleStart = 0;
@@ -326,7 +326,7 @@
                     }
                     parenStack.pop();
                     if (!parenStack.empty()) {
-                        lastOpen = ((Character)(parenStack.peek())).charValue();
+                        lastOpen = parenStack.peek().charValue();
                     }
                     else {
                         lastOpen = '\u0000';
@@ -552,7 +552,8 @@
      * character category numbers everywhere a literal character or a [] expression
      * originally occurred.
      */
-    protected void buildCharCategories(Vector tempRuleList) {
+    @SuppressWarnings("fallthrough")
+    protected void buildCharCategories(Vector<String> tempRuleList) {
         int bracketLevel = 0;
         int p = 0;
         int lineNum = 0;
@@ -560,9 +561,9 @@
         // build hash table of every literal character or [] expression in the rule list
         // and use CharSet.parseString() to derive a CharSet object representing the
         // characters each refers to
-        expressions = new Hashtable();
+        expressions = new Hashtable<String,Object>();
         while (lineNum < tempRuleList.size()) {
-            String line = (String)(tempRuleList.elementAt(lineNum));
+            String line = tempRuleList.elementAt(lineNum);
             p = 0;
             while (p < line.length()) {
                 int c = line.codePointAt(p);
@@ -618,7 +619,7 @@
         CharSet.releaseExpressionCache();
 
         // create the temporary category table (which is a vector of CharSet objects)
-        categories = new Vector();
+        categories = new Vector<CharSet>();
         if (ignoreChars != null) {
             categories.addElement(ignoreChars);
         }
@@ -643,8 +644,7 @@
         // At no time should a character ever occur in more than one character category.
 
         // for each expression in the expressions list, do...
-        Enumeration iter = expressions.elements();
-        while (iter.hasMoreElements()) {
+        for (Enumeration<Object> iter = expressions.elements(); iter.hasMoreElements(); ) {
             // initialize the working char set to the chars in the current expression
             CharSet e = (CharSet)iter.nextElement();
 
@@ -653,7 +653,7 @@
 
                 // if there's overlap between the current working set of chars
                 // and the current category...
-                CharSet that = (CharSet)(categories.elementAt(j));
+                CharSet that = categories.elementAt(j);
                 if (!that.intersection(e).empty()) {
 
                     // add a new category for the characters that were in the
@@ -686,9 +686,9 @@
         // up in some other category
         CharSet allChars = new CharSet();
         for (int i = 1; i < categories.size(); i++) {
-            allChars = allChars.union((CharSet)(categories.elementAt(i)));
+            allChars = allChars.union(categories.elementAt(i));
         }
-        CharSet ignoreChars = (CharSet)(categories.elementAt(0));
+        CharSet ignoreChars = categories.elementAt(0);
         ignoreChars = ignoreChars.difference(allChars);
         categories.setElementAt(ignoreChars, 0);
 
@@ -697,9 +697,9 @@
         // character categories that expression refers to.  The String is encoded: each
         // character is a character category number (plus 0x100 to avoid confusing them
         // with syntax characters in the rule grammar)
-        iter = expressions.keys();
-        while (iter.hasMoreElements()) {
-            String key = (String)iter.nextElement();
+
+        for (Enumeration<String> iter = expressions.keys(); iter.hasMoreElements(); ) {
+            String key = iter.nextElement();
             CharSet cs = (CharSet)expressions.get(key);
             StringBuffer cats = new StringBuffer();
 
@@ -707,7 +707,7 @@
             for (int j = 0; j < categories.size(); j++) {
 
                 // if the current expression contains characters in that category...
-                CharSet temp = cs.intersection((CharSet)(categories.elementAt(j)));
+                CharSet temp = cs.intersection(categories.elementAt(j));
                 if (!temp.empty()) {
 
                     // then add the encoded category number to the String for this
@@ -732,12 +732,12 @@
 
         // for each category...
         for (int i = 0; i < categories.size(); i++) {
-            CharSet chars = (CharSet)(categories.elementAt(i));
+            CharSet chars = categories.elementAt(i);
 
             // go through the character ranges in the category one by one...
-            Enumeration enum_ = chars.getChars();
+            Enumeration<int[]> enum_ = chars.getChars();
             while (enum_.hasMoreElements()) {
-                int[] range = (int[])(enum_.nextElement());
+                int[] range = enum_.nextElement();
 
                 // and set the corresponding elements in the CompactArray accordingly
                 if (i != 0) {
@@ -782,7 +782,7 @@
         numCategories = categories.size();
     }
 
-    protected void mungeExpressionList(Hashtable expressions) {
+    protected void mungeExpressionList(Hashtable<String, Object> expressions) {
         // empty in the parent class.  This function provides a hook for subclasses
         // to mess with the character category table.
     }
@@ -792,19 +792,19 @@
      * work is done in parseRule(), which is called once for each rule in the
      * description.
      */
-    private void buildStateTable(Vector tempRuleList) {
+    private void buildStateTable(Vector<String> tempRuleList) {
         // initialize our temporary state table, and fill it with two states:
         // state 0 is a dummy state that allows state 1 to be the starting state
         // and 0 to represent "stop".  State 1 is added here to seed things
         // before we start parsing
-        tempStateTable = new Vector();
+        tempStateTable = new Vector<short[]>();
         tempStateTable.addElement(new short[numCategories + 1]);
         tempStateTable.addElement(new short[numCategories + 1]);
 
         // call parseRule() for every rule in the rule list (except those which
         // start with !, which are actually backwards-iteration rules)
         for (int i = 0; i < tempRuleList.size(); i++) {
-            String rule = (String)tempRuleList.elementAt(i);
+            String rule = tempRuleList.elementAt(i);
             if (rule.charAt(0) != '!') {
                 parseRule(rule, true);
             }
@@ -891,10 +891,10 @@
         int lastState = currentState;
         String pendingChars = "";
 
-        decisionPointStack = new Stack();
-        decisionPointList = new Vector();
-        loopingStates = new Vector();
-        statesToBackfill = new Vector();
+        decisionPointStack = new Stack<Vector<Integer>>();
+        decisionPointList = new Vector<Integer>();
+        loopingStates = new Vector<Integer>();
+        statesToBackfill = new Vector<Integer>();
 
         short[] state;
         boolean sawEarlyBreak = false;
@@ -972,8 +972,8 @@
 
                 // if the character we're on is a period, we end up down here
                 else {
-                    int rowNum = ((Integer)decisionPointList.lastElement()).intValue();
-                    state = (short[])tempStateTable.elementAt(rowNum);
+                    int rowNum = decisionPointList.lastElement().intValue();
+                    state = tempStateTable.elementAt(rowNum);
 
                     // if the period is followed by an asterisk, then just set the current
                     // state to loop back on itself
@@ -1001,7 +1001,9 @@
                     // of the current desicion point list onto the stack (this is
                     // the same thing we do on an opening brace)
                     if (p + 1 < rule.length() && rule.charAt(p + 1) == '*') {
-                        decisionPointStack.push(decisionPointList.clone());
+                        @SuppressWarnings("unchecked")
+                        Vector<Integer> clone = (Vector<Integer>)decisionPointList.clone();
+                        decisionPointStack.push(clone);
                     }
 
                     // create a new state, add it to the list of states to backfill
@@ -1040,7 +1042,9 @@
             // it, preventing it from being affected by whatever's inside the parentheses.
             // This decision point list is restored when a } is encountered.
             else if (c == '{') {
-                decisionPointStack.push(decisionPointList.clone());
+                @SuppressWarnings("unchecked")
+                Vector<Integer> clone = (Vector<Integer>)decisionPointList.clone();
+                decisionPointStack.push(clone);
             }
 
             // a } marks the end of an optional run of characters.  Pop the last decision
@@ -1053,7 +1057,7 @@
                 // on the character categories that caused us to enter this state
                 if (c == '*') {
                     for (int i = lastState + 1; i < tempStateTable.size(); i++) {
-                        Vector temp = new Vector();
+                        Vector<Integer> temp = new Vector<Integer>();
                         temp.addElement(new Integer(i));
                         updateStateTable(temp, pendingChars, (short)(lastState + 1));
                     }
@@ -1063,7 +1067,7 @@
                 // it with the current decision point list (this causes the divergent
                 // paths through the state table to come together again on the next
                 // new state)
-                Vector temp = (Vector)decisionPointStack.pop();
+                Vector<Integer> temp = decisionPointStack.pop();
                 for (int i = 0; i < decisionPointList.size(); i++)
                     temp.addElement(decisionPointList.elementAt(i));
                 decisionPointList = temp;
@@ -1123,8 +1127,10 @@
                 // stack (this keeps track of the active decision point list before
                 // the () expression), followed by an empty decision point list
                 // (this will hold the exit points)
-                decisionPointStack.push(decisionPointList.clone());
-                decisionPointStack.push(new Vector());
+                @SuppressWarnings("unchecked")
+                Vector<Integer> clone = (Vector<Integer>)decisionPointList.clone();
+                decisionPointStack.push(clone);
+                decisionPointStack.push(new Vector<Integer>());
             }
 
             // a | separates alternative character sequences in a () expression.  When
@@ -1133,8 +1139,8 @@
             else if (c == '|') {
 
                 // pick out the top two decision point lists on the stack
-                Vector oneDown = (Vector)decisionPointStack.pop();
-                Vector twoDown = (Vector)decisionPointStack.peek();
+                Vector<Integer> oneDown = decisionPointStack.pop();
+                Vector<Integer> twoDown = decisionPointStack.peek();
                 decisionPointStack.push(oneDown);
 
                 // append the current decision point list to the list below it
@@ -1142,7 +1148,9 @@
                 // current decision point list to its state before the () expression
                 for (int i = 0; i < decisionPointList.size(); i++)
                     oneDown.addElement(decisionPointList.elementAt(i));
-                decisionPointList = (Vector)twoDown.clone();
+                @SuppressWarnings("unchecked")
+                Vector<Integer> clone = (Vector<Integer>)twoDown.clone();
+                decisionPointList = clone;
             }
 
             // a ) marks the end of a sequence of characters.  We do one of two things
@@ -1160,7 +1168,7 @@
                 // pull the exit point list off the stack, merge it with the current
                 // decision point list, and make the merged version the current
                 // decision point list
-                Vector exitPoints = (Vector)decisionPointStack.pop();
+                Vector<Integer> exitPoints = decisionPointStack.pop();
                 for (int i = 0; i < decisionPointList.size(); i++)
                     exitPoints.addElement(decisionPointList.elementAt(i));
                 decisionPointList = exitPoints;
@@ -1176,16 +1184,18 @@
 
                     // now exitPoints and decisionPointList have to point to equivalent
                     // vectors, but not the SAME vector
-                    exitPoints = (Vector)decisionPointList.clone();
+                    @SuppressWarnings("unchecked")
+                    Vector<Integer> clone = (Vector<Integer>)decisionPointList.clone();
+                    exitPoints = clone;
 
                     // pop the original decision point list off the stack
-                    Vector temp = (Vector)decisionPointStack.pop();
+                    Vector<Integer> temp = decisionPointStack.pop();
 
                     // we squirreled away the row number of our entry point list
                     // at the beginning of the original decision point list.  Fish
                     // that state number out and retrieve the entry point list
-                    int tempStateNum = ((Integer)temp.firstElement()).intValue();
-                    short[] tempState = (short[])tempStateTable.elementAt(tempStateNum);
+                    int tempStateNum = temp.firstElement().intValue();
+                    short[] tempState = tempStateTable.elementAt(tempStateNum);
 
                     // merge the original decision point list with the current
                     // decision point list
@@ -1217,8 +1227,8 @@
             else if (c == '/') {
                 sawEarlyBreak = true;
                 for (int i = 0; i < decisionPointList.size(); i++) {
-                    state = (short[])tempStateTable.elementAt(((Integer)decisionPointList.
-                                    elementAt(i)).intValue());
+                    state = tempStateTable.elementAt(decisionPointList.
+                                    elementAt(i).intValue());
                     state[numCategories] |= LOOKAHEAD_STATE_FLAG;
                 }
             }
@@ -1261,8 +1271,8 @@
         // signals that these states cause the break position to be updated to the
         // position of the slash rather than the current break position.
         for (int i = 0; i < decisionPointList.size(); i++) {
-            int rowNum = ((Integer)decisionPointList.elementAt(i)).intValue();
-            state = (short[])tempStateTable.elementAt(rowNum);
+            int rowNum = decisionPointList.elementAt(i).intValue();
+            state = tempStateTable.elementAt(rowNum);
             state[numCategories] |= END_STATE_FLAG;
             if (sawEarlyBreak) {
                 state[numCategories] |= LOOKAHEAD_STATE_FLAG;
@@ -1279,7 +1289,7 @@
      * list of the columns that need updating.
      * @param newValue Update the cells specfied above to contain this value
      */
-    private void updateStateTable(Vector rows,
+    private void updateStateTable(Vector<Integer> rows,
                                   String pendingChars,
                                   short newValue) {
         // create a dummy state that has the specified row number (newValue) in
@@ -1292,7 +1302,7 @@
         // go through the list of rows to update, and update them by calling
         // mergeStates() to merge them the the dummy state we created
         for (int i = 0; i < rows.size(); i++) {
-            mergeStates(((Integer)rows.elementAt(i)).intValue(), newValues, rows);
+            mergeStates(rows.elementAt(i).intValue(), newValues, rows);
         }
     }
 
@@ -1318,8 +1328,8 @@
      */
     private void mergeStates(int rowNum,
                              short[] newValues,
-                             Vector rowsBeingUpdated) {
-        short[] oldValues = (short[])(tempStateTable.elementAt(rowNum));
+                             Vector<Integer> rowsBeingUpdated) {
+        short[] oldValues = tempStateTable.elementAt(rowNum);
         boolean isLoopingState = loopingStates.contains(new Integer(rowNum));
 
         // for each of the cells in the rows we're reconciling, do...
@@ -1375,7 +1385,7 @@
                     // add this pair of row numbers to the merge list (create it first
                     // if we haven't created the merge list yet)
                     if (mergeList == null) {
-                        mergeList = new Vector();
+                        mergeList = new Vector<int[]>();
                     }
                     mergeList.addElement(new int[] { oldRowNum, newRowNum, combinedRowNum });
 
@@ -1384,7 +1394,7 @@
                     // state table and update the original row (oldValues) to point
                     // to the new, merged, state
                     short[] newRow = new short[numCategories + 1];
-                    short[] oldRow = (short[])(tempStateTable.elementAt(oldRowNum));
+                    short[] oldRow = tempStateTable.elementAt(oldRowNum);
                     System.arraycopy(oldRow, 0, newRow, 0, numCategories + 1);
                     tempStateTable.addElement(newRow);
                     oldValues[i] = (short)combinedRowNum;
@@ -1408,7 +1418,7 @@
                     // now (groan) do the same thing for all the entries on the
                     // decision point stack
                     for (int k = 0; k < decisionPointStack.size(); k++) {
-                        Vector dpl = (Vector)decisionPointStack.elementAt(k);
+                        Vector<Integer> dpl = decisionPointStack.elementAt(k);
                         if ((dpl.contains(new Integer(oldRowNum))
                                 || dpl.contains(new Integer(newRowNum)))
                             && !dpl.contains(new Integer(combinedRowNum))
@@ -1420,8 +1430,8 @@
                     // FINALLY (puff puff puff), call mergeStates() recursively to copy
                     // the row referred to by newValues into the new row and resolve any
                     // conflicts that come up at that level
-                    mergeStates(combinedRowNum, (short[])(tempStateTable.elementAt(
-                                    newValues[i])), rowsBeingUpdated);
+                    mergeStates(combinedRowNum, tempStateTable.elementAt(
+                                    newValues[i]), rowsBeingUpdated);
                 }
             }
         }
@@ -1445,7 +1455,7 @@
         else {
             int[] entry;
             for (int i = 0; i < mergeList.size(); i++) {
-                entry = (int[])(mergeList.elementAt(i));
+                entry = mergeList.elementAt(i);
 
                 // we have a hit if the two row numbers match the two row numbers
                 // in the beginning of the entry (the two that combine), in either
@@ -1477,20 +1487,21 @@
      * @param endStates The list of states to treat as end states (states that
      * can exit the loop).
      */
-    private void setLoopingStates(Vector newLoopingStates, Vector endStates) {
+    private void setLoopingStates(Vector<Integer> newLoopingStates,
+                                  Vector<Integer> endStates) {
 
         // if the current list of looping states isn't empty, we have to backfill
         // values from the looping states into the states that are waiting to be
         // backfilled
         if (!loopingStates.isEmpty()) {
-            int loopingState = ((Integer)loopingStates.lastElement()).intValue();
+            int loopingState = loopingStates.lastElement().intValue();
             int rowNum;
 
             // don't backfill into an end state OR any state reachable from an end state
             // (since the search for reachable states is recursive, it's split out into
             // a separate function, eliminateBackfillStates(), below)
             for (int i = 0; i < endStates.size(); i++) {
-                eliminateBackfillStates(((Integer)endStates.elementAt(i)).intValue());
+                eliminateBackfillStates(endStates.elementAt(i).intValue());
             }
 
             // we DON'T actually backfill the states that need to be backfilled here.
@@ -1501,8 +1512,8 @@
             // for backfilling by putting the row number of the state to copy from
             // into the flag cell at the end of the row
             for (int i = 0; i < statesToBackfill.size(); i++) {
-                rowNum = ((Integer)statesToBackfill.elementAt(i)).intValue();
-                short[] state = (short[])tempStateTable.elementAt(rowNum);
+                rowNum = statesToBackfill.elementAt(i).intValue();
+                short[] state = tempStateTable.elementAt(rowNum);
                 state[numCategories] =
                     (short)((state[numCategories] & ALL_FLAGS) | loopingState);
             }
@@ -1511,7 +1522,9 @@
         }
 
         if (newLoopingStates != null) {
-            loopingStates = (Vector)newLoopingStates.clone();
+            @SuppressWarnings("unchecked")
+            Vector<Integer> clone = (Vector<Integer>)newLoopingStates.clone();
+            loopingStates = clone;
         }
     }
 
@@ -1530,7 +1543,7 @@
 
             // then go through and recursively call this function for every
             // state that the base state points to
-            short[] state = (short[])tempStateTable.elementAt(baseState);
+            short[] state = tempStateTable.elementAt(baseState);
             for (int i = 0; i < numCategories; i++) {
                 if (state[i] != 0) {
                     eliminateBackfillStates(state[i]);
@@ -1551,7 +1564,7 @@
 
         // for each state in the state table...
         for (int i = 0; i < tempStateTable.size(); i++) {
-            state = (short[])tempStateTable.elementAt(i);
+            state = tempStateTable.elementAt(i);
 
             // check the state's flag word to see if it's marked for backfilling
             // (it's marked for backfilling if any bits other than the two high-order
@@ -1563,7 +1576,7 @@
                 // load up the state to copy from (if we haven't already)
                 if (fromState != loopingStateRowNum) {
                     loopingStateRowNum = fromState;
-                    loopingState = (short[])tempStateTable.elementAt(loopingStateRowNum);
+                    loopingState = tempStateTable.elementAt(loopingStateRowNum);
                 }
 
                 // clear out the backfill part of the flag word
@@ -1594,7 +1607,7 @@
         backfillLoopingStates();
 
         int[] rowNumMap = new int[tempStateTable.size()];
-        Stack rowsToFollow = new Stack();
+        Stack<Integer> rowsToFollow = new Stack<Integer>();
         rowsToFollow.push(new Integer(1));
         rowNumMap[1] = 1;
 
@@ -1602,8 +1615,8 @@
         // (the reachable states will have their row numbers in the row number
         // map, and the nonreachable states will have zero in the row number map)
         while (rowsToFollow.size() != 0) {
-            int rowNum = ((Integer)rowsToFollow.pop()).intValue();
-            short[] row = (short[])(tempStateTable.elementAt(rowNum));
+            int rowNum = rowsToFollow.pop().intValue();
+            short[] row = tempStateTable.elementAt(rowNum);
 
             for (int i = 0; i < numCategories; i++) {
                 if (row[i] != 0) {
@@ -1632,7 +1645,7 @@
             if (rowNumMap[i] == 0) {
                 continue;
             }
-            state1 = (short[])tempStateTable.elementAt(i);
+            state1 = tempStateTable.elementAt(i);
             for (int j = 0; j < numCategories; j++) {
                 if (state1[j] != 0) {
                     ++stateClasses[i];
@@ -1663,10 +1676,10 @@
                 for (int i = 0; i < stateClasses.length; i++) {
                     if (stateClasses[i] == currentClass) {
                         if (state1 == null) {
-                            state1 = (short[])tempStateTable.elementAt(i);
+                            state1 = tempStateTable.elementAt(i);
                         }
                         else {
-                            state2 = (short[])tempStateTable.elementAt(i);
+                            state2 = tempStateTable.elementAt(i);
                             for (int j = 0; j < state2.length; j++) {
                                 if ((j == numCategories && state1[j] != state2[j] && forward)
                                         || (j != numCategories && stateClasses[state1[j]]
@@ -1733,7 +1746,7 @@
             int p = 0;
             int p2 = 0;
             for (int i = 0; i < tempStateTable.size(); i++) {
-                short[] row = (short[])(tempStateTable.elementAt(i));
+                short[] row = tempStateTable.elementAt(i);
                 if (row == null) {
                     continue;
                 }
@@ -1752,7 +1765,7 @@
             backwardsStateTable = new short[newRowNum * numCategories];
             int p = 0;
             for (int i = 0; i < tempStateTable.size(); i++) {
-                short[] row = (short[])(tempStateTable.elementAt(i));
+                short[] row = tempStateTable.elementAt(i);
                 if (row == null) {
                     continue;
                 }
@@ -1769,12 +1782,12 @@
      * table and any additional rules (identified by the ! on the front)
      * supplied in the description
      */
-    private void buildBackwardsStateTable(Vector tempRuleList) {
+    private void buildBackwardsStateTable(Vector<String> tempRuleList) {
 
         // create the temporary state table and seed it with two rows (row 0
         // isn't used for anything, and we have to create row 1 (the initial
         // state) before we can do anything else
-        tempStateTable = new Vector();
+        tempStateTable = new Vector<short[]>();
         tempStateTable.addElement(new short[numCategories + 1]);
         tempStateTable.addElement(new short[numCategories + 1]);
 
@@ -1786,7 +1799,7 @@
         // the same syntax as the normal break rules, but begin with '!' to distinguish
         // them from normal break rules
         for (int i = 0; i < tempRuleList.size(); i++) {
-            String rule = (String)tempRuleList.elementAt(i);
+            String rule = tempRuleList.elementAt(i);
             if (rule.charAt(0) == '!') {
                 parseRule(rule.substring(1), false);
             }
@@ -1831,7 +1844,7 @@
         for (int i = 0; i < numCategories + 1; i++)
             tempStateTable.addElement(new short[numCategories + 1]);
 
-        short[] state = (short[])tempStateTable.elementAt(backTableOffset - 1);
+        short[] state = tempStateTable.elementAt(backTableOffset - 1);
         for (int i = 0; i < numCategories; i++)
             state[i] = (short)(i + backTableOffset);
 
@@ -1855,7 +1868,7 @@
                     for (int nextColumn = 0; nextColumn < numCategories; nextColumn++) {
                         int cellValue = lookupState(nextRow, nextColumn);
                         if (cellValue != 0) {
-                            state = (short[])tempStateTable.elementAt(nextColumn +
+                            state = tempStateTable.elementAt(nextColumn +
                                             backTableOffset);
                             state[column] = (short)(column + backTableOffset);
                         }
@@ -1876,9 +1889,9 @@
             // populated that is also populated in row 1 of the rule-based
             // sub-table, copy the value from row 1 over the value in the
             // auto-generated sub-table
-            state = (short[])tempStateTable.elementAt(1);
+            state = tempStateTable.elementAt(1);
             for (int i = backTableOffset - 1; i < tempStateTable.size(); i++) {
-                short[] state2 = (short[])tempStateTable.elementAt(i);
+                short[] state2 = tempStateTable.elementAt(i);
                 for (int j = 0; j < numCategories; j++) {
                     if (state[j] != 0 && state2[j] != 0) {
                         state2[j] = state[j];
@@ -1890,9 +1903,9 @@
             // an end state, fill in all unpopulated cells with the values
             // of the corresponding cells in the first row of the auto-
             // generated sub-table.
-            state = (short[])tempStateTable.elementAt(backTableOffset - 1);
+            state = tempStateTable.elementAt(backTableOffset - 1);
             for (int i = 1; i < backTableOffset - 1; i++) {
-                short[] state2 = (short[])tempStateTable.elementAt(i);
+                short[] state2 = tempStateTable.elementAt(i);
                 if ((state2[numCategories] & END_STATE_FLAG) == 0) {
                     for (int j = 0; j < numCategories; j++) {
                         if (state2[j] == 0) {
--- a/make/tools/src/build/tools/generatebreakiteratordata/SupplementaryCharacterData.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatebreakiteratordata/SupplementaryCharacterData.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -128,7 +128,7 @@
         int new_index = 0;
         int loop_count = dataCount - 1;
         long data = tempTable[old_index];
-        int start = (int)((long)(data>>32)) & CODEPOINT_MASK;
+        int start = (int)(data>>32) & CODEPOINT_MASK;
         int end   = (int)(data>>8) & CODEPOINT_MASK;
 
         /*
@@ -142,7 +142,7 @@
         newTempTable[new_index++] = composeEntry(start, (int)data);
         for (int i = 0; i < loop_count; i++) {
             data = tempTable[++old_index];
-            int nextStart = (int)((long)(data>>32)) & CODEPOINT_MASK;
+            int nextStart = (int)(data>>32) & CODEPOINT_MASK;
 
             /*
              * If the previous end code point is not equal to the previous start
--- a/make/tools/src/build/tools/generatecharacter/GenerateCharacter.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatecharacter/GenerateCharacter.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -1290,7 +1290,7 @@
                     else if (bits == 32 || bits < 8)
                         result.append(hex8((int)val));
                     else {
-                        result.append(hex16((long)val));
+                        result.append(hex16(val));
                         if (!Csyntax)
                             result.append("L");
                     }
--- a/make/tools/src/build/tools/generatecharacter/SpecialCaseMap.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatecharacter/SpecialCaseMap.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -39,7 +39,7 @@
  * <p>
  * @author John O'Conner
  */
-public class SpecialCaseMap implements Comparable {
+public class SpecialCaseMap implements Comparable<SpecialCaseMap> {
 
     SpecialCaseMap() {
         chSource = 0xFFFF;
@@ -55,7 +55,7 @@
      */
 
     public static SpecialCaseMap[] readSpecFile(File file, int plane) throws FileNotFoundException {
-        ArrayList caseMaps = new ArrayList(150);
+        ArrayList<SpecialCaseMap> caseMaps = new ArrayList<SpecialCaseMap>(150);
         int count = 0;
         BufferedReader f = new BufferedReader(new FileReader(file));
                 String line = null;
@@ -69,7 +69,7 @@
                 SpecialCaseMap item = parse(line.trim());
                 if (item != null) {
                                 if(item.getCharSource() >> 16 < plane) continue;
-                                if((int)(item.getCharSource() >> 16) > plane) break;
+                                if(item.getCharSource() >> 16 > plane) break;
                                 caseMaps.add(item);
                 ++count;
             }
@@ -83,7 +83,7 @@
 
     }
 
-    /**
+   /**
     * Given one line of a Unicode special casing data file as a String, parse the line
     * and return a SpecialCaseMap object that contains the case mapping.
     *
@@ -177,25 +177,25 @@
         else return -1;
     }
 
-        /*
+    /*
      * Extracts and returns the high surrogate value from a UTF-32 code point.
      * If argument is a BMP character, then it is converted to a char and returned;
      * otherwise the high surrogate value is extracted.
      * @param codePoint a UTF-32 codePoint with value greater than 0xFFFF.
      * @return the high surrogate value that helps create <code>codePoint</code>; else
      *         the char representation of <code>codePoint</code> if it is a BMP character.
-         * @since 1.5
+     * @since 1.5
      */
-        static char getHighSurrogate(int codePoint) {
-                char high = (char)codePoint;
-                if (codePoint > 0xFFFF) {
-                    high = (char)((codePoint - 0x10000)/0x0400 + 0xD800);
-                }
-                return high;
+    static char getHighSurrogate(int codePoint) {
+        char high = (char)codePoint;
+        if (codePoint > 0xFFFF) {
+            high = (char)((codePoint - 0x10000)/0x0400 + 0xD800);
         }
+        return high;
+    }
 
 
-        /*
+    /*
      * Extracts and returns the low surrogate value from a UTF-32 code point.
      * If argument is a BMP character, then it is converted to a char and returned;
      * otherwise the high surrogate value is extracted.
@@ -204,29 +204,28 @@
      *         the char representation of <code>codePoint</code> if it is a BMP character.
      * @since 1.5
      */
-        static char getLowSurrogate(int codePoint) {
-                char low = (char)codePoint;
-                if(codePoint > 0xFFFF) {
-                        low = (char)((codePoint - 0x10000)%0x0400 + 0xDC00);
-                }
-                return low;
+    static char getLowSurrogate(int codePoint) {
+        char low = (char)codePoint;
+        if(codePoint > 0xFFFF) {
+                low = (char)((codePoint - 0x10000)%0x0400 + 0xDC00);
         }
-
-        static String hex6(int n) {
-                String str = Integer.toHexString(n & 0xFFFFFF).toUpperCase();
-                return "000000".substring(Math.min(6, str.length())) + str;
+        return low;
+    }
 
-        }
+    static String hex6(int n) {
+        String str = Integer.toHexString(n & 0xFFFFFF).toUpperCase();
+        return "000000".substring(Math.min(6, str.length())) + str;
+    }
 
-        static String hex6(char[] map){
-                StringBuffer buff = new StringBuffer();
-                int x=0;
-                buff.append(hex6(map[x++]));
-                while(x<map.length) {
-                        buff.append(" " + hex6(map[x++]));
-                }
-                return buff.toString();
+    static String hex6(char[] map){
+        StringBuffer buff = new StringBuffer();
+        int x=0;
+        buff.append(hex6(map[x++]));
+        while(x<map.length) {
+            buff.append(" " + hex6(map[x++]));
         }
+        return buff.toString();
+    }
 
     void setCharSource(int ch) {
         chSource = ch;
@@ -302,56 +301,62 @@
     static String CONTEXT_MODERN = "MODERN";
     static String CONTEXT_NONMODERN = "NON_MODERN";
 
-    public int compareTo(Object otherObject) {
-                SpecialCaseMap other = (SpecialCaseMap)otherObject;
-        if (chSource < other.chSource) {
+    public int compareTo(SpecialCaseMap otherObject) {
+        if (chSource < otherObject.chSource) {
             return -1;
         }
-        else if (chSource > other.chSource) {
+        else if (chSource > otherObject.chSource) {
             return 1;
         }
         else return 0;
     }
 
     public boolean equals(Object o1) {
-                boolean bEqual = false;
-                if (0 == compareTo(o1)) {
-                        bEqual = true;
-                }
+        if (this == o1) {
+            return true;
+        }
+        if (o1 == null || !(o1 instanceof SpecialCaseMap)) {
+            return false;
+        }
+        SpecialCaseMap other = (SpecialCaseMap)o1;
+        boolean bEqual = false;
+        if (0 == compareTo(other)) {
+            bEqual = true;
+        }
         return bEqual;
     }
 
-        public String toString() {
-                StringBuffer buff = new StringBuffer();
-                buff.append(hex6(getCharSource()));
-                buff.append("|" + hex6(lowerCaseMap));
-                buff.append("|" + hex6(upperCaseMap));
-                buff.append("|" + hex6(titleCaseMap));
-                buff.append("|" + context);
-                return buff.toString();
-        }
+    public String toString() {
+        StringBuffer buff = new StringBuffer();
+        buff.append(hex6(getCharSource()));
+        buff.append("|" + hex6(lowerCaseMap));
+        buff.append("|" + hex6(upperCaseMap));
+        buff.append("|" + hex6(titleCaseMap));
+        buff.append("|" + context);
+        return buff.toString();
+    }
+
+    public int hashCode() {
+        return chSource;
+    }
 
-        public int hashCode() {
-                return (int)chSource;
+    public static void main(String[] args) {
+        SpecialCaseMap[] spec = null;
+        if (args.length == 2 ) {
+            try {
+                File file = new File(args[0]);
+                int plane = Integer.parseInt(args[1]);
+                spec = SpecialCaseMap.readSpecFile(file, plane);
+                System.out.println("SpecialCaseMap[" + spec.length + "]:");
+                for (int x=0; x<spec.length; x++) {
+                    System.out.println(spec[x].toString());
+                }
+            }
+            catch(Exception e) {
+                e.printStackTrace();
+            }
         }
 
-        public static void main(String[] args) {
-                SpecialCaseMap[] spec = null;
-                if (args.length == 2 ) {
-                        try {
-                                File file = new File(args[0]);
-                                int plane = Integer.parseInt(args[1]);
-                                spec = SpecialCaseMap.readSpecFile(file, plane);
-                                System.out.println("SpecialCaseMap[" + spec.length + "]:");
-                                for (int x=0; x<spec.length; x++) {
-                                        System.out.println(spec[x].toString());
-                                }
-                        }
-                        catch(Exception e) {
-                                e.printStackTrace();
-                        }
-                }
-
-        }
+    }
 
 }
--- a/make/tools/src/build/tools/generatecharacter/UnicodeSpec.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatecharacter/UnicodeSpec.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -391,31 +391,31 @@
     */
 
     public static UnicodeSpec[] readSpecFile(File file, int plane) throws FileNotFoundException {
-                ArrayList list = new ArrayList(3000);
+        ArrayList<UnicodeSpec> list = new ArrayList<UnicodeSpec>(3000);
         UnicodeSpec[] result = null;
         int count = 0;
         BufferedReader f = new BufferedReader(new FileReader(file));
-                String line = null;
+        String line = null;
         loop:
         while(true) {
             try {
                 line = f.readLine();
             }
             catch (IOException e) {
-                                break loop;
-                        }
+                break loop;
+            }
             if (line == null) break loop;
             UnicodeSpec item = parse(line.trim());
-                        int specPlane = (int)(item.getCodePoint() >>> 16);
-                        if (specPlane < plane) continue;
-                        if (specPlane > plane) break;
+            int specPlane = item.getCodePoint() >>> 16;
+            if (specPlane < plane) continue;
+            if (specPlane > plane) break;
 
             if (item != null) {
-                                list.add(item);
+                list.add(item);
             }
         }
-                result = new UnicodeSpec[list.size()];
-                list.toArray(result);
+        result = new UnicodeSpec[list.size()];
+        list.toArray(result);
         return result;
     }
 
--- a/make/tools/src/build/tools/generatecurrencydata/GenerateCurrencyData.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/generatecurrencydata/GenerateCurrencyData.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -72,10 +72,6 @@
     private static String formatVersion;
     private static String dataVersion;
     private static String validCurrencyCodes;
-    private static String currenciesWith0MinorUnitDecimals;
-    private static String currenciesWith1MinorUnitDecimal;
-    private static String currenciesWith3MinorUnitDecimal;
-    private static String currenciesWithMinorUnitsUndefined;
 
     // handy constants - must match definitions in java.util.Currency
     // magic number
@@ -83,29 +79,31 @@
     // number of characters from A to Z
     private static final int A_TO_Z = ('Z' - 'A') + 1;
     // entry for invalid country codes
-    private static final int INVALID_COUNTRY_ENTRY = 0x007F;
+    private static final int INVALID_COUNTRY_ENTRY = 0x0000007F;
     // entry for countries without currency
-    private static final int COUNTRY_WITHOUT_CURRENCY_ENTRY = 0x0080;
+    private static final int COUNTRY_WITHOUT_CURRENCY_ENTRY = 0x00000200;
     // mask for simple case country entries
-    private static final int SIMPLE_CASE_COUNTRY_MASK = 0x0000;
+    private static final int SIMPLE_CASE_COUNTRY_MASK = 0x00000000;
     // mask for simple case country entry final character
-    private static final int SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK = 0x001F;
+    private static final int SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK = 0x0000001F;
     // mask for simple case country entry default currency digits
-    private static final int SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK = 0x0060;
+    private static final int SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK = 0x000001E0;
     // shift count for simple case country entry default currency digits
     private static final int SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT = 5;
+    // maximum number for simple case country entry default currency digits
+    private static final int SIMPLE_CASE_COUNTRY_MAX_DEFAULT_DIGITS = 9;
     // mask for special case country entries
-    private static final int SPECIAL_CASE_COUNTRY_MASK = 0x0080;
+    private static final int SPECIAL_CASE_COUNTRY_MASK = 0x00000200;
     // mask for special case country index
-    private static final int SPECIAL_CASE_COUNTRY_INDEX_MASK = 0x001F;
+    private static final int SPECIAL_CASE_COUNTRY_INDEX_MASK = 0x0000001F;
     // delta from entry index component in main table to index into special case tables
     private static final int SPECIAL_CASE_COUNTRY_INDEX_DELTA = 1;
     // mask for distinguishing simple and special case countries
     private static final int COUNTRY_TYPE_MASK = SIMPLE_CASE_COUNTRY_MASK | SPECIAL_CASE_COUNTRY_MASK;
     // mask for the numeric code of the currency
-    private static final int NUMERIC_CODE_MASK = 0x0003FF00;
+    private static final int NUMERIC_CODE_MASK = 0x000FFC00;
     // shift count for the numeric code of the currency
-    private static final int NUMERIC_CODE_SHIFT = 8;
+    private static final int NUMERIC_CODE_SHIFT = 10;
 
     // generated data
     private static int[] mainTable = new int[A_TO_Z * A_TO_Z];
@@ -120,7 +118,7 @@
     private static int[] specialCaseOldCurrenciesNumericCode = new int[maxSpecialCases];
     private static int[] specialCaseNewCurrenciesNumericCode = new int[maxSpecialCases];
 
-    private static final int maxOtherCurrencies = 70;
+    private static final int maxOtherCurrencies = 128;
     private static int otherCurrenciesCount = 0;
     private static StringBuffer otherCurrencies = new StringBuffer();
     private static int[] otherCurrenciesDefaultFractionDigits = new int[maxOtherCurrencies];
@@ -129,6 +127,11 @@
     // date format for parsing cut-over times
     private static SimpleDateFormat format;
 
+    // Minor Units
+    private static String[] currenciesWithDefinedMinorUnitDecimals =
+        new String[SIMPLE_CASE_COUNTRY_MAX_DEFAULT_DIGITS + 1];
+    private static String currenciesWithMinorUnitsUndefined;
+
     public static void main(String[] args) {
 
         // Look for "-o outputfilename" option
@@ -171,16 +174,14 @@
         formatVersion = (String) currencyData.get("formatVersion");
         dataVersion = (String) currencyData.get("dataVersion");
         validCurrencyCodes = (String) currencyData.get("all");
-        currenciesWith0MinorUnitDecimals  = (String) currencyData.get("minor0");
-        currenciesWith1MinorUnitDecimal  = (String) currencyData.get("minor1");
-        currenciesWith3MinorUnitDecimal  = (String) currencyData.get("minor3");
+        for (int i = 0; i <= SIMPLE_CASE_COUNTRY_MAX_DEFAULT_DIGITS; i++) {
+            currenciesWithDefinedMinorUnitDecimals[i]
+                = (String) currencyData.get("minor"+i);
+        }
         currenciesWithMinorUnitsUndefined  = (String) currencyData.get("minorUndefined");
         if (formatVersion == null ||
                 dataVersion == null ||
                 validCurrencyCodes == null ||
-                currenciesWith0MinorUnitDecimals == null ||
-                currenciesWith1MinorUnitDecimal == null ||
-                currenciesWith3MinorUnitDecimal == null ||
                 currenciesWithMinorUnitsUndefined == null) {
             throw new NullPointerException("not all required data is defined in input");
         }
@@ -207,7 +208,7 @@
                         if (currencyInfo.charAt(0) == firstChar && currencyInfo.charAt(1) == secondChar) {
                             checkCurrencyCode(currencyInfo);
                             int digits = getDefaultFractionDigits(currencyInfo);
-                            if (digits < 0 || digits > 3) {
+                            if (digits < 0 || digits > SIMPLE_CASE_COUNTRY_MAX_DEFAULT_DIGITS) {
                                 throw new RuntimeException("fraction digits out of range for " + currencyInfo);
                             }
                             int numericCode= getNumericCode(currencyInfo);
@@ -231,13 +232,14 @@
     }
 
     private static int getDefaultFractionDigits(String currencyCode) {
-        if (currenciesWith0MinorUnitDecimals.indexOf(currencyCode) != -1) {
-            return 0;
-        } else if (currenciesWith1MinorUnitDecimal.indexOf(currencyCode) != -1) {
-            return 1;
-        } else if (currenciesWith3MinorUnitDecimal.indexOf(currencyCode) != -1) {
-            return 3;
-        } else if (currenciesWithMinorUnitsUndefined.indexOf(currencyCode) != -1) {
+        for (int i = 0; i <= SIMPLE_CASE_COUNTRY_MAX_DEFAULT_DIGITS; i++) {
+            if (currenciesWithDefinedMinorUnitDecimals[i] != null &&
+                currenciesWithDefinedMinorUnitDecimals[i].indexOf(currencyCode) != -1) {
+                return i;
+            }
+        }
+
+        if (currenciesWithMinorUnitsUndefined.indexOf(currencyCode) != -1) {
             return -1;
         } else {
             return 2;
@@ -250,10 +252,10 @@
         return Integer.parseInt(numericCode);
     }
 
-    static HashMap specialCaseMap = new HashMap();
+    static HashMap<String, Integer> specialCaseMap = new HashMap<String, Integer>();
 
     private static int makeSpecialCaseEntry(String currencyInfo) throws Exception {
-        Integer oldEntry = (Integer) specialCaseMap.get(currencyInfo);
+        Integer oldEntry = specialCaseMap.get(currencyInfo);
         if (oldEntry != null) {
             return oldEntry.intValue();
         }
--- a/make/tools/src/build/tools/hasher/Hasher.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/hasher/Hasher.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 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
@@ -51,15 +51,15 @@
 
     boolean verbose = false;
 
-    List keys = new ArrayList();        // Key strings
-    List values = new ArrayList();      // Value expressions
-    String pkg = null;                  // Package prefix for generated class
-    String cln = null;                  // Name of generated class
-    String vtype = "String";            // Value type
-    int maxBits = 11;                   // lg table size
-    int maxDepth = 3;                   // Max chain depth
-    boolean inner = false;              // Generating an inner class?
-    boolean empty = false;              // Generating an empty table?
+    List<String> keys = new ArrayList<String>();      // Key strings
+    List<String> values = new ArrayList<String>();    // Value expressions
+    String pkg = null;                          // Package prefix for generated class
+    String cln = null;                          // Name of generated class
+    String vtype = "String";                    // Value type
+    int maxBits = 11;                           // lg table size
+    int maxDepth = 3;                           // Max chain depth
+    boolean inner = false;                      // Generating an inner class?
+    boolean empty = false;                      // Generating an empty table?
 
     void usage() {
         err.println("usage: java Hasher [options] [[pkgName.]ClassName]");
@@ -76,9 +76,9 @@
     }
 
     Hasher(String[] args) {
-        List as = Arrays.asList(args);
-        for (Iterator i = as.iterator(); i.hasNext();) {
-            String a = (String)i.next();
+        List<String> as = Arrays.asList(args);
+        for (Iterator<String> i = as.iterator(); i.hasNext();) {
+            String a = i.next();
             if (a.equals("-e")) {
                 empty = true;
             } else if (a.equals("-i")) {
@@ -88,15 +88,15 @@
             } else if (a.equals("-md")) {
                 if (!i.hasNext())
                     usage();
-                maxDepth = Integer.parseInt((String)i.next());
+                maxDepth = Integer.parseInt(i.next());
             } else if (a.equals("-mb")) {
                 if (!i.hasNext())
                     usage();
-                maxBits = Integer.parseInt((String)i.next());
+                maxBits = Integer.parseInt(i.next());
             } else if (a.equals("-t")) {
                 if (!i.hasNext())
                     usage();
-                vtype = (String)i.next();
+                vtype = i.next();
             } else if (a.startsWith("-")) {
                 usage();
             } else {
@@ -153,8 +153,8 @@
         int nw = keys.size();
 
         for (int i = 0; i < nw; i++) {
-            String w = (String)keys.get(i);
-            String v = (String)values.get(i);
+            String w = keys.get(i);
+            String v = values.get(i);
             int h = hash(w);
             if (ht[h] == null)
                 ht[h] = new Object[] { w, v };
@@ -217,7 +217,7 @@
         if (verbose)
             err.println();
         for (int i = 0, n = keys.size(); i < n; i++) {
-            String w = (String)keys.get(i);
+            String w = keys.get(i);
             String v = get(w);
             if (verbose)
                 err.println(hash(w) + "\t" + w);
--- a/make/tools/src/build/tools/jarsplit/JarSplit.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jarsplit/JarSplit.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -43,7 +43,8 @@
     /* classlist[0] contains class file list
      * classlist[1] contains non-class file list
      */
-    private static Vector<String>[] classlist = (Vector<String>[])(new Vector[2]);
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    private static Vector<String>[] classlist = new Vector[2];
 
     /* The 2 class list name passed as arguments. */
     private static String[] fileNamelist = new String[2];
--- a/make/tools/src/build/tools/javazic/Gen.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/javazic/Gen.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -30,14 +30,9 @@
 import  java.io.FileOutputStream;
 import  java.io.DataOutputStream;
 import  java.io.RandomAccessFile;
-import  java.util.ArrayList;
-import  java.util.Iterator;
-import  java.util.LinkedList;
 import  java.util.List;
 import  java.util.Map;
 import  java.util.Set;
-import  java.util.TreeMap;
-import  java.util.TreeSet;
 import  sun.util.calendar.ZoneInfoFile;
 
 /**
@@ -105,14 +100,13 @@
                     /* if DST offset is 0, this means DST isn't used.
                      * (NOT: offset's index is 0.)
                      */
-                    if ((dstoffset =
-                         ((Integer)dstOffsets.get(i)).intValue()) == -1) {
+                    if ((dstoffset = dstOffsets.get(i).intValue()) == -1) {
                         dstoffset = 0;
                     }
 
-                    dos.writeLong((((Long)transitions.get(i)).longValue() << 12)
+                    dos.writeLong((transitions.get(i).longValue() << 12)
                                   | (dstoffset << 4)
-                                  | ((Integer)offsets.get(i)).intValue());
+                                  | offsets.get(i).intValue());
 
                 }
 
--- a/make/tools/src/build/tools/javazic/GenDoc.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/javazic/GenDoc.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -31,12 +31,8 @@
 import  java.io.FileReader;
 import  java.io.FileWriter;
 import  java.io.IOException;
-import  java.util.ArrayList;
-import  java.util.Calendar;
 import  java.util.Date;
 import  java.util.HashMap;
-import  java.util.Iterator;
-import  java.util.LinkedList;
 import  java.util.List;
 import  java.util.Map;
 import  java.util.Set;
@@ -189,7 +185,7 @@
 
             out.write(header1 + new Date() + header3 + zonename + header4);
             out.write(body1 + "<FONT size=\"+2\"><B>" + zonename + "</B></FONT>");
-            LatitudeAndLongitude location = (LatitudeAndLongitude)mapList.get(zonename);
+            LatitudeAndLongitude location = mapList.get(zonename);
             if (location != null) {
                 int deg, min, sec;
 
@@ -608,12 +604,12 @@
                        "<BR>\n\n" + "<TABLE BORDER=\"0\" WIDTH=\"100%\">\n" +
                        "<TR>\n<TD NOWRAP>\n");
 
-            Set aliasSet = a.keySet();
+            Set<String> aliasSet = a.keySet();
             len = aliasSet.size();
-            Object aliasNames[] = aliasSet.toArray();
+            String aliasNames[] = aliasSet.toArray(new String[0]);
             for (int i = 0; i < len; i++) {
-                displayNameList.put(transform((String)aliasNames[i]),
-                                    (String)aliasNames[i]);
+                displayNameList.put(transform(aliasNames[i]),
+                                    aliasNames[i]);
             }
 
             o = displayNameList.keySet().toArray();
--- a/make/tools/src/build/tools/javazic/Main.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/javazic/Main.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -26,7 +26,6 @@
 package build.tools.javazic;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 /**
--- a/make/tools/src/build/tools/javazic/Simple.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/javazic/Simple.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -29,10 +29,7 @@
 import  java.io.File;
 import  java.io.FileWriter;
 import  java.io.IOException;
-import  java.util.ArrayList;
 import  java.util.HashMap;
-import  java.util.Iterator;
-import  java.util.LinkedList;
 import  java.util.List;
 import  java.util.Map;
 import  java.util.Set;
@@ -51,22 +48,19 @@
     /**
      * Zone records which are applied for given year.
      */
-    private static Map<String,ZoneRec> lastZoneRecs
-        = new HashMap<String,ZoneRec>();
+    private static Map<String,ZoneRec> lastZoneRecs = new HashMap<String,ZoneRec>();
 
     /**
      * Rule records which are applied for given year.
      */
-    private static Map<String,List<RuleRec>> lastRules
-        = new TreeMap<String,List<RuleRec>>();
+    private static Map<String,List<RuleRec>> lastRules = new TreeMap<String,List<RuleRec>>();
 
     /**
      * zone IDs sorted by their GMT offsets. If zone's GMT
      * offset will change in the future, its last known offset is
      * used.
      */
-    private SortedMap<Integer, Set<String>> zonesByOffset
-        = new TreeMap<Integer,  Set<String>>();
+    private SortedMap<Integer, Set<String>> zonesByOffset = new TreeMap<Integer, Set<String>>();
 
     /**
      * Sets last Rule records and Zone records for given timezone to
@@ -101,16 +95,11 @@
      */
     int generateSrc(Mappings map) {
         try {
-            String outputDir = Main.getOutputDir();
-            File outD = new File(outputDir);
-
-            if (!outputDir.endsWith(File.separator)) {
-                outputDir += outD.separator;
-            }
+            File outD = new File(Main.getOutputDir());
             outD.mkdirs();
 
             FileWriter fw =
-                new FileWriter(outputDir + "TimeZoneData.java", false);
+                new FileWriter(new File(outD, "TimeZoneData.java"), false);
             BufferedWriter out = new BufferedWriter(fw);
 
             out.write("import java.util.SimpleTimeZone;\n\n");
--- a/make/tools/src/build/tools/javazic/Time.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/javazic/Time.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -268,16 +268,16 @@
         if (index < time.length()) {
             char c = time.charAt(index++);
             if (c == 's') {
-                tm.setType(tm.STD);
+                tm.setType(Time.STD);
             } else if (c == 'u' || c == 'g' || c == 'z') {
-                tm.setType(tm.UTC);
+                tm.setType(Time.UTC);
             } else if (c == 'w') {
-                tm.setType(tm.WALL);
+                tm.setType(Time.WALL);
             } else {
                 Main.panic("unknown time mode: "+c);
             }
         } else {
-            tm.setType(tm.WALL);
+            tm.setType(Time.WALL);
         }
         return tm;
     }
--- a/make/tools/src/build/tools/javazic/Zoneinfo.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/javazic/Zoneinfo.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -29,9 +29,7 @@
 import java.io.FileReader;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -411,9 +409,9 @@
                 if (!zrec.hasUntil()) {
                     if (tz.getNTransitions() > 0) {
                         if (stdOffset == 0) {
-                            tz.setDSTType(tz.X_DST);
+                            tz.setDSTType(Timezone.X_DST);
                         } else {
-                            tz.setDSTType(tz.LAST_DST);
+                            tz.setDSTType(Timezone.LAST_DST);
                         }
                         long time = Time.getLocalTime(maxYear,
                                                       Month.JANUARY, 1, 0);
@@ -423,7 +421,7 @@
                                          tz.getDstOffsetIndex(stdOffset));
                         tz.addUsedRec(zrec);
                     } else {
-                        tz.setDSTType(tz.NO_DST);
+                        tz.setDSTType(Timezone.NO_DST);
                     }
                     break;
                 }
@@ -531,7 +529,7 @@
                         if (year == endYear && !zrec.hasUntil()) {
                             if (tz.getNTransitions() > 0) {
                                 // Assume that this Zone stopped DST
-                                tz.setDSTType(tz.X_DST);
+                                tz.setDSTType(Timezone.X_DST);
                                 long time = Time.getLocalTime(maxYear, Month.JANUARY,
                                                               1, 0);
                                 time -= zrec.getGmtOffset();
@@ -540,7 +538,7 @@
                                                  tz.getDstOffsetIndex(0));
                                 usedZone = true;
                             } else {
-                                tz.setDSTType(tz.NO_DST);
+                                tz.setDSTType(Timezone.NO_DST);
                             }
                         }
                     }
@@ -556,8 +554,8 @@
             }
         }
 
-        if (tz.getDSTType() == tz.UNDEF_DST) {
-            tz.setDSTType(tz.DST);
+        if (tz.getDSTType() == Timezone.UNDEF_DST) {
+            tz.setDSTType(Timezone.DST);
         }
         tz.optimize();
         tz.checksum();
--- a/make/tools/src/build/tools/jdwpgen/AbstractCommandNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/AbstractCommandNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -25,7 +25,6 @@
 
 package build.tools.jdwpgen;
 
-import java.util.*;
 import java.io.*;
 
 class AbstractCommandNode extends AbstractNamedNode {
@@ -35,8 +34,8 @@
                        " Command</a> (" + nameNode.value() + ")</h5>");
         writer.println(comment());
         writer.println("<dl>");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).document(writer);
+        for (Node node : components) {
+            node.document(writer);
         }
         writer.println("</dl>");
     }
--- a/make/tools/src/build/tools/jdwpgen/AbstractGroupNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/AbstractGroupNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -25,14 +25,13 @@
 
 package build.tools.jdwpgen;
 
-import java.util.*;
 import java.io.*;
 
 abstract class AbstractGroupNode extends AbstractTypeListNode {
 
     void document(PrintWriter writer) {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).document(writer);
+        for (Node node : components) {
+            node.document(writer);
         }
     }
 
--- a/make/tools/src/build/tools/jdwpgen/AbstractNamedNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/AbstractNamedNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -38,10 +38,10 @@
     }
 
     void prune() {
-        Iterator it = components.iterator();
+        Iterator<Node> it = components.iterator();
 
         if (it.hasNext()) {
-            Node nameNode = (Node)it.next();
+            Node nameNode = it.next();
 
             if (nameNode instanceof NameNode) {
                 this.nameNode = (NameNode)nameNode;
@@ -64,8 +64,8 @@
     void document(PrintWriter writer) {
         writer.println("<h4><a name=" + name + ">" + name +
                        " Command Set</a></h4>");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).document(writer);
+        for (Node node : components) {
+            node.document(writer);
         }
     }
 
@@ -90,8 +90,8 @@
         writer.print("class " + javaClassName());
         writer.println(javaClassImplements() + " {");
         genJavaClassSpecifics(writer, depth+1);
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).genJava(writer, depth+1);
+        for (Node node : components) {
+            node.genJava(writer, depth+1);
         }
         indent(writer, depth);
         writer.println("}");
--- a/make/tools/src/build/tools/jdwpgen/AbstractTypeListNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/AbstractTypeListNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -40,7 +40,7 @@
 
     void document(PrintWriter writer) {
         writer.println("<dt>" + name() + " Data");
-        if (components.size() == 0) {
+        if (components.isEmpty()) {
             writer.println("<dd>(None)");
         } else {
             writer.println("<dd><table border=1 cellpadding=3 cellspacing=0 width=\"90%\" summary=\"\"><tr>");
@@ -49,24 +49,24 @@
             }
             writer.println("<th width=\"15%\"><th width=\"65%\">");
             writer.println("");
-            for (Iterator it = components.iterator(); it.hasNext();) {
-                ((Node)it.next()).document(writer);
+            for (Node node : components) {
+                node.document(writer);
             }
             writer.println("</table>");
         }
     }
 
     void genJavaClassBodyComponents(PrintWriter writer, int depth) {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            TypeNode tn = (TypeNode)it.next();
+        for (Node node : components) {
+            TypeNode tn = (TypeNode)node;
 
             tn.genJavaDeclaration(writer, depth);
         }
     }
 
     void genJavaReads(PrintWriter writer, int depth) {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            TypeNode tn = (TypeNode)it.next();
+        for (Node node : components) {
+            TypeNode tn = (TypeNode)node;
             tn.genJavaRead(writer, depth, tn.name());
         }
     }
@@ -88,7 +88,7 @@
 
     String javaParams() {
         StringBuffer sb = new StringBuffer();
-        for (Iterator it = components.iterator(); it.hasNext();) {
+        for (Iterator<Node> it = components.iterator(); it.hasNext();) {
             TypeNode tn = (TypeNode)it.next();
             sb.append(tn.javaParam());
             if (it.hasNext()) {
@@ -99,8 +99,8 @@
     }
 
     void genJavaWrites(PrintWriter writer, int depth) {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            TypeNode tn = (TypeNode)it.next();
+        for (Node node : components) {
+            TypeNode tn = (TypeNode)node;
             tn.genJavaWrite(writer, depth, tn.name());
         }
     }
@@ -111,8 +111,8 @@
         writer.println();
         indent(writer, depth);
         writer.println(className + "(" + javaParams() + ") {");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            TypeNode tn = (TypeNode)it.next();
+        for (Node node : components) {
+            TypeNode tn = (TypeNode)node;
             indent(writer, depth+1);
             writer.println("this." + tn.name() + " = " + tn.name() + ";");
         }
--- a/make/tools/src/build/tools/jdwpgen/AltNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/AltNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -100,7 +100,7 @@
         indent(writer, depth+1);
         writer.print("return new " + select.name() + "(");
         writer.print("ALT_ID, new " + javaClassName() + "(");
-        for (Iterator it = components.iterator(); it.hasNext();) {
+        for (Iterator<Node> it = components.iterator(); it.hasNext();) {
             TypeNode tn = (TypeNode)it.next();
             writer.print(tn.name());
             if (it.hasNext()) {
--- a/make/tools/src/build/tools/jdwpgen/CommandSetNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/CommandSetNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -25,7 +25,6 @@
 
 package build.tools.jdwpgen;
 
-import java.util.*;
 import java.io.*;
 
 class CommandSetNode extends AbstractNamedNode {
@@ -43,8 +42,8 @@
                        " Command Set</a> (" +
                        nameNode.value() + ")</h4>");
         writer.println(comment());
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).document(writer);
+        for (Node node : components) {
+            node.document(writer);
         }
     }
 
@@ -53,8 +52,8 @@
         writer.println(name() + "</a> Command Set (" +
                        nameNode.value() + ")");
         writer.println("<ul>");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).documentIndex(writer);
+        for (Node node : components) {
+            node.documentIndex(writer);
         }
         writer.println("</ul>");
     }
--- a/make/tools/src/build/tools/jdwpgen/ConstantSetNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/ConstantSetNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -38,9 +38,6 @@
     void prune() {
         List<Node> addons = new ArrayList<Node>();
 
-        for (Iterator it = components.iterator(); it.hasNext(); ) {
-            Node node = (Node)it.next();
-        }
         if (!addons.isEmpty()) {
             components.addAll(addons);
         }
@@ -63,8 +60,8 @@
         writer.println("<dd><table border=1 cellpadding=3 cellspacing=0 width=\"90%\" summary=\"\"><tr>");
         writer.println("<th width=\"20%\"><th width=\"5%\"><th width=\"65%\">");
         ConstantNode n;
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            n = ((ConstantNode)it.next());
+        for (Node node : components) {
+            n = (ConstantNode)node;
             writer.println("<a NAME=\"" + name + "_" + n.name + "\"></a>");
             n.document(writer);
         }
--- a/make/tools/src/build/tools/jdwpgen/ErrorSetNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/ErrorSetNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -25,7 +25,6 @@
 
 package build.tools.jdwpgen;
 
-import java.util.*;
 import java.io.*;
 
 class ErrorSetNode extends AbstractSimpleNode {
@@ -41,12 +40,12 @@
     void document(PrintWriter writer) {
 
         writer.println("<dt>" + "Error Data");
-        if (components.size() == 0) {
+        if (components.isEmpty()) {
             writer.println("<dd>(None)");
         } else {
             writer.println("<dd><table border=1 cellpadding=3 cellspacing=0 width=\"90%\" summary=\"\">");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).document(writer);
+        for (Node node : components) {
+            node.document(writer);
         }
         writer.println("</table>");
         }
--- a/make/tools/src/build/tools/jdwpgen/Node.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/Node.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -50,8 +50,8 @@
     }
 
     void parentAndExtractComments() {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            Node node = (Node)it.next();
+        for (Iterator<Node> it = components.iterator(); it.hasNext();) {
+            Node node = it.next();
             if (node instanceof CommentNode) {
                 it.remove();
                 commentList.add(((CommentNode)node).text());
@@ -63,16 +63,14 @@
     }
 
     void prune() {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            Node node = (Node)it.next();
+        for (Node node : components) {
             node.prune();
         }
     }
 
     void constrain(Context ctx) {
         context = ctx;
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            Node node = (Node)it.next();
+        for (Node node : components) {
             constrainComponent(ctx, node);
         }
     }
@@ -109,9 +107,9 @@
         if (commentList.size() > 0) {
             indent(writer, depth);
             writer.println("/**");
-            for (Iterator it = commentList.iterator(); it.hasNext();) {
+            for (String comment : commentList) {
                 indent(writer, depth);
-                writer.println(" * " + (String)it.next());
+                writer.println(" * " + comment);
             }
             indent(writer, depth);
             writer.println(" */");
@@ -123,15 +121,13 @@
     }
 
     void genJava(PrintWriter writer, int depth) {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            Node node = (Node)it.next();
+        for (Node node : components) {
             node.genJava(writer, depth);
         }
     }
 
     void genCInclude(PrintWriter writer) {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            Node node = (Node)it.next();
+        for (Node node : components) {
             node.genCInclude(writer);
         }
     }
@@ -184,8 +180,7 @@
     }
 
     void genJavaPreDef(PrintWriter writer, int depth) {
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            Node node = (Node)it.next();
+        for (Node node : components) {
             node.genJavaPreDef(writer, depth);
         }
     }
--- a/make/tools/src/build/tools/jdwpgen/OutNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/OutNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -48,8 +48,8 @@
         indent(writer, depth);
         writer.print(
             "static " + cmdName + " process(VirtualMachineImpl vm");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            TypeNode tn = (TypeNode)it.next();
+        for (Node node : components) {
+            TypeNode tn = (TypeNode)node;
             writer.println(", ");
             indent(writer, depth+5);
             writer.print(tn.javaParam());
@@ -59,8 +59,8 @@
         writer.println("throws JDWPException {");
         indent(writer, depth+1);
         writer.print("PacketStream ps = enqueueCommand(vm");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            TypeNode tn = (TypeNode)it.next();
+        for (Node node : components) {
+            TypeNode tn = (TypeNode)node;
             writer.print(", ");
             writer.print(tn.name());
         }
@@ -76,8 +76,8 @@
         indent(writer, depth);
         writer.print(
             "static PacketStream enqueueCommand(VirtualMachineImpl vm");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            TypeNode tn = (TypeNode)it.next();
+        for (Node node : components) {
+            TypeNode tn = (TypeNode)node;
             writer.println(", ");
             indent(writer, depth+5);
             writer.print(tn.javaParam());
--- a/make/tools/src/build/tools/jdwpgen/RootNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/RootNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -42,11 +42,11 @@
     void document(PrintWriter writer) {
         writer.println("<html><head><title>" + comment() + "</title></head>");
         writer.println("<body bgcolor=\"white\">");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).documentIndex(writer);
+        for (Node node : components) {
+            node.documentIndex(writer);
         }
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            ((Node)it.next()).document(writer);
+        for (Node node : components) {
+            node.document(writer);
         }
         writer.println("</body></html>");
     }
--- a/make/tools/src/build/tools/jdwpgen/SelectNode.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/jdwpgen/SelectNode.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -34,10 +34,10 @@
 
     void prune() {
         super.prune();
-        Iterator it = components.iterator();
+        Iterator<Node> it = components.iterator();
 
         if (it.hasNext()) {
-            Node typeNode = (Node)it.next();
+            Node typeNode = it.next();
 
             if (typeNode instanceof ByteTypeNode ||
                       typeNode instanceof IntTypeNode) {
@@ -131,8 +131,8 @@
         typeNode.genJavaRead(writer, depth, typeNode.name());
         indent(writer, depth);
         writer.println("switch (" + typeNode.name() + ") {");
-        for (Iterator it = components.iterator(); it.hasNext();) {
-            AltNode alt = (AltNode)it.next();
+        for (Node node : components) {
+            AltNode alt = (AltNode)node;
             alt.genJavaReadsSelectCase(writer, depth+1, commonVar());
         }
         indent(writer, depth);
--- a/make/tools/src/build/tools/makeclasslist/MakeClasslist.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/makeclasslist/MakeClasslist.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -38,7 +38,7 @@
 
 public class MakeClasslist {
   public static void main(String[] args) throws IOException {
-    List/*<String>*/ classes = new ArrayList();
+    List<String> classes = new ArrayList<String>();
     String origJavaHome = System.getProperty("java.home");
     String javaHome     = origJavaHome.toLowerCase();
     if (javaHome.endsWith("jre")) {
@@ -84,10 +84,9 @@
       }
     }
 
-    Set/*<String>*/  seenClasses = new HashSet();
+    Set<String> seenClasses = new HashSet<String>();
 
-    for (Iterator iter = classes.iterator(); iter.hasNext(); ) {
-      String str = (String) iter.next();
+    for (String str : seenClasses) {
       if (seenClasses.add(str)) {
         System.out.println(str);
       }
@@ -109,13 +108,13 @@
     // completePackage(seenClasses, rtJar, "java/lang");
   }
 
-  private static void completePackage(Set seenClasses,
+  private static void completePackage(Set<String> seenClasses,
                                       JarFile jar,
                                       String packageName) {
     int len = packageName.length();
-    Enumeration entries = jar.entries();
+    Enumeration<JarEntry> entries = jar.entries();
     while (entries.hasMoreElements()) {
-      JarEntry entry = (JarEntry) entries.nextElement();
+      JarEntry entry = entries.nextElement();
       String name = entry.getName();
       if (name.startsWith(packageName) &&
           name.endsWith(".class") &&
--- a/make/tools/src/build/tools/stripproperties/StripProperties.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/make/tools/src/build/tools/stripproperties/StripProperties.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -246,7 +246,7 @@
     throws IOException {
         BufferedWriter awriter;
         awriter = new BufferedWriter(new OutputStreamWriter(out, "8859_1"));
-        for (Enumeration e = properties.keys(); e.hasMoreElements();) {
+        for (Enumeration<Object> e = properties.keys(); e.hasMoreElements();) {
             String key = (String)e.nextElement();
             String val = (String)properties.get(key);
             key = saveConvert(key, true);
--- a/src/bsd/doc/man/jhat.1	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/bsd/doc/man/jhat.1	Tue Aug 22 02:03:52 2017 +0100
@@ -77,7 +77,7 @@
 .na
 \f2hprof\fP @
 .fi
-http://java.sun.com/developer/technicalArticles/Programming/HPROF.html.
+https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html.
 .RE
 
 .LP
@@ -134,7 +134,7 @@
 .na
 \f2hprof \- Heap and CPU profiling tool\fP @
 .fi
-http://java.sun.com/developer/technicalArticles/Programming/HPROF.html
+https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html.
 .RE
 
 .LP
--- a/src/linux/doc/man/jhat.1	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/linux/doc/man/jhat.1	Tue Aug 22 02:03:52 2017 +0100
@@ -77,7 +77,7 @@
 .na
 \f2hprof\fP @
 .fi
-http://java.sun.com/developer/technicalArticles/Programming/HPROF.html. 
+https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html.
 .RE
 
 .LP
@@ -134,7 +134,7 @@
 .na
 \f2hprof \- Heap and CPU profiling tool\fP @
 .fi
-http://java.sun.com/developer/technicalArticles/Programming/HPROF.html 
+https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html.
 .RE
 
 .LP
--- a/src/share/back/ThreadGroupReferenceImpl.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/back/ThreadGroupReferenceImpl.c	Tue Aug 22 02:03:52 2017 +0100
@@ -47,7 +47,7 @@
 
         (void)memset(&info, 0, sizeof(info));
         threadGroupInfo(group, &info);
-        (void)outStream_writeString(out, info.name);
+        (void)outStream_writeString(out, info.name == NULL ? "" : info.name);
         if ( info.name != NULL )
             jvmtiDeallocate(info.name);
 
--- a/src/share/back/invoker.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/back/invoker.c	Tue Aug 22 02:03:52 2017 +0100
@@ -211,6 +211,38 @@
     return error;
 }
 
+/*
+ * Delete global argument references from the request which got put there before a
+ * invoke request was carried out. See fillInvokeRequest().
+ */
+static void
+deleteGlobalArgumentRefs(JNIEnv *env, InvokeRequest *request)
+{
+    void *cursor;
+    jint argIndex = 0;
+    jvalue *argument = request->arguments;
+    jbyte argumentTag = firstArgumentTypeTag(request->methodSignature, &cursor);
+
+    if (request->clazz != NULL) {
+        tossGlobalRef(env, &(request->clazz));
+    }
+    if (request->instance != NULL) {
+        tossGlobalRef(env, &(request->instance));
+    }
+    /* Delete global argument references */
+    while (argIndex < request->argumentCount) {
+        if ((argumentTag == JDWP_TAG(OBJECT)) ||
+            (argumentTag == JDWP_TAG(ARRAY))) {
+            if (argument->l != NULL) {
+                tossGlobalRef(env, &(argument->l));
+            }
+        }
+        argument++;
+        argIndex++;
+        argumentTag = nextArgumentTypeTag(&cursor);
+    }
+}
+
 static jvmtiError
 fillInvokeRequest(JNIEnv *env, InvokeRequest *request,
                   jbyte invokeType, jbyte options, jint id,
@@ -320,6 +352,8 @@
 invokeConstructor(JNIEnv *env, InvokeRequest *request)
 {
     jobject object;
+
+    JDI_ASSERT_MSG(request->clazz, "Request clazz null");
     object = JNI_FUNC_PTR(env,NewObjectA)(env, request->clazz,
                                      request->method,
                                      request->arguments);
@@ -336,6 +370,7 @@
         case JDWP_TAG(OBJECT):
         case JDWP_TAG(ARRAY): {
             jobject object;
+            JDI_ASSERT_MSG(request->clazz, "Request clazz null");
             object = JNI_FUNC_PTR(env,CallStaticObjectMethodA)(env,
                                        request->clazz,
                                        request->method,
@@ -424,6 +459,7 @@
         case JDWP_TAG(OBJECT):
         case JDWP_TAG(ARRAY): {
             jobject object;
+            JDI_ASSERT_MSG(request->instance, "Request instance null");
             object = JNI_FUNC_PTR(env,CallObjectMethodA)(env,
                                  request->instance,
                                  request->method,
@@ -511,6 +547,8 @@
         case JDWP_TAG(OBJECT):
         case JDWP_TAG(ARRAY): {
             jobject object;
+            JDI_ASSERT_MSG(request->clazz, "Request clazz null");
+            JDI_ASSERT_MSG(request->instance, "Request instance null");
             object = JNI_FUNC_PTR(env,CallNonvirtualObjectMethodA)(env,
                                            request->instance,
                                            request->clazz,
@@ -607,6 +645,8 @@
     JNIEnv *env;
     jboolean startNow;
     InvokeRequest *request;
+    jbyte options;
+    jbyte invokeType;
 
     JDI_ASSERT(thread);
 
@@ -623,6 +663,9 @@
     if (startNow) {
         request->started = JNI_TRUE;
     }
+    options = request->options;
+    invokeType = request->invokeType;
+
     debugMonitorExit(invokerLock);
 
     if (!startNow) {
@@ -637,7 +680,7 @@
 
         JNI_FUNC_PTR(env,ExceptionClear)(env);
 
-        switch (request->invokeType) {
+        switch (invokeType) {
             case INVOKE_CONSTRUCTOR:
                 invokeConstructor(env, request);
                 break;
@@ -645,7 +688,7 @@
                 invokeStatic(env, request);
                 break;
             case INVOKE_INSTANCE:
-                if (request->options & JDWP_INVOKE_OPTIONS(NONVIRTUAL) ) {
+                if (options & JDWP_INVOKE_OPTIONS(NONVIRTUAL) ) {
                     invokeNonvirtual(env, request);
                 } else {
                     invokeVirtual(env, request);
@@ -677,6 +720,7 @@
     jint id;
     InvokeRequest *request;
     jboolean detached;
+    jboolean mustReleaseReturnValue = JNI_FALSE;
 
     JDI_ASSERT(thread);
 
@@ -720,15 +764,39 @@
         id = request->id;
         exc = request->exception;
         returnValue = request->returnValue;
+
+        /* Release return value and exception references, but delay the release
+         * until after the return packet was sent. */
+        mustReleaseReturnValue = request->invokeType == INVOKE_CONSTRUCTOR ||
+           returnTypeTag(request->methodSignature) == JDWP_TAG(OBJECT) ||
+           returnTypeTag(request->methodSignature) == JDWP_TAG(ARRAY);
+
     }
 
     /*
+     * At this time, there's no need to retain global references on
+     * arguments since the reply is processed. No one will deal with
+     * this request ID anymore, so we must call deleteGlobalArgumentRefs().
+     *
+     * We cannot delete saved exception or return value references
+     * since otherwise a deleted handle would escape when writing
+     * the response to the stream. Instead, we clean those refs up
+     * after writing the respone.
+     */
+    deleteGlobalArgumentRefs(env, request);
+
+    /* From now on, do not access the request structure anymore
+     * for this request id, because once we give up the invokerLock it may
+     * be immediately reused by a new invoke request.
+     */
+    request = NULL;
+
+    /*
      * Give up the lock before I/O operation
      */
     debugMonitorExit(invokerLock);
     eventHandler_unlock();
 
-
     if (!detached) {
         outStream_initReply(&out, id);
         (void)outStream_writeValue(env, &out, tag, returnValue);
@@ -736,6 +804,21 @@
         (void)outStream_writeObjectRef(env, &out, exc);
         outStream_sendReply(&out);
     }
+
+    /*
+     * Delete potentially saved global references of return value
+     * and exception
+     */
+    eventHandler_lock(); // for proper lock order
+    debugMonitorEnter(invokerLock);
+    if (mustReleaseReturnValue && returnValue.l != NULL) {
+        tossGlobalRef(env, &returnValue.l);
+    }
+    if (exc != NULL) {
+        tossGlobalRef(env, &exc);
+    }
+    debugMonitorExit(invokerLock);
+    eventHandler_unlock();
 }
 
 jboolean
--- a/src/share/back/outStream.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/back/outStream.c	Tue Aug 22 02:03:52 2017 +0100
@@ -298,17 +298,15 @@
 outStream_writeString(PacketOutputStream *stream, char *string)
 {
     jdwpError error;
-    jint      length;
+    jint      length = string != NULL ? (int)strlen(string) : 0;
 
     /* Options utf8=y/n controls if we want Standard UTF-8 or Modified */
     if ( gdata->modifiedUtf8 ) {
-        length = (int)strlen(string);
         (void)outStream_writeInt(stream, length);
         error = writeBytes(stream, (jbyte *)string, length);
     } else {
         jint      new_length;
 
-        length = (int)strlen(string);
         new_length = (gdata->npt->utf8mToUtf8sLength)
                             (gdata->npt->utf, (jbyte*)string, length);
         if ( new_length == length ) {
--- a/src/share/bin/java.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/bin/java.c	Tue Aug 22 02:03:52 2017 +0100
@@ -880,8 +880,14 @@
      * "Valid" returns (other than unrecoverable errors) follow.  Set
      * main_class as a side-effect of this routine.
      */
-    if (info.main_class != NULL)
+    if (info.main_class != NULL) {
+      if (strlen(info.main_class) <= MAXNAMELEN) {
         *main_class = JLI_StringDup(info.main_class);
+      } else {
+        JLI_ReportErrorMessage("Error: main-class: attribute exceeds system limits\n", JNI_TRUE);
+	exit(1);
+      }
+    }
 
     /*
      * If no version selection information is found either on the command
--- a/src/share/bin/wildcard.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/bin/wildcard.c	Tue Aug 22 02:03:52 2017 +0100
@@ -356,8 +356,13 @@
     const char *basename;
     FileList fl = FileList_new(16);
     WildcardIterator it = WildcardIterator_for(wildcard);
+
     if (it == NULL)
+    {
+        FileList_free(fl);
         return NULL;
+    }
+
     while ((basename = WildcardIterator_next(it)) != NULL)
         if (isJarFileName(basename))
             FileList_add(fl, wildcardConcat(wildcard, basename));
--- a/src/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014 Red Hat Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -80,10 +81,10 @@
      * @param random the source of randomness
      */
     public void initialize(int keysize, SecureRandom random) {
-        if ((keysize < 512) || (keysize > 2048) || (keysize % 64 != 0)) {
+        if ((keysize < 512) || (keysize > 4096) || (keysize % 64 != 0)) {
             throw new InvalidParameterException("Keysize must be multiple "
                                                 + "of 64, and can only range "
-                                                + "from 512 to 2048 "
+                                                + "from 512 to 4096 "
                                                 + "(inclusive)");
         }
         this.pSize = keysize;
@@ -115,11 +116,11 @@
 
         params = (DHParameterSpec)algParams;
         pSize = params.getP().bitLength();
-        if ((pSize < 512) || (pSize > 2048) ||
+        if ((pSize < 512) || (pSize > 4096) ||
             (pSize % 64 != 0)) {
             throw new InvalidAlgorithmParameterException
                 ("Prime size must be multiple of 64, and can only range "
-                 + "from 512 to 2048 (inclusive)");
+                 + "from 512 to 4096 (inclusive)");
         }
 
         // exponent size is optional, could be 0
--- a/src/share/classes/com/sun/crypto/provider/DHParameterGenerator.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/crypto/provider/DHParameterGenerator.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014 Red Hat Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -67,10 +68,10 @@
      * @param random the source of randomness
      */
     protected void engineInit(int keysize, SecureRandom random) {
-        if ((keysize < 512) || (keysize > 2048) || (keysize % 64 != 0)) {
+        if ((keysize < 512) || (keysize > 4096) || (keysize % 64 != 0)) {
             throw new InvalidParameterException("Keysize must be multiple "
                                                 + "of 64, and can only range "
-                                                + "from 512 to 2048 "
+                                                + "from 512 to 4096 "
                                                 + "(inclusive)");
         }
         this.primeSize = keysize;
@@ -99,10 +100,10 @@
             DHGenParameterSpec dhParamSpec = (DHGenParameterSpec)genParamSpec;
 
             primeSize = dhParamSpec.getPrimeSize();
-            if ((primeSize<512) || (primeSize>2048) || (primeSize%64 != 0)) {
+            if ((primeSize<512) || (primeSize>4096) || (primeSize%64 != 0)) {
                 throw new InvalidAlgorithmParameterException
                     ("Modulus size must be multiple of 64, and can only range "
-                     + "from 512 to 2048 (inclusive)");
+                     + "from 512 to 4096 (inclusive)");
             }
 
             exponentSize = dhParamSpec.getExponentSize();
--- a/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java	Tue Aug 22 02:03:52 2017 +0100
@@ -87,7 +87,7 @@
 
     static {
         java.security.AccessController.doPrivileged(
-            new sun.security.action.LoadLibraryAction("jpeg"));
+            new sun.security.action.LoadLibraryAction("javajpeg"));
         initReaderIDs(ImageInputStream.class,
                       JPEGQTable.class,
                       JPEGHuffmanTable.class);
--- a/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java	Tue Aug 22 02:03:52 2017 +0100
@@ -177,7 +177,7 @@
 
     static {
         java.security.AccessController.doPrivileged(
-            new sun.security.action.LoadLibraryAction("jpeg"));
+            new sun.security.action.LoadLibraryAction("javajpeg"));
         initWriterIDs(JPEGQTable.class,
                       JPEGHuffmanTable.class);
     }
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -93,7 +93,10 @@
      */
     static enum Settings {
         GTK_FONT_NAME,
-        GTK_ICON_SIZES
+        GTK_ICON_SIZES,
+        GTK_BUTTON_ORDER,
+        GTK_CURSOR_BLINK,
+        GTK_CURSOR_BLINK_TIME
     }
 
     /* Custom regions are needed for representing regions that don't exist
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -371,7 +371,17 @@
         int vProgWidth  =  22 - (progXThickness * 2);
         int vProgHeight =  80 - (progYThickness * 2);
 
-        Integer caretBlinkRate = Integer.valueOf(500);
+        Integer caretBlinkRate;
+        if (Boolean.FALSE.equals(GTKEngine.INSTANCE.getSetting(
+                GTKEngine.Settings.GTK_CURSOR_BLINK))) {
+            caretBlinkRate = Integer.valueOf(0);
+        } else {
+            caretBlinkRate = (Integer) GTKEngine.INSTANCE.getSetting(
+                    GTKEngine.Settings.GTK_CURSOR_BLINK_TIME);
+            if (caretBlinkRate == null) {
+                caretBlinkRate = Integer.valueOf(500);
+            }
+        }
         Insets zeroInsets = new InsetsUIResource(0, 0, 0, 0);
 
         Double defaultCaretAspectRatio = new Double(0.025);
@@ -539,6 +549,14 @@
             }
         }
 
+	/* If gtk-alternative-button-order is set to true, isYesLast needs to be false */
+	Boolean buttonOrder = Boolean.TRUE;
+	Object orderSetting = GTKEngine.INSTANCE.getSetting(GTKEngine.Settings.GTK_BUTTON_ORDER);
+	if (orderSetting instanceof Boolean) {
+	    Boolean order = (Boolean) orderSetting;
+	    if (Boolean.TRUE.equals(order))
+		buttonOrder = Boolean.FALSE;
+	}
         Object[] defaults = new Object[] {
             "ArrowButton.size", Integer.valueOf(13),
 
@@ -818,7 +836,7 @@
             "OptionPane.windowBindings", new Object[] {
                 "ESCAPE", "close" },
             "OptionPane.buttonClickThreshhold", new Integer(500),
-            "OptionPane.isYesLast", Boolean.TRUE,
+            "OptionPane.isYesLast", buttonOrder,
             "OptionPane.font", new FontLazyValue(Region.OPTION_PANE),
 
             "Panel.font", new FontLazyValue(Region.PANEL),
--- a/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2009, 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,7 +27,6 @@
 
 import java.awt.*;
 import java.lang.reflect.*;
-import java.security.*;
 import java.util.*;
 import javax.swing.*;
 import javax.swing.plaf.*;
@@ -908,7 +907,7 @@
 
     static class GTKStockIconInfo {
         private static Map<String,Integer> ICON_TYPE_MAP;
-        private static final Object ICON_SIZE_KEY = new StringBuffer("IconSize");
+        private static final Object ICON_SIZE_KEY = new Object(); // IconSize
 
         private static Dimension[] getIconSizesMap() {
             AppContext appContext = AppContext.getAppContext();
--- a/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java	Tue Aug 22 02:03:52 2017 +0100
@@ -295,6 +295,8 @@
         try {
             Properties p = new Properties();
             p.load(fin);
+	    // Properties.load does a buffered read so we don't need to wrap
+	    // the FileInputStream in a BufferedInputStream.
             return p;
         } finally {
             fin.close();
--- a/src/share/classes/com/sun/jndi/dns/DnsContextFactory.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/jndi/dns/DnsContextFactory.java	Tue Aug 22 02:03:52 2017 +0100
@@ -135,7 +135,7 @@
             throw new ConfigurationException("DNS pseudo-URL required");
         }
 
-        List<String> servers = new ArrayList<>();
+        List<String> servers = new ArrayList<String>();
 
         for (int i = 0; i < urls.length; i++) {
             String server = urls[i].getHost();
--- a/src/share/classes/com/sun/jndi/ldap/Connection.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/jndi/ldap/Connection.java	Tue Aug 22 02:03:52 2017 +0100
@@ -439,9 +439,14 @@
     BerDecoder readReply(LdapRequest ldr)
             throws IOException, NamingException {
         BerDecoder rber;
-        boolean waited = false;
 
-        while (((rber = ldr.getReplyBer()) == null) && !waited) {
+        // Track down elapsed time to workaround spurious wakeups
+        long elapsedMilli = 0;
+        long elapsedNano = 0;
+
+        while (((rber = ldr.getReplyBer()) == null) &&
+                (readTimeout <= 0 || elapsedMilli < readTimeout))
+        {
             try {
                 // If socket closed, don't even try
                 synchronized (this) {
@@ -455,10 +460,15 @@
                     rber = ldr.getReplyBer();
                     if (rber == null) {
                         if (readTimeout > 0) {  // Socket read timeout is specified
-                            // will be woken up before readTimeout only if reply is
+                            long beginNano = System.nanoTime();
+
+                            // will be woken up before readTimeout if reply is
                             // available
-                            ldr.wait(readTimeout);
-                            waited = true;
+                            ldr.wait(readTimeout - elapsedMilli);
+                            elapsedNano += (System.nanoTime() - beginNano);
+                            elapsedMilli += elapsedNano / 1000_000;
+                            elapsedNano %= 1000_000;
+
                         } else {
                             // no timeout is set so we wait infinitely until
                             // a response is received
@@ -475,7 +485,7 @@
             }
         }
 
-        if ((rber == null) && waited) {
+        if ((rber == null) && (elapsedMilli >= readTimeout)) {
             abandonRequest(ldr, null);
             throw new NamingException("LDAP response read timed out, timeout used:"
                             + readTimeout + "ms." );
--- a/src/share/classes/com/sun/jndi/ldap/LdapClient.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/jndi/ldap/LdapClient.java	Tue Aug 22 02:03:52 2017 +0100
@@ -494,16 +494,14 @@
      */
     void processConnectionClosure() {
         // Notify listeners
-        synchronized (unsolicited) {
-            if (unsolicited.size() > 0) {
-                String msg;
-                if (conn != null) {
-                    msg = conn.host + ":" + conn.port + " connection closed";
-                } else {
-                    msg = "Connection closed";
-                }
-                notifyUnsolicited(new CommunicationException(msg));
+        if (unsolicited.size() > 0) {
+            String msg;
+            if (conn != null) {
+                msg = conn.host + ":" + conn.port + " connection closed";
+            } else {
+                msg = "Connection closed";
             }
+            notifyUnsolicited(new CommunicationException(msg));
         }
 
         // Remove from pool
@@ -1488,7 +1486,7 @@
     // removeUnsolicited() is invoked to remove an LdapCtx from this client.
     //
     ////////////////////////////////////////////////////////////////////////////
-    private Vector<LdapCtx> unsolicited = new Vector<>(3);
+    private Vector<LdapCtx> unsolicited = new Vector<LdapCtx>(3);
     void addUnsolicited(LdapCtx ctx) {
         if (debug > 0) {
             System.err.println("LdapClient.addUnsolicited" + ctx);
@@ -1500,13 +1498,8 @@
         if (debug > 0) {
             System.err.println("LdapClient.removeUnsolicited" + ctx);
         }
-        synchronized (unsolicited) {
-            if (unsolicited.size() == 0) {
-                return;
-            }
             unsolicited.removeElement(ctx);
         }
-    }
 
     // NOTE: Cannot be synchronized because this is called asynchronously
     // by the reader thread in Connection. Instead, sync on 'unsolicited' Vector.
@@ -1514,30 +1507,35 @@
         if (debug > 0) {
             System.err.println("LdapClient.processUnsolicited");
         }
-        synchronized (unsolicited) {
-            try {
-                // Parse the response
-                LdapResult res = new LdapResult();
+        try {
+            // Parse the response
+            LdapResult res = new LdapResult();
+
+            ber.parseSeq(null); // init seq
+            ber.parseInt();             // msg id; should be 0; ignored
+            if (ber.parseByte() != LDAP_REP_EXTENSION) {
+                throw new IOException(
+                    "Unsolicited Notification must be an Extended Response");
+            }
+            ber.parseLength();
+            parseExtResponse(ber, res);
 
-                ber.parseSeq(null); // init seq
-                ber.parseInt();             // msg id; should be 0; ignored
-                if (ber.parseByte() != LDAP_REP_EXTENSION) {
-                    throw new IOException(
-                        "Unsolicited Notification must be an Extended Response");
-                }
-                ber.parseLength();
-                parseExtResponse(ber, res);
+            if (DISCONNECT_OID.equals(res.extensionId)) {
+                // force closing of connection
+                forceClose(pooled);
+            }
 
-                if (DISCONNECT_OID.equals(res.extensionId)) {
-                    // force closing of connection
-                    forceClose(pooled);
-                }
+            LdapCtx first = null;
+            UnsolicitedNotification notice = null;
 
+            synchronized (unsolicited) {
                 if (unsolicited.size() > 0) {
+                    first = unsolicited.elementAt(0);
+
                     // Create an UnsolicitedNotification using the parsed data
                     // Need a 'ctx' object because we want to use the context's
                     // list of provider control factories.
-                    UnsolicitedNotification notice = new UnsolicitedResponseImpl(
+                    notice = new UnsolicitedResponseImpl(
                         res.extensionId,
                         res.extensionValue,
                         res.referrals,
@@ -1545,42 +1543,45 @@
                         res.errorMessage,
                         res.matchedDN,
                         (res.resControls != null) ?
-                        unsolicited.elementAt(0).convertControls(res.resControls) :
+                        first.convertControls(res.resControls) :
                         null);
-
-                    // Fire UnsolicitedNotification events to listeners
-                    notifyUnsolicited(notice);
-
-                    // If "disconnect" notification,
-                    // notify unsolicited listeners via NamingException
-                    if (DISCONNECT_OID.equals(res.extensionId)) {
-                        notifyUnsolicited(
-                            new CommunicationException("Connection closed"));
-                    }
                 }
-            } catch (IOException e) {
-                if (unsolicited.size() == 0)
-                    return;  // no one registered; ignore
+            }
+
+            if (notice != null) {
+                // Fire UnsolicitedNotification events to listeners
+                notifyUnsolicited(notice);
 
-                NamingException ne = new CommunicationException(
-                    "Problem parsing unsolicited notification");
-                ne.setRootCause(e);
+                // If "disconnect" notification,
+                // notify unsolicited listeners via NamingException
+                if (DISCONNECT_OID.equals(res.extensionId)) {
+                    notifyUnsolicited(
+                        new CommunicationException("Connection closed"));
+                }
+            }
+        } catch (IOException e) {
+            NamingException ne = new CommunicationException(
+                "Problem parsing unsolicited notification");
+            ne.setRootCause(e);
 
-                notifyUnsolicited(ne);
+            notifyUnsolicited(ne);
 
-            } catch (NamingException e) {
-                notifyUnsolicited(e);
-            }
+        } catch (NamingException e) {
+            notifyUnsolicited(e);
         }
     }
 
 
     private void notifyUnsolicited(Object e) {
-        for (int i = 0; i < unsolicited.size(); i++) {
-            unsolicited.elementAt(i).fireUnsolicited(e);
+        Vector<LdapCtx> unsolicitedCopy;
+        synchronized (unsolicited) {
+            unsolicitedCopy = new Vector<>(unsolicited);
+            if (e instanceof NamingException) {
+                unsolicited.setSize(0);  // no more listeners after exception
+            }
         }
-        if (e instanceof NamingException) {
-            unsolicited.setSize(0);  // no more listeners after exception
+        for (int i = 0; i < unsolicitedCopy.size(); i++) {
+            unsolicitedCopy.elementAt(i).fireUnsolicited(e);
         }
     }
 
--- a/src/share/classes/com/sun/jndi/ldap/LdapURL.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/jndi/ldap/LdapURL.java	Tue Aug 22 02:03:52 2017 +0100
@@ -26,9 +26,6 @@
 package com.sun.jndi.ldap;
 
 import javax.naming.*;
-import javax.naming.directory.*;
-import javax.naming.spi.*;
-import java.net.URL;
 import java.net.MalformedURLException;
 import java.io.UnsupportedEncodingException;
 import java.util.StringTokenizer;
@@ -211,43 +208,52 @@
 
         // query begins with a '?' or is null
 
-        if (query == null) {
+        if (query == null || query.length() < 2) {
+            return;
+        }
+
+        int currentIndex = 1;
+        int nextQmark;
+        int endIndex;
+
+        // attributes:
+        nextQmark = query.indexOf('?', currentIndex);
+        endIndex = nextQmark == -1 ? query.length() : nextQmark;
+        if (endIndex - currentIndex > 0) {
+            attributes = query.substring(currentIndex, endIndex);
+        }
+        currentIndex = endIndex + 1;
+        if (currentIndex >= query.length()) {
             return;
         }
 
-        int qmark2 = query.indexOf('?', 1);
-
-        if (qmark2 < 0) {
-            attributes = query.substring(1);
+        // scope:
+        nextQmark = query.indexOf('?', currentIndex);
+        endIndex = nextQmark == -1 ? query.length() : nextQmark;
+        if (endIndex - currentIndex > 0) {
+            scope = query.substring(currentIndex, endIndex);
+        }
+        currentIndex = endIndex + 1;
+        if (currentIndex >= query.length()) {
             return;
-        } else if (qmark2 != 1) {
-            attributes = query.substring(1, qmark2);
         }
 
-        int qmark3 = query.indexOf('?', qmark2 + 1);
-
-        if (qmark3 < 0) {
-            scope = query.substring(qmark2 + 1);
+        // filter:
+        nextQmark = query.indexOf('?', currentIndex);
+        endIndex = nextQmark == -1 ? query.length() : nextQmark;
+        if (endIndex - currentIndex > 0) {
+            filter = query.substring(currentIndex, endIndex);
+            filter = UrlUtil.decode(filter, "UTF8");
+        }
+        currentIndex = endIndex + 1;
+        if (currentIndex >= query.length()) {
             return;
-        } else if (qmark3 != qmark2 + 1) {
-            scope = query.substring(qmark2 + 1, qmark3);
         }
 
-        int qmark4 = query.indexOf('?', qmark3 + 1);
-
-        if (qmark4 < 0) {
-            filter = query.substring(qmark3 + 1);
-        } else {
-            if (qmark4 != qmark3 + 1) {
-                filter = query.substring(qmark3 + 1, qmark4);
-            }
-            extensions = query.substring(qmark4 + 1);
-            if (extensions.length() > 0) {
-                extensions = UrlUtil.decode(extensions, "UTF8");
-            }
-        }
-        if (filter != null && filter.length() > 0) {
-            filter = UrlUtil.decode(filter, "UTF8");
+        // extensions:
+        if (query.length() - currentIndex > 0) {
+            extensions = query.substring(currentIndex);
+            extensions = UrlUtil.decode(extensions, "UTF8");
         }
     }
 
--- a/src/share/classes/com/sun/media/sound/SoftSynthesizer.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/media/sound/SoftSynthesizer.java	Tue Aug 22 02:03:52 2017 +0100
@@ -668,6 +668,40 @@
             actions.add(new PrivilegedAction<InputStream>() {
                 public InputStream run() {
                     if (System.getProperties().getProperty("os.name")
+                            .startsWith("Linux")) {
+
+                        File[] systemSoundFontsDir = new File[] {
+                            /* Arch, Fedora, Mageia */
+                            new File("/usr/share/soundfonts/"),
+                            new File("/usr/local/share/soundfonts/"),
+                            /* Debian, Gentoo, OpenSUSE, Ubuntu */
+                            new File("/usr/share/sounds/sf2/"),
+                            new File("/usr/local/share/sounds/sf2/"),
+                        };
+
+                        /*
+                         * Look for a default.sf2
+                         */
+                        for (File systemSoundFontDir : systemSoundFontsDir) {
+                            if (systemSoundFontDir.exists()) {
+                                File defaultSoundFont = new File(systemSoundFontDir, "default.sf2");
+                                if (defaultSoundFont.exists()) {
+                                    try {
+                                        return new FileInputStream(defaultSoundFont);
+                                    } catch (IOException e) {
+                                        // continue with lookup
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    return null;
+                }
+            });
+
+            actions.add(new PrivilegedAction<InputStream>() {
+                public InputStream run() {
+                    if (System.getProperties().getProperty("os.name")
                             .startsWith("Windows")) {
                         File gm_dls = new File(System.getenv("SystemRoot")
                                 + "\\system32\\drivers\\gm.dls");
--- a/src/share/classes/com/sun/naming/internal/ResourceManager.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/naming/internal/ResourceManager.java	Tue Aug 22 02:03:52 2017 +0100
@@ -557,14 +557,26 @@
             try {
                 NamingEnumeration<InputStream> resources =
                     helper.getResources(cl, APP_RESOURCE_FILE_NAME);
-                while (resources.hasMore()) {
-                    Properties props = new Properties();
-                    props.load(resources.next());
+                try {
+                    while (resources.hasMore()) {
+                        Properties props = new Properties();
+                        InputStream istream = resources.next();
+                        try {
+                            props.load(istream);
+                        } finally {
+                            istream.close();
+                        }
 
-                    if (result == null) {
-                        result = props;
-                    } else {
-                        mergeTables(result, props);
+                        if (result == null) {
+                            result = props;
+                        } else {
+                            mergeTables(result, props);
+                        }
+                    }
+                } finally {
+                    while (resources.hasMore()) {
+                        InputStream istream = (InputStream)resources.next();
+                        istream.close();
                     }
                 }
 
@@ -572,13 +584,17 @@
                 InputStream istream =
                     helper.getJavaHomeLibStream(JRELIB_PROPERTY_FILE_NAME);
                 if (istream != null) {
-                    Properties props = new Properties();
-                    props.load(istream);
+                    try {
+                        Properties props = new Properties();
+                        props.load(istream);
 
-                    if (result == null) {
-                        result = props;
-                    } else {
-                        mergeTables(result, props);
+                        if (result == null) {
+                            result = props;
+                        } else {
+                            mergeTables(result, props);
+                        }
+                    } finally {
+                        istream.close();
                     }
                 }
 
--- a/src/share/classes/com/sun/script/javascript/RhinoScriptEngine.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/script/javascript/RhinoScriptEngine.java	Tue Aug 22 02:03:52 2017 +0100
@@ -126,7 +126,7 @@
         if (tmp != null) {
             version = Integer.parseInt((String)tmp);
         } else {
-            version = Context.VERSION_1_8;
+            version = Context.VERSION_DEFAULT;
         }
         return version;
     }
--- a/src/share/classes/com/sun/script/javascript/RhinoScriptEngineFactory.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/script/javascript/RhinoScriptEngineFactory.java	Tue Aug 22 02:03:52 2017 +0100
@@ -53,16 +53,18 @@
     }
 
     public Object getParameter(String key) {
+        String implVer = ScriptRuntime.getMessage0("implementation.version");
+        String[] parts = implVer.split(" ");
         if (key.equals(ScriptEngine.NAME)) {
             return "javascript";
         } else if (key.equals(ScriptEngine.ENGINE)) {
-            return "Mozilla Rhino";
+            return parts[0];
         } else if (key.equals(ScriptEngine.ENGINE_VERSION)) {
-            return "1.7 release 3 PRERELEASE";
+            return implVer;
         } else if (key.equals(ScriptEngine.LANGUAGE)) {
             return "ECMAScript";
         } else if (key.equals(ScriptEngine.LANGUAGE_VERSION)) {
-            return "1.8";
+            return parts[1];
         } else if (key.equals("THREADING")) {
             return "MULTITHREADED";
         } else {
--- a/src/share/classes/com/sun/script/javascript/RhinoTopLevel.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/com/sun/script/javascript/RhinoTopLevel.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
--- a/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java	Tue Aug 22 02:03:52 2017 +0100
@@ -504,7 +504,10 @@
                 } else if (comp instanceof Container && comp != aContainer) {
                     Container cont = (Container)comp;
                     if (cont.isFocusTraversalPolicyProvider()) {
-                        return cont.getFocusTraversalPolicy().getLastComponent(cont);
+                        Component retComp = cont.getFocusTraversalPolicy().getLastComponent(cont);
+                        if (retComp != null) {
+                            return retComp;
+                        }
                     }
                 }
             }
--- a/src/share/classes/java/awt/ScrollPane.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/awt/ScrollPane.java	Tue Aug 22 02:03:52 2017 +0100
@@ -496,9 +496,8 @@
         Point p = getScrollPosition();
         Dimension cs = calculateChildSize();
         Dimension vs = getViewportSize();
-        Insets i = getInsets();
 
-        c.reshape(i.left - p.x, i.top - p.y, cs.width, cs.height);
+        c.reshape(- p.x, - p.y, cs.width, cs.height);
         ScrollPanePeer peer = (ScrollPanePeer)this.peer;
         if (peer != null) {
             peer.childResized(cs.width, cs.height);
--- a/src/share/classes/java/awt/color/ICC_Profile.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/awt/color/ICC_Profile.java	Tue Aug 22 02:03:52 2017 +0100
@@ -37,6 +37,8 @@
 
 import sun.java2d.cmm.PCMM;
 import sun.java2d.cmm.CMSManager;
+import sun.java2d.cmm.Profile;
+import sun.java2d.cmm.ProfileDataVerifier;
 import sun.java2d.cmm.ProfileDeferralMgr;
 import sun.java2d.cmm.ProfileDeferralInfo;
 import sun.java2d.cmm.ProfileActivator;
@@ -93,7 +95,7 @@
 
     private static final long serialVersionUID = -3938515861990936766L;
 
-    transient long ID;
+    private transient Profile cmmProfile;
 
     private transient ProfileDeferralInfo deferralInfo;
     private transient ProfileActivator profileActivator;
@@ -726,8 +728,8 @@
     /**
      * Constructs an ICC_Profile object with a given ID.
      */
-    ICC_Profile(long ID) {
-        this.ID = ID;
+    ICC_Profile(Profile p) {
+        this.cmmProfile = p;
     }
 
 
@@ -750,8 +752,8 @@
      * Frees the resources associated with an ICC_Profile object.
      */
     protected void finalize () {
-        if (ID != 0) {
-            CMSManager.getModule().freeProfile(ID);
+        if (cmmProfile != null) {
+            CMSManager.getModule().freeProfile(cmmProfile);
         } else if (profileActivator != null) {
             ProfileDeferralMgr.unregisterDeferral(profileActivator);
         }
@@ -769,39 +771,41 @@
     public static ICC_Profile getInstance(byte[] data) {
     ICC_Profile thisProfile;
 
-        long theID;
+        Profile p = null;
 
         if (ProfileDeferralMgr.deferring) {
             ProfileDeferralMgr.activateProfiles();
         }
 
+        ProfileDataVerifier.verify(data);
+
         try {
-            theID = CMSManager.getModule().loadProfile(data);
+            p = CMSManager.getModule().loadProfile(data);
         } catch (CMMException c) {
             throw new IllegalArgumentException("Invalid ICC Profile Data");
         }
 
         try {
-            if ((getColorSpaceType (theID) == ColorSpace.TYPE_GRAY) &&
-                (getData (theID, icSigMediaWhitePointTag) != null) &&
-                (getData (theID, icSigGrayTRCTag) != null)) {
-                thisProfile = new ICC_ProfileGray (theID);
+            if ((getColorSpaceType (p) == ColorSpace.TYPE_GRAY) &&
+                (getData (p, icSigMediaWhitePointTag) != null) &&
+                (getData (p, icSigGrayTRCTag) != null)) {
+                thisProfile = new ICC_ProfileGray (p);
             }
-            else if ((getColorSpaceType (theID) == ColorSpace.TYPE_RGB) &&
-                (getData (theID, icSigMediaWhitePointTag) != null) &&
-                (getData (theID, icSigRedColorantTag) != null) &&
-                (getData (theID, icSigGreenColorantTag) != null) &&
-                (getData (theID, icSigBlueColorantTag) != null) &&
-                (getData (theID, icSigRedTRCTag) != null) &&
-                (getData (theID, icSigGreenTRCTag) != null) &&
-                (getData (theID, icSigBlueTRCTag) != null)) {
-                thisProfile = new ICC_ProfileRGB (theID);
+            else if ((getColorSpaceType (p) == ColorSpace.TYPE_RGB) &&
+                (getData (p, icSigMediaWhitePointTag) != null) &&
+                (getData (p, icSigRedColorantTag) != null) &&
+                (getData (p, icSigGreenColorantTag) != null) &&
+                (getData (p, icSigBlueColorantTag) != null) &&
+                (getData (p, icSigRedTRCTag) != null) &&
+                (getData (p, icSigGreenTRCTag) != null) &&
+                (getData (p, icSigBlueTRCTag) != null)) {
+                thisProfile = new ICC_ProfileRGB (p);
             }
             else {
-                thisProfile = new ICC_Profile (theID);
+                thisProfile = new ICC_Profile (p);
             }
         } catch (CMMException c) {
-            thisProfile = new ICC_Profile (theID);
+            thisProfile = new ICC_Profile (p);
         }
         return thisProfile;
     }
@@ -1116,7 +1120,7 @@
                 fileName);
         }
         try {
-            ID = CMSManager.getModule().loadProfile(profileData);
+            cmmProfile = CMSManager.getModule().loadProfile(profileData);
         } catch (CMMException c) {
             ProfileDataException pde = new
                 ProfileDataException("Invalid ICC Profile Data" + fileName);
@@ -1226,14 +1230,14 @@
                                                    causing a deferred profile
                                                    to be loaded */
         }
-        return    getColorSpaceType(ID);
+        return    getColorSpaceType(cmmProfile);
     }
 
-    static int getColorSpaceType(long profileID) {
+    static int getColorSpaceType(Profile p) {
     byte[] theHeader;
     int theColorSpaceSig, theColorSpace;
 
-        theHeader = getData(profileID, icSigHead);
+        theHeader = getData(p, icSigHead);
         theColorSpaceSig = intFromBigEndian(theHeader, icHdrColorSpace);
         theColorSpace = iccCStoJCS (theColorSpaceSig);
         return theColorSpace;
@@ -1255,15 +1259,15 @@
         if (ProfileDeferralMgr.deferring) {
             ProfileDeferralMgr.activateProfiles();
         }
-        return getPCSType(ID);
+        return getPCSType(cmmProfile);
     }
 
 
-    static int getPCSType(long profileID) {
+    static int getPCSType(Profile p) {
     byte[] theHeader;
     int thePCSSig, thePCS;
 
-        theHeader = getData(profileID, icSigHead);
+        theHeader = getData(p, icSigHead);
         thePCSSig = intFromBigEndian(theHeader, icHdrPcs);
         thePCS = iccCStoJCS(thePCSSig);
         return thePCS;
@@ -1323,12 +1327,12 @@
         PCMM mdl = CMSManager.getModule();
 
         /* get the number of bytes needed for this profile */
-        profileSize = mdl.getProfileSize(ID);
+        profileSize = mdl.getProfileSize(cmmProfile);
 
         profileData = new byte [profileSize];
 
         /* get the data for the profile */
-        mdl.getProfileData(ID, profileData);
+        mdl.getProfileData(cmmProfile, profileData);
 
         return profileData;
     }
@@ -1355,11 +1359,11 @@
             ProfileDeferralMgr.activateProfiles();
         }
 
-        return getData(ID, tagSignature);
+        return getData(cmmProfile, tagSignature);
     }
 
 
-    static byte[] getData(long profileID, int tagSignature) {
+    static byte[] getData(Profile p, int tagSignature) {
     int tagSize;
     byte[] tagData;
 
@@ -1367,12 +1371,12 @@
             PCMM mdl = CMSManager.getModule();
 
             /* get the number of bytes needed for this tag */
-            tagSize = mdl.getTagSize(profileID, tagSignature);
+            tagSize = mdl.getTagSize(p, tagSignature);
 
             tagData = new byte[tagSize]; /* get an array for the tag */
 
             /* get the tag's data */
-            mdl.getTagData(profileID, tagSignature, tagData);
+            mdl.getTagData(p, tagSignature, tagData);
         } catch(CMMException c) {
             tagData = null;
         }
@@ -1403,7 +1407,7 @@
             ProfileDeferralMgr.activateProfiles();
         }
 
-        CMSManager.getModule().setTagData(ID, tagSignature, tagData);
+        CMSManager.getModule().setTagData(cmmProfile, tagSignature, tagData);
     }
 
     /**
@@ -1819,7 +1823,7 @@
                     new StringTokenizer(path, File.pathSeparator);
                 while (st.hasMoreTokens() && ((f == null) || (!f.isFile()))) {
                     dir = st.nextToken();
-                        fullPath = dir + File.separatorChar + fileName;
+                    fullPath = dir + File.separatorChar + fileName;
                     f = new File(fullPath);
                     if (!isChildOf(f, dir)) {
                         f = null;
@@ -1834,7 +1838,7 @@
                     new StringTokenizer(path, File.pathSeparator);
                 while (st.hasMoreTokens() && ((f == null) || (!f.isFile()))) {
                     dir = st.nextToken();
-                        fullPath = dir + File.separatorChar + fileName;
+                    fullPath = dir + File.separatorChar + fileName;
                     f = new File(fullPath);
                 }
             }
--- a/src/share/classes/java/awt/color/ICC_ProfileGray.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/awt/color/ICC_ProfileGray.java	Tue Aug 22 02:03:52 2017 +0100
@@ -35,7 +35,7 @@
 
 package java.awt.color;
 
-import java.awt.image.LookupTable;
+import sun.java2d.cmm.Profile;
 import sun.java2d.cmm.ProfileDeferralInfo;
 
 /**
@@ -76,8 +76,8 @@
     /**
      * Constructs a new ICC_ProfileGray from a CMM ID.
      */
-    ICC_ProfileGray(long ID) {
-        super(ID);
+    ICC_ProfileGray(Profile p) {
+        super(p);
     }
 
     /**
--- a/src/share/classes/java/awt/color/ICC_ProfileRGB.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/awt/color/ICC_ProfileRGB.java	Tue Aug 22 02:03:52 2017 +0100
@@ -35,7 +35,7 @@
 
 package java.awt.color;
 
-import java.awt.image.LookupTable;
+import sun.java2d.cmm.Profile;
 import sun.java2d.cmm.ProfileDeferralInfo;
 
 /**
@@ -114,8 +114,8 @@
      * @param ID The CMM ID for the profile.
      *
      */
-    ICC_ProfileRGB(long ID) {
-        super(ID);
+    ICC_ProfileRGB(Profile p) {
+        super(p);
     }
 
     /**
--- a/src/share/classes/java/io/InputStream.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/io/InputStream.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
--- a/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -70,7 +70,6 @@
     static {
         java.security.AccessController.doPrivileged(
                   new sun.security.action.LoadLibraryAction("net"));
-        init();
     }
 
     /**
@@ -364,6 +363,5 @@
         return connectDisabled;
     }
 
-    native int dataAvailable();
-    private static native void init();
+    abstract int dataAvailable();
 }
--- a/src/share/classes/java/net/Inet4Address.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/net/Inet4Address.java	Tue Aug 22 02:03:52 2017 +0100
@@ -117,11 +117,13 @@
                 holder().address = address;
             }
         }
+        holder().originalHostName = hostName;
     }
     Inet4Address(String hostName, int address) {
         holder().hostName = hostName;
         holder().family = IPv4;
         holder().address = address;
+        holder().originalHostName = hostName;
     }
 
     /**
--- a/src/share/classes/java/net/InetAddress.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/net/InetAddress.java	Tue Aug 22 02:03:52 2017 +0100
@@ -218,7 +218,7 @@
          *
          * Note: May define a new public method in the future if necessary.
          */
-        private String originalHostName;
+        String originalHostName;
 
         InetAddressHolder() {}
 
--- a/src/share/classes/java/net/SocksSocketImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/net/SocksSocketImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -68,6 +68,7 @@
             // Use getHostString() to avoid reverse lookups
             server = ad.getHostString();
             serverPort = ad.getPort();
+            applicationSetProxy = true;
         }
     }
 
@@ -167,8 +168,7 @@
                 userName = pw.getUserName();
                 password = new String(pw.getPassword());
             } else {
-                userName = java.security.AccessController.doPrivileged(
-                        new sun.security.action.GetPropertyAction("user.name"));
+                userName = getUserName();
             }
             if (userName == null)
                 return false;
--- a/src/share/classes/java/nio/Bits.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/nio/Bits.java	Tue Aug 22 02:03:52 2017 +0100
@@ -562,32 +562,13 @@
 
     // -- Processor and memory-system properties --
 
-    private static final ByteOrder byteOrder;
+    private static final ByteOrder byteOrder
+        = unsafe.isBigEndian() ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
 
     static ByteOrder byteOrder() {
-        if (byteOrder == null)
-            throw new Error("Unknown byte order");
         return byteOrder;
     }
 
-    static {
-        long a = unsafe.allocateMemory(8);
-        try {
-            unsafe.putLong(a, 0x0102030405060708L);
-            byte b = unsafe.getByte(a);
-            switch (b) {
-            case 0x01: byteOrder = ByteOrder.BIG_ENDIAN;     break;
-            case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN;  break;
-            default:
-                assert false;
-                byteOrder = null;
-            }
-        } finally {
-            unsafe.freeMemory(a);
-        }
-    }
-
-
     private static int pageSize = -1;
 
     static int pageSize() {
@@ -600,18 +581,9 @@
         return (int)(size + (long)pageSize() - 1L) / pageSize();
     }
 
-    private static boolean unaligned;
-    private static boolean unalignedKnown = false;
+    private static boolean unaligned = unsafe.unalignedAccess();
 
     static boolean unaligned() {
-        if (unalignedKnown)
-            return unaligned;
-        String arch = AccessController.doPrivileged(
-            new sun.security.action.GetPropertyAction("os.arch"));
-        unaligned = arch.equals("i386") || arch.equals("x86")
-            || arch.equals("amd64") || arch.equals("x86_64")
-            || arch.equals("ppc64") || arch.equals("ppc64le");
-        unalignedKnown = true;
         return unaligned;
     }
 
@@ -782,31 +754,131 @@
         }
     }
 
-    static void copyFromCharArray(Object src, long srcPos, long dstAddr,
-                                  long length)
-    {
-        copyFromShortArray(src, srcPos, dstAddr, length);
+    /**
+     * Copy and unconditionally byte swap 16 bit elements from a heap array to off-heap memory
+     *
+     * @param src
+     *        the source array, must be a 16-bit primitive array type
+     * @param srcPos
+     *        byte offset within source array of the first element to read
+     * @param dstAddr
+     *        destination address
+     * @param length
+     *        number of bytes to copy
+     */
+    static void copyFromCharArray(Object src, long srcPos, long dstAddr, long length) {
+        unsafe.copySwapMemory(src, unsafe.arrayBaseOffset(src.getClass()) + srcPos, null, dstAddr, length, 2);
     }
 
-    static void copyToCharArray(long srcAddr, Object dst, long dstPos,
-                                long length)
-    {
-        copyToShortArray(srcAddr, dst, dstPos, length);
+    /**
+     * Copy and unconditionally byte swap 16 bit elements from off-heap memory to a heap array
+     *
+     * @param srcAddr
+     *        source address
+     * @param dst
+     *        destination array, must be a 16-bit primitive array type
+     * @param dstPos
+     *        byte offset within the destination array of the first element to write
+     * @param length
+     *        number of bytes to copy
+     */
+    static void copyToCharArray(long srcAddr, Object dst, long dstPos, long length) {
+        unsafe.copySwapMemory(null, srcAddr, dst, unsafe.arrayBaseOffset(dst.getClass()) + dstPos, length, 2);
+    }
+
+    /**
+     * Copy and unconditionally byte swap 16 bit elements from a heap array to off-heap memory
+     *
+     * @param src
+     *        the source array, must be a 16-bit primitive array type
+     * @param srcPos
+     *        byte offset within source array of the first element to read
+     * @param dstAddr
+     *        destination address
+     * @param length
+     *        number of bytes to copy
+     */
+    static void copyFromShortArray(Object src, long srcPos, long dstAddr, long length) {
+        unsafe.copySwapMemory(src, unsafe.arrayBaseOffset(src.getClass()) + srcPos, null, dstAddr, length, 2);
+    }
+
+    /**
+     * Copy and unconditionally byte swap 16 bit elements from off-heap memory to a heap array
+     *
+     * @param srcAddr
+     *        source address
+     * @param dst
+     *        destination array, must be a 16-bit primitive array type
+     * @param dstPos
+     *        byte offset within the destination array of the first element to write
+     * @param length
+     *        number of bytes to copy
+     */
+    static void copyToShortArray(long srcAddr, Object dst, long dstPos, long length) {
+        unsafe.copySwapMemory(null, srcAddr, dst, unsafe.arrayBaseOffset(dst.getClass()) + dstPos, length, 2);
     }
 
-    static native void copyFromShortArray(Object src, long srcPos, long dstAddr,
-                                          long length);
-    static native void copyToShortArray(long srcAddr, Object dst, long dstPos,
-                                        long length);
+    /**
+     * Copy and unconditionally byte swap 32 bit elements from a heap array to off-heap memory
+     *
+     * @param src
+     *        the source array, must be a 32-bit primitive array type
+     * @param srcPos
+     *        byte offset within source array of the first element to read
+     * @param dstAddr
+     *        destination address
+     * @param length
+     *        number of bytes to copy
+     */
+    static void copyFromIntArray(Object src, long srcPos, long dstAddr, long length) {
+        unsafe.copySwapMemory(src, unsafe.arrayBaseOffset(src.getClass()) + srcPos, null, dstAddr, length, 4);
+    }
+
+    /**
+     * Copy and unconditionally byte swap 32 bit elements from off-heap memory to a heap array
+     *
+     * @param srcAddr
+     *        source address
+     * @param dst
+     *        destination array, must be a 32-bit primitive array type
+     * @param dstPos
+     *        byte offset within the destination array of the first element to write
+     * @param length
+     *        number of bytes to copy
+     */
+    static void copyToIntArray(long srcAddr, Object dst, long dstPos, long length) {
+        unsafe.copySwapMemory(null, srcAddr, dst, unsafe.arrayBaseOffset(dst.getClass()) + dstPos, length, 4);
+    }
 
-    static native void copyFromIntArray(Object src, long srcPos, long dstAddr,
-                                        long length);
-    static native void copyToIntArray(long srcAddr, Object dst, long dstPos,
-                                      long length);
+    /**
+     * Copy and unconditionally byte swap 64 bit elements from a heap array to off-heap memory
+     *
+     * @param src
+     *        the source array, must be a 64-bit primitive array type
+     * @param srcPos
+     *        byte offset within source array of the first element to read
+     * @param dstAddr
+     *        destination address
+     * @param length
+     *        number of bytes to copy
+     */
+    static void copyFromLongArray(Object src, long srcPos, long dstAddr, long length) {
+        unsafe.copySwapMemory(src, unsafe.arrayBaseOffset(src.getClass()) + srcPos, null, dstAddr, length, 8);
+    }
 
-    static native void copyFromLongArray(Object src, long srcPos, long dstAddr,
-                                         long length);
-    static native void copyToLongArray(long srcAddr, Object dst, long dstPos,
-                                       long length);
-
+    /**
+     * Copy and unconditionally byte swap 64 bit elements from off-heap memory to a heap array
+     *
+     * @param srcAddr
+     *        source address
+     * @param dst
+     *        destination array, must be a 64-bit primitive array type
+     * @param dstPos
+     *        byte offset within the destination array of the first element to write
+     * @param length
+     *        number of bytes to copy
+     */
+    static void copyToLongArray(long srcAddr, Object dst, long dstPos, long length) {
+        unsafe.copySwapMemory(null, srcAddr, dst, unsafe.arrayBaseOffset(dst.getClass()) + dstPos, length, 8);
+    }
 }
--- a/src/share/classes/java/security/Policy.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/security/Policy.java	Tue Aug 22 02:03:52 2017 +0100
@@ -33,7 +33,6 @@
 import sun.security.util.Debug;
 import sun.security.util.SecurityConstants;
 
-
 /**
  * A Policy object is responsible for determining whether code executing
  * in the Java runtime environment has permission to perform a
--- a/src/share/classes/java/text/SimpleDateFormat.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/text/SimpleDateFormat.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1657,7 +1657,7 @@
             }
             return (start + zoneNames[nameIndex].length());
         }
-        return 0;
+        return -start;
     }
 
     /**
--- a/src/share/classes/java/util/Currency.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/util/Currency.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -121,11 +121,11 @@
     //   - maps country code to 32-bit int
     //   - 26*26 entries, corresponding to [A-Z]*[A-Z]
     //   - \u007F -> not valid country
-    //   - bits 18-31: unused
-    //   - bits 8-17: numeric code (0 to 1023)
-    //   - bit 7: 1 - special case, bits 0-4 indicate which one
+    //   - bits 20-31: unused
+    //   - bits 10-19: numeric code (0 to 1023)
+    //   - bit 9: 1 - special case, bits 0-4 indicate which one
     //            0 - simple country, bits 0-4 indicate final char of currency code
-    //   - bits 5-6: fraction digits for simple countries, 0 for special cases
+    //   - bits 5-8: fraction digits for simple countries, 0 for special cases
     //   - bits 0-4: final char for currency code for simple country, or ID of special case
     // - special case IDs:
     //   - 0: country has no currency
@@ -163,32 +163,34 @@
     // number of characters from A to Z
     private static final int A_TO_Z = ('Z' - 'A') + 1;
     // entry for invalid country codes
-    private static final int INVALID_COUNTRY_ENTRY = 0x007F;
+    private static final int INVALID_COUNTRY_ENTRY = 0x0000007F;
     // entry for countries without currency
-    private static final int COUNTRY_WITHOUT_CURRENCY_ENTRY = 0x0080;
+    private static final int COUNTRY_WITHOUT_CURRENCY_ENTRY = 0x00000200;
     // mask for simple case country entries
-    private static final int SIMPLE_CASE_COUNTRY_MASK = 0x0000;
+    private static final int SIMPLE_CASE_COUNTRY_MASK = 0x00000000;
     // mask for simple case country entry final character
-    private static final int SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK = 0x001F;
+    private static final int SIMPLE_CASE_COUNTRY_FINAL_CHAR_MASK = 0x0000001F;
     // mask for simple case country entry default currency digits
-    private static final int SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK = 0x0060;
+    private static final int SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_MASK = 0x000001E0;
     // shift count for simple case country entry default currency digits
     private static final int SIMPLE_CASE_COUNTRY_DEFAULT_DIGITS_SHIFT = 5;
+    // maximum number for simple case country entry default currency digits
+    private static final int SIMPLE_CASE_COUNTRY_MAX_DEFAULT_DIGITS = 9;
     // mask for special case country entries
-    private static final int SPECIAL_CASE_COUNTRY_MASK = 0x0080;
+    private static final int SPECIAL_CASE_COUNTRY_MASK = 0x00000200;
     // mask for special case country index
-    private static final int SPECIAL_CASE_COUNTRY_INDEX_MASK = 0x001F;
+    private static final int SPECIAL_CASE_COUNTRY_INDEX_MASK = 0x0000001F;
     // delta from entry index component in main table to index into special case tables
     private static final int SPECIAL_CASE_COUNTRY_INDEX_DELTA = 1;
     // mask for distinguishing simple and special case countries
     private static final int COUNTRY_TYPE_MASK = SIMPLE_CASE_COUNTRY_MASK | SPECIAL_CASE_COUNTRY_MASK;
     // mask for the numeric code of the currency
-    private static final int NUMERIC_CODE_MASK = 0x0003FF00;
+    private static final int NUMERIC_CODE_MASK = 0x000FFC00;
     // shift count for the numeric code of the currency
-    private static final int NUMERIC_CODE_SHIFT = 8;
+    private static final int NUMERIC_CODE_SHIFT = 10;
 
     // Currency data format version
-    private static final int VALID_FORMAT_VERSION = 1;
+    private static final int VALID_FORMAT_VERSION = 2;
 
     static {
         AccessController.doPrivileged(new PrivilegedAction<Object>() {
@@ -240,7 +242,7 @@
                         }
                         Set<String> keys = props.stringPropertyNames();
                         Pattern propertiesPattern =
-                            Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*([0-3])");
+                            Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*(\\d+)");
                         for (String key : keys) {
                            replaceCurrencyData(propertiesPattern,
                                key.toUpperCase(Locale.ROOT),
@@ -691,7 +693,7 @@
      * @param ctry country code
      * @param data currency data.  This is a comma separated string that
      *    consists of "three-letter alphabet code", "three-digit numeric code",
-     *    and "one-digit (0,1,2, or 3) default fraction digit".
+     *    and "one-digit (0-9) default fraction digit".
      *    For example, "JPZ,392,0".
      * @throws
      */
@@ -721,8 +723,14 @@
 
         String code = m.group(1);
         int numeric = Integer.parseInt(m.group(2));
+        int entry = numeric << NUMERIC_CODE_SHIFT;
         int fraction = Integer.parseInt(m.group(3));
-        int entry = numeric << NUMERIC_CODE_SHIFT;
+        if (fraction > SIMPLE_CASE_COUNTRY_MAX_DEFAULT_DIGITS) {
+            info("currency.properties entry for " + ctry +
+                " ignored since the fraction is more than " +
+                SIMPLE_CASE_COUNTRY_MAX_DEFAULT_DIGITS + ":" + curdata, null);
+            return;
+        }
 
         int index;
         for (index = 0; index < scOldCurrencies.length; index++) {
--- a/src/share/classes/java/util/CurrencyData.properties	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/util/CurrencyData.properties	Tue Aug 22 02:03:52 2017 +0100
@@ -23,7 +23,10 @@
 # questions.
 #
 
-formatVersion=1
+# Version of the currency data format.
+#   1: initial
+#   2: Change in minor unit (allowing 4-9 digits)
+formatVersion=2
 
 # Version of the currency code information in this class.
 # It is a serial number that accompanies with each amendment.
@@ -36,7 +39,7 @@
 all=ADP020-AED784-AFA004-AFN971-ALL008-AMD051-ANG532-AOA973-ARS032-ATS040-AUD036-\
     AWG533-AYM945-AZM031-AZN944-BAM977-BBD052-BDT050-BEF056-BGL100-BGN975-BHD048-BIF108-\
     BMD060-BND096-BOB068-BOV984-BRL986-BSD044-BTN064-BWP072-BYB112-BYR974-\
-    BZD084-CAD124-CDF976-CHF756-CLF990-CLP152-CNY156-COP170-CRC188-CSD891-CUP192-CUC931-\
+    BZD084-CAD124-CDF976-CHE947-CHF756-CHW948-CLF990-CLP152-CNY156-COP170-COU970-CRC188-CSD891-CUP192-CUC931-\
     CVE132-CYP196-CZK203-DEM276-DJF262-DKK208-DOP214-DZD012-EEK233-EGP818-\
     ERN232-ESP724-ETB230-EUR978-FIM246-FJD242-FKP238-FRF250-GBP826-GEL981-\
     GHC288-GHS936-GIP292-GMD270-GNF324-GRD300-GTQ320-GWP624-GYD328-HKD344-HNL340-\
@@ -49,7 +52,7 @@
     PKR586-PLN985-PTE620-PYG600-QAR634-ROL946-RON946-RSD941-RUB643-RUR810-RWF646-SAR682-\
     SBD090-SCR690-SDD736-SDG938-SEK752-SGD702-SHP654-SIT705-SKK703-SLL694-SOS706-\
     SRD968-SRG740-SSP728-STD678-SVC222-SYP760-SZL748-THB764-TJS972-TMM795-TMT934-TND788-TOP776-\
-    TPE626-TRL792-TRY949-TTD780-TWD901-TZS834-UAH980-UGX800-USD840-USN997-USS998-\
+    TPE626-TRL792-TRY949-TTD780-TWD901-TZS834-UAH980-UGX800-USD840-USN997-USS998-UYI940-\
     UYU858-UZS860-VEB862-VEF937-VND704-VUV548-WST882-XAF950-XAG961-XAU959-XBA955-\
     XBB956-XBC957-XBD958-XCD951-XDR960-XFO000-XFU000-XOF952-XPD964-XPF953-\
     XPT962-XSU994-XTS963-XUA965-XXX999-YER886-YUM891-ZAR710-ZMK894-ZMW967-ZWD716-ZWL932-\
@@ -579,16 +582,17 @@
 ZW=ZWL
 
 
-# List of currencies with 0, 1, OR 3 decimals for minor units, or where there
-# are no minor units defined. All others use 2 decimals.
+# List of currencies with non-2digit decimals for minor units,
+# or where there are no minor units defined. All others use 2 decimals.
 
 minor0=\
-    ADP-BEF-BIF-BYB-BYR-CLF-CLP-DJF-ESP-GNF-\
+    ADP-BEF-BIF-BYB-BYR-CLP-DJF-ESP-GNF-\
     GRD-ISK-ITL-JPY-KMF-KRW-LUF-MGF-PYG-PTE-RWF-\
-    TPE-TRL-UGX-VND-VUV-XAF-XOF-XPF
-minor1=
+    TPE-TRL-UGX-UYI-VND-VUV-XAF-XOF-XPF
 minor3=\
     BHD-IQD-JOD-KWD-LYD-OMR-TND
+minor4=\
+    CLF
 minorUndefined=\
     XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-\
     XPT-XSU-XTS-XUA-XXX
--- a/src/share/classes/java/util/zip/Deflater.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/util/zip/Deflater.java	Tue Aug 22 02:03:52 2017 +0100
@@ -306,7 +306,9 @@
      * should be called in order to provide more input
      */
     public boolean needsInput() {
-        return len <= 0;
+        synchronized (zsRef) {
+            return len <= 0;
+        }
     }
 
     /**
--- a/src/share/classes/java/util/zip/ZStreamRef.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/util/zip/ZStreamRef.java	Tue Aug 22 02:03:52 2017 +0100
@@ -31,7 +31,7 @@
 
 class ZStreamRef {
 
-    private long address;
+    private volatile long address;
     ZStreamRef (long address) {
         this.address = address;
     }
--- a/src/share/classes/java/util/zip/ZipFile.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/java/util/zip/ZipFile.java	Tue Aug 22 02:03:52 2017 +0100
@@ -54,7 +54,7 @@
  */
 public
 class ZipFile implements ZipConstants, Closeable {
-    private long jzfile;           // address of jzfile data
+    private long jzfile;  // address of jzfile data
     private final String name;     // zip file name
     private final int total;       // total number of entries
     private final boolean locsig;  // if zip file starts with LOCSIG (usually true)
@@ -667,7 +667,7 @@
      * (possibly compressed) zip file entry.
      */
    private class ZipFileInputStream extends InputStream {
-        private volatile boolean closeRequested = false;
+        private volatile boolean zfisCloseRequested = false;
         protected long jzentry; // address of jzentry data
         private   long pos;     // current position within entry data
         protected long rem;     // number of remaining bytes within entry
@@ -681,24 +681,27 @@
         }
 
         public int read(byte b[], int off, int len) throws IOException {
-            if (rem == 0) {
-                return -1;
-            }
-            if (len <= 0) {
-                return 0;
-            }
-            if (len > rem) {
-                len = (int) rem;
-            }
             synchronized (ZipFile.this) {
+                long rem = this.rem;
+                long pos = this.pos;
+                if (rem == 0) {
+                    return -1;
+                }
+                if (len <= 0) {
+                    return 0;
+                }
+                if (len > rem) {
+                    len = (int) rem;
+                }
+
+                // Check if ZipFile open
                 ensureOpenOrZipException();
-
                 len = ZipFile.read(ZipFile.this.jzfile, jzentry, pos, b,
                                    off, len);
-            }
-            if (len > 0) {
-                pos += len;
-                rem -= len;
+                if (len > 0) {
+                    this.pos = (pos + len);
+                    this.rem = (rem - len);
+                }
             }
             if (rem == 0) {
                 close();
@@ -735,9 +738,9 @@
         }
 
         public void close() {
-            if (closeRequested)
+            if (zfisCloseRequested)
                 return;
-            closeRequested = true;
+            zfisCloseRequested = true;
 
             rem = 0;
             synchronized (ZipFile.this) {
--- a/src/share/classes/javax/crypto/Cipher.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/crypto/Cipher.java	Tue Aug 22 02:03:52 2017 +0100
@@ -203,12 +203,6 @@
     // The transformation
     private String transformation;
 
-    // Crypto permission representing the maximum allowable cryptographic
-    // strength that this Cipher object can be used for. (The cryptographic
-    // strength is a function of the keysize and algorithm parameters encoded
-    // in the crypto permission.)
-    private CryptoPermission cryptoPerm;
-
     // The exemption mechanism that needs to be enforced
     private ExemptionMechanism exmech;
 
@@ -249,16 +243,9 @@
     protected Cipher(CipherSpi cipherSpi,
                      Provider provider,
                      String transformation) {
-        // See bug 4341369 & 4334690 for more info.
-        // If the caller is trusted, then okey.
-        // Otherwise throw a NullPointerException.
-        if (!JceSecurityManager.INSTANCE.isCallerTrusted()) {
-            throw new NullPointerException();
-        }
         this.spi = cipherSpi;
         this.provider = provider;
         this.transformation = transformation;
-        this.cryptoPerm = CryptoAllPermission.INSTANCE;
         this.lock = null;
     }
 
@@ -271,7 +258,6 @@
     Cipher(CipherSpi cipherSpi, String transformation) {
         this.spi = cipherSpi;
         this.transformation = transformation;
-        this.cryptoPerm = CryptoAllPermission.INSTANCE;
         this.lock = null;
     }
 
@@ -499,9 +485,6 @@
         Exception failure = null;
         while (t.hasNext()) {
             Service s = t.next();
-            if (JceSecurity.canUseProvider(s.getProvider()) == false) {
-                continue;
-            }
             Transform tr = getTransform(s, transforms);
             if (tr == null) {
                 // should never happen
@@ -625,26 +608,12 @@
         }
         Exception failure = null;
         List<Transform> transforms = getTransforms(transformation);
-        boolean providerChecked = false;
         String paddingError = null;
         for (Transform tr : transforms) {
             Service s = provider.getService("Cipher", tr.transform);
             if (s == null) {
                 continue;
             }
-            if (providerChecked == false) {
-                // for compatibility, first do the lookup and then verify
-                // the provider. this makes the difference between a NSAE
-                // and a SecurityException if the
-                // provider does not support the algorithm.
-                Exception ve = JceSecurity.getVerificationResult(provider);
-                if (ve != null) {
-                    String msg = "JCE cannot authenticate the provider "
-                        + provider.getName();
-                    throw new SecurityException(msg, ve);
-                }
-                providerChecked = true;
-            }
             if (tr.supportsMode(s) == S_NO) {
                 continue;
             }
@@ -657,7 +626,6 @@
                 tr.setModePadding(spi);
                 Cipher cipher = new Cipher(spi, transformation);
                 cipher.provider = s.getProvider();
-                cipher.initCryptoPermission();
                 return cipher;
             } catch (Exception e) {
                 failure = e;
@@ -676,22 +644,6 @@
                 ("No such algorithm: " + transformation, failure);
     }
 
-    // If the requested crypto service is export-controlled,
-    // determine the maximum allowable keysize.
-    private void initCryptoPermission() throws NoSuchAlgorithmException {
-        if (JceSecurity.isRestricted() == false) {
-            cryptoPerm = CryptoAllPermission.INSTANCE;
-            exmech = null;
-            return;
-        }
-        cryptoPerm = getConfiguredPermission(transformation);
-        // Instantiate the exemption mechanism (if required)
-        String exmechName = cryptoPerm.getExemptionMechanism();
-        if (exmechName != null) {
-            exmech = ExemptionMechanism.getInstance(exmechName);
-        }
-    }
-
     // max number of debug warnings to print from chooseFirstProvider()
     private static int warnCount = 10;
 
@@ -733,9 +685,6 @@
                     s = serviceIterator.next();
                     thisSpi = null;
                 }
-                if (JceSecurity.canUseProvider(s.getProvider()) == false) {
-                    continue;
-                }
                 Transform tr = getTransform(s, transforms);
                 if (tr == null) {
                     // should never happen
@@ -753,7 +702,6 @@
                         thisSpi = (CipherSpi)obj;
                     }
                     tr.setModePadding(thisSpi);
-                    initCryptoPermission();
                     spi = thisSpi;
                     provider = s.getProvider();
                     // not needed any more
@@ -785,19 +733,15 @@
             InvalidAlgorithmParameterException {
         switch (type) {
         case I_KEY:
-            checkCryptoPerm(thisSpi, key);
             thisSpi.engineInit(opmode, key, random);
             break;
         case I_PARAMSPEC:
-            checkCryptoPerm(thisSpi, key, paramSpec);
             thisSpi.engineInit(opmode, key, paramSpec, random);
             break;
         case I_PARAMS:
-            checkCryptoPerm(thisSpi, key, params);
             thisSpi.engineInit(opmode, key, params, random);
             break;
         case I_CERT:
-            checkCryptoPerm(thisSpi, key);
             thisSpi.engineInit(opmode, key, random);
             break;
         default:
@@ -831,9 +775,6 @@
                 if (s.supportsParameter(key) == false) {
                     continue;
                 }
-                if (JceSecurity.canUseProvider(s.getProvider()) == false) {
-                    continue;
-                }
                 Transform tr = getTransform(s, transforms);
                 if (tr == null) {
                     // should never happen
@@ -847,7 +788,6 @@
                         thisSpi = (CipherSpi)s.newInstance(null);
                     }
                     tr.setModePadding(thisSpi);
-                    initCryptoPermission();
                     implInit(thisSpi, initType, opmode, key, paramSpec,
                                                         params, random);
                     provider = s.getProvider();
@@ -993,107 +933,6 @@
         return exmech;
     }
 
-    //
-    // Crypto permission check code below
-    //
-    private void checkCryptoPerm(CipherSpi checkSpi, Key key)
-            throws InvalidKeyException {
-        if (cryptoPerm == CryptoAllPermission.INSTANCE) {
-            return;
-        }
-        // Check if key size and default parameters are within legal limits
-        AlgorithmParameterSpec params;
-        try {
-            params = getAlgorithmParameterSpec(checkSpi.engineGetParameters());
-        } catch (InvalidParameterSpecException ipse) {
-            throw new InvalidKeyException
-                ("Unsupported default algorithm parameters");
-        }
-        if (!passCryptoPermCheck(checkSpi, key, params)) {
-            throw new InvalidKeyException(
-                "Illegal key size or default parameters");
-        }
-    }
-
-    private void checkCryptoPerm(CipherSpi checkSpi, Key key,
-            AlgorithmParameterSpec params) throws InvalidKeyException,
-            InvalidAlgorithmParameterException {
-        if (cryptoPerm == CryptoAllPermission.INSTANCE) {
-            return;
-        }
-        // Determine keysize and check if it is within legal limits
-        if (!passCryptoPermCheck(checkSpi, key, null)) {
-            throw new InvalidKeyException("Illegal key size");
-        }
-        if ((params != null) && (!passCryptoPermCheck(checkSpi, key, params))) {
-            throw new InvalidAlgorithmParameterException("Illegal parameters");
-        }
-    }
-
-    private void checkCryptoPerm(CipherSpi checkSpi, Key key,
-            AlgorithmParameters params)
-            throws InvalidKeyException, InvalidAlgorithmParameterException {
-        if (cryptoPerm == CryptoAllPermission.INSTANCE) {
-            return;
-        }
-        // Convert the specified parameters into specs and then delegate.
-        AlgorithmParameterSpec pSpec;
-        try {
-            pSpec = getAlgorithmParameterSpec(params);
-        } catch (InvalidParameterSpecException ipse) {
-            throw new InvalidAlgorithmParameterException
-                ("Failed to retrieve algorithm parameter specification");
-        }
-        checkCryptoPerm(checkSpi, key, pSpec);
-    }
-
-    private boolean passCryptoPermCheck(CipherSpi checkSpi, Key key,
-                                        AlgorithmParameterSpec params)
-            throws InvalidKeyException {
-        String em = cryptoPerm.getExemptionMechanism();
-        int keySize = checkSpi.engineGetKeySize(key);
-        // Use the "algorithm" component of the cipher
-        // transformation so that the perm check would
-        // work when the key has the "aliased" algo.
-        String algComponent;
-        int index = transformation.indexOf('/');
-        if (index != -1) {
-            algComponent = transformation.substring(0, index);
-        } else {
-            algComponent = transformation;
-        }
-        CryptoPermission checkPerm =
-            new CryptoPermission(algComponent, keySize, params, em);
-
-        if (!cryptoPerm.implies(checkPerm)) {
-            if (debug != null) {
-                debug.println("Crypto Permission check failed");
-                debug.println("granted: " + cryptoPerm);
-                debug.println("requesting: " + checkPerm);
-            }
-            return false;
-        }
-        if (exmech == null) {
-            return true;
-        }
-        try {
-            if (!exmech.isCryptoAllowed(key)) {
-                if (debug != null) {
-                    debug.println(exmech.getName() + " isn't enforced");
-                }
-                return false;
-            }
-        } catch (ExemptionMechanismException eme) {
-            if (debug != null) {
-                debug.println("Cannot determine whether "+
-                              exmech.getName() + " has been enforced");
-                eme.printStackTrace();
-            }
-            return false;
-        }
-        return true;
-    }
-
     // check if opmode is one of the defined constants
     // throw InvalidParameterExeption if not
     private static void checkOpmode(int opmode) {
@@ -1223,7 +1062,6 @@
         checkOpmode(opmode);
 
         if (spi != null) {
-            checkCryptoPerm(spi, key);
             spi.engineInit(opmode, key, random);
         } else {
             try {
@@ -1365,7 +1203,6 @@
         checkOpmode(opmode);
 
         if (spi != null) {
-            checkCryptoPerm(spi, key, params);
             spi.engineInit(opmode, key, params, random);
         } else {
             chooseProvider(I_PARAMSPEC, opmode, key, params, null, random);
@@ -1502,7 +1339,6 @@
         checkOpmode(opmode);
 
         if (spi != null) {
-            checkCryptoPerm(spi, key, params);
             spi.engineInit(opmode, key, params, random);
         } else {
             chooseProvider(I_PARAMS, opmode, key, null, params, random);
@@ -1681,7 +1517,6 @@
             (certificate==null? null:certificate.getPublicKey());
 
         if (spi != null) {
-            checkCryptoPerm(spi, publicKey);
             spi.engineInit(opmode, publicKey, random);
         } else {
             try {
@@ -2536,12 +2371,15 @@
         return null;
     }
 
+    // Used by getMaxAllowedKeyLength and getMaxAllowedParameterSpec
+    // always returns CryptoAllPermission. Old stuff from bad old days.
     private static CryptoPermission getConfiguredPermission(
             String transformation) throws NullPointerException,
             NoSuchAlgorithmException {
         if (transformation == null) throw new NullPointerException();
-        String[] parts = tokenizeTransformation(transformation);
-        return JceSecurityManager.INSTANCE.getCryptoPermission(parts[0]);
+	// Called to make sure it is a valid transformation.
+        tokenizeTransformation(transformation);
+        return CryptoAllPermission.INSTANCE;
     }
 
     /**
--- a/src/share/classes/javax/sql/rowset/BaseRowSet.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/sql/rowset/BaseRowSet.java	Tue Aug 22 02:03:52 2017 +0100
@@ -461,7 +461,7 @@
      * <code>false</code> that it is not. The default is <code>true</code>.
      * @serial
      */
-    private boolean escapeProcessing;
+    private boolean escapeProcessing = true;
 
     /**
      * A constant indicating the isolation level of the connection
--- a/src/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -48,6 +48,8 @@
  * Therefore, any <code>RowSetMetaDataImpl</code> method that retrieves information
  * is defined as having unspecified behavior when it is called
  * before the <code>RowSet</code> object contains data.
+ *
+ * @since 1.5
  */
 public class RowSetMetaDataImpl implements RowSetMetaData,  Serializable {
 
@@ -579,7 +581,7 @@
      *
      * @param columnIndex the first column is 1, the second is 2, and so on;
      *        must be between <code>1</code> and the number of columns, inclusive
-     * @return <code>true</code> if if a value in the designated column is a signed
+     * @return <code>true</code> if a value in the designated column is a signed
      *         number; <code>false</code> otherwise
      * @throws SQLException if a database access error occurs
      *         or the given column number is out of bounds
@@ -605,7 +607,7 @@
     }
 
     /**
-     * Retrieves the the suggested column title for the designated
+     * Retrieves the suggested column title for the designated
      * column for use in printouts and displays.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on;
@@ -801,8 +803,10 @@
      * @throws SQLException if a database access error occurs
      * or the given column number is out of bounds
      */
-    public  boolean isDefinitelyWritable(int columnIndex)
-        throws SQLException { return true;}
+    public  boolean isDefinitelyWritable(int columnIndex) throws SQLException {
+        checkColRange(columnIndex);
+        return true;
+    }
 
     /**
      * Retrieves the fully-qualified name of the class in the Java
@@ -1071,7 +1075,7 @@
         public int colType;
 
         /**
-         * The field that holds the the type name used by this particular data source
+         * The field that holds the type name used by this particular data source
          * for the value stored in this column.
          *
          * @serial
@@ -1079,7 +1083,7 @@
         public String colTypeName;
 
         /**
-         * The field that holds the updatablity boolean per column of a RowSet
+         * The field that holds the updatability boolean per column of a RowSet
          *
          * @serial
          */
--- a/src/share/classes/javax/sql/rowset/RowSetWarning.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/sql/rowset/RowSetWarning.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -50,15 +50,12 @@
  * The inherited methods <code>getMessage</code>, <code>getSQLState</code>,
  * and <code>getErrorCode</code> retrieve information contained in a
  * <code>RowSetWarning</code> object.
+ *
+ * @since 1.5
  */
 public class RowSetWarning extends SQLException {
 
     /**
-     * RowSetWarning object handle.
-     */
-     private RowSetWarning rwarning;
-
-    /**
      * Constructs a <code>RowSetWarning</code> object
      * with the given value for the reason; SQLState defaults to null,
      * and vendorCode defaults to 0.
@@ -109,7 +106,7 @@
      * @param reason a <code>String</code> giving a description of the
      *        warning;
      * @param SQLState an XOPEN code identifying the warning; if a non standard
-     *        XPOEN <i>SQLState</i> is supplied, no exception is thrown.
+     *        XOPEN <i>SQLState</i> is supplied, no exception is thrown.
      * @param vendorCode a database vendor-specific warning code
      */
     public RowSetWarning(java.lang.String reason, java.lang.String SQLState, int vendorCode) {
@@ -126,7 +123,15 @@
      * @see #setNextWarning
      */
     public RowSetWarning getNextWarning() {
-        return rwarning;
+        SQLException warning = getNextException();
+        if (  warning == null || warning instanceof RowSetWarning) {
+            return (RowSetWarning)warning;
+        } else {
+            // The chained value isn't a RowSetWarning.
+            // This is a programming error by whoever added it to
+            // the RowSetWarning chain.  We throw a Java "Error".
+            throw new Error("RowSetWarning chain holds value that is not a RowSetWarning: ");
+        }
     }
 
     /**
@@ -139,7 +144,7 @@
      * @see #getNextWarning
      */
     public void setNextWarning(RowSetWarning warning) {
-        rwarning = warning;
+        setNextException(warning);
     }
 
     static final long serialVersionUID = 6678332766434564774L;
--- a/src/share/classes/javax/swing/JComponent.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/JComponent.java	Tue Aug 22 02:03:52 2017 +0100
@@ -27,22 +27,15 @@
 
 import java.util.HashSet;
 import java.util.Hashtable;
-import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.Locale;
 import java.util.Vector;
 import java.util.EventListener;
 import java.util.Set;
-import java.util.Map;
-import java.util.HashMap;
 
 import java.awt.*;
 import java.awt.event.*;
-import java.awt.image.VolatileImage;
-import java.awt.Graphics2D;
 import java.awt.peer.LightweightPeer;
-import java.awt.dnd.DropTarget;
-import java.awt.font.FontRenderContext;
 import java.beans.PropertyChangeListener;
 import java.beans.VetoableChangeListener;
 import java.beans.VetoableChangeSupport;
@@ -224,8 +217,7 @@
      * indicates the EDT is calling into the InputVerifier from the
      * returned component.
      */
-    private static final Object INPUT_VERIFIER_SOURCE_KEY =
-            new StringBuilder("InputVerifierSourceKey");
+    private static final Object INPUT_VERIFIER_SOURCE_KEY = new Object(); // InputVerifierSourceKey
 
     /* The following fields support set methods for the corresponding
      * java.awt.Component properties.
@@ -373,8 +365,7 @@
     private static final String defaultLocale = "JComponent.defaultLocale";
 
     private static Component componentObtainingGraphicsFrom;
-    private static Object componentObtainingGraphicsFromLock = new
-            StringBuilder("componentObtainingGraphicsFrom");
+    private static Object componentObtainingGraphicsFromLock = new Object(); // componentObtainingGraphicsFrom
 
     /**
      * AA text hints.
--- a/src/share/classes/javax/swing/JDialog.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/JDialog.java	Tue Aug 22 02:03:52 2017 +0100
@@ -103,8 +103,7 @@
      * Key into the AppContext, used to check if should provide decorations
      * by default.
      */
-    private static final Object defaultLookAndFeelDecoratedKey =
-            new StringBuffer("JDialog.defaultLookAndFeelDecorated");
+    private static final Object defaultLookAndFeelDecoratedKey = new Object(); // JDialog.defaultLookAndFeelDecorated
 
     private int defaultCloseOperation = HIDE_ON_CLOSE;
 
--- a/src/share/classes/javax/swing/JEditorPane.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/JEditorPane.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1534,12 +1534,9 @@
     /*
      * Private AppContext keys for this class's static variables.
      */
-    private static final Object kitRegistryKey =
-        new StringBuffer("JEditorPane.kitRegistry");
-    private static final Object kitTypeRegistryKey =
-        new StringBuffer("JEditorPane.kitTypeRegistry");
-    private static final Object kitLoaderRegistryKey =
-        new StringBuffer("JEditorPane.kitLoaderRegistry");
+    private static final Object kitRegistryKey = new Object(); // JEditorPane.kitRegistry
+    private static final Object kitTypeRegistryKey = new Object(); // JEditorPane.kitTypeRegistry
+    private static final Object kitLoaderRegistryKey = new Object(); // JEditorPane.kitLoaderRegistry
 
     /**
      * @see #getUIClassID
--- a/src/share/classes/javax/swing/JFrame.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/JFrame.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2009, 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,11 +26,6 @@
 
 import java.awt.*;
 import java.awt.event.*;
-import java.beans.PropertyChangeListener;
-import java.util.Locale;
-import java.util.Vector;
-import java.io.Serializable;
-
 import javax.accessibility.*;
 
 
@@ -130,8 +125,7 @@
      * Key into the AppContext, used to check if should provide decorations
      * by default.
      */
-    private static final Object defaultLookAndFeelDecoratedKey =
-            new StringBuffer("JFrame.defaultLookAndFeelDecorated");
+    private static final Object defaultLookAndFeelDecoratedKey = new Object(); // JFrame.defaultLookAndFeelDecorated
 
     private int defaultCloseOperation = HIDE_ON_CLOSE;
 
--- a/src/share/classes/javax/swing/JInternalFrame.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/JInternalFrame.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2009, 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 java.io.ObjectOutputStream;
 import java.io.IOException;
-import java.lang.StringBuilder;
 import java.beans.PropertyChangeListener;
 import sun.awt.AppContext;
 import sun.swing.SwingUtilities2;
@@ -222,8 +221,7 @@
     /** Constrained property name indicating that the internal frame is iconified. */
     public final static String IS_ICON_PROPERTY = "icon";
 
-    private static final Object PROPERTY_CHANGE_LISTENER_KEY =
-        new StringBuilder("InternalFramePropertyChangeListener");
+    private static final Object PROPERTY_CHANGE_LISTENER_KEY = new Object(); // InternalFramePropertyChangeListener
 
     private static void addPropertyChangeListenerIfNecessary() {
         if (AppContext.getAppContext().get(PROPERTY_CHANGE_LISTENER_KEY) ==
--- a/src/share/classes/javax/swing/JMenu.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/JMenu.java	Tue Aug 22 02:03:52 2017 +0100
@@ -481,7 +481,8 @@
             }
             // Then the y:
             y = s.height + yOffset;    // Prefer dropping down
-            if (position.y + y + pmSize.height >= screenBounds.height &&
+            if (position.y + y + pmSize.height >= screenBounds.height
+                                                  + screenBounds.y &&
                 // popup doesn't fit - place it wherever there's more room
                 screenBounds.height - s.height < 2*(position.y
                                                   - screenBounds.y)) {
--- a/src/share/classes/javax/swing/JPopupMenu.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/JPopupMenu.java	Tue Aug 22 02:03:52 2017 +0100
@@ -33,20 +33,15 @@
 import java.io.Serializable;
 import java.beans.*;
 
-import java.util.Locale;
 import java.util.Vector;
-import java.util.Hashtable;
 import javax.accessibility.*;
 import javax.swing.plaf.PopupMenuUI;
-import javax.swing.plaf.ComponentUI;
 import javax.swing.plaf.basic.BasicComboPopup;
 import javax.swing.event.*;
 
 import sun.awt.SunToolkit;
 import sun.security.util.SecurityConstants;
 
-import java.applet.Applet;
-
 /**
  * An implementation of a popup menu -- a small window that pops up
  * and displays a series of choices. A <code>JPopupMenu</code> is used for the
@@ -94,8 +89,7 @@
     /**
      * Key used in AppContext to determine if light way popups are the default.
      */
-    private static final Object defaultLWPopupEnabledKey =
-        new StringBuffer("JPopupMenu.defaultLWPopupEnabledKey");
+    private static final Object defaultLWPopupEnabledKey = new Object(); // JPopupMenu.defaultLWPopupEnabledKey
 
     /** Bug#4425878-Property javax.swing.adjustPopupLocationToFit introduced */
     static boolean popupPostionFixDisabled = false;
--- a/src/share/classes/javax/swing/MenuSelectionManager.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/MenuSelectionManager.java	Tue Aug 22 02:03:52 2017 +0100
@@ -45,8 +45,7 @@
     private static final boolean VERBOSE = false; // show reuse hits/misses
     private static final boolean DEBUG =   false;  // show bad params, misc.
 
-    private static final StringBuilder MENU_SELECTION_MANAGER_KEY =
-                       new StringBuilder("javax.swing.MenuSelectionManager");
+    private static final Object MENU_SELECTION_MANAGER_KEY = new Object(); // javax.swing.MenuSelectionManager
 
     /**
      * Returns the default menu selection manager.
--- a/src/share/classes/javax/swing/PopupFactory.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/PopupFactory.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2009, 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
@@ -65,8 +65,7 @@
      * <code>AppContext</code>. This is the key used in the
      * <code>AppContext</code> to locate the <code>PopupFactory</code>.
      */
-    private static final Object SharedInstanceKey =
-        new StringBuffer("PopupFactory.SharedInstanceKey");
+    private static final Object SharedInstanceKey = new Object(); // PopupFactory.SharedInstanceKey
 
     /**
      * Max number of items to store in any one particular cache.
@@ -301,8 +300,7 @@
      * Popup implementation that uses a Window as the popup.
      */
     private static class HeavyWeightPopup extends Popup {
-        private static final Object heavyWeightPopupCacheKey =
-                 new StringBuffer("PopupFactory.heavyWeightPopupCache");
+        private static final Object heavyWeightPopupCacheKey = new Object(); // PopupFactory.heavyWeightPopupCache
 
         private volatile boolean isCacheEnabled = true;
 
@@ -661,8 +659,7 @@
      * Popup implementation that uses a JPanel as the popup.
      */
     private static class LightWeightPopup extends ContainerPopup {
-        private static final Object lightWeightPopupCacheKey =
-                         new StringBuffer("PopupFactory.lightPopupCache");
+        private static final Object lightWeightPopupCacheKey = new Object(); // PopupFactory.lightPopupCache
 
         /**
          * Returns a light weight <code>Popup</code> implementation. If
@@ -813,8 +810,7 @@
      * Popup implementation that uses a Panel as the popup.
      */
     private static class MediumWeightPopup extends ContainerPopup {
-        private static final Object mediumWeightPopupCacheKey =
-                             new StringBuffer("PopupFactory.mediumPopupCache");
+        private static final Object mediumWeightPopupCacheKey = new Object(); // PopupFactory.mediumPopupCache
 
         /** Child of the panel. The contents are added to this. */
         private JRootPane rootPane;
--- a/src/share/classes/javax/swing/SortingFocusTraversalPolicy.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/SortingFocusTraversalPolicy.java	Tue Aug 22 02:03:52 2017 +0100
@@ -566,7 +566,10 @@
             } else if (comp instanceof Container && comp != aContainer) {
                 Container cont = (Container)comp;
                 if (cont.isFocusTraversalPolicyProvider()) {
-                    return cont.getFocusTraversalPolicy().getLastComponent(cont);
+                    Component retComp = cont.getFocusTraversalPolicy().getLastComponent(cont);
+                    if (retComp != null) {
+                        return retComp;
+                    }
                 }
             }
         }
--- a/src/share/classes/javax/swing/SwingUtilities.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/SwingUtilities.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1749,8 +1749,7 @@
 
 
     // Don't use String, as it's not guaranteed to be unique in a Hashtable.
-    private static final Object sharedOwnerFrameKey =
-       new StringBuffer("SwingUtilities.sharedOwnerFrame");
+    private static final Object sharedOwnerFrameKey = new Object(); // SwingUtilities.sharedOwnerFrame
 
     static class SharedOwnerFrame extends Frame implements WindowListener {
         public void addNotify() {
--- a/src/share/classes/javax/swing/SwingWorker.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/SwingWorker.java	Tue Aug 22 02:03:52 2017 +0100
@@ -811,7 +811,7 @@
         return executorService;
     }
 
-    private static final Object DO_SUBMIT_KEY = new StringBuilder("doSubmit");
+    private static final Object DO_SUBMIT_KEY = new Object(); // doSubmit
     private static AccumulativeRunnable<Runnable> getDoSubmit() {
         synchronized (DO_SUBMIT_KEY) {
             final AppContext appContext = AppContext.getAppContext();
--- a/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java	Tue Aug 22 02:03:52 2017 +0100
@@ -125,6 +125,8 @@
     protected MouseMotionListener popupMouseMotionListener;
     protected KeyListener popupKeyListener;
 
+    private MouseWheelListener mouseWheelListener;
+
     // This is used for knowing when to cache the minimum preferred size.
     // If the data in the list changes, the cached value get marked for recalc.
     // Added to the current JComboBox model
@@ -173,11 +175,9 @@
     private Dimension cachedDisplaySize = new Dimension( 0, 0 );
 
     // Key used for lookup of the DefaultListCellRenderer in the AppContext.
-    private static final Object COMBO_UI_LIST_CELL_RENDERER_KEY =
-                        new StringBuffer("DefaultListCellRendererKey");
+    private static final Object COMBO_UI_LIST_CELL_RENDERER_KEY = new Object(); // DefaultListCellRendererKey
 
-    static final StringBuffer HIDE_POPUP_KEY
-                  = new StringBuffer("HidePopupKey");
+    static final Object HIDE_POPUP_KEY = new Object(); // HidePopupKey
 
     /**
      * Whether or not all cells have the same baseline.
@@ -375,6 +375,10 @@
                 comboBox.getModel().addListDataListener( listDataListener );
             }
         }
+
+        if ((mouseWheelListener = createMouseWheelListener()) != null) {
+            comboBox.addMouseWheelListener(mouseWheelListener);
+        }
     }
 
     /**
@@ -421,6 +425,9 @@
                 comboBox.getModel().removeListDataListener( listDataListener );
             }
         }
+        if (mouseWheelListener != null) {
+            comboBox.removeMouseWheelListener(mouseWheelListener);
+        }
     }
 
     /**
@@ -534,6 +541,10 @@
         return handler;
     }
 
+    private MouseWheelListener createMouseWheelListener() {
+        return getHandler();
+    }
+
     //
     // end UI Initialization
     //======================
@@ -1667,7 +1678,8 @@
     //
     private class Handler implements ActionListener, FocusListener,
                                      KeyListener, LayoutManager,
-                                     ListDataListener, PropertyChangeListener {
+                                     ListDataListener, PropertyChangeListener,
+                                     MouseWheelListener {
         //
         // PropertyChangeListener
         //
@@ -1937,21 +1949,25 @@
         public void actionPerformed(ActionEvent evt) {
             Object item = comboBox.getEditor().getItem();
             if (item != null) {
-             if(!comboBox.isPopupVisible() && !item.equals(comboBox.getSelectedItem())) {
-              comboBox.setSelectedItem(comboBox.getEditor().getItem());
-             }
-             ActionMap am = comboBox.getActionMap();
-             if (am != null) {
-                Action action = am.get("enterPressed");
-                if (action != null) {
-                    action.actionPerformed(new ActionEvent(comboBox, evt.getID(),
-                                           evt.getActionCommand(),
-                                           evt.getModifiers()));
+                if (!comboBox.isPopupVisible() && !item.equals(comboBox.getSelectedItem())) {
+                    comboBox.setSelectedItem(comboBox.getEditor().getItem());
+                }
+                ActionMap am = comboBox.getActionMap();
+                if (am != null) {
+                    Action action = am.get("enterPressed");
+                    if (action != null) {
+                        action.actionPerformed(new ActionEvent(comboBox, evt.getID(),
+                                evt.getActionCommand(),
+                                evt.getModifiers()));
+                    }
                 }
             }
-       }
+        }
+
+        public void mouseWheelMoved(MouseWheelEvent e) {
+            e.consume();
+        }
    }
-  }
 
     class DefaultKeySelectionManager implements JComboBox.KeySelectionManager, UIResource {
         private String prefix = "";
--- a/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java	Tue Aug 22 02:03:52 2017 +0100
@@ -181,6 +181,8 @@
      */
     protected ItemListener             itemListener;
 
+    private MouseWheelListener         scrollerMouseWheelListener;
+
     /**
      * This protected field is implementation specific. Do not access directly
      * or override.
@@ -287,6 +289,7 @@
         uninstallComboBoxModelListeners(comboBox.getModel());
         uninstallKeyboardActions();
         uninstallListListeners();
+        uninstallScrollerListeners();
         // We do this, otherwise the listener the ui installs on
         // the model (the combobox model in this case) will keep a
         // reference to the list, causing the list (and us) to never get gced.
@@ -573,6 +576,7 @@
         scroller.setFocusable( false );
         scroller.getVerticalScrollBar().setFocusable( false );
         scroller.setBorder( null );
+        installScrollerListeners();
     }
 
     /**
@@ -589,6 +593,20 @@
         setFocusable( false );
     }
 
+    private void installScrollerListeners() {
+        scrollerMouseWheelListener = getHandler();
+        if (scrollerMouseWheelListener != null) {
+            scroller.addMouseWheelListener(scrollerMouseWheelListener);
+        }
+    }
+
+    private void uninstallScrollerListeners() {
+        if (scrollerMouseWheelListener != null) {
+            scroller.removeMouseWheelListener(scrollerMouseWheelListener);
+            scrollerMouseWheelListener = null;
+        }
+    }
+
     /**
      * This method adds the necessary listeners to the JComboBox.
      */
@@ -797,8 +815,8 @@
 
 
     private class Handler implements ItemListener, MouseListener,
-                          MouseMotionListener, PropertyChangeListener,
-                          Serializable {
+                          MouseMotionListener, MouseWheelListener,
+                          PropertyChangeListener, Serializable {
         //
         // MouseListener
         // NOTE: this is added to both the JList and JComboBox
@@ -982,6 +1000,13 @@
                 setListSelection(comboBox.getSelectedIndex());
             }
         }
+
+        //
+        // MouseWheelListener
+        //
+        public void mouseWheelMoved(MouseWheelEvent e) {
+            e.consume();
+        }
     }
 
     //
--- a/src/share/classes/javax/swing/plaf/basic/BasicListUI.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/basic/BasicListUI.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2009, 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
@@ -56,8 +56,7 @@
  */
 public class BasicListUI extends ListUI
 {
-    private static final StringBuilder BASELINE_COMPONENT_KEY =
-        new StringBuilder("List.baselineComponent");
+    private static final Object BASELINE_COMPONENT_KEY = new Object(); // List.baselineComponent
 
     protected JList list = null;
     protected CellRendererPane rendererPane;
--- a/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2009, 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,26 +28,18 @@
 import javax.swing.*;
 import javax.swing.event.*;
 import javax.swing.plaf.*;
-import javax.swing.plaf.basic.*;
-import javax.swing.border.*;
 
 import java.applet.Applet;
 
 import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
 import java.awt.KeyboardFocusManager;
 import java.awt.Window;
 import java.awt.event.*;
 import java.awt.AWTEvent;
 import java.awt.Toolkit;
 
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeEvent;
-
 import java.util.*;
 
-import sun.swing.DefaultLookup;
 import sun.swing.UIAction;
 
 import sun.awt.AppContext;
@@ -61,10 +53,8 @@
  * @author Arnaud Weber
  */
 public class BasicPopupMenuUI extends PopupMenuUI {
-    static final StringBuilder MOUSE_GRABBER_KEY = new StringBuilder(
-                   "javax.swing.plaf.basic.BasicPopupMenuUI.MouseGrabber");
-    static final StringBuilder MENU_KEYBOARD_HELPER_KEY = new StringBuilder(
-                   "javax.swing.plaf.basic.BasicPopupMenuUI.MenuKeyboardHelper");
+    static final Object MOUSE_GRABBER_KEY = new Object(); // javax.swing.plaf.basic.BasicPopupMenuUI.MouseGrabber
+    static final Object MENU_KEYBOARD_HELPER_KEY = new Object(); // javax.swing.plaf.basic.BasicPopupMenuUI.MenuKeyboardHelper
 
     protected JPopupMenu popupMenu = null;
     private transient PopupMenuListener popupMenuListener = null;
@@ -884,7 +874,9 @@
                     processMouseEvent(me);
                 break;
             case MouseEvent.MOUSE_WHEEL:
-                if (isInPopup(src)) {
+                if (isInPopup(src)
+                    || ((src instanceof JComboBox) && ((JComboBox) src).isPopupVisible())) {
+
                     return;
                 }
                 cancelPopupMenu();
--- a/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java	Tue Aug 22 02:03:52 2017 +0100
@@ -438,7 +438,7 @@
         // to the button group or not
         Component getFocusTransferBaseComponent(boolean next){
             Component focusBaseComp = activeBtn;
-            Window container = SwingUtilities.getWindowAncestor(activeBtn);
+            Container container = focusBaseComp.getFocusCycleRootAncestor();
             if (container != null) {
                 FocusTraversalPolicy policy = container.getFocusTraversalPolicy();
                 Component comp = next ? policy.getComponentAfter(container, activeBtn)
--- a/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java	Tue Aug 22 02:03:52 2017 +0100
@@ -27,16 +27,11 @@
 
 import java.awt.*;
 import java.awt.datatransfer.*;
-import java.awt.dnd.*;
 import java.awt.event.*;
 import java.util.Enumeration;
-import java.util.EventObject;
-import java.util.Hashtable;
-import java.util.TooManyListenersException;
 import javax.swing.*;
 import javax.swing.event.*;
 import javax.swing.plaf.*;
-import javax.swing.text.*;
 import javax.swing.table.*;
 import javax.swing.plaf.basic.DragRecognitionSupport.BeforeDrag;
 import sun.swing.SwingUtilities2;
@@ -56,8 +51,7 @@
  */
 public class BasicTableUI extends TableUI
 {
-    private static final StringBuilder BASELINE_COMPONENT_KEY =
-        new StringBuilder("Table.baselineComponent");
+    private static final Object BASELINE_COMPONENT_KEY = new Object(); // Table.baselineComponent
 
 //
 // Instance Variables
--- a/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java	Tue Aug 22 02:03:52 2017 +0100
@@ -58,8 +58,7 @@
 
 public class BasicTreeUI extends TreeUI
 {
-    private static final StringBuilder BASELINE_COMPONENT_KEY =
-        new StringBuilder("Tree.baselineComponent");
+    private static final Object BASELINE_COMPONENT_KEY = new Object(); // Tree.baselineComponent
 
     // Old actions forward to an instance of this.
     static private final Actions SHARED_ACTION = new Actions();
--- a/src/share/classes/javax/swing/plaf/synth/ImagePainter.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/synth/ImagePainter.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2009, 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
@@ -41,8 +41,7 @@
  * @author Scott Violet
  */
 class ImagePainter extends SynthPainter {
-    private static final StringBuffer CACHE_KEY =
-                               new StringBuffer("SynthCacheKey");
+    private static final Object CACHE_KEY = new Object(); // SynthCacheKey
 
     private Image image;
     private Insets sInsets;
--- a/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java	Tue Aug 22 02:03:52 2017 +0100
@@ -73,8 +73,7 @@
     /**
      * AppContext key to get the current SynthStyleFactory.
      */
-    private static final Object STYLE_FACTORY_KEY =
-                  new StringBuffer("com.sun.java.swing.plaf.gtk.StyleCache");
+    private static final Object STYLE_FACTORY_KEY = new Object(); // com.sun.java.swing.plaf.gtk.StyleCache
 
     /**
      * AppContext key to get selectedUI.
--- a/src/share/classes/javax/swing/text/JTextComponent.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/javax/swing/text/JTextComponent.java	Tue Aug 22 02:03:52 2017 +0100
@@ -4053,8 +4053,7 @@
         return modifiers;
     }
 
-    private static final Object KEYMAP_TABLE =
-        new StringBuilder("JTextComponent_KeymapTable");
+    private static final Object KEYMAP_TABLE = new Object(); // JTextComponent_KeymapTable
 
     //
     // member variables used for on-the-spot input method
@@ -4387,8 +4386,7 @@
         }
     }
 
-    private static final Object FOCUSED_COMPONENT =
-        new StringBuilder("JTextComponent_FocusedComponent");
+    private static final Object FOCUSED_COMPONENT = new Object(); // JTextComponent_FocusedComponent
 
     /**
      * The default keymap that will be shared by all
--- a/src/share/classes/sun/applet/AppletPanel.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/applet/AppletPanel.java	Tue Aug 22 02:03:52 2017 +0100
@@ -68,7 +68,7 @@
     /**
      * The applet (if loaded).
      */
-    Applet applet;
+    protected Applet applet;
 
     /**
      * Applet will allow initialization.  Should be
@@ -162,7 +162,8 @@
      * Creates a thread to run the applet. This method is called
      * each time an applet is loaded and reloaded.
      */
-    synchronized void createAppletThread() {
+	//Overridden by NetxPanel.
+    protected synchronized void createAppletThread() {
         // Create a thread group for the applet, and start a new
         // thread to load the applet.
         String nm = "applet-" + getCode();
@@ -306,7 +307,7 @@
     /**
      * Get an event from the queue.
      */
-    synchronized AppletEvent getNextEvent() throws InterruptedException {
+    protected synchronized AppletEvent getNextEvent() throws InterruptedException {
         while (queue == null || queue.isEmpty()) {
             wait();
         }
@@ -692,7 +693,8 @@
      * applet event processing so that it can be gracefully interrupted from
      * things like HotJava.
      */
-    private void runLoader() {
+	//Overridden by NetxPanel.
+    protected void runLoader() {
         if (status != APPLET_DISPOSE) {
             showAppletStatus("notdisposed");
             return;
--- a/src/share/classes/sun/applet/AppletViewerPanel.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/applet/AppletViewerPanel.java	Tue Aug 22 02:03:52 2017 +0100
@@ -42,25 +42,25 @@
  *
  * @author      Arthur van Hoff
  */
-class AppletViewerPanel extends AppletPanel {
+public class AppletViewerPanel extends AppletPanel {
 
     /* Are we debugging? */
-    static boolean debug = false;
+    protected static boolean debug = false;
 
     /**
      * The document url.
      */
-    URL documentURL;
+    protected URL documentURL;
 
     /**
      * The base url.
      */
-    URL baseURL;
+    protected URL baseURL;
 
     /**
      * The attributes of the applet.
      */
-    Hashtable atts;
+    protected Hashtable<String,String> atts;
 
     /*
      * JDK 1.1 serialVersionUID
@@ -70,7 +70,7 @@
     /**
      * Construct an applet viewer and start the applet.
      */
-    AppletViewerPanel(URL documentURL, Hashtable atts) {
+    protected AppletViewerPanel(URL documentURL, Hashtable<String,String> atts) {
         this.documentURL = documentURL;
         this.atts = atts;
 
@@ -106,7 +106,7 @@
      * Get an applet parameter.
      */
     public String getParameter(String name) {
-        return (String)atts.get(name.toLowerCase());
+        return atts.get(name.toLowerCase());
     }
 
     /**
@@ -202,12 +202,12 @@
         return (AppletContext)getParent();
     }
 
-    static void debug(String s) {
+    protected static void debug(String s) {
         if(debug)
             System.err.println("AppletViewerPanel:::" + s);
     }
 
-    static void debug(String s, Throwable t) {
+    protected static void debug(String s, Throwable t) {
         if(debug) {
             t.printStackTrace();
             debug(s);
--- a/src/share/classes/sun/awt/AWTAccessor.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/awt/AWTAccessor.java	Tue Aug 22 02:03:52 2017 +0100
@@ -241,8 +241,8 @@
         AccessControlContext getAccessControlContext(Component comp);
 
         /**
-        * Revalidates the component synchronously.
-        */
+         * Revalidates the component synchronously.
+         */
         void revalidateSynchronously(Component comp);
 
     }
--- a/src/share/classes/sun/awt/image/JPEGImageDecoder.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/awt/image/JPEGImageDecoder.java	Tue Aug 22 02:03:52 2017 +0100
@@ -54,7 +54,7 @@
 
     static {
         java.security.AccessController.doPrivileged(
-                  new sun.security.action.LoadLibraryAction("jpeg"));
+                  new sun.security.action.LoadLibraryAction("javajpeg"));
         initIDs(InputStreamClass);
         RGBcolormodel = new DirectColorModel(24, 0xff0000, 0xff00, 0xff);
         ARGBcolormodel = ColorModel.getRGBdefault();
--- a/src/share/classes/sun/java2d/cmm/CMSManager.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/java2d/cmm/CMSManager.java	Tue Aug 22 02:03:52 2017 +0100
@@ -97,53 +97,53 @@
             cName = tcmm.getClass().getName();
         }
 
-        public long loadProfile(byte[] data) {
+        public Profile loadProfile(byte[] data) {
             System.err.print(cName + ".loadProfile");
-            long profileID = tcmm.loadProfile(data);
-            System.err.printf("(ID=%x)\n", profileID);
-            return profileID;
+            Profile p = tcmm.loadProfile(data);
+            System.err.printf("(ID=%s)\n", p.toString());
+            return p;
         }
 
-        public void freeProfile(long profileID) {
-            System.err.printf(cName + ".freeProfile(ID=%x)\n", profileID);
-            tcmm.freeProfile(profileID);
+        public void freeProfile(Profile p) {
+            System.err.printf(cName + ".freeProfile(ID=%s)\n", p.toString());
+            tcmm.freeProfile(p);
         }
 
-        public int getProfileSize(long profileID) {
-            System.err.print(cName + ".getProfileSize(ID=" + profileID + ")");
-            int size = tcmm.getProfileSize(profileID);
+        public int getProfileSize(Profile p) {
+            System.err.print(cName + ".getProfileSize(ID=" + p + ")");
+            int size = tcmm.getProfileSize(p);
             System.err.println("=" + size);
             return size;
         }
 
-        public void getProfileData(long profileID, byte[] data) {
-            System.err.print(cName + ".getProfileData(ID=" + profileID + ") ");
+        public void getProfileData(Profile p, byte[] data) {
+            System.err.print(cName + ".getProfileData(ID=" + p + ") ");
             System.err.println("requested " + data.length + " byte(s)");
-            tcmm.getProfileData(profileID, data);
+            tcmm.getProfileData(p, data);
         }
 
-        public int getTagSize(long profileID, int tagSignature) {
+        public int getTagSize(Profile p, int tagSignature) {
             System.err.printf(cName + ".getTagSize(ID=%x, TagSig=%s)",
-                              profileID, signatureToString(tagSignature));
-            int size = tcmm.getTagSize(profileID, tagSignature);
+                              p, signatureToString(tagSignature));
+            int size = tcmm.getTagSize(p, tagSignature);
             System.err.println("=" + size);
             return size;
         }
 
-        public void getTagData(long profileID, int tagSignature,
+        public void getTagData(Profile p, int tagSignature,
                                byte[] data) {
             System.err.printf(cName + ".getTagData(ID=%x, TagSig=%s)",
-                              profileID, signatureToString(tagSignature));
+                              p, signatureToString(tagSignature));
             System.err.println(" requested " + data.length + " byte(s)");
-            tcmm.getTagData(profileID, tagSignature, data);
+            tcmm.getTagData(p, tagSignature, data);
         }
 
-        public void setTagData(long profileID, int tagSignature,
+        public void setTagData(Profile p, int tagSignature,
                                byte[] data) {
-            System.err.print(cName + ".setTagData(ID=" + profileID +
+            System.err.print(cName + ".setTagData(ID=" + p +
                              ", TagSig=" + tagSignature + ")");
             System.err.println(" sending " + data.length + " byte(s)");
-            tcmm.setTagData(profileID, tagSignature, data);
+            tcmm.setTagData(p, tagSignature, data);
         }
 
         /* methods for creating ColorTransforms */
--- a/src/share/classes/sun/java2d/cmm/PCMM.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/java2d/cmm/PCMM.java	Tue Aug 22 02:03:52 2017 +0100
@@ -32,13 +32,13 @@
 public interface PCMM {
 
     /* methods invoked from ICC_Profile */
-    public long loadProfile(byte[] data);
-    public void freeProfile(long profileID);
-    public int  getProfileSize(long profileID);
-    public void getProfileData(long profileID, byte[] data);
-    public void getTagData(long profileID, int tagSignature, byte[] data);
-    public int getTagSize(long profileID, int tagSignature);
-    public void setTagData(long profileID, int tagSignature, byte[] data);
+    public Profile loadProfile(byte[] data);
+    public void freeProfile(Profile p);
+    public int  getProfileSize(Profile p);
+    public void getProfileData(Profile p, byte[] data);
+    public void getTagData(Profile p, int tagSignature, byte[] data);
+    public int getTagSize(Profile p, int tagSignature);
+    public void setTagData(Profile p, int tagSignature, byte[] data);
 
     /* methods for creating ColorTransforms */
     public ColorTransform createTransform(ICC_Profile profile, int renderType,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/java2d/cmm/Profile.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,43 @@
+/*
+ * 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.java2d.cmm;
+
+import java.awt.color.CMMException;
+
+public class Profile {
+    private final long nativePtr;
+
+    protected Profile(long ptr) {
+        nativePtr = ptr;
+    }
+
+    protected final long getNativePtr() {
+        if (nativePtr == 0L) {
+            throw new CMMException("Invalid profile: ptr is null");
+        }
+        return nativePtr;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/java2d/cmm/ProfileDataVerifier.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,114 @@
+/*
+ * 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.java2d.cmm;
+
+public class ProfileDataVerifier {
+    /**
+     * Throws an IllegalArgumentException if the data does not correspond
+     * to a valid ICC Profile.
+     *
+     * @param data the specified profile data.
+     */
+    public static void verify(byte[] data) {
+        if (data == null) {
+            throw new IllegalArgumentException("Invalid ICC Profile Data");
+        }
+
+        if (data.length < TOC_OFFSET) {
+            // not enough data for profile header
+            throw new IllegalArgumentException("Invalid ICC Profile Data");
+        }
+
+        // check profile size
+        final int size = readInt32(data, 0);
+        final int tagCount = readInt32(data, HEADER_SIZE);
+
+        if (tagCount < 0 || tagCount > MAX_TAG_COUNT) {
+            throw new IllegalArgumentException("Invalid ICC Profile Data");
+        }
+
+        if (size < (TOC_OFFSET + (tagCount * TOC_RECORD_SIZE)) ||
+            size > data.length)
+        {
+            throw new IllegalArgumentException("Invalid ICC Profile Data");
+        }
+
+        final int sig = readInt32(data, 36);
+
+        if (PROFILE_FILE_SIGNATURE != sig) {
+            throw new IllegalArgumentException("Invalid ICC Profile Data");
+        }
+
+        // verify table of content
+        for (int i = 0; i < tagCount; i++) {
+            final int tag_offset = getTagOffset(i, data);
+            final int tag_size = getTagSize(i, data);
+
+            if (tag_offset < TOC_OFFSET || tag_offset > size) {
+                throw new IllegalArgumentException("Invalid ICC Profile Data");
+            }
+
+            if (tag_size < 0 ||
+                tag_size > (Integer.MAX_VALUE - tag_offset) ||
+                tag_size + tag_offset > size)
+            {
+                throw new IllegalArgumentException("Invalid ICC Profile Data");
+            }
+        }
+    }
+
+    private static int getTagOffset(int idx, byte[] data) {
+        final int pos = TOC_OFFSET + idx * TOC_RECORD_SIZE + 4;
+        return readInt32(data, pos);
+    }
+
+    private static int getTagSize(int idx, byte[] data) {
+        final int pos = TOC_OFFSET + idx * TOC_RECORD_SIZE + 8;
+        return readInt32(data, pos);
+    }
+
+    private static int readInt32(byte[] data, int off) {
+        int res = 0;
+        for (int i = 0; i < 4; i++) {
+            res = res << 8;
+
+            res |= (0xff & data[off++]);
+        }
+        return res;
+    }
+
+    /**
+     * Lcms limit for the number of tags: 100
+     * Kcms limit for the number of tags: N/A
+     */
+    private static final int MAX_TAG_COUNT = 100;
+
+    private static final int HEADER_SIZE = 128;
+    private static final int TOC_OFFSET = HEADER_SIZE + 4;
+    private static final int TOC_RECORD_SIZE = 12;
+
+    private static final int PROFILE_FILE_SIGNATURE = 0x61637370;
+}
--- a/src/share/classes/sun/java2d/cmm/lcms/LCMS.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/java2d/cmm/lcms/LCMS.java	Tue Aug 22 02:03:52 2017 +0100
@@ -25,35 +25,142 @@
 
 package sun.java2d.cmm.lcms;
 
-import java.awt.color.ColorSpace;
+import java.awt.color.CMMException;
 import java.awt.color.ICC_Profile;
-import java.awt.color.CMMException;
 import sun.java2d.cmm.ColorTransform;
 import sun.java2d.cmm.PCMM;
-import sun.java2d.cmm.lcms.LCMS;
-import sun.java2d.cmm.lcms.LCMSTransform;
+import sun.java2d.cmm.Profile;
+import sun.java2d.cmm.lcms.LCMSProfile.TagData;
 
 public class LCMS implements PCMM {
 
     /* methods invoked from ICC_Profile */
-    public native long loadProfile(byte[] data);
+    @Override
+    public Profile loadProfile(byte[] data) {
+        final Object disposerRef = new Object();
+
+        final long ptr = loadProfileNative(data, disposerRef);
+
+        if (ptr != 0L) {
+            return new LCMSProfile(ptr, disposerRef);
+        }
+        return null;
+    }
+
+    private native long loadProfileNative(byte[] data, Object ref);
+
+    private LCMSProfile getLcmsProfile(Profile p) {
+        if (p instanceof LCMSProfile) {
+            return (LCMSProfile)p;
+        }
+        throw new CMMException("Invalid profile: " + p);
+    }
+
 
-    public native void freeProfile(long profileID);
+    @Override
+    public void freeProfile(Profile p) {
+        // we use disposer, so this method does nothing
+    }
+
+    @Override
+    public int getProfileSize(final Profile p) {
+        synchronized (p) {
+            return getProfileSizeNative(getLcmsProfile(p).getLcmsPtr());
+        }
+    }
 
-    public native synchronized int getProfileSize(long profileID);
+    private native int getProfileSizeNative(long ptr);
+
+    @Override
+    public void getProfileData(final Profile p, byte[] data) {
+        synchronized (p) {
+            getProfileDataNative(getLcmsProfile(p).getLcmsPtr(), data);
+        }
+    }
+
+    private native void getProfileDataNative(long ptr, byte[] data);
+
+    @Override
+    public int getTagSize(Profile p, int tagSignature) {
+        final LCMSProfile profile = getLcmsProfile(p);
 
-    public native synchronized void getProfileData(long profileID, byte[] data);
+        synchronized (profile) {
+            TagData t = profile.getTag(tagSignature);
+            return t == null ? 0 : t.getSize();
+        }
+    }
+
+    static native byte[] getTagNative(long profileID, int signature);
+
+    @Override
+    public void getTagData(Profile p, int tagSignature, byte[] data)
+    {
+        final LCMSProfile profile = getLcmsProfile(p);
+
+        synchronized (profile) {
+            TagData t = profile.getTag(tagSignature);
+            if (t != null) {
+                t.copyDataTo(data);
+            }
+        }
+    }
+
+    @Override
+    public synchronized void setTagData(Profile p, int tagSignature, byte[] data) {
+        final LCMSProfile profile = getLcmsProfile(p);
 
-    public native synchronized int getTagSize(long profileID, int tagSignature);
-    public native synchronized void getTagData(long profileID, int tagSignature,
-                                               byte[] data);
-    public native synchronized void setTagData(long profileID, int tagSignature,
+        synchronized (profile) {
+            profile.clearTagCache();
+
+            // Now we are going to update the profile with new tag data
+            // In some cases, we may change the pointer to the native
+            // profile.
+            //
+            // If we fail to write tag data for any reason, the old pointer
+            // should be used.
+            setTagDataNative(profile.getLcmsPtr(),
+                    tagSignature, data);
+        }
+    }
+
+    /**
+     * Writes supplied data as a tag into the profile.
+     * Destroys old profile, if new one was successfully
+     * created.
+     *
+     * Returns valid pointer to new profile.
+     *
+     * Throws CMMException if operation fails, preserve old profile from
+     * destruction.
+     */
+    private native void setTagDataNative(long ptr, int tagSignature,
                                                byte[] data);
 
-    public static native long getProfileID(ICC_Profile profile);
+    public synchronized static native LCMSProfile getProfileID(ICC_Profile profile);
+
+    /* Helper method used from LCMSColorTransfrom */
+    static long createTransform(
+        LCMSProfile[] profiles, int renderType,
+        int inFormatter, boolean isInIntPacked,
+        int outFormatter, boolean isOutIntPacked,
+        Object disposerRef)
+    {
+        long[] ptrs = new long[profiles.length];
 
-    public static native long createNativeTransform(
-        long[] profileIDs, int renderType, int inFormatter, int outFormatter,
+        for (int i = 0; i < profiles.length; i++) {
+            if (profiles[i] == null) throw new CMMException("Unknown profile ID");
+
+            ptrs[i] = profiles[i].getLcmsPtr();
+        }
+
+        return createNativeTransform(ptrs, renderType, inFormatter,
+                isInIntPacked, outFormatter, isOutIntPacked, disposerRef);
+    }
+
+    private static native long createNativeTransform(
+        long[] profileIDs, int renderType,
+        int inFormatter, boolean isInIntPacked,
+        int outFormatter, boolean isOutIntPacked,
         Object disposerRef);
 
    /**
@@ -93,7 +200,7 @@
                      * disposer frameworks
                      */
                     System.loadLibrary("awt");
-                    System.loadLibrary("lcms");
+                    System.loadLibrary("javalcms");
                     return null;
                 }
             }
--- a/src/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -22,26 +22,19 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-
 package sun.java2d.cmm.lcms;
 
-import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
 import java.awt.image.ComponentColorModel;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-import java.awt.image.SinglePixelPackedSampleModel;
 import java.awt.image.ComponentSampleModel;
 import java.awt.image.DataBuffer;
-import java.awt.image.DataBufferByte;
-import java.awt.image.DataBufferUShort;
-import java.awt.image.DataBufferInt;
 import java.awt.image.ColorModel;
+import java.awt.image.Raster;
+import java.awt.image.SampleModel;
 import sun.awt.image.ByteComponentRaster;
 import sun.awt.image.ShortComponentRaster;
 import sun.awt.image.IntegerComponentRaster;
 
-
 class LCMSImageLayout {
 
     public static int BYTES_SH(int x) {
@@ -49,47 +42,34 @@
     }
 
     public static int EXTRA_SH(int x) {
-        return x<<7;
+        return x << 7;
     }
 
     public static int CHANNELS_SH(int x) {
-        return x<<3;
+        return x << 3;
     }
-
-    public static final int SWAPFIRST   = 1<<14;
-
-    public static final int DOSWAP      = 1<<10;
-
+    public static final int SWAPFIRST = 1 << 14;
+    public static final int DOSWAP = 1 << 10;
     public static final int PT_RGB_8 =
-        CHANNELS_SH(3) | BYTES_SH(1);
-
+            CHANNELS_SH(3) | BYTES_SH(1);
     public static final int PT_GRAY_8 =
-        CHANNELS_SH(1) | BYTES_SH(1);
-
+            CHANNELS_SH(1) | BYTES_SH(1);
     public static final int PT_GRAY_16 =
-        CHANNELS_SH(1) | BYTES_SH(2);
-
+            CHANNELS_SH(1) | BYTES_SH(2);
     public static final int PT_RGBA_8 =
-        EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1);
-
+            EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1);
     public static final int PT_ARGB_8 =
-        EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1) | SWAPFIRST;
-
+            EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1) | SWAPFIRST;
     public static final int PT_BGR_8 =
-        DOSWAP | CHANNELS_SH(3) | BYTES_SH(1);
-
+            DOSWAP | CHANNELS_SH(3) | BYTES_SH(1);
     public static final int PT_ABGR_8 =
-        DOSWAP | EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1);
-
-    public static final int PT_BGRA_8 = EXTRA_SH(1) | CHANNELS_SH(3) |
-        BYTES_SH(1) | DOSWAP | SWAPFIRST;
-
-    public static final int DT_BYTE     = 0;
-    public static final int DT_SHORT    = 1;
-    public static final int DT_INT      = 2;
-    public static final int DT_DOUBLE   = 3;
-
-
+            DOSWAP | EXTRA_SH(1) | CHANNELS_SH(3) | BYTES_SH(1);
+    public static final int PT_BGRA_8 = EXTRA_SH(1) | CHANNELS_SH(3)
+            | BYTES_SH(1) | DOSWAP | SWAPFIRST;
+    public static final int DT_BYTE = 0;
+    public static final int DT_SHORT = 1;
+    public static final int DT_INT = 2;
+    public static final int DT_DOUBLE = 3;
     boolean isIntPacked = false;
     int pixelType;
     int dataType;
@@ -99,7 +79,13 @@
     private int nextPixelOffset;
     int offset;
 
+    /* This flag indicates whether the image can be processed
+     * at once by doTransfrom() native call. Otherwise, the
+     * image is processed scan by scan.
+     */
+    private boolean imageAtOnce = false;
     Object dataArray;
+
     private int dataArrayLength; /* in bytes */
 
     private LCMSImageLayout(int np, int pixelType, int pixelSize)
@@ -170,111 +156,184 @@
         verify();
     }
 
-    public LCMSImageLayout(BufferedImage image) throws ImageLayoutException {
-        ShortComponentRaster shortRaster;
-        IntegerComponentRaster intRaster;
-        ByteComponentRaster byteRaster;
+    private LCMSImageLayout() {
+    }
+
+    /* This method creates a layout object for given image.
+     * Returns null if the image is not supported by current implementation.
+     */
+    public static LCMSImageLayout createImageLayout(BufferedImage image)
+            throws ImageLayoutException {
+        LCMSImageLayout l = new LCMSImageLayout();
+
         switch (image.getType()) {
             case BufferedImage.TYPE_INT_RGB:
-                pixelType = PT_ARGB_8;
-                isIntPacked = true;
+                l.pixelType = PT_ARGB_8;
+                l.isIntPacked = true;
                 break;
             case BufferedImage.TYPE_INT_ARGB:
-                pixelType = PT_ARGB_8;
-                isIntPacked = true;
+                l.pixelType = PT_ARGB_8;
+                l.isIntPacked = true;
                 break;
             case BufferedImage.TYPE_INT_BGR:
-                pixelType = PT_ABGR_8;
-                isIntPacked = true;
+                l.pixelType = PT_ABGR_8;
+                l.isIntPacked = true;
                 break;
             case BufferedImage.TYPE_3BYTE_BGR:
-                pixelType = PT_BGR_8;
+                l.pixelType = PT_BGR_8;
                 break;
             case BufferedImage.TYPE_4BYTE_ABGR:
-                pixelType = PT_ABGR_8;
+                l.pixelType = PT_ABGR_8;
                 break;
             case BufferedImage.TYPE_BYTE_GRAY:
-                pixelType = PT_GRAY_8;
+                l.pixelType = PT_GRAY_8;
                 break;
             case BufferedImage.TYPE_USHORT_GRAY:
-                pixelType = PT_GRAY_16;
+                l.pixelType = PT_GRAY_16;
                 break;
             default:
-            // TODO: Add support for some images having
-            // SinglePixelPackedModel and ComponentSampleModel
-                throw new IllegalArgumentException(
-                    "CMMImageLayout - bad image type passed to constructor");
+                /* ColorConvertOp creates component images as
+                 * default destination, so this kind of images
+                 * has to be supported.
+                 */
+                ColorModel cm = image.getColorModel();
+                if (cm instanceof ComponentColorModel) {
+                    ComponentColorModel ccm = (ComponentColorModel) cm;
+
+                    // verify whether the component size is fine
+                    int[] cs = ccm.getComponentSize();
+                    for (int s : cs) {
+                        if (s != 8) {
+                            return null;
+                        }
+                    }
+
+                    return createImageLayout(image.getRaster());
+
+                }
+                return null;
         }
 
-        width = image.getWidth();
-        height = image.getHeight();
+        l.width = image.getWidth();
+        l.height = image.getHeight();
 
         switch (image.getType()) {
             case BufferedImage.TYPE_INT_RGB:
             case BufferedImage.TYPE_INT_ARGB:
             case BufferedImage.TYPE_INT_BGR:
-                intRaster = (IntegerComponentRaster)image.getRaster();
-
-                nextRowOffset = safeMult(4, intRaster.getScanlineStride());
-                nextPixelOffset = safeMult(4, intRaster.getPixelStride());
+                do {
+                    IntegerComponentRaster intRaster = (IntegerComponentRaster)
+                            image.getRaster();
+                    l.nextRowOffset = safeMult(4, intRaster.getScanlineStride());
+                    l.nextPixelOffset = safeMult(4, intRaster.getPixelStride());
+                    l.offset = safeMult(4, intRaster.getDataOffset(0));
+                    l.dataArray = intRaster.getDataStorage();
+                    l.dataArrayLength = 4 * intRaster.getDataStorage().length;
+                    l.dataType = DT_INT;
 
-                offset = safeMult(4, intRaster.getDataOffset(0));
-
-                dataArray = intRaster.getDataStorage();
-                dataArrayLength = 4 * intRaster.getDataStorage().length;
-                dataType = DT_INT;
+                    if (l.nextRowOffset == l.width * 4 * intRaster.getPixelStride()) {
+                        l.imageAtOnce = true;
+                    }
+                } while (false);
                 break;
 
             case BufferedImage.TYPE_3BYTE_BGR:
             case BufferedImage.TYPE_4BYTE_ABGR:
-                byteRaster = (ByteComponentRaster)image.getRaster();
-                nextRowOffset = byteRaster.getScanlineStride();
-                nextPixelOffset = byteRaster.getPixelStride();
+                do {
+                    ByteComponentRaster byteRaster = (ByteComponentRaster)
+                            image.getRaster();
+                    l.nextRowOffset = byteRaster.getScanlineStride();
+                    l.nextPixelOffset = byteRaster.getPixelStride();
 
-                int firstBand = image.getSampleModel().getNumBands() - 1;
-                offset = byteRaster.getDataOffset(firstBand);
-                dataArray = byteRaster.getDataStorage();
-                dataArrayLength = byteRaster.getDataStorage().length;
-                dataType = DT_BYTE;
+                    int firstBand = image.getSampleModel().getNumBands() - 1;
+                    l.offset = byteRaster.getDataOffset(firstBand);
+                    l.dataArray = byteRaster.getDataStorage();
+                    l.dataArrayLength = byteRaster.getDataStorage().length;
+                    l.dataType = DT_BYTE;
+                    if (l.nextRowOffset == l.width * byteRaster.getPixelStride()) {
+                        l.imageAtOnce = true;
+                    }
+                } while (false);
                 break;
 
             case BufferedImage.TYPE_BYTE_GRAY:
-                byteRaster = (ByteComponentRaster)image.getRaster();
-                nextRowOffset = byteRaster.getScanlineStride();
-                nextPixelOffset = byteRaster.getPixelStride();
+                do {
+                    ByteComponentRaster byteRaster = (ByteComponentRaster)
+                            image.getRaster();
+                    l.nextRowOffset = byteRaster.getScanlineStride();
+                    l.nextPixelOffset = byteRaster.getPixelStride();
 
-                offset = byteRaster.getDataOffset(0);
-                dataArray = byteRaster.getDataStorage();
-                dataArrayLength = byteRaster.getDataStorage().length;
-                dataType = DT_BYTE;
+                    l.dataArrayLength = byteRaster.getDataStorage().length;
+                    l.offset = byteRaster.getDataOffset(0);
+                    l.dataArray = byteRaster.getDataStorage();
+                    l.dataType = DT_BYTE;
+
+                    if (l.nextRowOffset == l.width * byteRaster.getPixelStride()) {
+                        l.imageAtOnce = true;
+                    }
+                } while (false);
                 break;
 
             case BufferedImage.TYPE_USHORT_GRAY:
-                shortRaster = (ShortComponentRaster)image.getRaster();
-                nextRowOffset = safeMult(2, shortRaster.getScanlineStride());
-                nextPixelOffset = safeMult(2, shortRaster.getPixelStride());
+                do {
+                    ShortComponentRaster shortRaster = (ShortComponentRaster)
+                            image.getRaster();
+                    l.nextRowOffset = safeMult(2, shortRaster.getScanlineStride());
+                    l.nextPixelOffset = safeMult(2, shortRaster.getPixelStride());
+
+                    l.offset = safeMult(2, shortRaster.getDataOffset(0));
+                    l.dataArray = shortRaster.getDataStorage();
+                    l.dataArrayLength = 2 * shortRaster.getDataStorage().length;
+                    l.dataType = DT_SHORT;
 
-                offset = safeMult(2, shortRaster.getDataOffset(0));
-                dataArray = shortRaster.getDataStorage();
-                dataArrayLength = 2 * shortRaster.getDataStorage().length;
-                dataType = DT_SHORT;
+                    if (l.nextRowOffset == l.width * 2 * shortRaster.getPixelStride()) {
+                        l.imageAtOnce = true;
+                    }
+                } while (false);
                 break;
+            default:
+                return null;
         }
-        verify();
+        l.verify();
+        return l;
     }
 
-    public static boolean isSupported(BufferedImage image) {
-        switch (image.getType()) {
-            case BufferedImage.TYPE_INT_RGB:
-            case BufferedImage.TYPE_INT_ARGB:
-            case BufferedImage.TYPE_INT_BGR:
-            case BufferedImage.TYPE_3BYTE_BGR:
-            case BufferedImage.TYPE_4BYTE_ABGR:
-            case BufferedImage.TYPE_BYTE_GRAY:
-            case BufferedImage.TYPE_USHORT_GRAY:
-                return true;
+    private static enum BandOrder {
+        DIRECT,
+        INVERTED,
+        ARBITRARY,
+        UNKNOWN;
+
+        public static BandOrder getBandOrder(int[] bandOffsets) {
+            BandOrder order = UNKNOWN;
+
+            int numBands = bandOffsets.length;
+
+            for (int i = 0; (order != ARBITRARY) && (i < bandOffsets.length); i++) {
+                switch (order) {
+                    case UNKNOWN:
+                        if (bandOffsets[i] == i) {
+                            order = DIRECT;
+                        } else if (bandOffsets[i] == (numBands - 1 - i)) {
+                            order = INVERTED;
+                        } else {
+                            order = ARBITRARY;
+                        }
+                        break;
+                    case DIRECT:
+                        if (bandOffsets[i] != i) {
+                            order = ARBITRARY;
+                        }
+                        break;
+                    case INVERTED:
+                        if (bandOffsets[i] != (numBands - 1 - i)) {
+                            order = ARBITRARY;
+                        }
+                        break;
+                }
+            }
+            return order;
         }
-        return false;
     }
 
     private void verify() throws ImageLayoutException {
@@ -323,6 +382,50 @@
             super(message);
         }
     }
+    public static LCMSImageLayout createImageLayout(Raster r) {
+        LCMSImageLayout l = new LCMSImageLayout();
+        if (r instanceof ByteComponentRaster &&
+                r.getSampleModel() instanceof ComponentSampleModel) {
+            ByteComponentRaster br = (ByteComponentRaster)r;
+
+            ComponentSampleModel csm = (ComponentSampleModel)r.getSampleModel();
+
+            l.pixelType = CHANNELS_SH(br.getNumBands()) | BYTES_SH(1);
+
+            int[] bandOffsets = csm.getBandOffsets();
+            BandOrder order = BandOrder.getBandOrder(bandOffsets);
+
+            int firstBand = 0;
+            switch (order) {
+                case INVERTED:
+                    l.pixelType |= DOSWAP;
+                    firstBand  = csm.getNumBands() - 1;
+                    break;
+                case DIRECT:
+                    // do nothing
+                    break;
+                default:
+                    // unable to create the image layout;
+                    return null;
+            }
+
+            l.nextRowOffset = br.getScanlineStride();
+            l.nextPixelOffset = br.getPixelStride();
+
+            l.offset = br.getDataOffset(firstBand);
+            l.dataArray = br.getDataStorage();
+            l.dataType = DT_BYTE;
+
+            l.width = br.getWidth();
+            l.height = br.getHeight();
+
+            if (l.nextRowOffset == l.width * br.getPixelStride()) {
+                l.imageAtOnce = true;
+            }
+            return l;
+        }
+        return null;
+    }
 
     /**
      * Derives number of bytes per pixel from the pixel format.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/java2d/cmm/lcms/LCMSProfile.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,109 @@
+/*
+ * 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.java2d.cmm.lcms;
+
+import java.awt.color.CMMException;
+import java.util.Arrays;
+import java.util.HashMap;
+import sun.java2d.cmm.Profile;
+
+final class LCMSProfile extends Profile {
+    private final TagCache tagCache;
+
+    private final Object disposerReferent;
+
+    LCMSProfile(long ptr, Object ref) {
+        super(ptr);
+
+        disposerReferent = ref;
+
+        tagCache = new TagCache(this);
+    }
+
+    final long getLcmsPtr() {
+        return this.getNativePtr();
+    }
+
+    TagData getTag(int sig) {
+        return tagCache.getTag(sig);
+    }
+
+    void clearTagCache() {
+        tagCache.clear();
+    }
+
+    static class TagCache  {
+        final LCMSProfile profile;
+        private HashMap<Integer, TagData> tags;
+
+        TagCache(LCMSProfile p) {
+            profile = p;
+            tags = new HashMap<>();
+        }
+
+        TagData getTag(int sig) {
+            TagData t = tags.get(sig);
+            if (t == null) {
+                byte[] tagData = LCMS.getTagNative(profile.getNativePtr(), sig);
+                if (tagData != null) {
+                    t = new TagData(sig, tagData);
+                    tags.put(sig, t);
+                }
+            }
+            return t;
+        }
+
+        void clear() {
+            tags.clear();
+        }
+    }
+
+    static class TagData {
+        private int signature;
+        private byte[] data;
+
+        TagData(int sig, byte[] data) {
+            this.signature = sig;
+            this.data = data;
+        }
+
+        int getSize() {
+            return data.length;
+        }
+
+        byte[] getData() {
+            return Arrays.copyOf(data, data.length);
+        }
+
+        void copyDataTo(byte[] dst) {
+            System.arraycopy(data, 0, dst, 0, data.length);
+        }
+
+        int getSignature() {
+            return signature;
+        }
+    }
+}
--- a/src/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -56,11 +56,13 @@
 
 public class LCMSTransform implements ColorTransform {
     long ID;
-    private int inFormatter;
-    private int outFormatter;
+    private int inFormatter = 0;
+    private boolean isInIntPacked = false;
+    private int outFormatter = 0;
+    private boolean isOutIntPacked = false;
 
     ICC_Profile[] profiles;
-    long [] profileIDs;
+    LCMSProfile[] lcmsProfiles;
     int renderType;
     int transformType;
 
@@ -82,8 +84,8 @@
         /* Actually, it is not a complete transform but just part of it */
         profiles = new ICC_Profile[1];
         profiles[0] = profile;
-        profileIDs = new long[1];
-        profileIDs[0] = LCMS.getProfileID(profile);
+        lcmsProfiles = new LCMSProfile[1];
+        lcmsProfiles[0] = LCMS.getProfileID(profile);
         this.renderType = (renderType == ColorTransform.Any)?
                               ICC_Profile.icPerceptual : renderType;
         this.transformType = transformType;
@@ -103,14 +105,14 @@
             size+=((LCMSTransform)transforms[i]).profiles.length;
         }
         profiles = new ICC_Profile[size];
-        profileIDs = new long[size];
+        lcmsProfiles = new LCMSProfile[size];
         int j = 0;
         for (int i=0; i < transforms.length; i++) {
             LCMSTransform curTrans = (LCMSTransform)transforms[i];
             System.arraycopy(curTrans.profiles, 0, profiles, j,
                              curTrans.profiles.length);
-            System.arraycopy(curTrans.profileIDs, 0, profileIDs, j,
-                             curTrans.profileIDs.length);
+            System.arraycopy(curTrans.lcmsProfiles, 0, lcmsProfiles, j,
+                             curTrans.lcmsProfiles.length);
             j += curTrans.profiles.length;
         }
         renderType = ((LCMSTransform)transforms[0]).renderType;
@@ -136,18 +138,23 @@
                                           LCMSImageLayout out) {
         // update native transfrom if needed
         if (ID == 0L ||
-            inFormatter != in.pixelType ||
-            outFormatter != out.pixelType) {
+            inFormatter != in.pixelType || isInIntPacked != in.isIntPacked ||
+            outFormatter != out.pixelType || isOutIntPacked != out.isIntPacked)
+        {
 
             if (ID != 0L) {
                 // Disposer will destroy forgotten transform
                 disposerReferent = new Object();
             }
             inFormatter = in.pixelType;
-            outFormatter = out.pixelType;
+            isInIntPacked = in.isIntPacked;
 
-            ID = LCMS.createNativeTransform(profileIDs, renderType,
-                                            inFormatter, outFormatter,
+            outFormatter = out.pixelType;
+            isOutIntPacked = out.isIntPacked;
+
+            ID = LCMS.createTransform(lcmsProfiles, renderType,
+                                            inFormatter, isInIntPacked,
+                                            outFormatter, isOutIntPacked,
                                             disposerReferent);
         }
 
@@ -155,17 +162,23 @@
     }
 
     public void colorConvert(BufferedImage src, BufferedImage dst) {
-        if (LCMSImageLayout.isSupported(src) &&
-            LCMSImageLayout.isSupported(dst))
-        {
-            try {
-                doTransform(new LCMSImageLayout(src), new LCMSImageLayout(dst));
-                return;
-            } catch (ImageLayoutException e) {
-                throw new CMMException("Unable to convert images");
+        LCMSImageLayout srcIL, dstIL;
+        try {
+            if (!dst.getColorModel().hasAlpha()) {
+                dstIL = LCMSImageLayout.createImageLayout(dst);
+
+                if (dstIL != null) {
+                    srcIL = LCMSImageLayout.createImageLayout(src);
+                    if (srcIL != null) {
+                        doTransform(srcIL, dstIL);
+                        return;
+                    }
+                }
             }
+        } catch (ImageLayoutException e) {
+            throw new CMMException("Unable to convert images");
         }
-        LCMSImageLayout srcIL, dstIL;
+
         Raster srcRas = src.getRaster();
         WritableRaster dstRas = dst.getRaster();
         ColorModel srcCM = src.getColorModel();
@@ -447,6 +460,14 @@
     public void colorConvert(Raster src, WritableRaster dst) {
 
         LCMSImageLayout srcIL, dstIL;
+        dstIL = LCMSImageLayout.createImageLayout(dst);
+        if (dstIL != null) {
+            srcIL = LCMSImageLayout.createImageLayout(src);
+            if (srcIL != null) {
+                doTransform(srcIL, dstIL);
+                return;
+            }
+        }
         // Can't pass src and dst directly to CMM, so process per scanline
         SampleModel srcSM = src.getSampleModel();
         SampleModel dstSM = dst.getSampleModel();
--- a/src/share/classes/sun/misc/SharedSecrets.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/misc/SharedSecrets.java	Tue Aug 22 02:03:52 2017 +0100
@@ -157,9 +157,10 @@
 
     public static JavaSecurityProtectionDomainAccess
         getJavaSecurityProtectionDomainAccess() {
-            if (javaSecurityProtectionDomainAccess == null)
-                unsafe.ensureClassInitialized(ProtectionDomain.class);
-            return javaSecurityProtectionDomainAccess;
+        if (javaSecurityProtectionDomainAccess == null)
+            unsafe.ensureClassInitialized(ProtectionDomain.class);
+
+        return javaSecurityProtectionDomainAccess;
     }
 
     public static void setJavaSecurityAccess(JavaSecurityAccess jsa) {
--- a/src/share/classes/sun/misc/Unsafe.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/misc/Unsafe.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2009, 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
@@ -560,6 +560,76 @@
         copyMemory(null, srcAddress, null, destAddress, bytes);
     }
 
+    private boolean isPrimitiveArray(Class<?> c) {
+        Class<?> componentType = c.getComponentType();
+        return componentType != null && componentType.isPrimitive();
+    }
+
+    private native void copySwapMemory0(Object srcBase, long srcOffset,
+                                        Object destBase, long destOffset,
+                                        long bytes, long elemSize);
+
+    /**
+     * Copies all elements from one block of memory to another block,
+     * *unconditionally* byte swapping the elements on the fly.
+     *
+     * <p>This method determines each block's base address by means of two parameters,
+     * and so it provides (in effect) a <em>double-register</em> addressing mode,
+     * as discussed in {@link #getInt(Object,long)}.  When the object reference is null,
+     * the offset supplies an absolute base address.
+     */
+    public void copySwapMemory(Object srcBase, long srcOffset,
+                               Object destBase, long destOffset,
+                               long bytes, long elemSize) {
+        if (bytes < 0) {
+            throw new IllegalArgumentException();
+        }
+        if (elemSize != 2 && elemSize != 4 && elemSize != 8) {
+            throw new IllegalArgumentException();
+        }
+        if (bytes % elemSize != 0) {
+            throw new IllegalArgumentException();
+        }
+        if ((srcBase == null && srcOffset == 0) ||
+            (destBase == null && destOffset == 0)) {
+            throw new NullPointerException();
+        }
+
+        // Must be off-heap, or primitive heap arrays
+        if (srcBase != null && (srcOffset < 0 || !isPrimitiveArray(srcBase.getClass()))) {
+            throw new IllegalArgumentException();
+        }
+        if (destBase != null && (destOffset < 0 || !isPrimitiveArray(destBase.getClass()))) {
+            throw new IllegalArgumentException();
+        }
+
+        // Sanity check size and offsets on 32-bit platforms. Most
+        // significant 32 bits must be zero.
+        if (ADDRESS_SIZE == 4 &&
+            (bytes >>> 32 != 0 || srcOffset >>> 32 != 0 || destOffset >>> 32 != 0)) {
+            throw new IllegalArgumentException();
+        }
+
+        if (bytes == 0) {
+            return;
+        }
+
+        copySwapMemory0(srcBase, srcOffset, destBase, destOffset, bytes, elemSize);
+    }
+
+   /**
+     * Copies all elements from one block of memory to another block, byte swapping the
+     * elements on the fly.
+     *
+     * This provides a <em>single-register</em> addressing mode, as
+     * discussed in {@link #getInt(Object,long)}.
+     *
+     * Equivalent to {@code copySwapMemory(null, srcAddress, null, destAddress, bytes, elemSize)}.
+     */
+    public void copySwapMemory(long srcAddress, long destAddress, long bytes, long elemSize) {
+        copySwapMemory(null, srcAddress, null, destAddress, bytes, elemSize);
+    }
+
     /**
      * Disposes of a block of native memory, as obtained from {@link
      * #allocateMemory} or {@link #reallocateMemory}.  The address passed to
@@ -631,6 +701,349 @@
     }
 
     /**
+     * @return Returns true if the native byte ordering of this
+     * platform is big-endian, false if it is little-endian.
+     */
+    public final boolean isBigEndian() { return BE; }
+
+    /**
+     * @return Returns true if this platform is capable of performing
+     * accesses at addresses which are not aligned for the type of the
+     * primitive type being accessed, false otherwise.
+     */
+    public final boolean unalignedAccess() { return unalignedAccess; }
+
+    /**
+     * Fetches a value at some byte offset into a given Java object.
+     * More specifically, fetches a value within the given object
+     * <code>o</code> at the given offset, or (if <code>o</code> is
+     * null) from the memory address whose numerical value is the
+     * given offset.  <p>
+     *
+     * The specification of this method is the same as {@link
+     * #getLong(Object, long)} except that the offset does not need to
+     * have been obtained from {@link #objectFieldOffset} on the
+     * {@link java.lang.reflect.Field} of some Java field.  The value
+     * in memory is raw data, and need not correspond to any Java
+     * variable.  Unless <code>o</code> is null, the value accessed
+     * must be entirely within the allocated object.  The endianness
+     * of the value in memory is the endianness of the native platform.
+     *
+     * <p> The read will be atomic with respect to the largest power
+     * of two that divides the GCD of the offset and the storage size.
+     * For example, getLongUnaligned will make atomic reads of 2-, 4-,
+     * or 8-byte storage units if the offset is zero mod 2, 4, or 8,
+     * respectively.  There are no other guarantees of atomicity.
+     * <p>
+     * 8-byte atomicity is only guaranteed on platforms on which
+     * support atomic accesses to longs.
+     *
+     * @param o Java heap object in which the value resides, if any, else
+     *        null
+     * @param offset The offset in bytes from the start of the object
+     * @return the value fetched from the indicated object
+     * @throws RuntimeException No defined exceptions are thrown, not even
+     *         {@link NullPointerException}
+     * @since 1.9
+     */
+    public final long getLongUnaligned(Object o, long offset) {
+        if ((offset & 7) == 0) {
+            return getLong(o, offset);
+        } else if ((offset & 3) == 0) {
+            return makeLong(getInt(o, offset),
+                            getInt(o, offset + 4));
+        } else if ((offset & 1) == 0) {
+            return makeLong(getShort(o, offset),
+                            getShort(o, offset + 2),
+                            getShort(o, offset + 4),
+                            getShort(o, offset + 6));
+        } else {
+            return makeLong(getByte(o, offset),
+                            getByte(o, offset + 1),
+                            getByte(o, offset + 2),
+                            getByte(o, offset + 3),
+                            getByte(o, offset + 4),
+                            getByte(o, offset + 5),
+                            getByte(o, offset + 6),
+                            getByte(o, offset + 7));
+        }
+    }
+    /**
+     * As {@link #getLongUnaligned(Object, long)} but with an
+     * additional argument which specifies the endianness of the value
+     * as stored in memory.
+     *
+     * @param o Java heap object in which the variable resides
+     * @param offset The offset in bytes from the start of the object
+     * @param bigEndian The endianness of the value
+     * @return the value fetched from the indicated object
+     * @since 1.9
+     */
+    public final long getLongUnaligned(Object o, long offset, boolean bigEndian) {
+        return convEndian(bigEndian, getLongUnaligned(o, offset));
+    }
+
+    /** @see #getLongUnaligned(Object, long) */
+    public final int getIntUnaligned(Object o, long offset) {
+        if ((offset & 3) == 0) {
+            return getInt(o, offset);
+        } else if ((offset & 1) == 0) {
+            return makeInt(getShort(o, offset),
+                           getShort(o, offset + 2));
+        } else {
+            return makeInt(getByte(o, offset),
+                           getByte(o, offset + 1),
+                           getByte(o, offset + 2),
+                           getByte(o, offset + 3));
+        }
+    }
+    /** @see #getLongUnaligned(Object, long, boolean) */
+    public final int getIntUnaligned(Object o, long offset, boolean bigEndian) {
+        return convEndian(bigEndian, getIntUnaligned(o, offset));
+    }
+
+    /** @see #getLongUnaligned(Object, long) */
+    public final short getShortUnaligned(Object o, long offset) {
+        if ((offset & 1) == 0) {
+            return getShort(o, offset);
+        } else {
+            return makeShort(getByte(o, offset),
+                             getByte(o, offset + 1));
+        }
+    }
+    /** @see #getLongUnaligned(Object, long, boolean) */
+    public final short getShortUnaligned(Object o, long offset, boolean bigEndian) {
+        return convEndian(bigEndian, getShortUnaligned(o, offset));
+    }
+
+    /** @see #getLongUnaligned(Object, long) */
+    public final char getCharUnaligned(Object o, long offset) {
+        return (char)getShortUnaligned(o, offset);
+    }
+    /** @see #getLongUnaligned(Object, long, boolean) */
+    public final char getCharUnaligned(Object o, long offset, boolean bigEndian) {
+        return convEndian(bigEndian, getCharUnaligned(o, offset));
+    }
+
+    /**
+     * Stores a value at some byte offset into a given Java object.
+     * <p>
+     * The specification of this method is the same as {@link
+     * #getLong(Object, long)} except that the offset does not need to
+     * have been obtained from {@link #objectFieldOffset} on the
+     * {@link java.lang.reflect.Field} of some Java field.  The value
+     * in memory is raw data, and need not correspond to any Java
+     * variable.  The endianness of the value in memory is the
+     * endianness of the native platform.
+     * <p>
+     * The write will be atomic with respect to the largest power of
+     * two that divides the GCD of the offset and the storage size.
+     * For example, putLongUnaligned will make atomic writes of 2-, 4-,
+     * or 8-byte storage units if the offset is zero mod 2, 4, or 8,
+     * respectively.  There are no other guarantees of atomicity.
+     * <p>
+     * 8-byte atomicity is only guaranteed on platforms on which
+     * support atomic accesses to longs.
+     * <p>
+     *
+     * @param o Java heap object in which the value resides, if any, else
+     *        null
+     * @param offset The offset in bytes from the start of the object
+     * @param x the value to store
+     * @throws RuntimeException No defined exceptions are thrown, not even
+     *         {@link NullPointerException}
+     * @since 1.9
+     */
+    public final void putLongUnaligned(Object o, long offset, long x) {
+        if ((offset & 7) == 0) {
+            putLong(o, offset, x);
+        } else if ((offset & 3) == 0) {
+            putLongParts(o, offset,
+                         (int)(x >> 0),
+                         (int)(x >>> 32));
+        } else if ((offset & 1) == 0) {
+            putLongParts(o, offset,
+                         (short)(x >>> 0),
+                         (short)(x >>> 16),
+                         (short)(x >>> 32),
+                         (short)(x >>> 48));
+        } else {
+            putLongParts(o, offset,
+                         (byte)(x >>> 0),
+                         (byte)(x >>> 8),
+                         (byte)(x >>> 16),
+                         (byte)(x >>> 24),
+                         (byte)(x >>> 32),
+                         (byte)(x >>> 40),
+                         (byte)(x >>> 48),
+                         (byte)(x >>> 56));
+        }
+    }
+    /**
+     * As {@link #putLongUnaligned(Object, long, long)} but with an additional
+     * argument which specifies the endianness of the value as stored in memory.
+     * @param o Java heap object in which the value resides
+     * @param offset The offset in bytes from the start of the object
+     * @param x the value to store
+     * @param bigEndian The endianness of the value
+     * @throws RuntimeException No defined exceptions are thrown, not even
+     *         {@link NullPointerException}
+     * @since 1.9
+     */
+    public final void putLongUnaligned(Object o, long offset, long x, boolean bigEndian) {
+        putLongUnaligned(o, offset, convEndian(bigEndian, x));
+    }
+
+    /** @see #putLongUnaligned(Object, long, long) */
+    public final void putIntUnaligned(Object o, long offset, int x) {
+        if ((offset & 3) == 0) {
+            putInt(o, offset, x);
+        } else if ((offset & 1) == 0) {
+            putIntParts(o, offset,
+                        (short)(x >> 0),
+                        (short)(x >>> 16));
+        } else {
+            putIntParts(o, offset,
+                        (byte)(x >>> 0),
+                        (byte)(x >>> 8),
+                        (byte)(x >>> 16),
+                        (byte)(x >>> 24));
+        }
+    }
+    /** @see #putLongUnaligned(Object, long, long, boolean) */
+    public final void putIntUnaligned(Object o, long offset, int x, boolean bigEndian) {
+        putIntUnaligned(o, offset, convEndian(bigEndian, x));
+    }
+
+    /** @see #putLongUnaligned(Object, long, long) */
+    public final void putShortUnaligned(Object o, long offset, short x) {
+        if ((offset & 1) == 0) {
+            putShort(o, offset, x);
+        } else {
+            putShortParts(o, offset,
+                          (byte)(x >>> 0),
+                          (byte)(x >>> 8));
+        }
+    }
+    /** @see #putLongUnaligned(Object, long, long, boolean) */
+    public final void putShortUnaligned(Object o, long offset, short x, boolean bigEndian) {
+        putShortUnaligned(o, offset, convEndian(bigEndian, x));
+    }
+
+    /** @see #putLongUnaligned(Object, long, long) */
+    public final void putCharUnaligned(Object o, long offset, char x) {
+        putShortUnaligned(o, offset, (short)x);
+    }
+    /** @see #putLongUnaligned(Object, long, long, boolean) */
+    public final void putCharUnaligned(Object o, long offset, char x, boolean bigEndian) {
+        putCharUnaligned(o, offset, convEndian(bigEndian, x));
+    }
+
+    // JVM interface methods
+    private native boolean unalignedAccess0();
+    private native boolean isBigEndian0();
+
+    // BE is true iff the native endianness of this platform is big.
+    private static final boolean BE = theUnsafe.isBigEndian0();
+
+    // unalignedAccess is true iff this platform can perform unaligned accesses.
+    private static final boolean unalignedAccess = theUnsafe.unalignedAccess0();
+
+    private static int pickPos(int top, int pos) { return BE ? top - pos : pos; }
+
+    // These methods construct integers from bytes.  The byte ordering
+    // is the native endianness of this platform.
+    private static long makeLong(byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) {
+        return ((toUnsignedLong(i0) << pickPos(56, 0))
+              | (toUnsignedLong(i1) << pickPos(56, 8))
+              | (toUnsignedLong(i2) << pickPos(56, 16))
+              | (toUnsignedLong(i3) << pickPos(56, 24))
+              | (toUnsignedLong(i4) << pickPos(56, 32))
+              | (toUnsignedLong(i5) << pickPos(56, 40))
+              | (toUnsignedLong(i6) << pickPos(56, 48))
+              | (toUnsignedLong(i7) << pickPos(56, 56)));
+    }
+    private static long makeLong(short i0, short i1, short i2, short i3) {
+        return ((toUnsignedLong(i0) << pickPos(48, 0))
+              | (toUnsignedLong(i1) << pickPos(48, 16))
+              | (toUnsignedLong(i2) << pickPos(48, 32))
+              | (toUnsignedLong(i3) << pickPos(48, 48)));
+    }
+    private static long makeLong(int i0, int i1) {
+        return (toUnsignedLong(i0) << pickPos(32, 0))
+             | (toUnsignedLong(i1) << pickPos(32, 32));
+    }
+    private static int makeInt(short i0, short i1) {
+        return (toUnsignedInt(i0) << pickPos(16, 0))
+             | (toUnsignedInt(i1) << pickPos(16, 16));
+    }
+    private static int makeInt(byte i0, byte i1, byte i2, byte i3) {
+        return ((toUnsignedInt(i0) << pickPos(24, 0))
+              | (toUnsignedInt(i1) << pickPos(24, 8))
+              | (toUnsignedInt(i2) << pickPos(24, 16))
+              | (toUnsignedInt(i3) << pickPos(24, 24)));
+    }
+    private static short makeShort(byte i0, byte i1) {
+        return (short)((toUnsignedInt(i0) << pickPos(8, 0))
+                     | (toUnsignedInt(i1) << pickPos(8, 8)));
+    }
+
+    private static byte  pick(byte  le, byte  be) { return BE ? be : le; }
+    private static short pick(short le, short be) { return BE ? be : le; }
+    private static int   pick(int   le, int   be) { return BE ? be : le; }
+
+    // These methods write integers to memory from smaller parts
+    // provided by their caller.  The ordering in which these parts
+    // are written is the native endianness of this platform.
+    private void putLongParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) {
+        putByte(o, offset + 0, pick(i0, i7));
+        putByte(o, offset + 1, pick(i1, i6));
+        putByte(o, offset + 2, pick(i2, i5));
+        putByte(o, offset + 3, pick(i3, i4));
+        putByte(o, offset + 4, pick(i4, i3));
+        putByte(o, offset + 5, pick(i5, i2));
+        putByte(o, offset + 6, pick(i6, i1));
+        putByte(o, offset + 7, pick(i7, i0));
+    }
+    private void putLongParts(Object o, long offset, short i0, short i1, short i2, short i3) {
+        putShort(o, offset + 0, pick(i0, i3));
+        putShort(o, offset + 2, pick(i1, i2));
+        putShort(o, offset + 4, pick(i2, i1));
+        putShort(o, offset + 6, pick(i3, i0));
+    }
+    private void putLongParts(Object o, long offset, int i0, int i1) {
+        putInt(o, offset + 0, pick(i0, i1));
+        putInt(o, offset + 4, pick(i1, i0));
+    }
+    private void putIntParts(Object o, long offset, short i0, short i1) {
+        putShort(o, offset + 0, pick(i0, i1));
+        putShort(o, offset + 2, pick(i1, i0));
+    }
+    private void putIntParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3) {
+        putByte(o, offset + 0, pick(i0, i3));
+        putByte(o, offset + 1, pick(i1, i2));
+        putByte(o, offset + 2, pick(i2, i1));
+        putByte(o, offset + 3, pick(i3, i0));
+    }
+    private void putShortParts(Object o, long offset, byte i0, byte i1) {
+        putByte(o, offset + 0, pick(i0, i1));
+        putByte(o, offset + 1, pick(i1, i0));
+    }
+
+    // Zero-extend an integer
+    private static int toUnsignedInt(byte n)    { return n & 0xff; }
+    private static int toUnsignedInt(short n)   { return n & 0xffff; }
+    private static long toUnsignedLong(byte n)  { return n & 0xffl; }
+    private static long toUnsignedLong(short n) { return n & 0xffffl; }
+    private static long toUnsignedLong(int n)   { return n & 0xffffffffl; }
+
+    // Maybe byte-reverse an integer
+    private static char convEndian(boolean big, char n)   { return big == BE ? n : Character.reverseBytes(n); }
+    private static short convEndian(boolean big, short n) { return big == BE ? n : Short.reverseBytes(n)    ; }
+    private static int convEndian(boolean big, int n)     { return big == BE ? n : Integer.reverseBytes(n)  ; }
+    private static long convEndian(boolean big, long n)   { return big == BE ? n : Long.reverseBytes(n)     ; }
+
+    /**
      * Report the location of a given field in the storage allocation of its
      * class.  Do not expect to perform any sort of arithmetic on this offset;
      * it is just a cookie which is passed to the unsafe heap memory accessors.
--- a/src/share/classes/sun/misc/Version.java.template	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/misc/Version.java.template	Tue Aug 22 02:03:52 2017 +0100
@@ -36,11 +36,23 @@
         "@@java_version@@";
 
     private static final String java_runtime_name =
-	"@@java_runtime_name@@";
- 
+        "@@java_runtime_name@@";
+
     private static final String java_runtime_version =
         "@@java_runtime_version@@";
 
+    private static final String jdk_derivative_name =
+        "@@jdk_derivative_name@@";
+
+    private static final String distro_name =
+        "@@distro_name@@";
+
+    private static final String distro_package_version =
+        "@@distro_package_version@@";
+
+    private static final String jdk_revid =
+        "@@jdk_revid@@";
+
     static {
         init();
     }
@@ -90,26 +102,44 @@
         boolean isHeadless = false;
 
         /* Report that we're running headless if the property is true */
-	String headless = System.getProperty("java.awt.headless");
-	if ( (headless != null) && (headless.equalsIgnoreCase("true")) ) {
+        String headless = System.getProperty("java.awt.headless");
+        if ( (headless != null) && (headless.equalsIgnoreCase("true")) ) {
             isHeadless = true;
-	} 
+        }
 
         /* First line: platform version. */
         ps.println(launcher_name + " version \"" + java_version + "\"");
 
-        /* Second line: runtime version (ie, libraries). */
-
-	ps.print(java_runtime_name + " (build " + java_runtime_version);
+        String java_vm_name    = System.getProperty("java.vm.name");
 
-	if (java_runtime_name.indexOf("Embedded") != -1 && isHeadless) {
-	    // embedded builds report headless state
-	    ps.print(", headless");
-	}
-	ps.println(')');
+        /* Second line: runtime version (ie, libraries). */
+        StringBuilder sb = new StringBuilder();
+        if (java_vm_name.toLowerCase().startsWith("cacao")) {
+            sb.append("IcedTea Runtime Environment");
+        } else {
+            sb.append(java_runtime_name);
+        }
+        if (jdk_derivative_name.length() > 0) {
+            sb.append(" (").append(jdk_derivative_name).append(")");
+        }
+        if (distro_package_version.length() > 0) {
+            sb.append(" (").append(distro_package_version).append(")");
+        } else {
+            sb.append(" (");
+            if (distro_name.length() > 0)
+                sb.append(distro_name).append(" ");
+            sb.append("build ").append(java_runtime_version);
+            if (jdk_revid.length() > 0)
+                sb.append("+").append(jdk_revid);
+            if (java_runtime_name.indexOf("Embedded") != -1 && isHeadless) {
+              // embedded builds report headless state
+              sb.append(", headless");
+            }
+            sb.append(")");
+        }
+        ps.println(sb.toString());
 
         /* Third line: JVM information. */
-        String java_vm_name    = System.getProperty("java.vm.name");
         String java_vm_version = System.getProperty("java.vm.version");
         String java_vm_info    = System.getProperty("java.vm.info");
         ps.println(java_vm_name + " (build " + java_vm_version + ", " +
--- a/src/share/classes/sun/nio/ch/FileChannelImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/nio/ch/FileChannelImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -327,6 +327,7 @@
             int rv = -1;
             long p = -1;
             int ti = -1;
+            long rp = -1;
             try {
                 begin();
                 ti = threads.add();
@@ -352,8 +353,8 @@
                 if (p > size)
                     p = size;
                 do {
-                    rv = (int)position0(fd, p);
-                } while ((rv == IOStatus.INTERRUPTED) && isOpen());
+                    rp = position0(fd, p);
+                } while ((rp == IOStatus.INTERRUPTED) && isOpen());
                 return this;
             } finally {
                 threads.remove(ti);
--- a/src/share/classes/sun/rmi/registry/RegistryImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/rmi/registry/RegistryImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -57,6 +57,9 @@
 import sun.rmi.server.UnicastServerRef;
 import sun.rmi.server.UnicastServerRef2;
 import sun.rmi.transport.LiveRef;
+import sun.rmi.transport.ObjectTable;
+import sun.rmi.transport.Target;
+import sun.security.action.GetPropertyAction;
 
 /**
  * A "registry" exists on every node that allows RMI connections to
@@ -463,6 +466,19 @@
             URL[] urls = sun.misc.URLClassPath.pathToURLs(envcp);
             ClassLoader cl = new URLClassLoader(urls);
 
+            String codebaseProperty = null;
+            String prop = java.security.AccessController.doPrivileged(
+                new GetPropertyAction("java.rmi.server.codebase"));
+                if (prop != null && prop.trim().length() > 0) {
+                    codebaseProperty = prop;
+                }
+            URL[] codebaseURLs = null;
+            if (codebaseProperty != null) {
+                codebaseURLs = sun.misc.URLClassPath.pathToURLs(codebaseProperty);
+            } else {
+                codebaseURLs = new URL[0];
+            }
+
             /*
              * Fix bugid 4242317: Classes defined by this class loader should
              * be annotated with the value of the "java.rmi.server.codebase"
--- a/src/share/classes/sun/security/ec/SunEC.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/ec/SunEC.java	Tue Aug 22 02:03:52 2017 +0100
@@ -58,6 +58,7 @@
             AccessController.doPrivileged(new PrivilegedAction<Void>() {
                 public Void run() {
                     System.loadLibrary("sunec"); // check for native library
+                    initialize();
                     return null;
                 }
             });
@@ -81,4 +82,22 @@
         }
     }
 
+    /**
+     * Cleanup native resources during finalisation.
+     */
+    @Override
+    protected void finalize() {
+        cleanup();
+    }
+
+    /**
+     * Initialize the native code.
+     */
+    private static native void initialize();
+
+    /**
+     * Cleanup in the native layer.
+     */
+    private static native void cleanup();
+
 }
--- a/src/share/classes/sun/security/krb5/Config.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/krb5/Config.java	Tue Aug 22 02:03:52 2017 +0100
@@ -43,6 +43,7 @@
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.List;
+import java.util.Locale;
 import sun.net.dns.ResolverConfiguration;
 import sun.security.krb5.internal.crypto.EType;
 import sun.security.krb5.internal.Krb5;
@@ -412,6 +413,32 @@
     }
 
     /**
+     * Gets the default boolean value for the specified name in the
+     * specified section.  Returns TRUE if the
+     * string value is "yes", or "true", FALSE if "no", or "false", or null
+     * if otherwise or not defined. The comparision is case-insensitive.
+     * @param name the name.
+     * @param section the name of the section.
+     * @return the boolean value, or null if there is no value defined or the
+     * value does not look like a boolean value.
+     * @throws IllegalArgumentException see {@link #get(String...)}
+     */
+    private Boolean getDefaultBooleanObject(String name, String section) {
+        String s = getDefault(name, section);
+        if (s == null) {
+            return null;
+        }
+        switch (s.toLowerCase(Locale.US)) {
+            case "yes": case "true":
+                return Boolean.TRUE;
+            case "no": case "false":
+                return Boolean.FALSE;
+            default:
+                return null;
+        }
+    }
+
+    /**
      * Parses a string to an integer. The convertible strings include the
      * string representations of positive integers, negative integers, and
      * hex decimal integers.  Valid inputs are, e.g., -1234, +1234,
@@ -1129,32 +1156,30 @@
     /**
      * Check if need to use DNS to locate Kerberos services
      */
-    public boolean useDNS(String name) {
-        String value = getDefault(name, "libdefaults");
-        if (value == null) {
-            value = getDefault("dns_fallback", "libdefaults");
-            if ("false".equalsIgnoreCase(value)) {
-                return false;
-            } else {
-                return true;
-            }
-        } else {
-            return value.equalsIgnoreCase("true");
+    private boolean useDNS(String name, boolean defaultValue) {
+        Boolean value = getDefaultBooleanObject(name, "libdefaults");
+        if (value != null) {
+            return value.booleanValue();
         }
+        value = getDefaultBooleanObject("dns_fallback", "libdefaults");
+        if (value != null) {
+            return value.booleanValue();
+        }
+        return defaultValue;
     }
 
     /**
      * Check if need to use DNS to locate the KDC
      */
     public boolean useDNS_KDC() {
-        return useDNS("dns_lookup_kdc");
+        return useDNS("dns_lookup_kdc", true);
     }
 
     /*
      * Check if need to use DNS to locate the Realm
      */
     public boolean useDNS_Realm() {
-        return useDNS("dns_lookup_realm");
+        return useDNS("dns_lookup_realm", false);
     }
 
     /**
--- a/src/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013 Red Hat, Inc. and/or its affiliates.
  * 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,7 +44,9 @@
 import java.io.FileOutputStream;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
-import java.lang.reflect.*;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 
 /**
  * CredentialsCache stores credentials(tickets, session keys, etc) in a
@@ -62,6 +65,8 @@
     private Vector<Credentials> credentialsList;
     private static String dir;
     private static boolean DEBUG = Krb5.DEBUG;
+    private static boolean alreadyLoaded = false;
+    private static boolean alreadyTried = false;
 
     public static synchronized FileCredentialsCache acquireInstance(
                 PrincipalName principal, String cache) {
@@ -349,9 +354,10 @@
      * The path name is searched in the following order:
      *
      * 1. KRB5CCNAME (bare file name without FILE:)
-     * 2. /tmp/krb5cc_<uid> on unix systems
-     * 3. <user.home>/krb5cc_<user.name>
-     * 4. <user.home>/krb5cc (if can't get <user.name>)
+     * 2. location specified by Kerberos API on unix systems
+     * 3. /tmp/krb5cc_<uid> on unix systems
+     * 4. <user.home>/krb5cc_<user.name>
+     * 5. <user.home>/krb5cc (if can't get <user.name>)
      */
 
     public static String getDefaultCacheName() {
@@ -400,21 +406,59 @@
         if (osname != null) {
             String cmd = null;
             String uidStr = null;
-            long uid = 0;
 
             if (!osname.startsWith("Windows")) {
                 try {
-                    Class<?> c = Class.forName
-                        ("com.sun.security.auth.module.UnixSystem");
-                    Constructor<?> constructor = c.getConstructor();
-                    Object obj = constructor.newInstance();
-                    Method method = c.getMethod("getUid");
-                    uid =  ((Long)method.invoke(obj)).longValue();
-                    name = File.separator + "tmp" +
-                        File.separator + stdCacheNameComponent + "_" + uid;
-                    if (DEBUG) {
-                        System.out.println(">>>KinitOptions cache name is " +
-                                           name);
+                    // Load the native code if necessary
+                    if (!alreadyTried) {
+                        // See if there's any native code to load
+                        try {
+                            ensureLoaded();
+                        } catch (Exception e) {
+                            if (DEBUG) {
+                                System.out.println("Could not load native Kerberos bridge");
+                                e.printStackTrace();
+                            }
+                            alreadyTried = true;
+                        }
+                    }
+                    if (alreadyLoaded) {
+                        // There is some native code
+                        if (DEBUG) {
+                           System.out.println(">> Look up native default credential cache");
+                        }
+                        // Query the native Kerberos API for the cache location
+                        name = nativeGetDefaultCacheName();
+                    }
+
+                    /*
+                     * We require the default cache location to be a file name.
+                     * DIR: can point to a cache collection, while DIR:: points
+                     * to a specific cache file.
+                     *
+                     * http://k5wiki.kerberos.org/wiki?title=Projects/Client_principal_selection&oldid=4118
+                     */
+                    if (name != null && (name.startsWith("FILE:") || name.startsWith("DIR::"))) {
+                        name = name.substring(5);
+                        if (DEBUG) {
+                            System.out.println(">>>KinitOptions cache name is " +
+                                    name);
+                        }
+                    } else {
+                        long uid = 0;
+
+                        Class<?> c = Class.forName
+                            ("com.sun.security.auth.module.UnixSystem");
+                        Constructor<?> constructor = c.getConstructor();
+                        Object obj = constructor.newInstance();
+                        Method method = c.getMethod("getUid");
+                        uid =  ((Long)method.invoke(obj)).longValue();
+                        name = File.separator + "tmp" +
+                            File.separator + stdCacheNameComponent + "_" + uid;
+                        if (DEBUG) {
+                            System.out.println(">>>KinitOptions cache name is " +
+                                               name);
+                        }
                     }
                     return name;
                 } catch (Exception e) {
@@ -461,6 +505,8 @@
         return name;
     }
 
+    private native static String nativeGetDefaultCacheName() throws Exception;
+
     public static String checkValidation(String name) {
         String fullname = null;
         if (name == null) {
@@ -541,4 +587,16 @@
         }
         return null;
     }
+
+    private static void ensureLoaded() {
+        java.security.AccessController.doPrivileged(
+                new java.security.PrivilegedAction<Void> () {
+                    public Void run() {
+                            System.loadLibrary("j2krb5");
+                        return null;
+                    }
+                });
+        alreadyLoaded = true;
+    }
+
 }
--- a/src/share/classes/sun/security/pkcs11/Config.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/pkcs11/Config.java	Tue Aug 22 02:03:52 2017 +0100
@@ -52,6 +52,7 @@
     static final int ERR_HALT       = 1;
     static final int ERR_IGNORE_ALL = 2;
     static final int ERR_IGNORE_LIB = 3;
+    static final int ERR_IGNORE_MULTI_INIT = 4;
 
     // same as allowSingleThreadedModules but controlled via a system property
     // and applied to all providers. if set to false, no SunPKCS11 instances
@@ -1000,6 +1001,8 @@
             handleStartupErrors = ERR_IGNORE_LIB;
         } else if (val.equals("halt")) {
             handleStartupErrors = ERR_HALT;
+        } else if (val.equals("ignoreMultipleInitialisation")) {
+            handleStartupErrors = ERR_IGNORE_MULTI_INIT;
         } else {
             throw excToken("Invalid value for handleStartupErrors:");
         }
--- a/src/share/classes/sun/security/pkcs11/P11Cipher.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/pkcs11/P11Cipher.java	Tue Aug 22 02:03:52 2017 +0100
@@ -70,7 +70,7 @@
     private static interface Padding {
         // ENC: format the specified buffer with padding bytes and return the
         // actual padding length
-        int setPaddingBytes(byte[] paddingBuffer, int padLen);
+        int setPaddingBytes(byte[] paddingBuffer, int offset, int padLen);
 
         // DEC: return the length of trailing padding bytes given the specified
         // padded data
@@ -91,8 +91,8 @@
             this.blockSize = blockSize;
         }
 
-        public int setPaddingBytes(byte[] paddingBuffer, int padLen) {
-            Arrays.fill(paddingBuffer, 0, padLen, (byte) (padLen & 0x007f));
+        public int setPaddingBytes(byte[] paddingBuffer, int offset, int padLen) {
+            Arrays.fill(paddingBuffer, offset, offset + padLen, (byte) (padLen & 0x007f));
             return padLen;
         }
 
@@ -161,10 +161,16 @@
     // original IV, if in MODE_CBC or MODE_CTR
     private byte[] iv;
 
-    // number of bytes buffered internally by the native mechanism and padBuffer
-    // if we do the padding
+    // number of bytes buffered by the blockBuffer
     private int bytesBuffered;
 
+    // number of bytes buffered internally
+    private int bytesBufferedInt;
+
+    // bytes buffered from an incomplete block
+    private byte[] blockBuffer;
+    private int blockBufferLen;
+
     // length of key size in bytes; currently only used by AES given its oid
     // specification mandates a fixed size of the key
     private int fixedKeySize = -1;
@@ -206,6 +212,9 @@
             // should not happen
             throw new ProviderException(nspe);
         }
+
+	if (blockSize > 0)
+	    blockBuffer = new byte[blockSize];
     }
 
     protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
@@ -418,7 +427,8 @@
                 token.p11.C_DecryptFinal(session.id(), 0, buffer, 0, bufLen);
             }
         } catch (PKCS11Exception e) {
-            throw new ProviderException("Cancel failed", e);
+	    if (e.getErrorCode() != CKR_OPERATION_NOT_INITIALIZED)
+		throw new ProviderException("Cancel failed", e);
         } finally {
             reset();
         }
@@ -450,7 +460,9 @@
             throw ex;
         }
         bytesBuffered = 0;
+	bytesBufferedInt = 0;
         padBufferLen = 0;
+	blockBufferLen = 0;
         initialized = true;
     }
 
@@ -460,7 +472,7 @@
             return 0;
         }
 
-        int result = inLen + bytesBuffered;
+        int result = inLen + bytesBuffered + bytesBufferedInt;
         if (blockSize != 0) {
             // minus the number of bytes in the last incomplete block.
             result -= (result & (blockSize - 1));
@@ -474,7 +486,7 @@
             return 0;
         }
 
-        int result = inLen + bytesBuffered;
+        int result = inLen + bytesBuffered + bytesBufferedInt;
         if (blockSize != 0 && encrypt && paddingType != PAD_NONE) {
             // add the number of bytes to make the last block complete.
             result += (blockSize - (result & (blockSize - 1)));
@@ -486,7 +498,9 @@
     private void reset() {
         initialized = false;
         bytesBuffered = 0;
+	bytesBufferedInt = 0;
         padBufferLen = 0;
+	blockBufferLen = 0;
         if (session != null) {
             session = token.releaseSession(session);
         }
@@ -561,50 +575,65 @@
         }
         try {
             ensureInitialized();
-            int k = 0;
-            if (encrypt) {
-                k = token.p11.C_EncryptUpdate(session.id(), 0, in, inOfs, inLen,
-                        0, out, outOfs, outLen);
-            } else {
-                int newPadBufferLen = 0;
-                if (paddingObj != null) {
-                    if (padBufferLen != 0) {
-                        // NSS throws up when called with data not in multiple
-                        // of blocks. Try to work around this by holding the
-                        // extra data in padBuffer.
-                        if (padBufferLen != padBuffer.length) {
-                            int bufCapacity = padBuffer.length - padBufferLen;
-                            if (inLen > bufCapacity) {
-                                bufferInputBytes(in, inOfs, bufCapacity);
-                                inOfs += bufCapacity;
-                                inLen -= bufCapacity;
-                            } else {
-                                bufferInputBytes(in, inOfs, inLen);
-                                return 0;
-                            }
-                        }
-                        k = token.p11.C_DecryptUpdate(session.id(),
-                                0, padBuffer, 0, padBufferLen,
-                                0, out, outOfs, outLen);
-                        padBufferLen = 0;
-                    }
-                    newPadBufferLen = inLen & (blockSize - 1);
-                    if (newPadBufferLen == 0) {
-                        newPadBufferLen = padBuffer.length;
-                    }
-                    inLen -= newPadBufferLen;
-                }
-                if (inLen > 0) {
-                    k += token.p11.C_DecryptUpdate(session.id(), 0, in, inOfs,
-                            inLen, 0, out, (outOfs + k), (outLen - k));
-                }
-                // update 'padBuffer' if using our own padding impl.
-                if (paddingObj != null) {
-                    bufferInputBytes(in, inOfs + inLen, newPadBufferLen);
-                }
-            }
-            bytesBuffered += (inLen - k);
-            return k;
+            int bufRes = 0;
+	    int inRes = 0;
+	    int newBlockBufferLen = 0;
+
+	    // NSS throws up when called with data not in multiple
+	    // of blocks. Try to work around this by holding the
+	    // extra data in blockBuffer.
+	    if (blockBufferLen != 0) {
+		if (blockBufferLen != blockBuffer.length) {
+		    int bufCapacity = blockBuffer.length - blockBufferLen;
+		    if (inLen >= bufCapacity) {
+			bufferInputBytes(in, inOfs, bufCapacity);
+			inOfs += bufCapacity;
+			inLen -= bufCapacity;
+		    } else {
+			bufferInputBytes(in, inOfs, inLen);
+			return 0;
+		    }
+		}
+		if (encrypt) {
+		    bufRes = token.p11.C_EncryptUpdate(session.id(), 0, blockBuffer, 0,
+						       blockBufferLen, 0, out, outOfs,
+						       outLen);
+		} else {
+		    bufRes = token.p11.C_DecryptUpdate(session.id(), 0, blockBuffer, 0,
+						       blockBufferLen, 0, out, outOfs,
+						       outLen);
+		}
+		bytesBufferedInt += (blockBufferLen - bufRes);
+		blockBufferLen = 0;
+		bytesBuffered = 0;
+	    }
+
+	    if (inLen == 0)
+		return bufRes;
+
+	    if (blockBuffer != null) {
+		newBlockBufferLen = inLen & (blockSize - 1);
+		if (!encrypt && paddingObj != null && newBlockBufferLen == 0)
+		    // Hold the last block in the buffer if we need to unpad
+		    newBlockBufferLen = blockBuffer.length;
+		inLen -= newBlockBufferLen;
+		bufferInputBytes(in, inOfs + inLen, newBlockBufferLen);
+	    }
+
+	    if (inLen > 0) {
+		if (encrypt) {
+                    inRes = token.p11.C_EncryptUpdate(session.id(), 0, in, inOfs,
+						      inLen, 0, out, (outOfs + bufRes),
+						      (outLen - bufRes));
+		} else {
+                    inRes = token.p11.C_DecryptUpdate(session.id(), 0, in, inOfs,
+						      inLen, 0, out, (outOfs + bufRes),
+						      (outLen - bufRes));
+		}
+		bytesBufferedInt += (inLen - inRes);
+	    }
+
+            return inRes + bufRes;
         } catch (PKCS11Exception e) {
             if (e.getErrorCode() == CKR_BUFFER_TOO_SMALL) {
                 throw (ShortBufferException)
@@ -657,70 +686,79 @@
                 }
             }
 
-            int k = 0;
-            if (encrypt) {
-                if (inAddr == 0 && inArray == null) {
-                    inArray = new byte[inLen];
-                    inBuffer.get(inArray);
-                } else {
-                    inBuffer.position(origPos + inLen);
-                }
-                k = token.p11.C_EncryptUpdate(session.id(),
-                        inAddr, inArray, inOfs, inLen,
-                        outAddr, outArray, outOfs, outLen);
-            } else {
-                int newPadBufferLen = 0;
-                if (paddingObj != null) {
-                    if (padBufferLen != 0) {
-                        // NSS throws up when called with data not in multiple
-                        // of blocks. Try to work around this by holding the
-                        // extra data in padBuffer.
-                        if (padBufferLen != padBuffer.length) {
-                            int bufCapacity = padBuffer.length - padBufferLen;
-                            if (inLen > bufCapacity) {
-                                bufferInputBytes(inBuffer, bufCapacity);
-                                inOfs += bufCapacity;
-                                inLen -= bufCapacity;
-                            } else {
-                                bufferInputBytes(inBuffer, inLen);
-                                return 0;
-                            }
-                        }
-                        k = token.p11.C_DecryptUpdate(session.id(), 0,
-                                padBuffer, 0, padBufferLen, outAddr, outArray,
-                                outOfs, outLen);
-                        padBufferLen = 0;
-                    }
-                    newPadBufferLen = inLen & (blockSize - 1);
-                    if (newPadBufferLen == 0) {
-                        newPadBufferLen = padBuffer.length;
-                    }
-                    inLen -= newPadBufferLen;
-                }
-                if (inLen > 0) {
-                    if (inAddr == 0 && inArray == null) {
-                        inArray = new byte[inLen];
-                        inBuffer.get(inArray);
-                    } else {
-                        inBuffer.position(inBuffer.position() + inLen);
-                    }
-                    k += token.p11.C_DecryptUpdate(session.id(), inAddr,
-                            inArray, inOfs, inLen, outAddr, outArray,
-                            (outOfs + k), (outLen - k));
-                }
-                // update 'padBuffer' if using our own padding impl.
-                if (paddingObj != null && newPadBufferLen != 0) {
-                    bufferInputBytes(inBuffer, newPadBufferLen);
-                }
-            }
-            bytesBuffered += (inLen - k);
+            int bufRes = 0;
+	    int inRes = 0;
+	    int newBlockBufferLen = 0;
+
+	    // NSS throws up when called with data not in multiple
+	    // of blocks. Try to work around this by holding the
+	    // extra data in blockBuffer.
+	    if (blockBufferLen != 0) {
+		if (blockBufferLen != blockBuffer.length) {
+		    int bufCapacity = blockBuffer.length - blockBufferLen;
+		    if (inLen >= bufCapacity) {
+			bufferInputBytes(inBuffer, bufCapacity);
+			inOfs += bufCapacity;
+			inLen -= bufCapacity;
+		    } else {
+			bufferInputBytes(inBuffer, inLen);
+			return 0;
+		    }
+		}
+		if (encrypt) {
+		    bufRes = token.p11.C_EncryptUpdate(session.id(), 0, blockBuffer, 0,
+						       blockBufferLen, outAddr, outArray, outOfs,
+						       outLen);
+		} else {
+		    bufRes = token.p11.C_DecryptUpdate(session.id(), 0, blockBuffer, 0,
+						       blockBufferLen, outAddr, outArray, outOfs,
+						       outLen);
+		}
+		bytesBufferedInt += (blockBufferLen - bufRes);
+		blockBufferLen = 0;
+		bytesBuffered = 0;
+	    }
+
+	    if (inLen == 0)
+		return bufRes;
+
+	    if (blockBuffer != null) {
+		newBlockBufferLen = inLen & (blockSize - 1);
+		if (!encrypt && paddingObj != null && newBlockBufferLen == 0)
+		    // Hold the last block in the buffer if we need to unpad
+		    newBlockBufferLen = blockBuffer.length;
+		inLen -= newBlockBufferLen;
+		bufferInputBytes(inBuffer, newBlockBufferLen);
+	    }
+
+	    if (inAddr == 0 && inArray == null) {
+		inArray = new byte[inLen];
+		inBuffer.get(inArray);
+	    } else {
+		inBuffer.position(inBuffer.position() + inLen);
+	    }
+
+	    if (inLen > 0) {
+		if (encrypt) {
+                    inRes = token.p11.C_EncryptUpdate(session.id(), inAddr, inArray, inOfs,
+						      inLen, outAddr, outArray, (outOfs + bufRes),
+						      (outLen - bufRes));
+		} else {
+                    inRes = token.p11.C_DecryptUpdate(session.id(), inAddr, inArray, inOfs,
+						      inLen, outAddr, outArray, (outOfs + bufRes),
+						      (outLen - bufRes));
+		}
+		bytesBufferedInt += (inLen - inRes);
+	    }
+
+	    int total = inRes + bufRes;
             if (!(outBuffer instanceof DirectBuffer) &&
                     !outBuffer.hasArray()) {
-                outBuffer.put(outArray, outOfs, k);
+                outBuffer.put(outArray, outOfs, total);
             } else {
-                outBuffer.position(outBuffer.position() + k);
+                outBuffer.position(outBuffer.position() + total);
             }
-            return k;
+	    return total;
         } catch (PKCS11Exception e) {
             // Reset input buffer to its original position for
             inBuffer.position(origPos);
@@ -737,45 +775,71 @@
             throws ShortBufferException, IllegalBlockSizeException,
             BadPaddingException {
         int requiredOutLen = doFinalLength(0);
+	boolean updating = false;
+	PKCS11Exception err = null;
+
         if (outLen < requiredOutLen) {
             throw new ShortBufferException();
         }
         try {
             ensureInitialized();
             int k = 0;
-            if (encrypt) {
-                if (paddingObj != null) {
-                    int actualPadLen = paddingObj.setPaddingBytes(padBuffer,
-                            requiredOutLen - bytesBuffered);
-                    k = token.p11.C_EncryptUpdate(session.id(),
-                            0, padBuffer, 0, actualPadLen,
-                            0, out, outOfs, outLen);
-                }
+	    if (encrypt) {
+		if (blockBuffer != null) {
+		    // Do we need to pad?
+		    if (paddingObj != null) {
+			int actualPadLen = paddingObj.setPaddingBytes(blockBuffer,
+			    blockBufferLen, blockSize - blockBufferLen);
+			blockBufferLen = blockSize;
+		    }
+		    updating = true;
+		    k = token.p11.C_EncryptUpdate(session.id(),
+						  0, blockBuffer, 0, blockBufferLen,
+						  0, out, outOfs, outLen);
+		    updating = false;
+		}
                 k += token.p11.C_EncryptFinal(session.id(),
                         0, out, (outOfs + k), (outLen - k));
             } else {
+		if (blockBufferLen != 0) {
+		    if (paddingObj == null)
+			k = token.p11.C_DecryptUpdate(session.id(), 0,
+						      blockBuffer, 0, blockBufferLen, 0,
+						      out, outOfs, outLen);
+		    else
+			k = token.p11.C_DecryptUpdate(session.id(), 0,
+						      blockBuffer, 0, blockBufferLen, 0,
+						      padBuffer, 0, padBuffer.length);
+		}
                 if (paddingObj != null) {
-                    if (padBufferLen != 0) {
-                        k = token.p11.C_DecryptUpdate(session.id(), 0,
-                                padBuffer, 0, padBufferLen, 0, padBuffer, 0,
-                                padBuffer.length);
-                    }
                     k += token.p11.C_DecryptFinal(session.id(), 0, padBuffer, k,
                             padBuffer.length - k);
                     int actualPadLen = paddingObj.unpad(padBuffer, k);
                     k -= actualPadLen;
                     System.arraycopy(padBuffer, 0, out, outOfs, k);
                 } else {
-                    k = token.p11.C_DecryptFinal(session.id(), 0, out, outOfs,
-                            outLen);
+                    k += token.p11.C_DecryptFinal(session.id(), 0, out, (outOfs + k),
+						  (outLen - k));
                 }
             }
             return k;
         } catch (PKCS11Exception e) {
+	    err = e;
             handleException(e);
             throw new ProviderException("doFinal() failed", e);
         } finally {
-            reset();
+            if (err != null) {
+		if (err.getErrorCode() != CKR_BUFFER_TOO_SMALL) {
+		    if (updating)
+			// Work around NSS not cancelling the
+			// operation on an error in update
+			cancelOperation();
+		    else
+			reset();
+		}
+	    } else {
+		reset();
+	    }
         }
     }
 
@@ -784,6 +848,9 @@
             BadPaddingException {
         int outLen = outBuffer.remaining();
         int requiredOutLen = doFinalLength(0);
+	boolean updating = false;
+	PKCS11Exception err = null;
+
         if (outLen < requiredOutLen) {
             throw new ShortBufferException();
         }
@@ -808,24 +875,34 @@
 
             int k = 0;
 
-            if (encrypt) {
-                if (paddingObj != null) {
-                    int actualPadLen = paddingObj.setPaddingBytes(padBuffer,
-                            requiredOutLen - bytesBuffered);
-                    k = token.p11.C_EncryptUpdate(session.id(),
-                            0, padBuffer, 0, actualPadLen,
-                            outAddr, outArray, outOfs, outLen);
-                }
+	    if (encrypt) {
+		if (blockBuffer != null) {
+		    // Do we need to pad?
+		    if (paddingObj != null) {
+			int actualPadLen = paddingObj.setPaddingBytes(blockBuffer,
+			    blockBufferLen, blockSize - blockBufferLen);
+			blockBufferLen = blockSize;
+		    }
+		    updating = true;
+		    k = token.p11.C_EncryptUpdate(session.id(),
+						  0, blockBuffer, 0, blockBufferLen,
+						  outAddr, outArray, outOfs, outLen);
+		    updating = false;
+		}
                 k += token.p11.C_EncryptFinal(session.id(),
                         outAddr, outArray, (outOfs + k), (outLen - k));
-            } else {
+	    } else {
+		if (blockBufferLen != 0) {
+		    k = token.p11.C_DecryptUpdate(session.id(), 0,
+						  blockBuffer, 0, blockBufferLen, outAddr,
+						  outArray, outOfs, outLen);
+		} else {
+			k = token.p11.C_DecryptUpdate(session.id(), 0,
+						      blockBuffer, 0, blockBufferLen, 0,
+						      padBuffer, 0, padBuffer.length);
+		}
+
                 if (paddingObj != null) {
-                    if (padBufferLen != 0) {
-                        k = token.p11.C_DecryptUpdate(session.id(),
-                                0, padBuffer, 0, padBufferLen,
-                                0, padBuffer, 0, padBuffer.length);
-                        padBufferLen = 0;
-                    }
                     k += token.p11.C_DecryptFinal(session.id(),
                             0, padBuffer, k, padBuffer.length - k);
                     int actualPadLen = paddingObj.unpad(padBuffer, k);
@@ -834,7 +911,8 @@
                     outOfs = 0;
                 } else {
                     k = token.p11.C_DecryptFinal(session.id(),
-                            outAddr, outArray, outOfs, outLen);
+						 outAddr, outArray,
+						 (outOfs + k), (outLen - k));
                 }
             }
             if ((!encrypt && paddingObj != null) ||
@@ -846,10 +924,22 @@
             }
             return k;
         } catch (PKCS11Exception e) {
+	    err = e;
             handleException(e);
             throw new ProviderException("doFinal() failed", e);
         } finally {
-            reset();
+            if (err != null) {
+		if (err.getErrorCode() != CKR_BUFFER_TOO_SMALL) {
+		    if (updating)
+			// Work around NSS not cancelling the
+			// operation on an error in update
+			cancelOperation();
+		    else
+			reset();
+		}
+	    } else {
+		reset();
+	    }
         }
     }
 
@@ -890,14 +980,14 @@
     }
 
     private final void bufferInputBytes(byte[] in, int inOfs, int len) {
-        System.arraycopy(in, inOfs, padBuffer, padBufferLen, len);
-        padBufferLen += len;
+        System.arraycopy(in, inOfs, blockBuffer, blockBufferLen, len);
+        blockBufferLen += len;
         bytesBuffered += len;
     }
 
     private final void bufferInputBytes(ByteBuffer inBuffer, int len) {
-        inBuffer.get(padBuffer, padBufferLen, len);
-        padBufferLen += len;
+        inBuffer.get(blockBuffer, blockBufferLen, len);
+        blockBufferLen += len;
         bytesBuffered += len;
     }
 }
--- a/src/share/classes/sun/security/pkcs11/P11Util.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/pkcs11/P11Util.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
--- a/src/share/classes/sun/security/pkcs11/Secmod.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/pkcs11/Secmod.java	Tue Aug 22 02:03:52 2017 +0100
@@ -408,7 +408,16 @@
                         + "module: " + libraryName + ", " + commonName);
                 }
             }
-            this.libraryName = (new File(libraryDir, libraryName)).getPath();
+            // On Ubuntu the libsoftokn3 library is located in a subdirectory
+            // of the system libraries directory. (Since Ubuntu 11.04.)
+            File libraryFile = new File(libraryDir, libraryName);
+            if (!libraryFile.isFile()) {
+               File failover = new File(libraryDir, "nss/" + libraryName);
+               if (failover.isFile()) {
+                   libraryFile = failover;
+               }
+            }
+            this.libraryName = libraryFile.getPath();
             this.commonName = commonName;
             this.slot = slot;
             this.type = type;
@@ -746,8 +755,12 @@
             if (DEBUG) System.out.println("handles: " + handles.length);
 
             for (long handle : handles) {
-                TrustAttributes trust = new TrustAttributes(token, session, handle);
-                trustMap.put(trust.getHash(), trust);
+                try {
+                    TrustAttributes trust = new TrustAttributes(token, session, handle);
+                    trustMap.put(trust.getHash(), trust);
+                } catch (PKCS11Exception e) {
+                    // skip put on pkcs11 error
+                }
             }
         } finally {
             token.releaseSession(session);
--- a/src/share/classes/sun/security/pkcs11/SessionManager.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/pkcs11/SessionManager.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -34,6 +34,9 @@
 import sun.security.pkcs11.wrapper.*;
 import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
 
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.atomic.AtomicInteger;
+
 /**
  * Session manager. There is one session manager object per PKCS#11
  * provider. It allows code to checkout a session, release it
@@ -77,7 +80,7 @@
     private final int maxSessions;
 
     // total number of active sessions
-    private int activeSessions;
+    private AtomicInteger activeSessions = new AtomicInteger();
 
     // pool of available object sessions
     private final Pool objSessions;
@@ -87,6 +90,7 @@
 
     // maximum number of active sessions during this invocation, for debugging
     private int maxActiveSessions;
+    private Object maxActiveSessionsLock;
 
     // flags to use in the C_OpenSession() call
     private final long openSessionFlags;
@@ -110,6 +114,9 @@
         this.token = token;
         this.objSessions = new Pool(this);
         this.opSessions = new Pool(this);
+        if (debug != null) {
+            maxActiveSessionsLock = new Object();
+        }
     }
 
     // returns whether only a fairly low number of sessions are
@@ -118,7 +125,7 @@
         return (maxSessions <= DEFAULT_MAX_SESSIONS);
     }
 
-    synchronized Session getObjSession() throws PKCS11Exception {
+    Session getObjSession() throws PKCS11Exception {
         Session session = objSessions.poll();
         if (session != null) {
             return ensureValid(session);
@@ -131,7 +138,7 @@
         return ensureValid(session);
     }
 
-    synchronized Session getOpSession() throws PKCS11Exception {
+    Session getOpSession() throws PKCS11Exception {
         Session session = opSessions.poll();
         if (session != null) {
             return ensureValid(session);
@@ -139,7 +146,7 @@
         // create a new session rather than re-using an obj session
         // that avoids potential expensive cancels() for Signatures & RSACipher
         if (maxSessions == Integer.MAX_VALUE ||
-                activeSessions < maxSessions) {
+                activeSessions.get() < maxSessions) {
             session = openSession();
             return ensureValid(session);
         }
@@ -155,20 +162,20 @@
         return session;
     }
 
-    synchronized Session killSession(Session session) {
+    Session killSession(Session session) {
         if ((session == null) || (token.isValid() == false)) {
             return null;
         }
         if (debug != null) {
             String location = new Exception().getStackTrace()[2].toString();
             System.out.println("Killing session (" + location + ") active: "
-                + activeSessions);
+                + activeSessions.get());
         }
         closeSession(session);
         return null;
     }
 
-    synchronized Session releaseSession(Session session) {
+    Session releaseSession(Session session) {
         if ((session == null) || (token.isValid() == false)) {
             return null;
         }
@@ -181,13 +188,13 @@
         return null;
     }
 
-    synchronized void demoteObjSession(Session session) {
+    void demoteObjSession(Session session) {
         if (token.isValid() == false) {
             return;
         }
         if (debug != null) {
             System.out.println("Demoting session, active: " +
-                activeSessions);
+                activeSessions.get());
         }
         boolean present = objSessions.remove(session);
         if (present == false) {
@@ -200,18 +207,21 @@
 
     private Session openSession() throws PKCS11Exception {
         if ((maxSessions != Integer.MAX_VALUE) &&
-                (activeSessions >= maxSessions)) {
+                (activeSessions.get() >= maxSessions)) {
             throw new ProviderException("No more sessions available");
         }
+
         long id = token.p11.C_OpenSession
                     (token.provider.slotID, openSessionFlags, null, null);
         Session session = new Session(token, id);
-        activeSessions++;
+        activeSessions.incrementAndGet();
         if (debug != null) {
-            if (activeSessions > maxActiveSessions) {
-                maxActiveSessions = activeSessions;
-                if (maxActiveSessions % 10 == 0) {
-                    System.out.println("Open sessions: " + maxActiveSessions);
+            synchronized(maxActiveSessionsLock) {
+                if (activeSessions.get() > maxActiveSessions) {
+                    maxActiveSessions = activeSessions.get();
+                    if (maxActiveSessions % 10 == 0) {
+                        System.out.println("Open sessions: " + maxActiveSessions);
+                    }
                 }
             }
         }
@@ -220,18 +230,18 @@
 
     private void closeSession(Session session) {
         session.close();
-        activeSessions--;
+        activeSessions.decrementAndGet();
     }
 
-    private static final class Pool {
+    public static final class Pool {
 
         private final SessionManager mgr;
 
-        private final List<Session> pool;
+        private final ConcurrentLinkedDeque<Session> pool;
 
         Pool(SessionManager mgr) {
-            this.mgr = mgr;
-            pool = new ArrayList<Session>();
+           this.mgr = mgr;
+           pool = new ConcurrentLinkedDeque<Session>();
         }
 
         boolean remove(Session session) {
@@ -239,45 +249,40 @@
         }
 
         Session poll() {
-            int n = pool.size();
-            if (n == 0) {
-                return null;
-            }
-            Session session = pool.remove(n - 1);
-            return session;
+            return pool.pollLast();
         }
 
         void release(Session session) {
-            pool.add(session);
-            // if there are idle sessions, close them
+            pool.offer(session);
             if (session.hasObjects()) {
                 return;
             }
+
             int n = pool.size();
             if (n < 5) {
                 return;
             }
-            Session oldestSession = pool.get(0);
+
+            Session oldestSession;
             long time = System.currentTimeMillis();
-            if (session.isLive(time) && oldestSession.isLive(time)) {
-                return;
-            }
-            Collections.sort(pool);
             int i = 0;
-            while (i < n - 1) { // always keep at least 1 session open
-                oldestSession = pool.get(i);
-                if (oldestSession.isLive(time)) {
+            // Check if the session head is too old and continue through queue
+            // until only one is left.
+            do {
+                oldestSession = pool.peek();
+                if (oldestSession == null || oldestSession.isLive(time) ||
+                        !pool.remove(oldestSession)) {
                     break;
                 }
+
                 i++;
                 mgr.closeSession(oldestSession);
-            }
+            } while ((n - i) > 1);
+
             if (debug != null) {
                 System.out.println("Closing " + i + " idle sessions, active: "
                         + mgr.activeSessions);
             }
-            List<Session> subList = pool.subList(0, i);
-            subList.clear();
         }
 
     }
--- a/src/share/classes/sun/security/pkcs11/SunPKCS11.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/pkcs11/SunPKCS11.java	Tue Aug 22 02:03:52 2017 +0100
@@ -167,6 +167,7 @@
             try {
                 String nssLibraryDirectory = config.getNssLibraryDirectory();
                 String nssSecmodDirectory = config.getNssSecmodDirectory();
+                int errorHandling = config.getHandleStartupErrors();
                 boolean nssOptimizeSpace = config.getNssOptimizeSpace();
 
                 if (secmod.isInitialized()) {
@@ -174,20 +175,30 @@
                         String s = secmod.getConfigDir();
                         if ((s != null) &&
                                 (s.equals(nssSecmodDirectory) == false)) {
-                            throw new ProviderException("Secmod directory "
-                                + nssSecmodDirectory
-                                + " invalid, NSS already initialized with "
-                                + s);
+                            String msg = "Secmod directory " + nssSecmodDirectory
+                                + " invalid, NSS already initialized with " + s;
+                            if (errorHandling == Config.ERR_IGNORE_MULTI_INIT ||
+                                errorHandling == Config.ERR_IGNORE_ALL) {
+                                throw new UnsupportedOperationException(msg);
+                            } else {
+                                throw new ProviderException(msg);
+                            }
                         }
                     }
                     if (nssLibraryDirectory != null) {
                         String s = secmod.getLibDir();
                         if ((s != null) &&
                                 (s.equals(nssLibraryDirectory) == false)) {
-                            throw new ProviderException("NSS library directory "
+                            String msg = "NSS library directory "
                                 + nssLibraryDirectory
                                 + " invalid, NSS already initialized with "
-                                + s);
+                                + s;
+                            if (errorHandling == Config.ERR_IGNORE_MULTI_INIT ||
+                                errorHandling == Config.ERR_IGNORE_ALL) {
+                                throw new UnsupportedOperationException(msg);
+                            } else {
+                                throw new ProviderException(msg);
+                            }
                         }
                     }
                 } else {
--- a/src/share/classes/sun/security/provider/ByteArrayAccess.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/provider/ByteArrayAccess.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -88,13 +88,8 @@
 
     // Return whether this platform supports full speed int/long memory access
     // at unaligned addresses.
-    // This code was copied from java.nio.Bits because there is no equivalent
-    // public API.
     private static boolean unaligned() {
-        String arch = java.security.AccessController.doPrivileged
-            (new sun.security.action.GetPropertyAction("os.arch", ""));
-        return arch.equals("i386") || arch.equals("x86") || arch.equals("amd64")
-            || arch.equals("x86_64") || arch.equals("ppc64") || arch.equals("ppc64le");
+        return unsafe.unalignedAccess();
     }
 
     /**
--- a/src/share/classes/sun/security/provider/DSAParameterGenerator.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/provider/DSAParameterGenerator.java	Tue Aug 22 02:03:52 2017 +0100
@@ -37,6 +37,7 @@
 import java.security.spec.AlgorithmParameterSpec;
 import java.security.spec.InvalidParameterSpecException;
 import java.security.spec.DSAParameterSpec;
+import sun.security.spec.DSAGenParameterSpec;
 
 import sun.security.spec.DSAGenParameterSpec;
 
--- a/src/share/classes/sun/security/provider/certpath/OCSP.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/provider/certpath/OCSP.java	Tue Aug 22 02:03:52 2017 +0100
@@ -42,6 +42,7 @@
 import java.util.Map;
 
 import static sun.security.provider.certpath.OCSPResponse.*;
+import sun.misc.IOUtils;
 import sun.security.action.GetIntegerAction;
 import sun.security.util.Debug;
 import sun.security.x509.AccessDescription;
@@ -247,22 +248,7 @@
             }
             in = con.getInputStream();
             int contentLength = con.getContentLength();
-            if (contentLength == -1) {
-                contentLength = Integer.MAX_VALUE;
-            }
-            response = new byte[contentLength > 2048 ? 2048 : contentLength];
-            int total = 0;
-            while (total < contentLength) {
-                int count = in.read(response, total, response.length - total);
-                if (count < 0)
-                    break;
-
-                total += count;
-                if (total >= response.length && total < contentLength) {
-                    response = Arrays.copyOf(response, total * 2);
-                }
-            }
-            response = Arrays.copyOf(response, total);
+            response = IOUtils.readFully(in, contentLength, false);
         } finally {
             if (in != null) {
                 try {
--- a/src/share/classes/sun/security/ssl/ClientHandshaker.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/ssl/ClientHandshaker.java	Tue Aug 22 02:03:52 2017 +0100
@@ -62,6 +62,10 @@
  */
 final class ClientHandshaker extends Handshaker {
 
+    // constants for subject alt names of type DNS and IP
+    private final static int ALTNAME_DNS = 2;
+    private final static int ALTNAME_IP  = 7;
+
     // the server's public key from its certificate.
     private PublicKey serverKey;
 
@@ -1493,20 +1497,49 @@
             return true;
         }
 
-        // check the iPAddress field in subjectAltName extension
-        Object thisIPAddress = getSubjectAltName(thisCert, 7);  // 7: iPAddress
-        Object prevIPAddress = getSubjectAltName(prevCert, 7);
-        if (thisIPAddress != null && prevIPAddress!= null) {
-            // only allow the exactly match
-            return Objects.equals(thisIPAddress, prevIPAddress);
+        // check subject alternative names
+        Collection<List<?>> thisSubjectAltNames = null;
+        try {
+            thisSubjectAltNames = thisCert.getSubjectAlternativeNames();
+        } catch (CertificateParsingException cpe) {
+            if (debug != null && Debug.isOn("handshake")) {
+                System.out.println(
+                        "Attempt to obtain subjectAltNames extension failed!");
+            }
+        }
+
+        Collection<List<?>> prevSubjectAltNames = null;
+        try {
+            prevSubjectAltNames = prevCert.getSubjectAlternativeNames();
+        } catch (CertificateParsingException cpe) {
+            if (debug != null && Debug.isOn("handshake")) {
+                System.out.println(
+                        "Attempt to obtain subjectAltNames extension failed!");
+            }
         }
 
-        // check the dNSName field in subjectAltName extension
-        Object thisDNSName = getSubjectAltName(thisCert, 2);    // 2: dNSName
-        Object prevDNSName = getSubjectAltName(prevCert, 2);
-        if (thisDNSName != null && prevDNSName!= null) {
-            // only allow the exactly match
-            return Objects.equals(thisDNSName, prevDNSName);
+        if ((thisSubjectAltNames != null) && (prevSubjectAltNames != null)) {
+            // check the iPAddress field in subjectAltName extension
+            Collection<String> thisSubAltIPAddrs =
+                        getSubjectAltNames(thisSubjectAltNames, ALTNAME_IP);
+            Collection<String> prevSubAltIPAddrs =
+                        getSubjectAltNames(prevSubjectAltNames, ALTNAME_IP);
+            if ((thisSubAltIPAddrs != null) && (prevSubAltIPAddrs != null) &&
+                (isEquivalent(thisSubAltIPAddrs, prevSubAltIPAddrs))) {
+
+                return true;
+            }
+
+            // check the dNSName field in subjectAltName extension
+            Collection<String> thisSubAltDnsNames =
+                        getSubjectAltNames(thisSubjectAltNames, ALTNAME_DNS);
+            Collection<String> prevSubAltDnsNames =
+                        getSubjectAltNames(prevSubjectAltNames, ALTNAME_DNS);
+            if ((thisSubAltDnsNames != null) && (prevSubAltDnsNames != null) &&
+                (isEquivalent(thisSubAltDnsNames, prevSubAltDnsNames))) {
+
+                return true;
+            }
         }
 
         // check the certificate subject and issuer
@@ -1527,29 +1560,43 @@
     /*
      * Returns the subject alternative name of the specified type in the
      * subjectAltNames extension of a certificate.
+     *
+     * Note that only those subjectAltName types that use String data
+     * should be passed into this function.
      */
-    private static Object getSubjectAltName(X509Certificate cert, int type) {
-        Collection<List<?>> subjectAltNames;
+    private static Collection<String> getSubjectAltNames(
+            Collection<List<?>> subjectAltNames, int type) {
 
-        try {
-            subjectAltNames = cert.getSubjectAlternativeNames();
-        } catch (CertificateParsingException cpe) {
-            if (debug != null && Debug.isOn("handshake")) {
-                System.out.println(
-                        "Attempt to obtain subjectAltNames extension failed!");
-            }
-            return null;
-        }
-
-        if (subjectAltNames != null) {
-            for (List<?> subjectAltName : subjectAltNames) {
-                int subjectAltNameType = (Integer)subjectAltName.get(0);
-                if (subjectAltNameType == type) {
-                    return subjectAltName.get(1);
+        HashSet<String> subAltDnsNames = null;
+        for (List<?> subjectAltName : subjectAltNames) {
+            int subjectAltNameType = (Integer)subjectAltName.get(0);
+            if (subjectAltNameType == type) {
+                String subAltDnsName = (String)subjectAltName.get(1);
+                if ((subAltDnsName != null) && !subAltDnsName.isEmpty()) {
+                    if (subAltDnsNames == null) {
+                        subAltDnsNames =
+                                new HashSet<>(subjectAltNames.size());
+                    }
+                    subAltDnsNames.add(subAltDnsName);
                 }
             }
         }
 
-        return null;
+        return subAltDnsNames;
+    }
+
+    private static boolean isEquivalent(Collection<String> thisSubAltNames,
+            Collection<String> prevSubAltNames) {
+
+        for (String thisSubAltName : thisSubAltNames) {
+            for (String prevSubAltName : prevSubAltNames) {
+                // Only allow the exactly match.  Check no wildcard character.
+                if (thisSubAltName.equalsIgnoreCase(prevSubAltName)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
     }
 }
--- a/src/share/classes/sun/security/ssl/SSLEngineImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/ssl/SSLEngineImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -515,6 +515,9 @@
         if (handshaker != null) {
             handshaker.checkThrown();
         }
+
+        // reset the flag of the first application record
+        isFirstAppOutputRecord = true;
     }
 
     //
@@ -1276,6 +1279,14 @@
                 writer.writeRecord(eor, ea, writeMAC, writeCipher);
 
         /*
+         * turn off the flag of the first application record if we really
+         * consumed at least byte.
+         */
+        if (isFirstAppOutputRecord && ea.deltaApp() > 0) {
+            isFirstAppOutputRecord = false;
+        }
+
+        /*
          * We only need to check the sequence number state for
          * non-handshaking record.
          *
--- a/src/share/classes/sun/security/ssl/ServerHandshaker.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/ssl/ServerHandshaker.java	Tue Aug 22 02:03:52 2017 +0100
@@ -42,14 +42,14 @@
 import javax.security.auth.Subject;
 
 import sun.security.action.GetPropertyAction;
-import sun.security.util.KeyUtil;
-import sun.security.util.LegacyAlgorithmConstraints;
-import sun.security.util.Parsing;
 import sun.security.ssl.HandshakeMessage.*;
 import sun.security.ssl.CipherSuite.*;
 import sun.security.ssl.SignatureAndHashAlgorithm.*;
 import static sun.security.ssl.CipherSuite.*;
 import static sun.security.ssl.CipherSuite.KeyExchange.*;
+import sun.security.util.KeyUtil;
+import sun.security.util.LegacyAlgorithmConstraints;
+import sun.security.util.Parsing;
 
 /**
  * ServerHandshaker does the protocol handshaking from the point
--- a/src/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -170,15 +170,20 @@
                 storeFile = new File(storeFileName);
                 fis = getFileInputStream(storeFile);
             } else {
-                String javaHome = props.get("javaHome");
-                storeFile = new File(javaHome + sep + "lib" + sep
-                                                + "security" + sep +
-                                                "jssecacerts");
+                /* Check system cacerts DB first; /etc/pki/java/cacerts */
+                storeFile = new File(sep + "etc" + sep + "pki" + sep
+                                     + "java" + sep + "cacerts");
                 if ((fis = getFileInputStream(storeFile)) == null) {
+                    String javaHome = props.get("javaHome");
                     storeFile = new File(javaHome + sep + "lib" + sep
-                                                + "security" + sep +
-                                                "cacerts");
-                    fis = getFileInputStream(storeFile);
+                                         + "security" + sep +
+                                         "jssecacerts");
+                    if ((fis = getFileInputStream(storeFile)) == null) {
+                        storeFile = new File(javaHome + sep + "lib" + sep
+                                             + "security" + sep +
+                                             "cacerts");
+                        fis = getFileInputStream(storeFile);
+                    }
                 }
             }
 
--- a/src/share/classes/sun/security/util/ObjectIdentifier.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/security/util/ObjectIdentifier.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2009, 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
--- a/src/share/classes/sun/swing/DefaultLookup.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/swing/DefaultLookup.java	Tue Aug 22 02:03:52 2017 +0100
@@ -47,8 +47,7 @@
     /**
      * Key used to store DefaultLookup for AppContext.
      */
-    private static final Object DEFAULT_LOOKUP_KEY = new
-                                        StringBuffer("DefaultLookup");
+    private static final Object DEFAULT_LOOKUP_KEY = new Object(); // DefaultLookup
     /**
      * Thread that last asked for a default.
      */
--- a/src/share/classes/sun/swing/SwingUtilities2.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/swing/SwingUtilities2.java	Tue Aug 22 02:03:52 2017 +0100
@@ -31,15 +31,12 @@
 import static java.awt.RenderingHints.*;
 import java.awt.event.*;
 import java.awt.font.*;
-import java.awt.geom.*;
 import java.awt.print.PrinterGraphics;
-import java.text.Bidi;
 import java.text.CharacterIterator;
 import java.text.AttributedCharacterIterator;
 import java.text.AttributedString;
 
 import javax.swing.*;
-import javax.swing.plaf.*;
 import javax.swing.text.Highlighter;
 import javax.swing.text.JTextComponent;
 import javax.swing.text.DefaultHighlighter;
@@ -51,8 +48,6 @@
 import sun.swing.ImageIconUIResource;
 import sun.print.ProxyPrintGraphics;
 import sun.awt.*;
-import sun.security.action.GetPropertyAction;
-import sun.security.util.SecurityConstants;
 import java.io.*;
 import java.util.*;
 import sun.font.FontDesignMetrics;
@@ -77,8 +72,7 @@
      * The <code>AppContext</code> key for our one <code>LAFState</code>
      * instance.
      */
-    public static final Object LAF_STATE_KEY =
-            new StringBuffer("LookAndFeel State");
+    public static final Object LAF_STATE_KEY = new Object(); // LookAndFeel State
 
     public static final Object MENU_SELECTION_MANAGER_LISTENER_KEY =
             new StringBuffer("MenuSelectionManager listener key");
@@ -109,8 +103,7 @@
      * To avoid having this property persist between look and feels changes
      * the value of the property is set to null in JComponent.setUI
      */
-    public static final Object AA_TEXT_PROPERTY_KEY =
-                          new StringBuffer("AATextInfoPropertyKey");
+    public static final Object AA_TEXT_PROPERTY_KEY = new Object(); // AATextInfoPropertyKey
 
     /**
      * Attribute key for the content elements.  If it is set on an element, the
@@ -122,8 +115,7 @@
      * Used to tell a text component, being used as an editor for table
      * or tree, how many clicks it took to start editing.
      */
-    private static final StringBuilder SKIP_CLICK_COUNT =
-        new StringBuilder("skipClickCount");
+    private static final Object SKIP_CLICK_COUNT = new Object(); // skipClickCount
 
     /* Presently this class assumes default fractional metrics.
      * This may need to change to emulate future platform L&Fs.
@@ -183,8 +175,7 @@
      * Key used in client properties used to indicate that the
      * <code>ComponentUI</code> of the JComponent instance should be returned.
      */
-    public static final Object COMPONENT_UI_PROPERTY_KEY =
-                            new StringBuffer("ComponentUIPropertyKey");
+    public static final Object COMPONENT_UI_PROPERTY_KEY = new Object(); // ComponentUIPropertyKey
 
     /** Client Property key for the text maximal offsets for BasicMenuItemUI */
     public static final StringUIClientPropertyKey BASICMENUITEMUI_MAX_TEXT_OFFSET =
--- a/src/share/classes/sun/util/calendar/ZoneInfoFile.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/classes/sun/util/calendar/ZoneInfoFile.java	Tue Aug 22 02:03:52 2017 +0100
@@ -25,10 +25,12 @@
 
 package sun.util.calendar;
 
+import  java.io.BufferedInputStream;
 import  java.io.File;
 import  java.io.FileInputStream;
 import  java.io.FileNotFoundException;
 import  java.io.IOException;
+import  java.io.InputStream;
 import  java.lang.ref.SoftReference;
 import  java.nio.file.FileSystems;
 import  java.security.AccessController;
@@ -39,6 +41,7 @@
 import  java.util.HashMap;
 import  java.util.List;
 import  java.util.Map;
+import  java.util.Properties;
 
 /**
  * <code>ZoneInfoFile</code> reads Zone information files in the
@@ -477,9 +480,13 @@
     private static final String ziDir = AccessController.doPrivileged(
         new PrivilegedAction<String>() {
             public String run() {
-                String zi = System.getProperty("java.home") +
-                    File.separator + "lib" + File.separator + "zi";
+                String homeDir = System.getProperty("java.home");
+                String zi = homeDir + File.separator + "lib" +
+                  File.separator + "zi";
                 try {
+                    String otherDir = getZoneInfoDir(homeDir);
+                    if (otherDir != null)
+                        zi = otherDir;
                     zi = FileSystems.getDefault().getPath(zi).toRealPath().toString();
                 } catch(Exception e) {
                 }
@@ -487,6 +494,32 @@
             }
         });
 
+    private static String getZoneInfoDir(final String homeDir) {
+        try {
+            return AccessController.doPrivileged
+                (new PrivilegedExceptionAction<String>() {
+                    public String run() throws IOException {
+                        File f = new File(homeDir + File.separator + "lib" +
+                                          File.separator + "tz.properties");
+                        InputStream in = new FileInputStream(f);
+                        BufferedInputStream bin = new BufferedInputStream(in);
+                        Properties props = new Properties();
+                        props.load(bin);
+                        bin.close();
+                        String dir = props.getProperty("sun.zoneinfo.dir");
+                        if (dir == null)
+                            return null;
+                        File zim = new File(dir, "ZoneInfoMappings");
+                        if (zim.exists())
+                            return dir;
+                        return null;
+                    }
+                });
+        } catch (PrivilegedActionException e) {
+            return null;
+        }
+    }
+
     /**
      * Converts the given time zone ID to a platform dependent path
      * name. For example, "America/Los_Angeles" is converted to
@@ -1045,8 +1078,8 @@
         byte[] buffer = null;
 
         try {
-            buffer = (byte[]) AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                public Object run() throws IOException {
+            buffer = AccessController.doPrivileged(new PrivilegedExceptionAction<byte[]>() {
+                public byte[] run() throws IOException {
                     File file = new File(ziDir, fileName);
                     byte[] buf = null;
                     int filesize = (int)file.length();
--- a/src/share/demo/java2d/J2DBench/build.xml	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/java2d/J2DBench/build.xml	Tue Aug 22 02:03:52 2017 +0100
@@ -49,10 +49,10 @@
   <target name="compile" depends="init"
         description="compile the source " >
     <!-- Compile the java code from ${src} into ${build} -->
-    <javac debug="false" source="1.2" target="1.2" srcdir="${src}" destdir="${build}"/>
+    <javac debug="flase" source="1.5" target="1.5" srcdir="${src}" destdir="${build}"/>
   </target>
 
-  <target name="run" depends="dist" 
+  <target name="run" depends="dist"
     description="run J2DBench" >
     <java jar="${dist}/J2DBench.jar"
        fork="true"
@@ -60,7 +60,7 @@
     </java>
   </target>
 
-  <target name="analyze" depends="dist" 
+  <target name="analyze" depends="dist"
     description="run J2DAnalyzer" >
     <java jar="${dist}/J2DAnalyzer.jar"
        fork="true"
@@ -80,6 +80,10 @@
     <copy todir="${build}/j2dbench/tests/iio/images">
       <fileset dir="${resources}/images" />
     </copy>
+    <mkdir dir="${build}/j2dbench/tests/cmm/images"/>
+    <copy todir="${build}/j2dbench/tests/cmm/images">
+      <fileset dir="${resources}/cmm_images" />
+    </copy>
   </target>
 
   <target name="dist" depends="compile, resources"
@@ -88,14 +92,14 @@
     <mkdir dir="${dist}"/>
 
     <!-- Put everything in ${build} into the J2DBench.jar file -->
-    <jar jarfile="${dist}/J2DBench.jar" basedir="${build}" 
+    <jar jarfile="${dist}/J2DBench.jar" basedir="${build}"
         excludes="j2dbench/report/**" >
       <manifest>
         <attribute name="Built-By" value="${user.name}"/>
 	<attribute name="Main-Class" value="j2dbench.J2DBench"/>
       </manifest>
     </jar>
-    <jar jarfile="${dist}/J2DAnalyzer.jar" basedir="${build}" 
+    <jar jarfile="${dist}/J2DAnalyzer.jar" basedir="${build}"
         includes="j2dbench/report/**" >
       <manifest>
         <attribute name="Built-By" value="${user.name}"/>
Binary file src/share/demo/java2d/J2DBench/resources/cmm_images/img_icc_large.jpg has changed
Binary file src/share/demo/java2d/J2DBench/resources/cmm_images/img_icc_medium.jpg has changed
Binary file src/share/demo/java2d/J2DBench/resources/cmm_images/img_icc_small.jpg has changed
--- a/src/share/demo/java2d/J2DBench/src/j2dbench/J2DBench.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/java2d/J2DBench/src/j2dbench/J2DBench.java	Tue Aug 22 02:03:52 2017 +0100
@@ -69,6 +69,7 @@
 import j2dbench.tests.RenderTests;
 import j2dbench.tests.PixelTests;
 import j2dbench.tests.iio.IIOTests;
+import j2dbench.tests.cmm.CMMTests;
 import j2dbench.tests.text.TextConstructionTests;
 import j2dbench.tests.text.TextMeasureTests;
 import j2dbench.tests.text.TextRenderTests;
@@ -199,6 +200,7 @@
         TextMeasureTests.init();
         TextConstructionTests.init();
         IIOTests.init();
+        CMMTests.init();
 
         boolean gui = true;
         boolean showresults = true;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/CMMTests.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - 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.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS 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 COPYRIGHT OWNER OR
+ * 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 source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Option;
+import j2dbench.Result;
+import j2dbench.Test;
+import j2dbench.TestEnvironment;
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class CMMTests extends Test {
+
+    protected static Group cmmRoot;
+    protected static Group cmmOptRoot;
+    protected static Option csList;
+    protected static Option usePlatfromProfiles;
+
+    public static void init() {
+        cmmRoot = new Group("cmm", "Color Management Benchmarks");
+        cmmRoot.setTabbed();
+
+        cmmOptRoot = new Group(cmmRoot, "opts", "General Options");
+
+        /*
+        usePlatfromProfiles =
+                new Option.Enable(cmmOptRoot, "csPlatfrom",
+                        "Use Platfrom Profiles", false);
+        */
+        int[] colorspaces = new int[] {
+            ColorSpace.CS_sRGB,
+            ColorSpace.CS_GRAY,
+            ColorSpace.CS_LINEAR_RGB,
+            ColorSpace.CS_CIEXYZ
+        };
+
+        String[] csNames = new String[]{
+            "CS_sRGB",
+            "CS_GRAY",
+            "CS_LINEAR_RGB",
+            "CS_CIEXYZ"
+        };
+
+        csList = new Option.IntList(cmmOptRoot,
+                "profiles", "Color Profiles",
+                colorspaces, csNames, csNames, 0x8);
+
+        ColorConversionTests.init();
+        ProfileTests.init();
+    }
+
+    protected static ColorSpace getColorSpace(TestEnvironment env) {
+        ColorSpace cs;
+        Boolean usePlatfrom = true; //(Boolean)env.getModifier(usePlatfromProfiles);
+
+        int cs_code = env.getIntValue(csList);
+        if (usePlatfrom) {
+            cs = ColorSpace.getInstance(cs_code);
+        } else {
+            String resource = "profiles/";
+            switch (cs_code) {
+                case ColorSpace.CS_CIEXYZ:
+                    resource += "CIEXYZ.pf";
+                    break;
+                case ColorSpace.CS_GRAY:
+                    resource += "GRAY.pf";
+                    break;
+                case ColorSpace.CS_LINEAR_RGB:
+                    resource += "LINEAR_RGB.pf";
+                    break;
+                case ColorSpace.CS_PYCC:
+                    resource += "PYCC.pf";
+                    break;
+                case ColorSpace.CS_sRGB:
+                    resource += "sRGB.pf";
+                    break;
+                default:
+                    throw new RuntimeException("Unknown color space: " + cs_code);
+            }
+
+            try {
+                InputStream is = CMMTests.class.getResourceAsStream(resource);
+                ICC_Profile p = ICC_Profile.getInstance(is);
+
+                cs = new ICC_ColorSpace(p);
+            } catch (IOException e) {
+                throw new RuntimeException("Unable load profile from resource " + resource, e);
+            }
+        }
+        return cs;
+    }
+
+    protected CMMTests(Group parent, String nodeName, String description) {
+        super(parent, nodeName, description);
+        addDependencies(cmmOptRoot, true);
+    }
+
+    @Override
+    public Object initTest(TestEnvironment te, Result result) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void runTest(Object o, int i) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void cleanupTest(TestEnvironment te, Object o) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/ColorConversionTests.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - 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.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS 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 COPYRIGHT OWNER OR
+ * 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 source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+
+public class ColorConversionTests extends CMMTests {
+
+    protected static Group colorConvRoot;
+
+    public static void init() {
+        colorConvRoot = new Group(cmmRoot, "colorconv", "Color Conversion Benchmarks");
+        colorConvRoot.setTabbed();
+
+        DataConversionTests.init();
+        ColorConvertOpTests.init();
+        EmbeddedProfileTests.init();
+    }
+
+    protected ColorConversionTests(Group parent, String nodeName, String description) {
+        super(parent, nodeName, description);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/ColorConvertOpTests.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,383 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - 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.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS 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 COPYRIGHT OWNER OR
+ * 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 source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Option;
+import j2dbench.Result;
+import j2dbench.TestEnvironment;
+import j2dbench.tests.iio.IIOTests;
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
+import javax.imageio.ImageIO;
+
+public class ColorConvertOpTests extends ColorConversionTests {
+
+    private static enum ImageContent {
+        BLANK("bank", "Blank (opaque black)"),
+        RANDOM("random", "Random"),
+        VECTOR("vector", "Vector Art"),
+        PHOTO("photo", "Photograph");
+
+        public final String name;
+        public final String descr;
+
+        private ImageContent(String name, String descr) {
+            this.name = name;
+            this.descr = descr;
+        }
+    }
+
+    private static enum ImageType {
+        INT_ARGB(BufferedImage.TYPE_INT_ARGB, "INT_ARGB", "TYPE_INT_ARGB"),
+        INT_RGB(BufferedImage.TYPE_INT_RGB, "INT_RGB", "TYPE_INT_RGB"),
+        INT_BGR(BufferedImage.TYPE_INT_BGR, "INT_BGR", "TYPE_INT_BGR"),
+        BYTE_3BYTE_BGR(BufferedImage.TYPE_3BYTE_BGR, "3BYTE_BGR", "TYPE_3BYTE_BGR"),
+        BYTE_4BYTE_ABGR(BufferedImage.TYPE_4BYTE_ABGR, "4BYTE_BGR", "TYPE_4BYTE_BGR"),
+        COMPATIBLE_DST(0, "Compatible", "Compatible destination");
+
+        private ImageType(int type, String abbr, String descr) {
+            this.type = type;
+            this.abbrev = abbr;
+            this.descr = descr;
+        }
+
+        public final int type;
+        public final String abbrev;
+        public final String descr;
+    }
+
+    private static enum ListType {
+        SRC("srcType", "Source Images"),
+        DST("dstType", "Destination Images");
+
+        private ListType(String name, String description) {
+            this.name = name;
+            this.description = description;
+        }
+        public final String name;
+        public final String description;
+    }
+
+    public static Option createImageTypeList(ListType listType) {
+
+        ImageType[] allTypes = ImageType.values();
+
+        int num = allTypes.length;
+        if (listType == ListType.SRC) {
+            num -= 1; // exclude compatible destination
+        }
+
+        ImageType[] t = new ImageType[num];
+        String[] names = new String[num];
+        String[] abbrev = new String[num];
+        String[] descr = new String[num];
+
+        for (int i = 0; i < num; i++) {
+            t[i] = allTypes[i];
+            names[i] = t[i].toString();
+            abbrev[i] = t[i].abbrev;
+            descr[i] = t[i].descr;
+        }
+
+        Option list = new Option.ObjectList(opOptionsRoot,
+                listType.name, listType.description,
+                names, t, abbrev, descr, 1);
+        return list;
+    }
+
+    protected static Group opConvRoot;
+
+    protected static Group opOptionsRoot;
+    protected static Option sizeList;
+    protected static Option contentList;
+
+    protected static Option sourceType;
+
+    protected static Option destinationType;
+
+    public static void init() {
+        opConvRoot = new Group(colorConvRoot, "ccop", "ColorConvertOp Tests");
+
+        opOptionsRoot = new Group(opConvRoot, "ccopOptions", "Options");
+
+        // size list
+        int[] sizes = new int[] {1, 20, 250, 1000, 4000};
+        String[] sizeStrs = new String[] {
+            "1x1", "20x20", "250x250", "1000x1000", "4000x4000"
+        };
+        String[] sizeDescs = new String[] {
+            "Tiny Images (1x1)",
+            "Small Images (20x20)",
+            "Medium Images (250x250)",
+            "Large Images (1000x1000)",
+            "Huge Images (4000x4000)",
+        };
+        sizeList = new Option.IntList(opOptionsRoot,
+                                      "size", "Image Size",
+                                      sizes, sizeStrs, sizeDescs, 0x4);
+        ((Option.ObjectList) sizeList).setNumRows(5);
+
+        // image content
+        ImageContent[] c = ImageContent.values();
+
+        String[] contentStrs = new String[c.length];
+        String[] contentDescs = new String[c.length];
+
+        for (int i = 0; i < c.length; i++) {
+            contentStrs[i] = c[i].name;
+            contentDescs[i] = c[i].descr;
+        };
+
+        contentList = new Option.ObjectList(opOptionsRoot,
+                                            "content", "Image Content",
+                                            contentStrs, c,
+                                            contentStrs, contentDescs,
+                                            0x8);
+
+        sourceType = createImageTypeList(ListType.SRC);
+
+        destinationType = createImageTypeList(ListType.DST);
+
+        new ConvertImageTest();
+        new ConvertRasterTest();
+        new DrawImageTest();
+    }
+
+    public ColorConvertOpTests(Group parent, String nodeName, String description) {
+        super(parent, nodeName, description);
+        addDependencies(opOptionsRoot, true);
+    }
+
+    public Object initTest(TestEnvironment env, Result res) {
+        return new Context(env, res);
+    }
+
+    public void cleanupTest(TestEnvironment env, Object o) {
+        Context ctx = (Context)o;
+        ctx.cs = null;
+        ctx.op_img = null;
+        ctx.op_rst = null;
+        ctx.dst = null;
+        ctx.src = null;
+        ctx.graphics = null;
+    }
+
+    private static class Context {
+        ColorSpace cs;
+        Graphics2D graphics;
+        ColorConvertOp op_img;
+        ColorConvertOp op_rst;
+
+        BufferedImage src;
+        BufferedImage dst;
+
+        WritableRaster rsrc;
+        WritableRaster rdst;
+
+        public Context(TestEnvironment env, Result res) {
+
+            graphics = (Graphics2D)env.getGraphics();
+            cs = getColorSpace(env);
+
+            // TODO: provide rendering hints
+            op_img = new ColorConvertOp(cs, null);
+            ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+            op_rst = new ColorConvertOp(sRGB, cs, null);
+
+            int size = env.getIntValue(sizeList);
+
+            ImageContent content = (ImageContent)env.getModifier(contentList);
+            ImageType srcType = (ImageType)env.getModifier(sourceType);
+
+            src = createBufferedImage(size, size, content, srcType.type);
+            rsrc = src.getRaster();
+
+            ImageType dstType = (ImageType)env.getModifier(destinationType);
+            if (dstType == ImageType.COMPATIBLE_DST) {
+                dst = op_img.createCompatibleDestImage(src, null);
+            } else {
+                dst = createBufferedImage(size, size, content, dstType.type);
+            }
+            // raster always has to be comatible
+            rdst = op_rst.createCompatibleDestRaster(rsrc);
+        }
+    }
+
+    private static class ConvertImageTest extends ColorConvertOpTests {
+        public ConvertImageTest() {
+            super(opConvRoot, "op_img", "op.filetr(BufferedImage)");
+        }
+
+        public void runTest(Object octx, int numReps) {
+            final Context ctx = (Context)octx;
+            final ColorConvertOp op = ctx.op_img;
+
+            final BufferedImage src = ctx.src;
+            BufferedImage dst = ctx.dst;
+            do {
+                try {
+                    dst = op.filter(src, dst);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+
+    private static class ConvertRasterTest extends ColorConvertOpTests {
+        public ConvertRasterTest() {
+            super(opConvRoot, "op_rst", "op.filetr(Raster)");
+        }
+
+        public void runTest(Object octx, int numReps) {
+            final Context ctx = (Context)octx;
+            final ColorConvertOp op = ctx.op_rst;
+
+            final Raster src = ctx.rsrc;
+            WritableRaster dst = ctx.rdst;
+            do {
+                try {
+                    dst = op.filter(src, dst);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+
+    private static class DrawImageTest extends ColorConvertOpTests {
+        public DrawImageTest() {
+            super(opConvRoot, "op_draw", "drawImage(ColorConvertOp)");
+        }
+
+        public void runTest(Object octx, int numReps) {
+            final Context ctx = (Context)octx;
+            final ColorConvertOp op = ctx.op_img;
+
+            final Graphics2D g = ctx.graphics;
+
+            final BufferedImage src = ctx.src;
+
+            do {
+                g.drawImage(src, op, 0, 0);
+            } while (--numReps >= 0);
+        }
+    }
+
+    /**************************************************************************
+     ******                    Helper routines
+     *************************************************************************/
+    protected static BufferedImage createBufferedImage(int width,
+                                                       int height,
+                                                       ImageContent contentType,
+                                                       int type)
+    {
+        BufferedImage image;
+        image = new BufferedImage(width, height, type);
+        boolean hasAlpha = image.getColorModel().hasAlpha();
+        switch (contentType) {
+            case RANDOM:
+                for (int y = 0; y < height; y++) {
+                    for (int x = 0; x < width; x++) {
+                        int rgb = (int)(Math.random() * 0xffffff);
+                        if (hasAlpha) {
+                            rgb |= 0x7f000000;
+                        }
+                        image.setRGB(x, y, rgb);
+                    }
+                }
+                break;
+            case VECTOR:
+                {
+                    Graphics2D g = image.createGraphics();
+                    if (hasAlpha) {
+                        // fill background with a translucent color
+                        g.setComposite(AlphaComposite.getInstance(
+                                           AlphaComposite.SRC, 0.5f));
+                    }
+                    g.setColor(Color.blue);
+                    g.fillRect(0, 0, width, height);
+                    g.setComposite(AlphaComposite.Src);
+                    g.setColor(Color.yellow);
+                    g.fillOval(2, 2, width-4, height-4);
+                    g.setColor(Color.red);
+                    g.fillOval(4, 4, width-8, height-8);
+                    g.setColor(Color.green);
+                    g.fillRect(8, 8, width-16, height-16);
+                    g.setColor(Color.white);
+                    g.drawLine(0, 0, width, height);
+                    g.drawLine(0, height, width, 0);
+                    g.dispose();
+                    break;
+                }
+            case PHOTO:
+                {
+                    Image photo = null;
+                    try {
+                        photo = ImageIO.read(
+                            IIOTests.class.getResourceAsStream("images/photo.jpg"));
+                    } catch (Exception e) {
+                        System.err.println("error loading photo");
+                        e.printStackTrace();
+                    }
+                    Graphics2D g = image.createGraphics();
+                    if (hasAlpha) {
+                        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC,
+                                                                  0.5f));
+                    }
+                    g.drawImage(photo, 0, 0, width, height, null);
+                    g.dispose();
+                    break;
+                }
+            default:
+                break;
+        }
+
+        return image;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/DataConversionTests.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - 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.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS 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 COPYRIGHT OWNER OR
+ * 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 source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Result;
+import j2dbench.TestEnvironment;
+import java.awt.color.ColorSpace;
+
+public class DataConversionTests extends ColorConversionTests {
+
+    protected static Group dataConvRoot;
+
+    public static void init() {
+        dataConvRoot = new Group(colorConvRoot, "data", "Data Conversoion Tests");
+
+        new FromRGBTest();
+        new ToRGBTest();
+        new FromCIEXYZTest();
+        new ToCIEXYZTest();
+    }
+
+    public DataConversionTests(Group parent, String nodeName, String description) {
+        super(parent, nodeName, description);
+    }
+
+    protected static class Context {
+
+        ColorSpace cs;
+        int numComponents;
+        float[] val;
+        float[] rgb;
+        float[] cie;
+        TestEnvironment env;
+        Result res;
+
+        public Context(TestEnvironment env, Result result, ColorSpace cs) {
+            this.cs = cs;
+            this.env = env;
+            this.res = result;
+
+            numComponents = cs.getNumComponents();
+
+            val = new float[numComponents];
+
+            for (int i = 0; i < numComponents; i++) {
+                float min = cs.getMinValue(i);
+                float max = cs.getMaxValue(i);
+
+                val[i] = 0.5f * (max - min);
+            }
+
+            rgb = new float[]{0.5f, 0.5f, 0.5f};
+            cie = new float[]{0.5f, 0.5f, 0.5f};
+        }
+    }
+
+    @Override
+    public Object initTest(TestEnvironment env, Result result) {
+        ColorSpace cs = getColorSpace(env);
+        return new Context(env, result, cs);
+    }
+
+    @Override
+    public void cleanupTest(TestEnvironment te, Object o) {
+    }
+
+    private static class FromRGBTest extends DataConversionTests {
+
+        public FromRGBTest() {
+            super(dataConvRoot,
+                    "fromRGB",
+                    "ColorSpace.fromRGB()");
+        }
+
+        public void runTest(Object ctx, int numReps) {
+            final Context ictx = (Context) ctx;
+            final ColorSpace cs = ictx.cs;
+
+            final float[] rgb = ictx.rgb;
+            do {
+                try {
+                    cs.fromRGB(rgb);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+
+    private static class FromCIEXYZTest extends DataConversionTests {
+
+        public FromCIEXYZTest() {
+            super(dataConvRoot,
+                    "fromCIEXYZ",
+                    "ColorSpace.fromCIEXYZ()");
+        }
+
+        public void runTest(Object ctx, int numReps) {
+            final Context ictx = (Context) ctx;
+            final ColorSpace cs = ictx.cs;
+
+            final float[] val = ictx.cie;
+            do {
+                try {
+                    cs.fromCIEXYZ(val);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+
+    private static class ToCIEXYZTest extends DataConversionTests {
+
+        public ToCIEXYZTest() {
+            super(dataConvRoot,
+                    "toCIEXYZ",
+                    "ColorSpace.toCIEXYZ()");
+        }
+
+        public void runTest(Object ctx, int numReps) {
+            final Context ictx = (Context) ctx;
+            final ColorSpace cs = ictx.cs;
+
+            final float[] val = ictx.val;
+
+            do {
+                try {
+                    cs.toCIEXYZ(val);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+
+    private static class ToRGBTest extends DataConversionTests {
+
+        public ToRGBTest() {
+            super(dataConvRoot,
+                    "toRGB",
+                    "ColorSpace.toRGB()");
+        }
+
+        public void runTest(Object ctx, int numReps) {
+            final Context ictx = (Context) ctx;
+            final ColorSpace cs = ictx.cs;
+
+            final float[] val = ictx.val;
+
+            do {
+                try {
+                    cs.toRGB(val);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/EmbeddedProfileTests.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - 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.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS 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 COPYRIGHT OWNER OR
+ * 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 source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Option;
+import j2dbench.Result;
+import j2dbench.TestEnvironment;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.net.URL;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+
+/* This benchmark verifies how changes in cmm library affects image decoding */
+public class EmbeddedProfileTests extends ColorConversionTests {
+
+    protected static Group grpRoot;
+    protected static Group grpOptionsRoot;
+
+    protected static Option inputImages;
+
+    public static void init() {
+        grpRoot = new Group(colorConvRoot, "embed", "Embedded Profile Tests");
+
+        grpOptionsRoot = new Group(grpRoot, "embedOptions", "Options");
+
+        inputImages = createImageList();
+
+        new ReadImageTest();
+    }
+
+    private static enum IccImageResource {
+        SMALL("images/img_icc_small.jpg", "512x512", "Small: 512x512"),
+        MEDIUM("images/img_icc_medium.jpg", "2048x2048", "Medium: 2048x2048"),
+        LARGE("images/img_icc_large.jpg", "4096x4096", "Large: 4096x4096");
+
+        private IccImageResource(String file, String name, String description) {
+            this.url = CMMTests.class.getResource(file);
+            this.abbrev = name;
+            this.description = description;
+        }
+
+        public final URL url;
+        public final String abbrev;
+        public final String description;
+    }
+
+    private static Option createImageList() {
+        IccImageResource[] images = IccImageResource.values();
+
+        int num = images.length;
+
+        String[] names = new String[num];
+        String[] abbrev = new String[num];
+        String[] descr = new String[num];
+
+        for (int i = 0; i < num; i++) {
+            names[i] = images[i].toString();
+            abbrev[i] = images[i].abbrev;
+            descr[i] = images[i].description;
+        }
+
+         Option list = new Option.ObjectList(grpOptionsRoot,
+                "Images", "Input Images",
+                names, images, abbrev, descr, 1);
+
+         return list;
+    }
+
+    public EmbeddedProfileTests(Group parent, String nodeName, String description) {
+        super(parent, nodeName, description);
+        addDependencies(grpOptionsRoot, true);
+    }
+
+    private static class Context {
+        URL input;
+
+        public Context(TestEnvironment env, Result res) {
+
+            IccImageResource icc_input = (IccImageResource)
+                    env.getModifier(inputImages);
+
+            input = icc_input.url;
+        }
+    }
+
+     public Object initTest(TestEnvironment env, Result res) {
+        return new Context(env, res);
+    }
+
+    public void cleanupTest(TestEnvironment env, Object o) {
+        Context ctx = (Context)o;
+        ctx.input = null;
+    }
+
+    private static class ReadImageTest extends EmbeddedProfileTests {
+        public ReadImageTest() {
+            super(grpRoot, "embd_img_read", "ImageReader.read()");
+        }
+
+        public void runTest(Object octx, int numReps) {
+            final Context ctx = (Context)octx;
+            final URL url = ctx.input;
+            ImageInputStream iis = null;
+            ImageReader reader = null;
+
+            try {
+                iis = ImageIO.createImageInputStream(url.openStream());
+                reader = ImageIO.getImageReaders(iis).next();
+            } catch (IOException e) {
+                throw new RuntimeException("Unable to run the becnhmark", e);
+            }
+
+            do {
+                try {
+                    reader.setInput(iis);
+                    BufferedImage img = reader.read(0);
+                    reader.reset();
+
+                    iis = ImageIO.createImageInputStream(url.openStream());
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/ProfileTests.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - 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.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS 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 COPYRIGHT OWNER OR
+ * 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 source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Result;
+import j2dbench.TestEnvironment;
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
+
+public class ProfileTests extends CMMTests {
+
+    protected static Group profileRoot;
+
+    public static void init() {
+        profileRoot = new Group(cmmRoot, "profiles", "Profile Handling Benchmarks");
+
+        new ReadHeaderTest();
+        new GetNumComponentsTest();
+    }
+
+    protected ProfileTests(Group parent, String nodeName, String description) {
+        super(parent, nodeName, description);
+    }
+
+    protected static class Context {
+
+        ICC_Profile profile;
+        TestEnvironment env;
+        Result res;
+
+        public Context(ICC_Profile profile, TestEnvironment env, Result res) {
+            this.profile = profile;
+            this.env = env;
+            this.res = res;
+        }
+    }
+
+    @Override
+    public Object initTest(TestEnvironment env, Result res) {
+        ICC_ColorSpace cs = (ICC_ColorSpace) getColorSpace(env);
+        return new Context(cs.getProfile(), env, res);
+    }
+
+    @Override
+    public void cleanupTest(TestEnvironment env, Object o) {
+    }
+
+    private static class ReadHeaderTest extends ProfileTests {
+
+        public ReadHeaderTest() {
+            super(profileRoot,
+                    "getHeader",
+                    "getData(icSigHead)");
+        }
+
+        @Override
+        public void runTest(Object ctx, int numReps) {
+            final Context ictx = (Context) ctx;
+            final ICC_Profile profile = ictx.profile;
+
+            byte[] data = null;
+            do {
+                try {
+                    data = profile.getData(ICC_Profile.icSigHead);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+
+    private static class GetNumComponentsTest extends ProfileTests {
+
+        public GetNumComponentsTest() {
+            super(profileRoot,
+                    "getNumComponents",
+                    "getNumComponents");
+        }
+
+        @Override
+        public void runTest(Object ctx, int numReps) {
+            final Context ictx = (Context) ctx;
+            final ICC_Profile profile = ictx.profile;
+
+            do {
+                try {
+                    int num = profile.getNumComponents();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } while (--numReps >= 0);
+        }
+    }
+}
--- a/src/share/demo/jvmti/gctest/sample.makefile.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/gctest/sample.makefile.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -43,7 +43,7 @@
 
 # Source lists
 LIBNAME=gctest
-SOURCES=gctest.c ../agent_util/agent_util.c
+SOURCES=gctest.c ../../agent_util/src/agent_util.c
 
 # Solaris Sun C Compiler Version 5.5
 ifeq ($(OSNAME), solaris)
@@ -89,7 +89,7 @@
     # Object files needed to create library
     OBJECTS=$(SOURCES:%.c=%.o)
     # Library name and options needed to build it
-    LIBRARY=lib$(LIBNAME).so
+    LIBRARY=../lib/lib$(LIBNAME).so
     LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc
     # Libraries we are dependent on
     LIBRARIES=-lc
@@ -122,7 +122,7 @@
 
 # Common -I options
 CFLAGS += -I.
-CFLAGS += -I../agent_util
+CFLAGS += -I../../agent_util/src
 CFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
 
 # Default rule
--- a/src/share/demo/jvmti/heapTracker/sample.makefile.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/heapTracker/sample.makefile.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -41,13 +41,15 @@
 #
 ########################################################################
 
+JAVA_CRW_DEMO=../../java_crw_demo/src/libjava_crw_demo.so
+
 # Source lists
 LIBNAME=heapTracker
-SOURCES=heapTracker.c ../agent_util/agent_util.c
+SOURCES=heapTracker.c ../../agent_util/src/agent_util.c
 JAVA_SOURCES=HeapTracker.java
 
 # Name of jar file that needs to be created
-JARFILE=heapTracker.jar
+JARFILE=../heapTracker.jar
 
 # Solaris Sun C Compiler Version 5.5
 ifeq ($(OSNAME), solaris)
@@ -93,10 +95,10 @@
     # Object files needed to create library
     OBJECTS=$(SOURCES:%.c=%.o)
     # Library name and options needed to build it
-    LIBRARY=lib$(LIBNAME).so
+    LIBRARY=../lib/lib$(LIBNAME).so
     LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc
     # Libraries we are dependent on
-    LIBRARIES=-L $(JDK)/jre/lib/$(LIBARCH) -ljava_crw_demo -lc
+    LIBRARIES=-L../../java_crw_demo/src/ -ljava_crw_demo -lc
     # Building a shared library
     LINK_SHARED=$(LINK.c) -shared -o $@
 endif
@@ -128,15 +130,18 @@
 
 # Common -I options
 CFLAGS += -I.
-CFLAGS += -I../agent_util
-CFLAGS += -I../java_crw_demo
+CFLAGS += -I../../agent_util/src
+CFLAGS += -I../../java_crw_demo/src
 CFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
 
 # Default rule (build both native library and jar file)
 all: $(LIBRARY) $(JARFILE)
 
+$(JAVA_CRW_DEMO):
+	make JDK=$(JDK) OSNAME=$(OSNAME) -C ../../java_crw_demo/src -f sample.makefile.txt
+
 # Build native library
-$(LIBRARY): $(OBJECTS)
+$(LIBRARY): $(OBJECTS) $(JAVA_CRW_DEMO)
 	$(LINK_SHARED) $(OBJECTS) $(LIBRARIES)
 
 # Build jar file
--- a/src/share/demo/jvmti/heapViewer/sample.makefile.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/heapViewer/sample.makefile.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -43,7 +43,7 @@
 
 # Source lists
 LIBNAME=heapViewer
-SOURCES=heapViewer.c ../agent_util/agent_util.c
+SOURCES=heapViewer.c ../../agent_util/src/agent_util.c
 
 # Solaris Sun C Compiler Version 5.5
 ifeq ($(OSNAME), solaris)
@@ -89,7 +89,7 @@
     # Object files needed to create library
     OBJECTS=$(SOURCES:%.c=%.o)
     # Library name and options needed to build it
-    LIBRARY=lib$(LIBNAME).so
+    LIBRARY=../lib/lib$(LIBNAME).so
     LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc
     # Libraries we are dependent on
     LIBRARIES=-lc
@@ -123,6 +123,7 @@
 # Common -I options
 CFLAGS += -I.
 CFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
+CFLAGS += -I../../agent_util/src
 
 # Default rule
 all: $(LIBRARY)
--- a/src/share/demo/jvmti/hprof/hprof_init.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/hprof/hprof_init.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1361,7 +1361,7 @@
         } rawMonitorExit(gdata->dump_lock);
 
         /* Dump everything if we need to */
-        if (gdata->dump_on_exit && need_to_dump) {
+        if (gdata->dump_on_exit || need_to_dump) {
 
             dump_all_data(env);
         }
--- a/src/share/demo/jvmti/hprof/sample.makefile.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/hprof/sample.makefile.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -73,7 +73,7 @@
 JAVA_SOURCES=Tracker.java
 
 # Name of jar file that needs to be created
-#JARFILE=hprof.jar
+JARFILE=../hprof.jar
 
 # Solaris Sun C Compiler Version 5.5
 ifeq ($(OSNAME), solaris)
@@ -110,7 +110,7 @@
 # Linux GNU C Compiler
 ifeq ($(OSNAME), linux)
     # GNU Compiler options needed to build it
-    COMMON_FLAGS=-fno-strict-aliasing -fPIC -fno-omit-frame-pointer
+    COMMON_FLAGS=-fno-strict-aliasing -fPIC -fno-omit-frame-pointer -DSKIP_NPT
     # Options that help find errors
     COMMON_FLAGS+= -W -Wall  -Wno-unused -Wno-parentheses
     # To allow access to dladdr()
@@ -166,7 +166,7 @@
 
 # Common -I options
 CFLAGS += -I.
-CFLAGS += -I../java_crw_demo
+CFLAGS += -I../../java_crw_demo/src
 CFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
 
 # Default rule (build both native library and jar file)
--- a/src/share/demo/jvmti/minst/sample.makefile.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/minst/sample.makefile.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -41,13 +41,15 @@
 #
 ########################################################################
 
+JAVA_CRW_DEMO=../../java_crw_demo/src/libjava_crw_demo.so
+
 # Source lists
 LIBNAME=minst
-SOURCES=minst.c ../agent_util/agent_util.c
+SOURCES=minst.c ../../agent_util/src/agent_util.c
 JAVA_SOURCES=Minst.java
 
 # Name of jar file that needs to be created
-JARFILE=minst.jar
+JARFILE=../minst.jar
 
 # Solaris Sun C Compiler Version 5.5
 ifeq ($(OSNAME), solaris)
@@ -93,10 +95,10 @@
     # Object files needed to create library
     OBJECTS=$(SOURCES:%.c=%.o)
     # Library name and options needed to build it
-    LIBRARY=lib$(LIBNAME).so
+    LIBRARY=../lib/lib$(LIBNAME).so
     LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc
     # Libraries we are dependent on
-    LIBRARIES=-L $(JDK)/jre/lib/$(LIBARCH) -ljava_crw_demo -lc
+    LIBRARIES=-L../../java_crw_demo/src/ -ljava_crw_demo -lc
     # Building a shared library
     LINK_SHARED=$(LINK.c) -shared -o $@
 endif
@@ -128,15 +130,18 @@
 
 # Common -I options
 CFLAGS += -I.
-CFLAGS += -I../agent_util
-CFLAGS += -I../java_crw_demo
+CFLAGS += -I../../agent_util/src
+CFLAGS += -I../../java_crw_demo/src
 CFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
 
 # Default rule (build both native library and jar file)
 all: $(LIBRARY) $(JARFILE)
 
+$(JAVA_CRW_DEMO):	
+	make JDK=$(JDK) OSNAME=$(OSNAME) -C ../../java_crw_demo/src -f sample.makefile.txt
+
 # Build native library
-$(LIBRARY): $(OBJECTS)
+$(LIBRARY): $(OBJECTS) $(JAVA_CRW_DEMO)
 	$(LINK_SHARED) $(OBJECTS) $(LIBRARIES)
 
 # Build jar file
--- a/src/share/demo/jvmti/mtrace/sample.makefile.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/mtrace/sample.makefile.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -41,13 +41,15 @@
 #
 ########################################################################
 
+JAVA_CRW_DEMO=../../java_crw_demo/src/libjava_crw_demo.so
+
 # Source lists
 LIBNAME=mtrace
-SOURCES=mtrace.c ../agent_util/agent_util.c
+SOURCES=mtrace.c ../../agent_util/src/agent_util.c
 JAVA_SOURCES=Mtrace.java
 
 # Name of jar file that needs to be created
-JARFILE=mtrace.jar
+JARFILE=../mtrace.jar
 
 # Solaris Sun C Compiler Version 5.5
 ifeq ($(OSNAME), solaris)
@@ -93,10 +95,11 @@
     # Object files needed to create library
     OBJECTS=$(SOURCES:%.c=%.o)
     # Library name and options needed to build it
-    LIBRARY=lib$(LIBNAME).so
+    LIBRARY=../lib/lib$(LIBNAME).so
     LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc
     # Libraries we are dependent on
-    LIBRARIES=-L $(JDK)/jre/lib/$(LIBARCH) -ljava_crw_demo -lc
+    LIBRARIES=-L../../java_crw_demo/src -ljava_crw_demo -lc
+
     # Building a shared library
     LINK_SHARED=$(LINK.c) -shared -o $@
 endif
@@ -128,15 +131,18 @@
 
 # Common -I options
 CFLAGS += -I.
-CFLAGS += -I../agent_util
-CFLAGS += -I../java_crw_demo
+CFLAGS += -I../../agent_util/src
+CFLAGS += -I../../java_crw_demo/src
 CFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
 
 # Default rule (build both native library and jar file)
 all: $(LIBRARY) $(JARFILE)
 
+$(JAVA_CRW_DEMO):
+	make JDK=$(JDK) OSNAME=$(OSNAME) -C ../../java_crw_demo/src -f sample.makefile.txt
+
 # Build native library
-$(LIBRARY): $(OBJECTS)
+$(LIBRARY): $(OBJECTS) $(JAVA_CRW_DEMO)
 	$(LINK_SHARED) $(OBJECTS) $(LIBRARIES)
 
 # Build jar file
--- a/src/share/demo/jvmti/versionCheck/sample.makefile.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/versionCheck/sample.makefile.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -43,7 +43,7 @@
 
 # Source lists
 LIBNAME=versionCheck
-SOURCES=versionCheck.c ../agent_util/agent_util.c
+SOURCES=versionCheck.c ../../agent_util/src/agent_util.c
 
 # Solaris Sun C Compiler Version 5.5
 ifeq ($(OSNAME), solaris)
@@ -89,7 +89,7 @@
     # Object files needed to create library
     OBJECTS=$(SOURCES:%.c=%.o)
     # Library name and options needed to build it
-    LIBRARY=lib$(LIBNAME).so
+    LIBRARY=../lib/lib$(LIBNAME).so
     LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc
     # Libraries we are dependent on
     LIBRARIES=-lc
@@ -122,7 +122,7 @@
 
 # Common -I options
 CFLAGS += -I.
-CFLAGS += -I../agent_util
+CFLAGS += -I../../agent_util/src
 CFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
 
 # Default rule
--- a/src/share/demo/jvmti/waiters/sample.makefile.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/demo/jvmti/waiters/sample.makefile.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -43,7 +43,7 @@
 
 # Source lists
 LIBNAME=waiters
-SOURCES=waiters.cpp Agent.cpp Thread.cpp Monitor.cpp ../agent_util/agent_util.c
+SOURCES=waiters.cpp Agent.cpp Thread.cpp Monitor.cpp
 
 # Solaris Sun C Compiler Version 5.5
 ifeq ($(OSNAME), solaris)
@@ -89,8 +89,9 @@
     endif
     # Object files needed to create library
     OBJECTS=$(SOURCES:%.cpp=%.o)
+    OBJECTS+=../../agent_util/src/agent_util.o
     # Library name and options needed to build it
-    LIBRARY=lib$(LIBNAME).so
+    LIBRARY=../lib/lib$(LIBNAME).so
     LDFLAGS=-Wl,-soname=$(LIBRARY) -static-libgcc
     # Libraries we are dependent on
     LIBRARIES=
@@ -123,9 +124,10 @@
 
 # Common -I options
 CXXFLAGS += -I.
-CXXFLAGS += -I../agent_util
+CXXFLAGS += -I../../agent_util/src
 CXXFLAGS += -I$(JDK)/include -I$(JDK)/include/$(OSNAME)
 
+CFLAGS = $(CXXFLAGS)
 # Default rule
 all: $(LIBRARY)
 
--- a/src/share/instrument/JarFacade.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/instrument/JarFacade.c	Tue Aug 22 02:03:52 2017 +0100
@@ -23,14 +23,14 @@
  * questions.
  */
 
-#ifdef _WIN32
+#ifndef __solaris__
 /*
  * Win* needs this include. However, Linux and Solaris do not.
  * Having this include on Solaris SPARC breaks having non US-ASCII
  * characters in the value of the Premain-Class attribute.
  */
 #include <ctype.h>
-#endif /* _WIN32 */
+#endif /* __solaris__ */
 #include <string.h>
 #include <stdlib.h>
 
--- a/src/share/lib/security/java.security-linux	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/lib/security/java.security-linux	Tue Aug 22 02:03:52 2017 +0100
@@ -52,6 +52,10 @@
 security.provider.7=com.sun.security.sasl.Provider
 security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
 security.provider.9=sun.security.smartcardio.SunPCSC
+# the NSS security provider was not enabled for this build; it can be enabled
+# if NSS (libnss3) is available on the machine. The nss.cfg file may need
+# editing to reflect the location of the NSS installation.
+#security.provider.10=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/nss.cfg
 
 #
 # Select the source of seed data for SecureRandom. By default an
@@ -501,7 +505,7 @@
 #
 # Example:
 #   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 768, \
+jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768, \
     EC keySize < 224
 
 # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
--- a/src/share/lib/security/java.security-macosx	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/lib/security/java.security-macosx	Tue Aug 22 02:03:52 2017 +0100
@@ -53,6 +53,10 @@
 security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
 security.provider.9=sun.security.smartcardio.SunPCSC
 security.provider.10=apple.security.AppleProvider
+# the NSS security provider was not enabled for this build; it can be enabled
+# if NSS (libnss3) is available on the machine. The nss.cfg file may need
+# editing to reflect the location of the NSS installation.
+#security.provider.11=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/nss.cfg
 
 #
 # Select the source of seed data for SecureRandom. By default an
@@ -506,7 +510,7 @@
 #
 # Example:
 #   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 768, \
+jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768, \
     EC keySize < 224
 
 # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
--- a/src/share/lib/security/java.security-solaris	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/lib/security/java.security-solaris	Tue Aug 22 02:03:52 2017 +0100
@@ -54,6 +54,10 @@
 security.provider.9=com.sun.security.sasl.Provider
 security.provider.10=org.jcp.xml.dsig.internal.dom.XMLDSigRI
 security.provider.11=sun.security.smartcardio.SunPCSC
+# the NSS security provider was not enabled for this build; it can be enabled
+# if NSS (libnss3) is available on the machine. The nss.cfg file may need
+# editing to reflect the location of the NSS installation.
+#security.provider.12=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/nss.cfg
 
 #
 # Select the source of seed data for SecureRandom. By default an
@@ -505,7 +509,7 @@
 #
 # Example:
 #   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 768, \
+jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768, \
     EC keySize < 224
 
 # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
--- a/src/share/lib/security/java.security-windows	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/lib/security/java.security-windows	Tue Aug 22 02:03:52 2017 +0100
@@ -53,6 +53,10 @@
 security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
 security.provider.9=sun.security.smartcardio.SunPCSC
 security.provider.10=sun.security.mscapi.SunMSCAPI
+# the NSS security provider was not enabled for this build; it can be enabled
+# if NSS (libnss3) is available on the machine. The nss.cfg file may need
+# editing to reflect the location of the NSS installation.
+#security.provider.11=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/nss.cfg
 
 #
 # Select the source of seed data for SecureRandom. By default an
@@ -506,7 +510,7 @@
 #
 # Example:
 #   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 768, \
+jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768, \
     EC keySize < 224
 
 # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/lib/security/nss.cfg.in	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,5 @@
+name = NSS
+nssLibraryDirectory = @NSS_LIBDIR@
+nssDbMode = noDb
+attributes = compatibility
+handleStartupErrors = ignoreMultipleInitialisation
--- a/src/share/native/com/sun/java/util/jar/pack/jni.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/com/sun/java/util/jar/pack/jni.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -244,7 +244,7 @@
 
   if (uPtr->aborting()) {
     THROW_IOE(uPtr->get_abort_message());
-    return false;
+    return JNI_FALSE;
   }
 
   CHECK_NULL_RETURN(filep, false);
@@ -292,7 +292,7 @@
 
   if (uPtr->aborting()) {
     THROW_IOE(uPtr->get_abort_message());
-    return false;
+    return NULL;
   }
 
   // We have fetched all the files.
@@ -310,7 +310,7 @@
 JNIEXPORT jlong JNICALL
 Java_com_sun_java_util_jar_pack_NativeUnpack_finish(JNIEnv *env, jobject pObj) {
   unpacker* uPtr = get_unpacker(env, pObj, false);
-  CHECK_EXCEPTION_RETURN_VALUE(uPtr, NULL);
+  CHECK_EXCEPTION_RETURN_VALUE(uPtr, -1);
   size_t consumed = uPtr->input_consumed();
   free_unpacker(env, pObj, uPtr);
   return consumed;
--- a/src/share/native/com/sun/java/util/jar/pack/unpack.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/com/sun/java/util/jar/pack/unpack.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -2174,7 +2174,6 @@
 
   method_descr.readData(method_count);
   read_attrs(ATTR_CONTEXT_METHOD, method_count);
-
   CHECK;
 
   read_attrs(ATTR_CONTEXT_CLASS, class_count);
--- a/src/share/native/com/sun/media/sound/SoundDefs.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/com/sun/media/sound/SoundDefs.h	Tue Aug 22 02:03:52 2017 +0100
@@ -43,6 +43,16 @@
 #define X_ZERO          6
 #define X_ARM           7
 #define X_PPC           8
+#define X_ALPHA         9
+#define X_M68K          10
+#define X_MIPS          11
+#define X_MIPSEL        12
+#define X_PPC64         13
+#define X_S390          14
+#define X_S390X         15
+#define X_SH            16
+#define X_AARCH64       17
+#define X_PPC64LE       18
 
 // **********************************
 // Make sure you set X_PLATFORM and X_ARCH defines correctly.
--- a/src/share/native/java/net/InetAddress.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/java/net/InetAddress.c	Tue Aug 22 02:03:52 2017 +0100
@@ -38,6 +38,7 @@
 jfieldID iac_addressID;
 jfieldID iac_familyID;
 jfieldID iac_hostNameID;
+jfieldID iac_origHostNameID;
 jfieldID ia_preferIPv6AddressID;
 
 /*
@@ -64,4 +65,6 @@
     iac_familyID = (*env)->GetFieldID(env, iac_class, "family", "I");
     CHECK_NULL(iac_familyID);
     iac_hostNameID = (*env)->GetFieldID(env, iac_class, "hostName", "Ljava/lang/String;");
+    CHECK_NULL(iac_hostNameID);
+    iac_origHostNameID = (*env)->GetFieldID(env, iac_class, "originalHostName", "Ljava/lang/String;");
 }
--- a/src/share/native/java/net/net_util.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/java/net/net_util.c	Tue Aug 22 02:03:52 2017 +0100
@@ -227,6 +227,7 @@
     initInetAddrs(env);
     holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
     (*env)->SetObjectField(env, holder, iac_hostNameID, host);
+    (*env)->SetObjectField(env, holder, iac_origHostNameID, host);
 }
 
 int getInetAddress_addr(JNIEnv *env, jobject iaObj) {
--- a/src/share/native/java/net/net_util.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/java/net/net_util.h	Tue Aug 22 02:03:52 2017 +0100
@@ -53,6 +53,7 @@
 extern jfieldID iac_addressID;
 extern jfieldID iac_familyID;
 extern jfieldID iac_hostNameID;
+extern jfieldID iac_origHostNameID;
 extern jfieldID ia_preferIPv6AddressID;
 
 /** (Inet6Address accessors)
--- a/src/share/native/java/nio/Bits.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,278 +0,0 @@
-/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * 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 "jni.h"
-#include "jni_util.h"
-#include "jlong.h"
-#include <string.h>
-
-/*
- * WARNING:
- *
- * Do not replace instances of:
- *
- *   if (length > MBYTE)
- *     size = MBYTE;
- *   else
- *     size = length;
- *
- * with
- *
- *   size = (length > MBYTE ? MBYTE : length);
- *
- * This expression causes a c compiler assertion failure when compiling on
- * 32-bit sparc.
- */
-
-#define MBYTE 1048576
-
-#define GETCRITICAL(bytes, env, obj) { \
-    bytes = (*env)->GetPrimitiveArrayCritical(env, obj, NULL); \
-    if (bytes == NULL) \
-        JNU_ThrowInternalError(env, "Unable to get array"); \
-}
-
-#define RELEASECRITICAL(bytes, env, obj, mode) { \
-    (*env)->ReleasePrimitiveArrayCritical(env, obj, bytes, mode); \
-}
-
-#define SWAPSHORT(x) ((jshort)(((x) << 8) | (((x) >> 8) & 0xff)))
-#define SWAPINT(x)   ((jint)((SWAPSHORT((jshort)(x)) << 16) | \
-                            (SWAPSHORT((jshort)((x) >> 16)) & 0xffff)))
-#define SWAPLONG(x)  ((jlong)(((jlong)SWAPINT((jint)(x)) << 32) | \
-                              ((jlong)SWAPINT((jint)((x) >> 32)) & 0xffffffff)))
-
-JNIEXPORT void JNICALL
-Java_java_nio_Bits_copyFromShortArray(JNIEnv *env, jobject this, jobject src,
-                                      jlong srcPos, jlong dstAddr, jlong length)
-{
-    jbyte *bytes;
-    size_t size;
-    jshort *srcShort, *dstShort, *endShort;
-    jshort tmpShort;
-
-    dstShort = (jshort *)jlong_to_ptr(dstAddr);
-
-    while (length > 0) {
-        /* do not change this if-else statement, see WARNING above */
-        if (length > MBYTE)
-            size = MBYTE;
-        else
-            size = (size_t)length;
-
-        GETCRITICAL(bytes, env, src);
-
-        srcShort = (jshort *)(bytes + srcPos);
-        endShort = srcShort + (size / sizeof(jshort));
-        while (srcShort < endShort) {
-          tmpShort = *srcShort++;
-          *dstShort++ = SWAPSHORT(tmpShort);
-        }
-
-        RELEASECRITICAL(bytes, env, src, JNI_ABORT);
-
-        length -= size;
-        dstAddr += size;
-        srcPos += size;
-    }
-}
-
-JNIEXPORT void JNICALL
-Java_java_nio_Bits_copyToShortArray(JNIEnv *env, jobject this, jlong srcAddr,
-                                    jobject dst, jlong dstPos, jlong length)
-{
-    jbyte *bytes;
-    size_t size;
-    jshort *srcShort, *dstShort, *endShort;
-    jshort tmpShort;
-
-    srcShort = (jshort *)jlong_to_ptr(srcAddr);
-
-    while (length > 0) {
-        /* do not change this if-else statement, see WARNING above */
-        if (length > MBYTE)
-            size = MBYTE;
-        else
-            size = (size_t)length;
-
-        GETCRITICAL(bytes, env, dst);
-
-        dstShort = (jshort *)(bytes + dstPos);
-        endShort = srcShort + (size / sizeof(jshort));
-        while (srcShort < endShort) {
-            tmpShort = *srcShort++;
-            *dstShort++ = SWAPSHORT(tmpShort);
-        }
-
-        RELEASECRITICAL(bytes, env, dst, 0);
-
-        length -= size;
-        srcAddr += size;
-        dstPos += size;
-    }
-}
-
-JNIEXPORT void JNICALL
-Java_java_nio_Bits_copyFromIntArray(JNIEnv *env, jobject this, jobject src,
-                                    jlong srcPos, jlong dstAddr, jlong length)
-{
-    jbyte *bytes;
-    size_t size;
-    jint *srcInt, *dstInt, *endInt;
-    jint tmpInt;
-
-    dstInt = (jint *)jlong_to_ptr(dstAddr);
-
-    while (length > 0) {
-        /* do not change this code, see WARNING above */
-        if (length > MBYTE)
-            size = MBYTE;
-        else
-            size = (size_t)length;
-
-        GETCRITICAL(bytes, env, src);
-
-        srcInt = (jint *)(bytes + srcPos);
-        endInt = srcInt + (size / sizeof(jint));
-        while (srcInt < endInt) {
-            tmpInt = *srcInt++;
-            *dstInt++ = SWAPINT(tmpInt);
-        }
-
-        RELEASECRITICAL(bytes, env, src, JNI_ABORT);
-
-        length -= size;
-        dstAddr += size;
-        srcPos += size;
-    }
-}
-
-JNIEXPORT void JNICALL
-Java_java_nio_Bits_copyToIntArray(JNIEnv *env, jobject this, jlong srcAddr,
-                                  jobject dst, jlong dstPos, jlong length)
-{
-    jbyte *bytes;
-    size_t size;
-    jint *srcInt, *dstInt, *endInt;
-    jint tmpInt;
-
-    srcInt = (jint *)jlong_to_ptr(srcAddr);
-
-    while (length > 0) {
-        /* do not change this code, see WARNING above */
-        if (length > MBYTE)
-            size = MBYTE;
-        else
-            size = (size_t)length;
-
-        GETCRITICAL(bytes, env, dst);
-
-        dstInt = (jint *)(bytes + dstPos);
-        endInt = srcInt + (size / sizeof(jint));
-        while (srcInt < endInt) {
-            tmpInt = *srcInt++;
-            *dstInt++ = SWAPINT(tmpInt);
-        }
-
-        RELEASECRITICAL(bytes, env, dst, 0);
-
-        length -= size;
-        srcAddr += size;
-        dstPos += size;
-    }
-}
-
-JNIEXPORT void JNICALL
-Java_java_nio_Bits_copyFromLongArray(JNIEnv *env, jobject this, jobject src,
-                                     jlong srcPos, jlong dstAddr, jlong length)
-{
-    jbyte *bytes;
-    size_t size;
-    jlong *srcLong, *dstLong, *endLong;
-    jlong tmpLong;
-
-    dstLong = (jlong *)jlong_to_ptr(dstAddr);
-
-    while (length > 0) {
-        /* do not change this code, see WARNING above */
-        if (length > MBYTE)
-            size = MBYTE;
-        else
-            size = (size_t)length;
-
-        GETCRITICAL(bytes, env, src);
-
-        srcLong = (jlong *)(bytes + srcPos);
-        endLong = srcLong + (size / sizeof(jlong));
-        while (srcLong < endLong) {
-            tmpLong = *srcLong++;
-            *dstLong++ = SWAPLONG(tmpLong);
-        }
-
-        RELEASECRITICAL(bytes, env, src, JNI_ABORT);
-
-        length -= size;
-        dstAddr += size;
-        srcPos += size;
-    }
-}
-
-JNIEXPORT void JNICALL
-Java_java_nio_Bits_copyToLongArray(JNIEnv *env, jobject this, jlong srcAddr,
-                                   jobject dst, jlong dstPos, jlong length)
-{
-    jbyte *bytes;
-    size_t size;
-    jlong *srcLong, *dstLong, *endLong;
-    jlong tmpLong;
-
-    srcLong = (jlong *)jlong_to_ptr(srcAddr);
-
-    while (length > 0) {
-        /* do not change this code, see WARNING above */
-        if (length > MBYTE)
-            size = MBYTE;
-        else
-            size = (size_t)length;
-
-        GETCRITICAL(bytes, env, dst);
-
-        dstLong = (jlong *)(bytes + dstPos);
-        endLong = srcLong + (size / sizeof(jlong));
-        while (srcLong < endLong) {
-            tmpLong = *srcLong++;
-            *dstLong++ = SWAPLONG(tmpLong);
-        }
-
-        RELEASECRITICAL(bytes, env, dst, 0);
-
-        length -= size;
-        srcAddr += size;
-        dstPos += size;
-    }
-}
--- a/src/share/native/java/util/zip/Deflater.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/java/util/zip/Deflater.c	Tue Aug 22 02:03:52 2017 +0100
@@ -60,13 +60,13 @@
 
 JNIEXPORT jlong JNICALL
 Java_java_util_zip_Deflater_init(JNIEnv *env, jclass cls, jint level,
-                                 jint strategy, jboolean nowrap)
+				 jint strategy, jboolean nowrap)
 {
     z_stream *strm = calloc(1, sizeof(z_stream));
 
     if (strm == 0) {
-        JNU_ThrowOutOfMemoryError(env, 0);
-        return jlong_zero;
+	JNU_ThrowOutOfMemoryError(env, 0);
+	return jlong_zero;
     } else {
         const char *msg;
         int ret = deflateInit2(strm, level, Z_DEFLATED,
--- a/src/share/native/java/util/zip/Inflater.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/java/util/zip/Inflater.c	Tue Aug 22 02:03:52 2017 +0100
@@ -40,7 +40,7 @@
 #include "java_util_zip_Inflater.h"
 
 #define ThrowDataFormatException(env, msg) \
-        JNU_ThrowByName(env, "java/util/zip/DataFormatException", msg)
+	JNU_ThrowByName(env, "java/util/zip/DataFormatException", msg)
 
 static jfieldID needDictID;
 static jfieldID finishedID;
--- a/src/share/native/java/util/zip/zip_util.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/java/util/zip/zip_util.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1283,12 +1283,23 @@
 jint
 ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len)
 {
-    jlong entry_size = (entry->csize != 0) ? entry->csize : entry->size;
+    jlong entry_size;
     jlong start;
 
+    if (zip == 0) {
+        return -1;
+    }
+
     /* Clear previous zip error */
     zip->msg = NULL;
 
+    if (entry == 0) {
+        zip->msg = "ZIP_Read: jzentry is NULL";
+        return -1;
+    }
+
+    entry_size = (entry->csize != 0) ? entry->csize : entry->size;
+
     /* Check specified position */
     if (pos < 0 || pos > entry_size - 1) {
         zip->msg = "ZIP_Read: specified offset out of range";
@@ -1419,6 +1430,11 @@
 {
     char *msg;
 
+    if (entry == 0) {
+        jio_fprintf(stderr, "jzentry was invalid");
+        return JNI_FALSE;
+    }
+
     strcpy(entryname, entry->name);
     if (entry->csize == 0) {
         /* Entry is stored */
--- a/src/share/native/sun/awt/image/awt_ImageRep.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/awt/image/awt_ImageRep.c	Tue Aug 22 02:03:52 2017 +0100
@@ -290,7 +290,7 @@
     mapSize = (*env)->GetIntField(env, jicm, g_ICMmapSizeID);
 
     if (numLut < 0 || numLut > 256 || mapSize < 0 || mapSize > 256) {
-        /* Ether old or new ICM has a palette that exceeds capacity
+        /* Either old or new ICM has a palette that exceeds capacity
            of byte data type, so we have to convert the image data
            to default representation.
         */
--- a/src/share/native/sun/awt/image/jpeg/README	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,385 +0,0 @@
-The Independent JPEG Group's JPEG software
-==========================================
-
-README for release 6b of 27-Mar-1998
-====================================
-
-This distribution contains the sixth public release of the Independent JPEG
-Group's free JPEG software.  You are welcome to redistribute this software and
-to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
-
-Serious users of this software (particularly those incorporating it into
-larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to
-our electronic mailing list.  Mailing list members are notified of updates
-and have a chance to participate in technical discussions, etc.
-
-This software is the work of Tom Lane, Philip Gladstone, Jim Boucher,
-Lee Crocker, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi,
-Guido Vollbeding, Ge' Weijers, and other members of the Independent JPEG
-Group.
-
-IJG is not affiliated with the official ISO JPEG standards committee.
-
-
-DOCUMENTATION ROADMAP
-=====================
-
-This file contains the following sections:
-
-OVERVIEW            General description of JPEG and the IJG software.
-LEGAL ISSUES        Copyright, lack of warranty, terms of distribution.
-REFERENCES          Where to learn more about JPEG.
-ARCHIVE LOCATIONS   Where to find newer versions of this software.
-RELATED SOFTWARE    Other stuff you should get.
-FILE FORMAT WARS    Software *not* to get.
-TO DO               Plans for future IJG releases.
-
-Other documentation files in the distribution are:
-
-User documentation:
-  install.doc       How to configure and install the IJG software.
-  usage.doc         Usage instructions for cjpeg, djpeg, jpegtran,
-                    rdjpgcom, and wrjpgcom.
-  *.1               Unix-style man pages for programs (same info as usage.doc).
-  wizard.doc        Advanced usage instructions for JPEG wizards only.
-  change.log        Version-to-version change highlights.
-Programmer and internal documentation:
-  libjpeg.doc       How to use the JPEG library in your own programs.
-  example.c         Sample code for calling the JPEG library.
-  structure.doc     Overview of the JPEG library's internal structure.
-  filelist.doc      Road map of IJG files.
-  coderules.doc     Coding style rules --- please read if you contribute code.
-
-Please read at least the files install.doc and usage.doc.  Useful information
-can also be found in the JPEG FAQ (Frequently Asked Questions) article.  See
-ARCHIVE LOCATIONS below to find out where to obtain the FAQ article.
-
-If you want to understand how the JPEG code works, we suggest reading one or
-more of the REFERENCES, then looking at the documentation files (in roughly
-the order listed) before diving into the code.
-
-
-OVERVIEW
-========
-
-This package contains C software to implement JPEG image compression and
-decompression.  JPEG (pronounced "jay-peg") is a standardized compression
-method for full-color and gray-scale images.  JPEG is intended for compressing
-"real-world" scenes; line drawings, cartoons and other non-realistic images
-are not its strong suit.  JPEG is lossy, meaning that the output image is not
-exactly identical to the input image.  Hence you must not use JPEG if you
-have to have identical output bits.  However, on typical photographic images,
-very good compression levels can be obtained with no visible change, and
-remarkably high compression levels are possible if you can tolerate a
-low-quality image.  For more details, see the references, or just experiment
-with various compression settings.
-
-This software implements JPEG baseline, extended-sequential, and progressive
-compression processes.  Provision is made for supporting all variants of these
-processes, although some uncommon parameter settings aren't implemented yet.
-For legal reasons, we are not distributing code for the arithmetic-coding
-variants of JPEG; see LEGAL ISSUES.  We have made no provision for supporting
-the hierarchical or lossless processes defined in the standard.
-
-We provide a set of library routines for reading and writing JPEG image files,
-plus two sample applications "cjpeg" and "djpeg", which use the library to
-perform conversion between JPEG and some other popular image file formats.
-The library is intended to be reused in other applications.
-
-In order to support file conversion and viewing software, we have included
-considerable functionality beyond the bare JPEG coding/decoding capability;
-for example, the color quantization modules are not strictly part of JPEG
-decoding, but they are essential for output to colormapped file formats or
-colormapped displays.  These extra functions can be compiled out of the
-library if not required for a particular application.  We have also included
-"jpegtran", a utility for lossless transcoding between different JPEG
-processes, and "rdjpgcom" and "wrjpgcom", two simple applications for
-inserting and extracting textual comments in JFIF files.
-
-The emphasis in designing this software has been on achieving portability and
-flexibility, while also making it fast enough to be useful.  In particular,
-the software is not intended to be read as a tutorial on JPEG.  (See the
-REFERENCES section for introductory material.)  Rather, it is intended to
-be reliable, portable, industrial-strength code.  We do not claim to have
-achieved that goal in every aspect of the software, but we strive for it.
-
-We welcome the use of this software as a component of commercial products.
-No royalty is required, but we do ask for an acknowledgement in product
-documentation, as described under LEGAL ISSUES.
-
-
-LEGAL ISSUES
-============
-
-In plain English:
-
-1. We don't promise that this software works.  (But if you find any bugs,
-   please let us know!)
-2. You can use this software for whatever you want.  You don't have to pay us.
-3. You may not pretend that you wrote this software.  If you use it in a
-   program, you must acknowledge somewhere in your documentation that
-   you've used the IJG code.
-
-In legalese:
-
-The authors make NO WARRANTY or representation, either express or implied,
-with respect to this software, its quality, accuracy, merchantability, or
-fitness for a particular purpose.  This software is provided "AS IS", and you,
-its user, assume the entire risk as to its quality and accuracy.
-
-This software is copyright (C) 1991-1998, Thomas G. Lane.
-All Rights Reserved except as specified below.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-software (or portions thereof) for any purpose, without fee, subject to these
-conditions:
-(1) If any part of the source code for this software is distributed, then this
-README file must be included, with this copyright and no-warranty notice
-unaltered; and any additions, deletions, or changes to the original files
-must be clearly indicated in accompanying documentation.
-(2) If only executable code is distributed, then the accompanying
-documentation must state that "this software is based in part on the work of
-the Independent JPEG Group".
-(3) Permission for use of this software is granted only if the user accepts
-full responsibility for any undesirable consequences; the authors accept
-NO LIABILITY for damages of any kind.
-
-These conditions apply to any software derived from or based on the IJG code,
-not just to the unmodified library.  If you use our work, you ought to
-acknowledge us.
-
-Permission is NOT granted for the use of any IJG author's name or company name
-in advertising or publicity relating to this software or products derived from
-it.  This software may be referred to only as "the Independent JPEG Group's
-software".
-
-We specifically permit and encourage the use of this software as the basis of
-commercial products, provided that all warranty or liability claims are
-assumed by the product vendor.
-
-
-ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
-sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
-ansi2knr.c is NOT covered by the above copyright and conditions, but instead
-by the usual distribution terms of the Free Software Foundation; principally,
-that you must include source code if you redistribute it.  (See the file
-ansi2knr.c for full details.)  However, since ansi2knr.c is not needed as part
-of any program generated from the IJG code, this does not limit you more than
-the foregoing paragraphs do.
-
-The Unix configuration script "configure" was produced with GNU Autoconf.
-It is copyright by the Free Software Foundation but is freely distributable.
-The same holds for its supporting scripts (config.guess, config.sub,
-ltconfig, ltmain.sh).  Another support script, install-sh, is copyright
-by M.I.T. but is also freely distributable.
-
-It appears that the arithmetic coding option of the JPEG spec is covered by
-patents owned by IBM, AT&T, and Mitsubishi.  Hence arithmetic coding cannot
-legally be used without obtaining one or more licenses.  For this reason,
-support for arithmetic coding has been removed from the free JPEG software.
-(Since arithmetic coding provides only a marginal gain over the unpatented
-Huffman mode, it is unlikely that very many implementations will support it.)
-So far as we are aware, there are no patent restrictions on the remaining
-code.
-
-The IJG distribution formerly included code to read and write GIF files.
-To avoid entanglement with the Unisys LZW patent, GIF reading support has
-been removed altogether, and the GIF writer has been simplified to produce
-"uncompressed GIFs".  This technique does not use the LZW algorithm; the
-resulting GIF files are larger than usual, but are readable by all standard
-GIF decoders.
-
-We are required to state that
-    "The Graphics Interchange Format(c) is the Copyright property of
-    CompuServe Incorporated.  GIF(sm) is a Service Mark property of
-    CompuServe Incorporated."
-
-
-REFERENCES
-==========
-
-We highly recommend reading one or more of these references before trying to
-understand the innards of the JPEG software.
-
-The best short technical introduction to the JPEG compression algorithm is
-	Wallace, Gregory K.  "The JPEG Still Picture Compression Standard",
-	Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
-(Adjacent articles in that issue discuss MPEG motion picture compression,
-applications of JPEG, and related topics.)  If you don't have the CACM issue
-handy, a PostScript file containing a revised version of Wallace's article is
-available at ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz.  The file (actually
-a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
-omits the sample images that appeared in CACM, but it includes corrections
-and some added material.  Note: the Wallace article is copyright ACM and IEEE,
-and it may not be used for commercial purposes.
-
-A somewhat less technical, more leisurely introduction to JPEG can be found in
-"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by
-M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1.  This book provides
-good explanations and example C code for a multitude of compression methods
-including JPEG.  It is an excellent source if you are comfortable reading C
-code but don't know much about data compression in general.  The book's JPEG
-sample code is far from industrial-strength, but when you are ready to look
-at a full implementation, you've got one here...
-
-The best full description of JPEG is the textbook "JPEG Still Image Data
-Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published
-by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.  Price US$59.95, 638 pp.
-The book includes the complete text of the ISO JPEG standards (DIS 10918-1
-and draft DIS 10918-2).  This is by far the most complete exposition of JPEG
-in existence, and we highly recommend it.
-
-The JPEG standard itself is not available electronically; you must order a
-paper copy through ISO or ITU.  (Unless you feel a need to own a certified
-official copy, we recommend buying the Pennebaker and Mitchell book instead;
-it's much cheaper and includes a great deal of useful explanatory material.)
-In the USA, copies of the standard may be ordered from ANSI Sales at (212)
-642-4900, or from Global Engineering Documents at (800) 854-7179.  (ANSI
-doesn't take credit card orders, but Global does.)  It's not cheap: as of
-1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7%
-shipping/handling.  The standard is divided into two parts, Part 1 being the
-actual specification, while Part 2 covers compliance testing methods.  Part 1
-is titled "Digital Compression and Coding of Continuous-tone Still Images,
-Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
-10918-1, ITU-T T.81.  Part 2 is titled "Digital Compression and Coding of
-Continuous-tone Still Images, Part 2: Compliance testing" and has document
-numbers ISO/IEC IS 10918-2, ITU-T T.83.
-
-Some extensions to the original JPEG standard are defined in JPEG Part 3,
-a newer ISO standard numbered ISO/IEC IS 10918-3 and ITU-T T.84.  IJG
-currently does not support any Part 3 extensions.
-
-The JPEG standard does not specify all details of an interchangeable file
-format.  For the omitted details we follow the "JFIF" conventions, revision
-1.02.  A copy of the JFIF spec is available from:
-	Literature Department
-	C-Cube Microsystems, Inc.
-	1778 McCarthy Blvd.
-	Milpitas, CA 95035
-	phone (408) 944-6300,  fax (408) 944-6314
-A PostScript version of this document is available by FTP at
-ftp://ftp.uu.net/graphics/jpeg/jfif.ps.gz.  There is also a plain text
-version at ftp://ftp.uu.net/graphics/jpeg/jfif.txt.gz, but it is missing
-the figures.
-
-The TIFF 6.0 file format specification can be obtained by FTP from
-ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz.  The JPEG incorporation scheme
-found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
-IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
-Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
-(Compression tag 7).  Copies of this Note can be obtained from ftp.sgi.com or
-from ftp://ftp.uu.net/graphics/jpeg/.  It is expected that the next revision
-of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
-Although IJG's own code does not support TIFF/JPEG, the free libtiff library
-uses our library to implement TIFF/JPEG per the Note.  libtiff is available
-from ftp://ftp.sgi.com/graphics/tiff/.
-
-
-ARCHIVE LOCATIONS
-=================
-
-The "official" archive site for this software is ftp.uu.net (Internet
-address 192.48.96.9).  The most recent released version can always be found
-there in directory graphics/jpeg.  This particular version will be archived
-as ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz.  If you don't have
-direct Internet access, UUNET's archives are also available via UUCP; contact
-help@uunet.uu.net for information on retrieving files that way.
-
-Numerous Internet sites maintain copies of the UUNET files.  However, only
-ftp.uu.net is guaranteed to have the latest official version.
-
-You can also obtain this software in DOS-compatible "zip" archive format from
-the SimTel archives (ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/), or
-on CompuServe in the Graphics Support forum (GO CIS:GRAPHSUP), library 12
-"JPEG Tools".  Again, these versions may sometimes lag behind the ftp.uu.net
-release.
-
-The JPEG FAQ (Frequently Asked Questions) article is a useful source of
-general information about JPEG.  It is updated constantly and therefore is
-not included in this distribution.  The FAQ is posted every two weeks to
-Usenet newsgroups comp.graphics.misc, news.answers, and other groups.
-It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
-and other news.answers archive sites, including the official news.answers
-archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
-If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
-with body
-	send usenet/news.answers/jpeg-faq/part1
-	send usenet/news.answers/jpeg-faq/part2
-
-
-RELATED SOFTWARE
-================
-
-Numerous viewing and image manipulation programs now support JPEG.  (Quite a
-few of them use this library to do so.)  The JPEG FAQ described above lists
-some of the more popular free and shareware viewers, and tells where to
-obtain them on Internet.
-
-If you are on a Unix machine, we highly recommend Jef Poskanzer's free
-PBMPLUS software, which provides many useful operations on PPM-format image
-files.  In particular, it can convert PPM images to and from a wide range of
-other formats, thus making cjpeg/djpeg considerably more useful.  The latest
-version is distributed by the NetPBM group, and is available from numerous
-sites, notably ftp://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/.
-Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software is;
-you are likely to have difficulty making it work on any non-Unix machine.
-
-A different free JPEG implementation, written by the PVRG group at Stanford,
-is available from ftp://havefun.stanford.edu/pub/jpeg/.  This program
-is designed for research and experimentation rather than production use;
-it is slower, harder to use, and less portable than the IJG code, but it
-is easier to read and modify.  Also, the PVRG code supports lossless JPEG,
-which we do not.  (On the other hand, it doesn't do progressive JPEG.)
-
-
-FILE FORMAT WARS
-================
-
-Some JPEG programs produce files that are not compatible with our library.
-The root of the problem is that the ISO JPEG committee failed to specify a
-concrete file format.  Some vendors "filled in the blanks" on their own,
-creating proprietary formats that no one else could read.  (For example, none
-of the early commercial JPEG implementations for the Macintosh were able to
-exchange compressed files.)
-
-The file format we have adopted is called JFIF (see REFERENCES).  This format
-has been agreed to by a number of major commercial JPEG vendors, and it has
-become the de facto standard.  JFIF is a minimal or "low end" representation.
-We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF
-Technical Note #2) for "high end" applications that need to record a lot of
-additional data about an image.  TIFF/JPEG is fairly new and not yet widely
-supported, unfortunately.
-
-The upcoming JPEG Part 3 standard defines a file format called SPIFF.
-SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should
-be able to read the most common variant of SPIFF.  SPIFF has some technical
-advantages over JFIF, but its major claim to fame is simply that it is an
-official standard rather than an informal one.  At this point it is unclear
-whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto
-standard.  IJG intends to support SPIFF once the standard is frozen, but we
-have not decided whether it should become our default output format or not.
-(In any case, our decoder will remain capable of reading JFIF indefinitely.)
-
-Various proprietary file formats incorporating JPEG compression also exist.
-We have little or no sympathy for the existence of these formats.  Indeed,
-one of the original reasons for developing this free software was to help
-force convergence on common, open format standards for JPEG files.  Don't
-use a proprietary file format!
-
-
-TO DO
-=====
-
-The major thrust for v7 will probably be improvement of visual quality.
-The current method for scaling the quantization tables is known not to be
-very good at low Q values.  We also intend to investigate block boundary
-smoothing, "poor man's variable quantization", and other means of improving
-quality-vs-file-size performance without sacrificing compatibility.
-
-In future versions, we are considering supporting some of the upcoming JPEG
-Part 3 extensions --- principally, variable quantization and the SPIFF file
-format.
-
-As always, speeding things up is of great interest.
-
-Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net.
--- a/src/share/native/sun/awt/image/jpeg/imageioJPEG.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/awt/image/jpeg/imageioJPEG.c	Tue Aug 22 02:03:52 2017 +0100
@@ -51,7 +51,7 @@
 
 /* headers from the JPEG library */
 #include <jpeglib.h>
-#include "jerror.h"
+#include <jerror.h>
 
 #undef MAX
 #define MAX(a,b)        ((a) > (b) ? (a) : (b))
@@ -1487,6 +1487,8 @@
                                                     "[S"));
 }
 
+#define JPEG_APP1  (JPEG_APP0 + 1)  /* EXIF APP1 marker code  */
+
 JNIEXPORT jlong JNICALL
 Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_initJPEGImageReader
     (JNIEnv *env,
@@ -1540,6 +1542,7 @@
 
     // Set up to keep any APP2 markers, as these might contain ICC profile
     // data
+    jpeg_save_markers(cinfo, JPEG_APP1, 0xFFFF);
     jpeg_save_markers(cinfo, ICC_MARKER, 0xFFFF);
 
     /*
@@ -1602,8 +1605,6 @@
     imageio_init_source((j_decompress_ptr) cinfo);
 }
 
-#define JPEG_APP1  (JPEG_APP0 + 1)  /* EXIF APP1 marker code  */
-
 /*
  * For EXIF images, the APP1 will appear immediately after the SOI,
  * so it's safe to only look at the first marker in the list.
@@ -2795,6 +2796,11 @@
             scale[i] = (UINT8*) malloc((maxBandValue + 1) * sizeof(UINT8));
 
             if (scale[i] == NULL) {
+                // Cleanup before throwing an out of memory exception
+                for (j = 0; j < i; j++) {
+                    free(scale[j]);
+                }
+                free(scale);
                 JNU_ThrowByName( env, "java/lang/OutOfMemoryError",
                                  "Writing JPEG Stream");
                 return JNI_FALSE;
--- a/src/share/native/sun/awt/image/jpeg/jcapimin.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,284 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcapimin.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface code for the compression half
- * of the JPEG library.  These are the "minimum" API routines that may be
- * needed in either the normal full-compression case or the transcoding-only
- * case.
- *
- * Most of the routines intended to be called directly by an application
- * are in this file or in jcapistd.c.  But also see jcparam.c for
- * parameter-setup helper routines, jcomapi.c for routines shared by
- * compression and decompression, and jctrans.c for the transcoding case.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Initialization of a JPEG compression object.
- * The error manager must already be set up (in case memory manager fails).
- */
-
-GLOBAL(void)
-jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
-{
-  int i;
-
-  /* Guard against version mismatches between library and caller. */
-  cinfo->mem = NULL;            /* so jpeg_destroy knows mem mgr not called */
-  if (version != JPEG_LIB_VERSION)
-    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
-  if (structsize != SIZEOF(struct jpeg_compress_struct))
-    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
-             (int) SIZEOF(struct jpeg_compress_struct), (int) structsize);
-
-  /* For debugging purposes, we zero the whole master structure.
-   * But the application has already set the err pointer, and may have set
-   * client_data, so we have to save and restore those fields.
-   * Note: if application hasn't set client_data, tools like Purify may
-   * complain here.
-   */
-  {
-    struct jpeg_error_mgr * err = cinfo->err;
-    void * client_data = cinfo->client_data; /* ignore Purify complaint here */
-    MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));
-    cinfo->err = err;
-    cinfo->client_data = client_data;
-  }
-  cinfo->is_decompressor = FALSE;
-
-  /* Initialize a memory manager instance for this object */
-  jinit_memory_mgr((j_common_ptr) cinfo);
-
-  /* Zero out pointers to permanent structures. */
-  cinfo->progress = NULL;
-  cinfo->dest = NULL;
-
-  cinfo->comp_info = NULL;
-
-  for (i = 0; i < NUM_QUANT_TBLS; i++)
-    cinfo->quant_tbl_ptrs[i] = NULL;
-
-  for (i = 0; i < NUM_HUFF_TBLS; i++) {
-    cinfo->dc_huff_tbl_ptrs[i] = NULL;
-    cinfo->ac_huff_tbl_ptrs[i] = NULL;
-  }
-
-  cinfo->script_space = NULL;
-
-  cinfo->input_gamma = 1.0;     /* in case application forgets */
-
-  /* OK, I'm ready */
-  cinfo->global_state = CSTATE_START;
-}
-
-
-/*
- * Destruction of a JPEG compression object
- */
-
-GLOBAL(void)
-jpeg_destroy_compress (j_compress_ptr cinfo)
-{
-  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
-}
-
-
-/*
- * Abort processing of a JPEG compression operation,
- * but don't destroy the object itself.
- */
-
-GLOBAL(void)
-jpeg_abort_compress (j_compress_ptr cinfo)
-{
-  jpeg_abort((j_common_ptr) cinfo); /* use common routine */
-}
-
-
-/*
- * Forcibly suppress or un-suppress all quantization and Huffman tables.
- * Marks all currently defined tables as already written (if suppress)
- * or not written (if !suppress).  This will control whether they get emitted
- * by a subsequent jpeg_start_compress call.
- *
- * This routine is exported for use by applications that want to produce
- * abbreviated JPEG datastreams.  It logically belongs in jcparam.c, but
- * since it is called by jpeg_start_compress, we put it here --- otherwise
- * jcparam.o would be linked whether the application used it or not.
- */
-
-GLOBAL(void)
-jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)
-{
-  int i;
-  JQUANT_TBL * qtbl;
-  JHUFF_TBL * htbl;
-
-  for (i = 0; i < NUM_QUANT_TBLS; i++) {
-    if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)
-      qtbl->sent_table = suppress;
-  }
-
-  for (i = 0; i < NUM_HUFF_TBLS; i++) {
-    if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)
-      htbl->sent_table = suppress;
-    if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)
-      htbl->sent_table = suppress;
-  }
-}
-
-
-/*
- * Finish JPEG compression.
- *
- * If a multipass operating mode was selected, this may do a great deal of
- * work including most of the actual output.
- */
-
-GLOBAL(void)
-jpeg_finish_compress (j_compress_ptr cinfo)
-{
-  JDIMENSION iMCU_row;
-
-  if (cinfo->global_state == CSTATE_SCANNING ||
-      cinfo->global_state == CSTATE_RAW_OK) {
-    /* Terminate first pass */
-    if (cinfo->next_scanline < cinfo->image_height)
-      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
-    (*cinfo->master->finish_pass) (cinfo);
-  } else if (cinfo->global_state != CSTATE_WRCOEFS)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  /* Perform any remaining passes */
-  while (! cinfo->master->is_last_pass) {
-    (*cinfo->master->prepare_for_pass) (cinfo);
-    for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {
-      if (cinfo->progress != NULL) {
-        cinfo->progress->pass_counter = (long) iMCU_row;
-        cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;
-        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
-      }
-      /* We bypass the main controller and invoke coef controller directly;
-       * all work is being done from the coefficient buffer.
-       */
-      if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))
-        ERREXIT(cinfo, JERR_CANT_SUSPEND);
-    }
-    (*cinfo->master->finish_pass) (cinfo);
-  }
-  /* Write EOI, do final cleanup */
-  (*cinfo->marker->write_file_trailer) (cinfo);
-  (*cinfo->dest->term_destination) (cinfo);
-  /* We can use jpeg_abort to release memory and reset global_state */
-  jpeg_abort((j_common_ptr) cinfo);
-}
-
-
-/*
- * Write a special marker.
- * This is only recommended for writing COM or APPn markers.
- * Must be called after jpeg_start_compress() and before
- * first call to jpeg_write_scanlines() or jpeg_write_raw_data().
- */
-
-GLOBAL(void)
-jpeg_write_marker (j_compress_ptr cinfo, int marker,
-                   const JOCTET *dataptr, unsigned int datalen)
-{
-  JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));
-
-  if (cinfo->next_scanline != 0 ||
-      (cinfo->global_state != CSTATE_SCANNING &&
-       cinfo->global_state != CSTATE_RAW_OK &&
-       cinfo->global_state != CSTATE_WRCOEFS))
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
-  write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */
-  while (datalen--) {
-    (*write_marker_byte) (cinfo, *dataptr);
-    dataptr++;
-  }
-}
-
-/* Same, but piecemeal. */
-
-GLOBAL(void)
-jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
-{
-  if (cinfo->next_scanline != 0 ||
-      (cinfo->global_state != CSTATE_SCANNING &&
-       cinfo->global_state != CSTATE_RAW_OK &&
-       cinfo->global_state != CSTATE_WRCOEFS))
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
-}
-
-GLOBAL(void)
-jpeg_write_m_byte (j_compress_ptr cinfo, int val)
-{
-  (*cinfo->marker->write_marker_byte) (cinfo, val);
-}
-
-
-/*
- * Alternate compression function: just write an abbreviated table file.
- * Before calling this, all parameters and a data destination must be set up.
- *
- * To produce a pair of files containing abbreviated tables and abbreviated
- * image data, one would proceed as follows:
- *
- *              initialize JPEG object
- *              set JPEG parameters
- *              set destination to table file
- *              jpeg_write_tables(cinfo);
- *              set destination to image file
- *              jpeg_start_compress(cinfo, FALSE);
- *              write data...
- *              jpeg_finish_compress(cinfo);
- *
- * jpeg_write_tables has the side effect of marking all tables written
- * (same as jpeg_suppress_tables(..., TRUE)).  Thus a subsequent start_compress
- * will not re-emit the tables unless it is passed write_all_tables=TRUE.
- */
-
-GLOBAL(void)
-jpeg_write_tables (j_compress_ptr cinfo)
-{
-  if (cinfo->global_state != CSTATE_START)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  /* (Re)initialize error mgr and destination modules */
-  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
-  (*cinfo->dest->init_destination) (cinfo);
-  /* Initialize the marker writer ... bit of a crock to do it here. */
-  jinit_marker_writer(cinfo);
-  /* Write them tables! */
-  (*cinfo->marker->write_tables_only) (cinfo);
-  /* And clean up. */
-  (*cinfo->dest->term_destination) (cinfo);
-  /*
-   * In library releases up through v6a, we called jpeg_abort() here to free
-   * any working memory allocated by the destination manager and marker
-   * writer.  Some applications had a problem with that: they allocated space
-   * of their own from the library memory manager, and didn't want it to go
-   * away during write_tables.  So now we do nothing.  This will cause a
-   * memory leak if an app calls write_tables repeatedly without doing a full
-   * compression cycle or otherwise resetting the JPEG object.  However, that
-   * seems less bad than unexpectedly freeing memory in the normal case.
-   * An app that prefers the old behavior can call jpeg_abort for itself after
-   * each call to jpeg_write_tables().
-   */
-}
--- a/src/share/native/sun/awt/image/jpeg/jcapistd.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcapistd.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface code for the compression half
- * of the JPEG library.  These are the "standard" API routines that are
- * used in the normal full-compression case.  They are not used by a
- * transcoding-only application.  Note that if an application links in
- * jpeg_start_compress, it will end up linking in the entire compressor.
- * We thus must separate this file from jcapimin.c to avoid linking the
- * whole compression library into a transcoder.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Compression initialization.
- * Before calling this, all parameters and a data destination must be set up.
- *
- * We require a write_all_tables parameter as a failsafe check when writing
- * multiple datastreams from the same compression object.  Since prior runs
- * will have left all the tables marked sent_table=TRUE, a subsequent run
- * would emit an abbreviated stream (no tables) by default.  This may be what
- * is wanted, but for safety's sake it should not be the default behavior:
- * programmers should have to make a deliberate choice to emit abbreviated
- * images.  Therefore the documentation and examples should encourage people
- * to pass write_all_tables=TRUE; then it will take active thought to do the
- * wrong thing.
- */
-
-GLOBAL(void)
-jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)
-{
-  if (cinfo->global_state != CSTATE_START)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  if (write_all_tables)
-    jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */
-
-  /* (Re)initialize error mgr and destination modules */
-  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
-  (*cinfo->dest->init_destination) (cinfo);
-  /* Perform master selection of active modules */
-  jinit_compress_master(cinfo);
-  /* Set up for the first pass */
-  (*cinfo->master->prepare_for_pass) (cinfo);
-  /* Ready for application to drive first pass through jpeg_write_scanlines
-   * or jpeg_write_raw_data.
-   */
-  cinfo->next_scanline = 0;
-  cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);
-}
-
-
-/*
- * Write some scanlines of data to the JPEG compressor.
- *
- * The return value will be the number of lines actually written.
- * This should be less than the supplied num_lines only in case that
- * the data destination module has requested suspension of the compressor,
- * or if more than image_height scanlines are passed in.
- *
- * Note: we warn about excess calls to jpeg_write_scanlines() since
- * this likely signals an application programmer error.  However,
- * excess scanlines passed in the last valid call are *silently* ignored,
- * so that the application need not adjust num_lines for end-of-image
- * when using a multiple-scanline buffer.
- */
-
-GLOBAL(JDIMENSION)
-jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,
-                      JDIMENSION num_lines)
-{
-  JDIMENSION row_ctr, rows_left;
-
-  if (cinfo->global_state != CSTATE_SCANNING)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  if (cinfo->next_scanline >= cinfo->image_height)
-    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
-
-  /* Call progress monitor hook if present */
-  if (cinfo->progress != NULL) {
-    cinfo->progress->pass_counter = (long) cinfo->next_scanline;
-    cinfo->progress->pass_limit = (long) cinfo->image_height;
-    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
-  }
-
-  /* Give master control module another chance if this is first call to
-   * jpeg_write_scanlines.  This lets output of the frame/scan headers be
-   * delayed so that application can write COM, etc, markers between
-   * jpeg_start_compress and jpeg_write_scanlines.
-   */
-  if (cinfo->master->call_pass_startup)
-    (*cinfo->master->pass_startup) (cinfo);
-
-  /* Ignore any extra scanlines at bottom of image. */
-  rows_left = cinfo->image_height - cinfo->next_scanline;
-  if (num_lines > rows_left)
-    num_lines = rows_left;
-
-  row_ctr = 0;
-  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);
-  cinfo->next_scanline += row_ctr;
-  return row_ctr;
-}
-
-
-/*
- * Alternate entry point to write raw data.
- * Processes exactly one iMCU row per call, unless suspended.
- */
-
-GLOBAL(JDIMENSION)
-jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
-                     JDIMENSION num_lines)
-{
-  JDIMENSION lines_per_iMCU_row;
-
-  if (cinfo->global_state != CSTATE_RAW_OK)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  if (cinfo->next_scanline >= cinfo->image_height) {
-    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
-    return 0;
-  }
-
-  /* Call progress monitor hook if present */
-  if (cinfo->progress != NULL) {
-    cinfo->progress->pass_counter = (long) cinfo->next_scanline;
-    cinfo->progress->pass_limit = (long) cinfo->image_height;
-    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
-  }
-
-  /* Give master control module another chance if this is first call to
-   * jpeg_write_raw_data.  This lets output of the frame/scan headers be
-   * delayed so that application can write COM, etc, markers between
-   * jpeg_start_compress and jpeg_write_raw_data.
-   */
-  if (cinfo->master->call_pass_startup)
-    (*cinfo->master->pass_startup) (cinfo);
-
-  /* Verify that at least one iMCU row has been passed. */
-  lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;
-  if (num_lines < lines_per_iMCU_row)
-    ERREXIT(cinfo, JERR_BUFFER_SIZE);
-
-  /* Directly compress the row. */
-  if (! (*cinfo->coef->compress_data) (cinfo, data)) {
-    /* If compressor did not consume the whole row, suspend processing. */
-    return 0;
-  }
-
-  /* OK, we processed one iMCU row. */
-  cinfo->next_scanline += lines_per_iMCU_row;
-  return lines_per_iMCU_row;
-}
--- a/src/share/native/sun/awt/image/jpeg/jccoefct.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,453 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jccoefct.c
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the coefficient buffer controller for compression.
- * This controller is the top level of the JPEG compressor proper.
- * The coefficient buffer lies between forward-DCT and entropy encoding steps.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* We use a full-image coefficient buffer when doing Huffman optimization,
- * and also for writing multiple-scan JPEG files.  In all cases, the DCT
- * step is run during the first pass, and subsequent passes need only read
- * the buffered coefficients.
- */
-#ifdef ENTROPY_OPT_SUPPORTED
-#define FULL_COEF_BUFFER_SUPPORTED
-#else
-#ifdef C_MULTISCAN_FILES_SUPPORTED
-#define FULL_COEF_BUFFER_SUPPORTED
-#endif
-#endif
-
-
-/* Private buffer controller object */
-
-typedef struct {
-  struct jpeg_c_coef_controller pub; /* public fields */
-
-  JDIMENSION iMCU_row_num;      /* iMCU row # within image */
-  JDIMENSION mcu_ctr;           /* counts MCUs processed in current row */
-  int MCU_vert_offset;          /* counts MCU rows within iMCU row */
-  int MCU_rows_per_iMCU_row;    /* number of such rows needed */
-
-  /* For single-pass compression, it's sufficient to buffer just one MCU
-   * (although this may prove a bit slow in practice).  We allocate a
-   * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each
-   * MCU constructed and sent.  (On 80x86, the workspace is FAR even though
-   * it's not really very big; this is to keep the module interfaces unchanged
-   * when a large coefficient buffer is necessary.)
-   * In multi-pass modes, this array points to the current MCU's blocks
-   * within the virtual arrays.
-   */
-  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
-
-  /* In multi-pass modes, we need a virtual block array for each component. */
-  jvirt_barray_ptr whole_image[MAX_COMPONENTS];
-} my_coef_controller;
-
-typedef my_coef_controller * my_coef_ptr;
-
-
-/* Forward declarations */
-METHODDEF(boolean) compress_data
-    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
-#ifdef FULL_COEF_BUFFER_SUPPORTED
-METHODDEF(boolean) compress_first_pass
-    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
-METHODDEF(boolean) compress_output
-    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
-#endif
-
-
-LOCAL(void)
-start_iMCU_row (j_compress_ptr cinfo)
-/* Reset within-iMCU-row counters for a new row */
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
-  /* In an interleaved scan, an MCU row is the same as an iMCU row.
-   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
-   * But at the bottom of the image, process only what's left.
-   */
-  if (cinfo->comps_in_scan > 1) {
-    coef->MCU_rows_per_iMCU_row = 1;
-  } else {
-    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
-      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
-    else
-      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
-  }
-
-  coef->mcu_ctr = 0;
-  coef->MCU_vert_offset = 0;
-}
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
-  coef->iMCU_row_num = 0;
-  start_iMCU_row(cinfo);
-
-  switch (pass_mode) {
-  case JBUF_PASS_THRU:
-    if (coef->whole_image[0] != NULL)
-      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    coef->pub.compress_data = compress_data;
-    break;
-#ifdef FULL_COEF_BUFFER_SUPPORTED
-  case JBUF_SAVE_AND_PASS:
-    if (coef->whole_image[0] == NULL)
-      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    coef->pub.compress_data = compress_first_pass;
-    break;
-  case JBUF_CRANK_DEST:
-    if (coef->whole_image[0] == NULL)
-      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    coef->pub.compress_data = compress_output;
-    break;
-#endif
-  default:
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    break;
-  }
-}
-
-
-/*
- * Process some data in the single-pass case.
- * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
- * per call, ie, v_samp_factor block rows for each component in the image.
- * Returns TRUE if the iMCU row is completed, FALSE if suspended.
- *
- * NB: input_buf contains a plane for each component in image,
- * which we index according to the component's SOF position.
- */
-
-METHODDEF(boolean)
-compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  JDIMENSION MCU_col_num;       /* index of current MCU within row */
-  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
-  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
-  int blkn, bi, ci, yindex, yoffset, blockcnt;
-  JDIMENSION ypos, xpos;
-  jpeg_component_info *compptr;
-
-  /* Loop to write as much as one whole iMCU row */
-  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
-       yoffset++) {
-    for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;
-         MCU_col_num++) {
-      /* Determine where data comes from in input_buf and do the DCT thing.
-       * Each call on forward_DCT processes a horizontal row of DCT blocks
-       * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks
-       * sequentially.  Dummy blocks at the right or bottom edge are filled in
-       * specially.  The data in them does not matter for image reconstruction,
-       * so we fill them with values that will encode to the smallest amount of
-       * data, viz: all zeroes in the AC entries, DC entries equal to previous
-       * block's DC value.  (Thanks to Thomas Kinsman for this idea.)
-       */
-      blkn = 0;
-      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-        compptr = cinfo->cur_comp_info[ci];
-        blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
-                                                : compptr->last_col_width;
-        xpos = MCU_col_num * compptr->MCU_sample_width;
-        ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */
-        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
-          if (coef->iMCU_row_num < last_iMCU_row ||
-              yoffset+yindex < compptr->last_row_height) {
-            (*cinfo->fdct->forward_DCT) (cinfo, compptr,
-                                         input_buf[compptr->component_index],
-                                         coef->MCU_buffer[blkn],
-                                         ypos, xpos, (JDIMENSION) blockcnt);
-            if (blockcnt < compptr->MCU_width) {
-              /* Create some dummy blocks at the right edge of the image. */
-              jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],
-                        (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
-              for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
-                coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
-              }
-            }
-          } else {
-            /* Create a row of dummy blocks at the bottom of the image. */
-            jzero_far((void FAR *) coef->MCU_buffer[blkn],
-                      compptr->MCU_width * SIZEOF(JBLOCK));
-            for (bi = 0; bi < compptr->MCU_width; bi++) {
-              coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
-            }
-          }
-          blkn += compptr->MCU_width;
-          ypos += DCTSIZE;
-        }
-      }
-      /* Try to write the MCU.  In event of a suspension failure, we will
-       * re-DCT the MCU on restart (a bit inefficient, could be fixed...)
-       */
-      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
-        /* Suspension forced; update state counters and exit */
-        coef->MCU_vert_offset = yoffset;
-        coef->mcu_ctr = MCU_col_num;
-        return FALSE;
-      }
-    }
-    /* Completed an MCU row, but perhaps not an iMCU row */
-    coef->mcu_ctr = 0;
-  }
-  /* Completed the iMCU row, advance counters for next one */
-  coef->iMCU_row_num++;
-  start_iMCU_row(cinfo);
-  return TRUE;
-}
-
-
-#ifdef FULL_COEF_BUFFER_SUPPORTED
-
-/*
- * Process some data in the first pass of a multi-pass case.
- * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
- * per call, ie, v_samp_factor block rows for each component in the image.
- * This amount of data is read from the source buffer, DCT'd and quantized,
- * and saved into the virtual arrays.  We also generate suitable dummy blocks
- * as needed at the right and lower edges.  (The dummy blocks are constructed
- * in the virtual arrays, which have been padded appropriately.)  This makes
- * it possible for subsequent passes not to worry about real vs. dummy blocks.
- *
- * We must also emit the data to the entropy encoder.  This is conveniently
- * done by calling compress_output() after we've loaded the current strip
- * of the virtual arrays.
- *
- * NB: input_buf contains a plane for each component in image.  All
- * components are DCT'd and loaded into the virtual arrays in this pass.
- * However, it may be that only a subset of the components are emitted to
- * the entropy encoder during this first pass; be careful about looking
- * at the scan-dependent variables (MCU dimensions, etc).
- */
-
-METHODDEF(boolean)
-compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
-  JDIMENSION blocks_across, MCUs_across, MCUindex;
-  int bi, ci, h_samp_factor, block_row, block_rows, ndummy;
-  JCOEF lastDC;
-  jpeg_component_info *compptr;
-  JBLOCKARRAY buffer;
-  JBLOCKROW thisblockrow, lastblockrow;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Align the virtual buffer for this component. */
-    buffer = (*cinfo->mem->access_virt_barray)
-      ((j_common_ptr) cinfo, coef->whole_image[ci],
-       coef->iMCU_row_num * compptr->v_samp_factor,
-       (JDIMENSION) compptr->v_samp_factor, TRUE);
-    /* Count non-dummy DCT block rows in this iMCU row. */
-    if (coef->iMCU_row_num < last_iMCU_row)
-      block_rows = compptr->v_samp_factor;
-    else {
-      /* NB: can't use last_row_height here, since may not be set! */
-      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
-      if (block_rows == 0) block_rows = compptr->v_samp_factor;
-    }
-    blocks_across = compptr->width_in_blocks;
-    h_samp_factor = compptr->h_samp_factor;
-    /* Count number of dummy blocks to be added at the right margin. */
-    ndummy = (int) (blocks_across % h_samp_factor);
-    if (ndummy > 0)
-      ndummy = h_samp_factor - ndummy;
-    /* Perform DCT for all non-dummy blocks in this iMCU row.  Each call
-     * on forward_DCT processes a complete horizontal row of DCT blocks.
-     */
-    for (block_row = 0; block_row < block_rows; block_row++) {
-      thisblockrow = buffer[block_row];
-      (*cinfo->fdct->forward_DCT) (cinfo, compptr,
-                                   input_buf[ci], thisblockrow,
-                                   (JDIMENSION) (block_row * DCTSIZE),
-                                   (JDIMENSION) 0, blocks_across);
-      if (ndummy > 0) {
-        /* Create dummy blocks at the right edge of the image. */
-        thisblockrow += blocks_across; /* => first dummy block */
-        jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
-        lastDC = thisblockrow[-1][0];
-        for (bi = 0; bi < ndummy; bi++) {
-          thisblockrow[bi][0] = lastDC;
-        }
-      }
-    }
-    /* If at end of image, create dummy block rows as needed.
-     * The tricky part here is that within each MCU, we want the DC values
-     * of the dummy blocks to match the last real block's DC value.
-     * This squeezes a few more bytes out of the resulting file...
-     */
-    if (coef->iMCU_row_num == last_iMCU_row) {
-      blocks_across += ndummy;  /* include lower right corner */
-      MCUs_across = blocks_across / h_samp_factor;
-      for (block_row = block_rows; block_row < compptr->v_samp_factor;
-           block_row++) {
-        thisblockrow = buffer[block_row];
-        lastblockrow = buffer[block_row-1];
-        jzero_far((void FAR *) thisblockrow,
-                  (size_t) (blocks_across * SIZEOF(JBLOCK)));
-        for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
-          lastDC = lastblockrow[h_samp_factor-1][0];
-          for (bi = 0; bi < h_samp_factor; bi++) {
-            thisblockrow[bi][0] = lastDC;
-          }
-          thisblockrow += h_samp_factor; /* advance to next MCU in row */
-          lastblockrow += h_samp_factor;
-        }
-      }
-    }
-  }
-  /* NB: compress_output will increment iMCU_row_num if successful.
-   * A suspension return will result in redoing all the work above next time.
-   */
-
-  /* Emit data to the entropy encoder, sharing code with subsequent passes */
-  return compress_output(cinfo, input_buf);
-}
-
-
-/*
- * Process some data in subsequent passes of a multi-pass case.
- * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
- * per call, ie, v_samp_factor block rows for each component in the scan.
- * The data is obtained from the virtual arrays and fed to the entropy coder.
- * Returns TRUE if the iMCU row is completed, FALSE if suspended.
- *
- * NB: input_buf is ignored; it is likely to be a NULL pointer.
- */
-
-METHODDEF(boolean)
-compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  JDIMENSION MCU_col_num;       /* index of current MCU within row */
-  int blkn, ci, xindex, yindex, yoffset;
-  JDIMENSION start_col;
-  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
-  JBLOCKROW buffer_ptr;
-  jpeg_component_info *compptr;
-
-  /* Align the virtual buffers for the components used in this scan.
-   * NB: during first pass, this is safe only because the buffers will
-   * already be aligned properly, so jmemmgr.c won't need to do any I/O.
-   */
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    buffer[ci] = (*cinfo->mem->access_virt_barray)
-      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
-       coef->iMCU_row_num * compptr->v_samp_factor,
-       (JDIMENSION) compptr->v_samp_factor, FALSE);
-  }
-
-  /* Loop to process one whole iMCU row */
-  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
-       yoffset++) {
-    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
-         MCU_col_num++) {
-      /* Construct list of pointers to DCT blocks belonging to this MCU */
-      blkn = 0;                 /* index of current DCT block within MCU */
-      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-        compptr = cinfo->cur_comp_info[ci];
-        start_col = MCU_col_num * compptr->MCU_width;
-        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
-          buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
-          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
-            coef->MCU_buffer[blkn++] = buffer_ptr++;
-          }
-        }
-      }
-      /* Try to write the MCU. */
-      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
-        /* Suspension forced; update state counters and exit */
-        coef->MCU_vert_offset = yoffset;
-        coef->mcu_ctr = MCU_col_num;
-        return FALSE;
-      }
-    }
-    /* Completed an MCU row, but perhaps not an iMCU row */
-    coef->mcu_ctr = 0;
-  }
-  /* Completed the iMCU row, advance counters for next one */
-  coef->iMCU_row_num++;
-  start_iMCU_row(cinfo);
-  return TRUE;
-}
-
-#endif /* FULL_COEF_BUFFER_SUPPORTED */
-
-
-/*
- * Initialize coefficient buffer controller.
- */
-
-GLOBAL(void)
-jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
-{
-  my_coef_ptr coef;
-
-  coef = (my_coef_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_coef_controller));
-  cinfo->coef = (struct jpeg_c_coef_controller *) coef;
-  coef->pub.start_pass = start_pass_coef;
-
-  /* Create the coefficient buffer. */
-  if (need_full_buffer) {
-#ifdef FULL_COEF_BUFFER_SUPPORTED
-    /* Allocate a full-image virtual array for each component, */
-    /* padded to a multiple of samp_factor DCT blocks in each direction. */
-    int ci;
-    jpeg_component_info *compptr;
-
-    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-         ci++, compptr++) {
-      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
-        ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
-         (JDIMENSION) jround_up((long) compptr->width_in_blocks,
-                                (long) compptr->h_samp_factor),
-         (JDIMENSION) jround_up((long) compptr->height_in_blocks,
-                                (long) compptr->v_samp_factor),
-         (JDIMENSION) compptr->v_samp_factor);
-    }
-#else
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-#endif
-  } else {
-    /* We only need a single-MCU buffer. */
-    JBLOCKROW buffer;
-    int i;
-
-    buffer = (JBLOCKROW)
-      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
-    for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
-      coef->MCU_buffer[i] = buffer + i;
-    }
-    coef->whole_image[0] = NULL; /* flag for no virtual arrays */
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jccolor.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,462 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jccolor.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains input colorspace conversion routines.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private subobject */
-
-typedef struct {
-  struct jpeg_color_converter pub; /* public fields */
-
-  /* Private state for RGB->YCC conversion */
-  INT32 * rgb_ycc_tab;          /* => table for RGB to YCbCr conversion */
-} my_color_converter;
-
-typedef my_color_converter * my_cconvert_ptr;
-
-
-/**************** RGB -> YCbCr conversion: most common case **************/
-
-/*
- * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
- * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
- * The conversion equations to be implemented are therefore
- *      Y  =  0.29900 * R + 0.58700 * G + 0.11400 * B
- *      Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B  + CENTERJSAMPLE
- *      Cr =  0.50000 * R - 0.41869 * G - 0.08131 * B  + CENTERJSAMPLE
- * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
- * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
- * rather than CENTERJSAMPLE, for Cb and Cr.  This gave equal positive and
- * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
- * were not represented exactly.  Now we sacrifice exact representation of
- * maximum red and maximum blue in order to get exact grayscales.
- *
- * To avoid floating-point arithmetic, we represent the fractional constants
- * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
- * the products by 2^16, with appropriate rounding, to get the correct answer.
- *
- * For even more speed, we avoid doing any multiplications in the inner loop
- * by precalculating the constants times R,G,B for all possible values.
- * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
- * for 12-bit samples it is still acceptable.  It's not very reasonable for
- * 16-bit samples, but if you want lossless storage you shouldn't be changing
- * colorspace anyway.
- * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
- * in the tables to save adding them separately in the inner loop.
- */
-
-#define SCALEBITS       16      /* speediest right-shift on some machines */
-#define CBCR_OFFSET     ((INT32) CENTERJSAMPLE << SCALEBITS)
-#define ONE_HALF        ((INT32) 1 << (SCALEBITS-1))
-#define FIX(x)          ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
-
-/* We allocate one big table and divide it up into eight parts, instead of
- * doing eight alloc_small requests.  This lets us use a single table base
- * address, which can be held in a register in the inner loops on many
- * machines (more than can hold all eight addresses, anyway).
- */
-
-#define R_Y_OFF         0                       /* offset to R => Y section */
-#define G_Y_OFF         (1*(MAXJSAMPLE+1))      /* offset to G => Y section */
-#define B_Y_OFF         (2*(MAXJSAMPLE+1))      /* etc. */
-#define R_CB_OFF        (3*(MAXJSAMPLE+1))
-#define G_CB_OFF        (4*(MAXJSAMPLE+1))
-#define B_CB_OFF        (5*(MAXJSAMPLE+1))
-#define R_CR_OFF        B_CB_OFF                /* B=>Cb, R=>Cr are the same */
-#define G_CR_OFF        (6*(MAXJSAMPLE+1))
-#define B_CR_OFF        (7*(MAXJSAMPLE+1))
-#define TABLE_SIZE      (8*(MAXJSAMPLE+1))
-
-
-/*
- * Initialize for RGB->YCC colorspace conversion.
- */
-
-METHODDEF(void)
-rgb_ycc_start (j_compress_ptr cinfo)
-{
-  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
-  INT32 * rgb_ycc_tab;
-  INT32 i;
-
-  /* Allocate and fill in the conversion tables. */
-  cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (TABLE_SIZE * SIZEOF(INT32)));
-
-  for (i = 0; i <= MAXJSAMPLE; i++) {
-    rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
-    rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
-    rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i     + ONE_HALF;
-    rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
-    rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
-    /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
-     * This ensures that the maximum output will round to MAXJSAMPLE
-     * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
-     */
-    rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;
-/*  B=>Cb and R=>Cr tables are the same
-    rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;
-*/
-    rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
-    rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
-  }
-}
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- *
- * Note that we change from the application's interleaved-pixel format
- * to our internal noninterleaved, one-plane-per-component format.
- * The input buffer is therefore three times as wide as the output buffer.
- *
- * A starting row offset is provided only for the output buffer.  The caller
- * can easily adjust the passed input_buf value to accommodate any row
- * offset required on that side.
- */
-
-METHODDEF(void)
-rgb_ycc_convert (j_compress_ptr cinfo,
-                 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
-                 JDIMENSION output_row, int num_rows)
-{
-  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
-  register int r, g, b;
-  register INT32 * ctab = cconvert->rgb_ycc_tab;
-  register JSAMPROW inptr;
-  register JSAMPROW outptr0, outptr1, outptr2;
-  register JDIMENSION col;
-  JDIMENSION num_cols = cinfo->image_width;
-
-  while (--num_rows >= 0) {
-    inptr = *input_buf++;
-    outptr0 = output_buf[0][output_row];
-    outptr1 = output_buf[1][output_row];
-    outptr2 = output_buf[2][output_row];
-    output_row++;
-    for (col = 0; col < num_cols; col++) {
-      r = GETJSAMPLE(inptr[RGB_RED]);
-      g = GETJSAMPLE(inptr[RGB_GREEN]);
-      b = GETJSAMPLE(inptr[RGB_BLUE]);
-      inptr += RGB_PIXELSIZE;
-      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
-       * must be too; we do not need an explicit range-limiting operation.
-       * Hence the value being shifted is never negative, and we don't
-       * need the general RIGHT_SHIFT macro.
-       */
-      /* Y */
-      outptr0[col] = (JSAMPLE)
-                ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
-                 >> SCALEBITS);
-      /* Cb */
-      outptr1[col] = (JSAMPLE)
-                ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
-                 >> SCALEBITS);
-      /* Cr */
-      outptr2[col] = (JSAMPLE)
-                ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
-                 >> SCALEBITS);
-    }
-  }
-}
-
-
-/**************** Cases other than RGB -> YCbCr **************/
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- * This version handles RGB->grayscale conversion, which is the same
- * as the RGB->Y portion of RGB->YCbCr.
- * We assume rgb_ycc_start has been called (we only use the Y tables).
- */
-
-METHODDEF(void)
-rgb_gray_convert (j_compress_ptr cinfo,
-                  JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
-                  JDIMENSION output_row, int num_rows)
-{
-  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
-  register int r, g, b;
-  register INT32 * ctab = cconvert->rgb_ycc_tab;
-  register JSAMPROW inptr;
-  register JSAMPROW outptr;
-  register JDIMENSION col;
-  JDIMENSION num_cols = cinfo->image_width;
-
-  while (--num_rows >= 0) {
-    inptr = *input_buf++;
-    outptr = output_buf[0][output_row];
-    output_row++;
-    for (col = 0; col < num_cols; col++) {
-      r = GETJSAMPLE(inptr[RGB_RED]);
-      g = GETJSAMPLE(inptr[RGB_GREEN]);
-      b = GETJSAMPLE(inptr[RGB_BLUE]);
-      inptr += RGB_PIXELSIZE;
-      /* Y */
-      outptr[col] = (JSAMPLE)
-                ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
-                 >> SCALEBITS);
-    }
-  }
-}
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- * This version handles Adobe-style CMYK->YCCK conversion,
- * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
- * conversion as above, while passing K (black) unchanged.
- * We assume rgb_ycc_start has been called.
- */
-
-METHODDEF(void)
-cmyk_ycck_convert (j_compress_ptr cinfo,
-                   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
-                   JDIMENSION output_row, int num_rows)
-{
-  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
-  register int r, g, b;
-  register INT32 * ctab = cconvert->rgb_ycc_tab;
-  register JSAMPROW inptr;
-  register JSAMPROW outptr0, outptr1, outptr2, outptr3;
-  register JDIMENSION col;
-  JDIMENSION num_cols = cinfo->image_width;
-
-  while (--num_rows >= 0) {
-    inptr = *input_buf++;
-    outptr0 = output_buf[0][output_row];
-    outptr1 = output_buf[1][output_row];
-    outptr2 = output_buf[2][output_row];
-    outptr3 = output_buf[3][output_row];
-    output_row++;
-    for (col = 0; col < num_cols; col++) {
-      r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
-      g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
-      b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
-      /* K passes through as-is */
-      outptr3[col] = inptr[3];  /* don't need GETJSAMPLE here */
-      inptr += 4;
-      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
-       * must be too; we do not need an explicit range-limiting operation.
-       * Hence the value being shifted is never negative, and we don't
-       * need the general RIGHT_SHIFT macro.
-       */
-      /* Y */
-      outptr0[col] = (JSAMPLE)
-                ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
-                 >> SCALEBITS);
-      /* Cb */
-      outptr1[col] = (JSAMPLE)
-                ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
-                 >> SCALEBITS);
-      /* Cr */
-      outptr2[col] = (JSAMPLE)
-                ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
-                 >> SCALEBITS);
-    }
-  }
-}
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- * This version handles grayscale output with no conversion.
- * The source can be either plain grayscale or YCbCr (since Y == gray).
- */
-
-METHODDEF(void)
-grayscale_convert (j_compress_ptr cinfo,
-                   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
-                   JDIMENSION output_row, int num_rows)
-{
-  register JSAMPROW inptr;
-  register JSAMPROW outptr;
-  register JDIMENSION col;
-  JDIMENSION num_cols = cinfo->image_width;
-  int instride = cinfo->input_components;
-
-  while (--num_rows >= 0) {
-    inptr = *input_buf++;
-    outptr = output_buf[0][output_row];
-    output_row++;
-    for (col = 0; col < num_cols; col++) {
-      outptr[col] = inptr[0];   /* don't need GETJSAMPLE() here */
-      inptr += instride;
-    }
-  }
-}
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- * This version handles multi-component colorspaces without conversion.
- * We assume input_components == num_components.
- */
-
-METHODDEF(void)
-null_convert (j_compress_ptr cinfo,
-              JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
-              JDIMENSION output_row, int num_rows)
-{
-  register JSAMPROW inptr;
-  register JSAMPROW outptr;
-  register JDIMENSION col;
-  register int ci;
-  int nc = cinfo->num_components;
-  JDIMENSION num_cols = cinfo->image_width;
-
-  while (--num_rows >= 0) {
-    /* It seems fastest to make a separate pass for each component. */
-    for (ci = 0; ci < nc; ci++) {
-      inptr = *input_buf;
-      outptr = output_buf[ci][output_row];
-      for (col = 0; col < num_cols; col++) {
-        outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
-        inptr += nc;
-      }
-    }
-    input_buf++;
-    output_row++;
-  }
-}
-
-
-/*
- * Empty method for start_pass.
- */
-
-METHODDEF(void)
-null_method (j_compress_ptr cinfo)
-{
-  /* no work needed */
-}
-
-
-/*
- * Module initialization routine for input colorspace conversion.
- */
-
-GLOBAL(void)
-jinit_color_converter (j_compress_ptr cinfo)
-{
-  my_cconvert_ptr cconvert;
-
-  cconvert = (my_cconvert_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_color_converter));
-  cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
-  /* set start_pass to null method until we find out differently */
-  cconvert->pub.start_pass = null_method;
-
-  /* Make sure input_components agrees with in_color_space */
-  switch (cinfo->in_color_space) {
-  case JCS_GRAYSCALE:
-    if (cinfo->input_components != 1)
-      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
-    break;
-
-  case JCS_RGB:
-#if RGB_PIXELSIZE != 3
-    if (cinfo->input_components != RGB_PIXELSIZE)
-      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
-    break;
-#endif /* else share code with YCbCr */
-
-  case JCS_YCbCr:
-    if (cinfo->input_components != 3)
-      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
-    break;
-
-  case JCS_CMYK:
-  case JCS_YCCK:
-    if (cinfo->input_components != 4)
-      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
-    break;
-
-  default:                      /* JCS_UNKNOWN can be anything */
-    if (cinfo->input_components < 1)
-      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
-    break;
-  }
-
-  /* Check num_components, set conversion method based on requested space */
-  switch (cinfo->jpeg_color_space) {
-  case JCS_GRAYSCALE:
-    if (cinfo->num_components != 1)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    if (cinfo->in_color_space == JCS_GRAYSCALE)
-      cconvert->pub.color_convert = grayscale_convert;
-    else if (cinfo->in_color_space == JCS_RGB) {
-      cconvert->pub.start_pass = rgb_ycc_start;
-      cconvert->pub.color_convert = rgb_gray_convert;
-    } else if (cinfo->in_color_space == JCS_YCbCr)
-      cconvert->pub.color_convert = grayscale_convert;
-    else
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-
-  case JCS_RGB:
-    if (cinfo->num_components != 3)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
-      cconvert->pub.color_convert = null_convert;
-    else
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-
-  case JCS_YCbCr:
-    if (cinfo->num_components != 3)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    if (cinfo->in_color_space == JCS_RGB) {
-      cconvert->pub.start_pass = rgb_ycc_start;
-      cconvert->pub.color_convert = rgb_ycc_convert;
-    } else if (cinfo->in_color_space == JCS_YCbCr)
-      cconvert->pub.color_convert = null_convert;
-    else
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-
-  case JCS_CMYK:
-    if (cinfo->num_components != 4)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    if (cinfo->in_color_space == JCS_CMYK)
-      cconvert->pub.color_convert = null_convert;
-    else
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-
-  case JCS_YCCK:
-    if (cinfo->num_components != 4)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    if (cinfo->in_color_space == JCS_CMYK) {
-      cconvert->pub.start_pass = rgb_ycc_start;
-      cconvert->pub.color_convert = cmyk_ycck_convert;
-    } else if (cinfo->in_color_space == JCS_YCCK)
-      cconvert->pub.color_convert = null_convert;
-    else
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-
-  default:                      /* allow null conversion of JCS_UNKNOWN */
-    if (cinfo->jpeg_color_space != cinfo->in_color_space ||
-        cinfo->num_components != cinfo->input_components)
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    cconvert->pub.color_convert = null_convert;
-    break;
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jcdctmgr.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,391 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcdctmgr.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the forward-DCT management logic.
- * This code selects a particular DCT implementation to be used,
- * and it performs related housekeeping chores including coefficient
- * quantization.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-
-/* Private subobject for this module */
-
-typedef struct {
-  struct jpeg_forward_dct pub;  /* public fields */
-
-  /* Pointer to the DCT routine actually in use */
-  forward_DCT_method_ptr do_dct;
-
-  /* The actual post-DCT divisors --- not identical to the quant table
-   * entries, because of scaling (especially for an unnormalized DCT).
-   * Each table is given in normal array order.
-   */
-  DCTELEM * divisors[NUM_QUANT_TBLS];
-
-#ifdef DCT_FLOAT_SUPPORTED
-  /* Same as above for the floating-point case. */
-  float_DCT_method_ptr do_float_dct;
-  FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
-#endif
-} my_fdct_controller;
-
-typedef my_fdct_controller * my_fdct_ptr;
-
-
-/*
- * Initialize for a processing pass.
- * Verify that all referenced Q-tables are present, and set up
- * the divisor table for each one.
- * In the current implementation, DCT of all components is done during
- * the first pass, even if only some components will be output in the
- * first scan.  Hence all components should be examined here.
- */
-
-METHODDEF(void)
-start_pass_fdctmgr (j_compress_ptr cinfo)
-{
-  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
-  int ci, qtblno, i;
-  jpeg_component_info *compptr;
-  JQUANT_TBL * qtbl;
-  DCTELEM * dtbl;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    qtblno = compptr->quant_tbl_no;
-    /* Make sure specified quantization table is present */
-    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
-        cinfo->quant_tbl_ptrs[qtblno] == NULL)
-      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
-    qtbl = cinfo->quant_tbl_ptrs[qtblno];
-    /* Compute divisors for this quant table */
-    /* We may do this more than once for same table, but it's not a big deal */
-    switch (cinfo->dct_method) {
-#ifdef DCT_ISLOW_SUPPORTED
-    case JDCT_ISLOW:
-      /* For LL&M IDCT method, divisors are equal to raw quantization
-       * coefficients multiplied by 8 (to counteract scaling).
-       */
-      if (fdct->divisors[qtblno] == NULL) {
-        fdct->divisors[qtblno] = (DCTELEM *)
-          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                      DCTSIZE2 * SIZEOF(DCTELEM));
-      }
-      dtbl = fdct->divisors[qtblno];
-      for (i = 0; i < DCTSIZE2; i++) {
-        dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
-      }
-      break;
-#endif
-#ifdef DCT_IFAST_SUPPORTED
-    case JDCT_IFAST:
-      {
-        /* For AA&N IDCT method, divisors are equal to quantization
-         * coefficients scaled by scalefactor[row]*scalefactor[col], where
-         *   scalefactor[0] = 1
-         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
-         * We apply a further scale factor of 8.
-         */
-#define CONST_BITS 14
-        static const INT16 aanscales[DCTSIZE2] = {
-          /* precomputed values scaled up by 14 bits */
-          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
-          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
-          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
-          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
-          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
-          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
-           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
-           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
-        };
-        SHIFT_TEMPS
-
-        if (fdct->divisors[qtblno] == NULL) {
-          fdct->divisors[qtblno] = (DCTELEM *)
-            (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                        DCTSIZE2 * SIZEOF(DCTELEM));
-        }
-        dtbl = fdct->divisors[qtblno];
-        for (i = 0; i < DCTSIZE2; i++) {
-          dtbl[i] = (DCTELEM)
-            DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
-                                  (INT32) aanscales[i]),
-                    CONST_BITS-3);
-        }
-      }
-      break;
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
-    case JDCT_FLOAT:
-      {
-        /* For float AA&N IDCT method, divisors are equal to quantization
-         * coefficients scaled by scalefactor[row]*scalefactor[col], where
-         *   scalefactor[0] = 1
-         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
-         * We apply a further scale factor of 8.
-         * What's actually stored is 1/divisor so that the inner loop can
-         * use a multiplication rather than a division.
-         */
-        FAST_FLOAT * fdtbl;
-        int row, col;
-        static const double aanscalefactor[DCTSIZE] = {
-          1.0, 1.387039845, 1.306562965, 1.175875602,
-          1.0, 0.785694958, 0.541196100, 0.275899379
-        };
-
-        if (fdct->float_divisors[qtblno] == NULL) {
-          fdct->float_divisors[qtblno] = (FAST_FLOAT *)
-            (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                        DCTSIZE2 * SIZEOF(FAST_FLOAT));
-        }
-        fdtbl = fdct->float_divisors[qtblno];
-        i = 0;
-        for (row = 0; row < DCTSIZE; row++) {
-          for (col = 0; col < DCTSIZE; col++) {
-            fdtbl[i] = (FAST_FLOAT)
-              (1.0 / (((double) qtbl->quantval[i] *
-                       aanscalefactor[row] * aanscalefactor[col] * 8.0)));
-            i++;
-          }
-        }
-      }
-      break;
-#endif
-    default:
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-      break;
-    }
-  }
-}
-
-
-/*
- * Perform forward DCT on one or more blocks of a component.
- *
- * The input samples are taken from the sample_data[] array starting at
- * position start_row/start_col, and moving to the right for any additional
- * blocks. The quantized coefficients are returned in coef_blocks[].
- */
-
-METHODDEF(void)
-forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
-             JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
-             JDIMENSION start_row, JDIMENSION start_col,
-             JDIMENSION num_blocks)
-/* This version is used for integer DCT implementations. */
-{
-  /* This routine is heavily used, so it's worth coding it tightly. */
-  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
-  forward_DCT_method_ptr do_dct = fdct->do_dct;
-  DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
-  DCTELEM workspace[DCTSIZE2];  /* work area for FDCT subroutine */
-  JDIMENSION bi;
-
-  sample_data += start_row;     /* fold in the vertical offset once */
-
-  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
-    /* Load data into workspace, applying unsigned->signed conversion */
-    { register DCTELEM *workspaceptr;
-      register JSAMPROW elemptr;
-      register int elemr;
-
-      workspaceptr = workspace;
-      for (elemr = 0; elemr < DCTSIZE; elemr++) {
-        elemptr = sample_data[elemr] + start_col;
-#if DCTSIZE == 8                /* unroll the inner loop */
-        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-#else
-        { register int elemc;
-          for (elemc = DCTSIZE; elemc > 0; elemc--) {
-            *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-          }
-        }
-#endif
-      }
-    }
-
-    /* Perform the DCT */
-    (*do_dct) (workspace);
-
-    /* Quantize/descale the coefficients, and store into coef_blocks[] */
-    { register DCTELEM temp, qval;
-      register int i;
-      register JCOEFPTR output_ptr = coef_blocks[bi];
-
-      for (i = 0; i < DCTSIZE2; i++) {
-        qval = divisors[i];
-        temp = workspace[i];
-        /* Divide the coefficient value by qval, ensuring proper rounding.
-         * Since C does not specify the direction of rounding for negative
-         * quotients, we have to force the dividend positive for portability.
-         *
-         * In most files, at least half of the output values will be zero
-         * (at default quantization settings, more like three-quarters...)
-         * so we should ensure that this case is fast.  On many machines,
-         * a comparison is enough cheaper than a divide to make a special test
-         * a win.  Since both inputs will be nonnegative, we need only test
-         * for a < b to discover whether a/b is 0.
-         * If your machine's division is fast enough, define FAST_DIVIDE.
-         */
-#ifdef FAST_DIVIDE
-#define DIVIDE_BY(a,b)  a /= b
-#else
-#define DIVIDE_BY(a,b)  if (a >= b) a /= b; else a = 0
-#endif
-        if (temp < 0) {
-          temp = -temp;
-          temp += qval>>1;      /* for rounding */
-          DIVIDE_BY(temp, qval);
-          temp = -temp;
-        } else {
-          temp += qval>>1;      /* for rounding */
-          DIVIDE_BY(temp, qval);
-        }
-        output_ptr[i] = (JCOEF) temp;
-      }
-    }
-  }
-}
-
-
-#ifdef DCT_FLOAT_SUPPORTED
-
-METHODDEF(void)
-forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
-                   JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
-                   JDIMENSION start_row, JDIMENSION start_col,
-                   JDIMENSION num_blocks)
-/* This version is used for floating-point DCT implementations. */
-{
-  /* This routine is heavily used, so it's worth coding it tightly. */
-  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
-  float_DCT_method_ptr do_dct = fdct->do_float_dct;
-  FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
-  FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
-  JDIMENSION bi;
-
-  sample_data += start_row;     /* fold in the vertical offset once */
-
-  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
-    /* Load data into workspace, applying unsigned->signed conversion */
-    { register FAST_FLOAT *workspaceptr;
-      register JSAMPROW elemptr;
-      register int elemr;
-
-      workspaceptr = workspace;
-      for (elemr = 0; elemr < DCTSIZE; elemr++) {
-        elemptr = sample_data[elemr] + start_col;
-#if DCTSIZE == 8                /* unroll the inner loop */
-        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-#else
-        { register int elemc;
-          for (elemc = DCTSIZE; elemc > 0; elemc--) {
-            *workspaceptr++ = (FAST_FLOAT)
-              (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-          }
-        }
-#endif
-      }
-    }
-
-    /* Perform the DCT */
-    (*do_dct) (workspace);
-
-    /* Quantize/descale the coefficients, and store into coef_blocks[] */
-    { register FAST_FLOAT temp;
-      register int i;
-      register JCOEFPTR output_ptr = coef_blocks[bi];
-
-      for (i = 0; i < DCTSIZE2; i++) {
-        /* Apply the quantization and scaling factor */
-        temp = workspace[i] * divisors[i];
-        /* Round to nearest integer.
-         * Since C does not specify the direction of rounding for negative
-         * quotients, we have to force the dividend positive for portability.
-         * The maximum coefficient size is +-16K (for 12-bit data), so this
-         * code should work for either 16-bit or 32-bit ints.
-         */
-        output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);
-      }
-    }
-  }
-}
-
-#endif /* DCT_FLOAT_SUPPORTED */
-
-
-/*
- * Initialize FDCT manager.
- */
-
-GLOBAL(void)
-jinit_forward_dct (j_compress_ptr cinfo)
-{
-  my_fdct_ptr fdct;
-  int i;
-
-  fdct = (my_fdct_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_fdct_controller));
-  cinfo->fdct = (struct jpeg_forward_dct *) fdct;
-  fdct->pub.start_pass = start_pass_fdctmgr;
-
-  switch (cinfo->dct_method) {
-#ifdef DCT_ISLOW_SUPPORTED
-  case JDCT_ISLOW:
-    fdct->pub.forward_DCT = forward_DCT;
-    fdct->do_dct = jpeg_fdct_islow;
-    break;
-#endif
-#ifdef DCT_IFAST_SUPPORTED
-  case JDCT_IFAST:
-    fdct->pub.forward_DCT = forward_DCT;
-    fdct->do_dct = jpeg_fdct_ifast;
-    break;
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
-  case JDCT_FLOAT:
-    fdct->pub.forward_DCT = forward_DCT_float;
-    fdct->do_float_dct = jpeg_fdct_float;
-    break;
-#endif
-  default:
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-    break;
-  }
-
-  /* Mark divisor tables unallocated */
-  for (i = 0; i < NUM_QUANT_TBLS; i++) {
-    fdct->divisors[i] = NULL;
-#ifdef DCT_FLOAT_SUPPORTED
-    fdct->float_divisors[i] = NULL;
-#endif
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jchuff.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,913 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jchuff.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains Huffman entropy encoding routines.
- *
- * Much of the complexity here has to do with supporting output suspension.
- * If the data destination module demands suspension, we want to be able to
- * back up to the start of the current MCU.  To do this, we copy state
- * variables into local working storage, and update them back to the
- * permanent JPEG objects only upon successful completion of an MCU.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jchuff.h"             /* Declarations shared with jcphuff.c */
-
-
-/* Expanded entropy encoder object for Huffman encoding.
- *
- * The savable_state subrecord contains fields that change within an MCU,
- * but must not be updated permanently until we complete the MCU.
- */
-
-typedef struct {
-  INT32 put_buffer;             /* current bit-accumulation buffer */
-  int put_bits;                 /* # of bits now in it */
-  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-} savable_state;
-
-/* This macro is to work around compilers with missing or broken
- * structure assignment.  You'll need to fix this code if you have
- * such a compiler and you change MAX_COMPS_IN_SCAN.
- */
-
-#ifndef NO_STRUCT_ASSIGN
-#define ASSIGN_STATE(dest,src)  ((dest) = (src))
-#else
-#if MAX_COMPS_IN_SCAN == 4
-#define ASSIGN_STATE(dest,src)  \
-        ((dest).put_buffer = (src).put_buffer, \
-         (dest).put_bits = (src).put_bits, \
-         (dest).last_dc_val[0] = (src).last_dc_val[0], \
-         (dest).last_dc_val[1] = (src).last_dc_val[1], \
-         (dest).last_dc_val[2] = (src).last_dc_val[2], \
-         (dest).last_dc_val[3] = (src).last_dc_val[3])
-#endif
-#endif
-
-
-typedef struct {
-  struct jpeg_entropy_encoder pub; /* public fields */
-
-  savable_state saved;          /* Bit buffer & DC state at start of MCU */
-
-  /* These fields are NOT loaded into local working state. */
-  unsigned int restarts_to_go;  /* MCUs left in this restart interval */
-  int next_restart_num;         /* next restart number to write (0-7) */
-
-  /* Pointers to derived tables (these workspaces have image lifespan) */
-  c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
-  c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
-
-#ifdef ENTROPY_OPT_SUPPORTED    /* Statistics tables for optimization */
-  long * dc_count_ptrs[NUM_HUFF_TBLS];
-  long * ac_count_ptrs[NUM_HUFF_TBLS];
-#endif
-} huff_entropy_encoder;
-
-typedef huff_entropy_encoder * huff_entropy_ptr;
-
-/* Working state while writing an MCU.
- * This struct contains all the fields that are needed by subroutines.
- */
-
-typedef struct {
-  JOCTET * next_output_byte;    /* => next byte to write in buffer */
-  size_t free_in_buffer;        /* # of byte spaces remaining in buffer */
-  savable_state cur;            /* Current bit buffer & DC state */
-  j_compress_ptr cinfo;         /* dump_buffer needs access to this */
-} working_state;
-
-
-/* Forward declarations */
-METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,
-                                        JBLOCKROW *MCU_data));
-METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));
-#ifdef ENTROPY_OPT_SUPPORTED
-METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,
-                                          JBLOCKROW *MCU_data));
-METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));
-#endif
-
-
-/*
- * Initialize for a Huffman-compressed scan.
- * If gather_statistics is TRUE, we do not output anything during the scan,
- * just count the Huffman symbols used and generate Huffman code tables.
- */
-
-METHODDEF(void)
-start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
-{
-  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
-  int ci, dctbl, actbl;
-  jpeg_component_info * compptr;
-
-  if (gather_statistics) {
-#ifdef ENTROPY_OPT_SUPPORTED
-    entropy->pub.encode_mcu = encode_mcu_gather;
-    entropy->pub.finish_pass = finish_pass_gather;
-#else
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-  } else {
-    entropy->pub.encode_mcu = encode_mcu_huff;
-    entropy->pub.finish_pass = finish_pass_huff;
-  }
-
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    dctbl = compptr->dc_tbl_no;
-    actbl = compptr->ac_tbl_no;
-    if (gather_statistics) {
-#ifdef ENTROPY_OPT_SUPPORTED
-      /* Check for invalid table indexes */
-      /* (make_c_derived_tbl does this in the other path) */
-      if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)
-        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);
-      if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
-        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
-      /* Allocate and zero the statistics tables */
-      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
-      if (entropy->dc_count_ptrs[dctbl] == NULL)
-        entropy->dc_count_ptrs[dctbl] = (long *)
-          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                      257 * SIZEOF(long));
-      MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));
-      if (entropy->ac_count_ptrs[actbl] == NULL)
-        entropy->ac_count_ptrs[actbl] = (long *)
-          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                      257 * SIZEOF(long));
-      MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));
-#endif
-    } else {
-      /* Compute derived values for Huffman tables */
-      /* We may do this more than once for a table, but it's not expensive */
-      jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,
-                              & entropy->dc_derived_tbls[dctbl]);
-      jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
-                              & entropy->ac_derived_tbls[actbl]);
-    }
-    /* Initialize DC predictions to 0 */
-    entropy->saved.last_dc_val[ci] = 0;
-  }
-
-  /* Initialize bit buffer to empty */
-  entropy->saved.put_buffer = 0;
-  entropy->saved.put_bits = 0;
-
-  /* Initialize restart stuff */
-  entropy->restarts_to_go = cinfo->restart_interval;
-  entropy->next_restart_num = 0;
-}
-
-
-/*
- * Compute the derived values for a Huffman table.
- * This routine also performs some validation checks on the table.
- *
- * Note this is also used by jcphuff.c.
- */
-
-GLOBAL(void)
-jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
-                         c_derived_tbl ** pdtbl)
-{
-  JHUFF_TBL *htbl;
-  c_derived_tbl *dtbl;
-  int p, i, l, lastp, si, maxsymbol;
-  char huffsize[257];
-  unsigned int huffcode[257];
-  unsigned int code;
-
-  /* Note that huffsize[] and huffcode[] are filled in code-length order,
-   * paralleling the order of the symbols themselves in htbl->huffval[].
-   */
-
-  /* Find the input Huffman table */
-  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
-    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
-  htbl =
-    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
-  if (htbl == NULL)
-    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
-
-  /* Allocate a workspace if we haven't already done so. */
-  if (*pdtbl == NULL)
-    *pdtbl = (c_derived_tbl *)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  SIZEOF(c_derived_tbl));
-  dtbl = *pdtbl;
-
-  /* Figure C.1: make table of Huffman code length for each symbol */
-
-  p = 0;
-  for (l = 1; l <= 16; l++) {
-    i = (int) htbl->bits[l];
-    if (i < 0 || p + i > 256)   /* protect against table overrun */
-      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-    while (i--)
-      huffsize[p++] = (char) l;
-  }
-  huffsize[p] = 0;
-  lastp = p;
-
-  /* Figure C.2: generate the codes themselves */
-  /* We also validate that the counts represent a legal Huffman code tree. */
-
-  code = 0;
-  si = huffsize[0];
-  p = 0;
-  while (huffsize[p]) {
-    while (((int) huffsize[p]) == si) {
-      huffcode[p++] = code;
-      code++;
-    }
-    /* code is now 1 more than the last code used for codelength si; but
-     * it must still fit in si bits, since no code is allowed to be all ones.
-     */
-    if (((INT32) code) >= (((INT32) 1) << si))
-      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-    code <<= 1;
-    si++;
-  }
-
-  /* Figure C.3: generate encoding tables */
-  /* These are code and size indexed by symbol value */
-
-  /* Set all codeless symbols to have code length 0;
-   * this lets us detect duplicate VAL entries here, and later
-   * allows emit_bits to detect any attempt to emit such symbols.
-   */
-  MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));
-
-  /* This is also a convenient place to check for out-of-range
-   * and duplicated VAL entries.  We allow 0..255 for AC symbols
-   * but only 0..15 for DC.  (We could constrain them further
-   * based on data depth and mode, but this seems enough.)
-   */
-  maxsymbol = isDC ? 15 : 255;
-
-  for (p = 0; p < lastp; p++) {
-    i = htbl->huffval[p];
-    if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])
-      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-    dtbl->ehufco[i] = huffcode[p];
-    dtbl->ehufsi[i] = huffsize[p];
-  }
-}
-
-
-/* Outputting bytes to the file */
-
-/* Emit a byte, taking 'action' if must suspend. */
-#define emit_byte(state,val,action)  \
-        { *(state)->next_output_byte++ = (JOCTET) (val);  \
-          if (--(state)->free_in_buffer == 0)  \
-            if (! dump_buffer(state))  \
-              { action; } }
-
-
-LOCAL(boolean)
-dump_buffer (working_state * state)
-/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */
-{
-  struct jpeg_destination_mgr * dest = state->cinfo->dest;
-
-  if (! (*dest->empty_output_buffer) (state->cinfo))
-    return FALSE;
-  /* After a successful buffer dump, must reset buffer pointers */
-  state->next_output_byte = dest->next_output_byte;
-  state->free_in_buffer = dest->free_in_buffer;
-  return TRUE;
-}
-
-
-/* Outputting bits to the file */
-
-/* Only the right 24 bits of put_buffer are used; the valid bits are
- * left-justified in this part.  At most 16 bits can be passed to emit_bits
- * in one call, and we never retain more than 7 bits in put_buffer
- * between calls, so 24 bits are sufficient.
- */
-
-INLINE
-LOCAL(boolean)
-emit_bits (working_state * state, unsigned int code, int size)
-/* Emit some bits; return TRUE if successful, FALSE if must suspend */
-{
-  /* This routine is heavily used, so it's worth coding tightly. */
-  register INT32 put_buffer = (INT32) code;
-  register int put_bits = state->cur.put_bits;
-
-  /* if size is 0, caller used an invalid Huffman table entry */
-  if (size == 0)
-    ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
-
-  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
-
-  put_bits += size;             /* new number of bits in buffer */
-
-  put_buffer <<= 24 - put_bits; /* align incoming bits */
-
-  put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
-
-  while (put_bits >= 8) {
-    int c = (int) ((put_buffer >> 16) & 0xFF);
-
-    emit_byte(state, c, return FALSE);
-    if (c == 0xFF) {            /* need to stuff a zero byte? */
-      emit_byte(state, 0, return FALSE);
-    }
-    put_buffer <<= 8;
-    put_bits -= 8;
-  }
-
-  state->cur.put_buffer = put_buffer; /* update state variables */
-  state->cur.put_bits = put_bits;
-
-  return TRUE;
-}
-
-
-LOCAL(boolean)
-flush_bits (working_state * state)
-{
-  if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */
-    return FALSE;
-  state->cur.put_buffer = 0;    /* and reset bit-buffer to empty */
-  state->cur.put_bits = 0;
-  return TRUE;
-}
-
-
-/* Encode a single block's worth of coefficients */
-
-LOCAL(boolean)
-encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
-                  c_derived_tbl *dctbl, c_derived_tbl *actbl)
-{
-  register int temp, temp2;
-  register int nbits;
-  register int k, r, i;
-
-  /* Encode the DC coefficient difference per section F.1.2.1 */
-
-  temp = temp2 = block[0] - last_dc_val;
-
-  if (temp < 0) {
-    temp = -temp;               /* temp is abs value of input */
-    /* For a negative input, want temp2 = bitwise complement of abs(input) */
-    /* This code assumes we are on a two's complement machine */
-    temp2--;
-  }
-
-  /* Find the number of bits needed for the magnitude of the coefficient */
-  nbits = 0;
-  while (temp) {
-    nbits++;
-    temp >>= 1;
-  }
-  /* Check for out-of-range coefficient values.
-   * Since we're encoding a difference, the range limit is twice as much.
-   */
-  if (nbits > MAX_COEF_BITS+1)
-    ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
-
-  /* Emit the Huffman-coded symbol for the number of bits */
-  if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))
-    return FALSE;
-
-  /* Emit that number of bits of the value, if positive, */
-  /* or the complement of its magnitude, if negative. */
-  if (nbits)                    /* emit_bits rejects calls with size 0 */
-    if (! emit_bits(state, (unsigned int) temp2, nbits))
-      return FALSE;
-
-  /* Encode the AC coefficients per section F.1.2.2 */
-
-  r = 0;                        /* r = run length of zeros */
-
-  for (k = 1; k < DCTSIZE2; k++) {
-    if ((temp = block[jpeg_natural_order[k]]) == 0) {
-      r++;
-    } else {
-      /* if run length > 15, must emit special run-length-16 codes (0xF0) */
-      while (r > 15) {
-        if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))
-          return FALSE;
-        r -= 16;
-      }
-
-      temp2 = temp;
-      if (temp < 0) {
-        temp = -temp;           /* temp is abs value of input */
-        /* This code assumes we are on a two's complement machine */
-        temp2--;
-      }
-
-      /* Find the number of bits needed for the magnitude of the coefficient */
-      nbits = 1;                /* there must be at least one 1 bit */
-      while ((temp >>= 1))
-        nbits++;
-      /* Check for out-of-range coefficient values */
-      if (nbits > MAX_COEF_BITS)
-        ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
-
-      /* Emit Huffman symbol for run length / number of bits */
-      i = (r << 4) + nbits;
-      if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))
-        return FALSE;
-
-      /* Emit that number of bits of the value, if positive, */
-      /* or the complement of its magnitude, if negative. */
-      if (! emit_bits(state, (unsigned int) temp2, nbits))
-        return FALSE;
-
-      r = 0;
-    }
-  }
-
-  /* If the last coef(s) were zero, emit an end-of-block code */
-  if (r > 0)
-    if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))
-      return FALSE;
-
-  return TRUE;
-}
-
-
-/*
- * Emit a restart marker & resynchronize predictions.
- */
-
-LOCAL(boolean)
-emit_restart (working_state * state, int restart_num)
-{
-  int ci;
-
-  if (! flush_bits(state))
-    return FALSE;
-
-  emit_byte(state, 0xFF, return FALSE);
-  emit_byte(state, JPEG_RST0 + restart_num, return FALSE);
-
-  /* Re-initialize DC predictions to 0 */
-  for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)
-    state->cur.last_dc_val[ci] = 0;
-
-  /* The restart counter is not updated until we successfully write the MCU. */
-
-  return TRUE;
-}
-
-
-/*
- * Encode and output one MCU's worth of Huffman-compressed coefficients.
- */
-
-METHODDEF(boolean)
-encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
-  working_state state;
-  int blkn, ci;
-  jpeg_component_info * compptr;
-
-  /* Load up working state */
-  state.next_output_byte = cinfo->dest->next_output_byte;
-  state.free_in_buffer = cinfo->dest->free_in_buffer;
-  ASSIGN_STATE(state.cur, entropy->saved);
-  state.cinfo = cinfo;
-
-  /* Emit restart marker if needed */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0)
-      if (! emit_restart(&state, entropy->next_restart_num))
-        return FALSE;
-  }
-
-  /* Encode the MCU data blocks */
-  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-    ci = cinfo->MCU_membership[blkn];
-    compptr = cinfo->cur_comp_info[ci];
-    if (! encode_one_block(&state,
-                           MCU_data[blkn][0], state.cur.last_dc_val[ci],
-                           entropy->dc_derived_tbls[compptr->dc_tbl_no],
-                           entropy->ac_derived_tbls[compptr->ac_tbl_no]))
-      return FALSE;
-    /* Update last_dc_val */
-    state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
-  }
-
-  /* Completed MCU, so update state */
-  cinfo->dest->next_output_byte = state.next_output_byte;
-  cinfo->dest->free_in_buffer = state.free_in_buffer;
-  ASSIGN_STATE(entropy->saved, state.cur);
-
-  /* Update restart-interval state too */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0) {
-      entropy->restarts_to_go = cinfo->restart_interval;
-      entropy->next_restart_num++;
-      entropy->next_restart_num &= 7;
-    }
-    entropy->restarts_to_go--;
-  }
-
-  return TRUE;
-}
-
-
-/*
- * Finish up at the end of a Huffman-compressed scan.
- */
-
-METHODDEF(void)
-finish_pass_huff (j_compress_ptr cinfo)
-{
-  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
-  working_state state;
-
-  /* Load up working state ... flush_bits needs it */
-  state.next_output_byte = cinfo->dest->next_output_byte;
-  state.free_in_buffer = cinfo->dest->free_in_buffer;
-  ASSIGN_STATE(state.cur, entropy->saved);
-  state.cinfo = cinfo;
-
-  /* Flush out the last data */
-  if (! flush_bits(&state))
-    ERREXIT(cinfo, JERR_CANT_SUSPEND);
-
-  /* Update state */
-  cinfo->dest->next_output_byte = state.next_output_byte;
-  cinfo->dest->free_in_buffer = state.free_in_buffer;
-  ASSIGN_STATE(entropy->saved, state.cur);
-}
-
-
-/*
- * Huffman coding optimization.
- *
- * We first scan the supplied data and count the number of uses of each symbol
- * that is to be Huffman-coded. (This process MUST agree with the code above.)
- * Then we build a Huffman coding tree for the observed counts.
- * Symbols which are not needed at all for the particular image are not
- * assigned any code, which saves space in the DHT marker as well as in
- * the compressed data.
- */
-
-#ifdef ENTROPY_OPT_SUPPORTED
-
-
-/* Process a single block's worth of coefficients */
-
-LOCAL(void)
-htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
-                 long dc_counts[], long ac_counts[])
-{
-  register int temp;
-  register int nbits;
-  register int k, r;
-
-  /* Encode the DC coefficient difference per section F.1.2.1 */
-
-  temp = block[0] - last_dc_val;
-  if (temp < 0)
-    temp = -temp;
-
-  /* Find the number of bits needed for the magnitude of the coefficient */
-  nbits = 0;
-  while (temp) {
-    nbits++;
-    temp >>= 1;
-  }
-  /* Check for out-of-range coefficient values.
-   * Since we're encoding a difference, the range limit is twice as much.
-   */
-  if (nbits > MAX_COEF_BITS+1)
-    ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
-  /* Count the Huffman symbol for the number of bits */
-  dc_counts[nbits]++;
-
-  /* Encode the AC coefficients per section F.1.2.2 */
-
-  r = 0;                        /* r = run length of zeros */
-
-  for (k = 1; k < DCTSIZE2; k++) {
-    if ((temp = block[jpeg_natural_order[k]]) == 0) {
-      r++;
-    } else {
-      /* if run length > 15, must emit special run-length-16 codes (0xF0) */
-      while (r > 15) {
-        ac_counts[0xF0]++;
-        r -= 16;
-      }
-
-      /* Find the number of bits needed for the magnitude of the coefficient */
-      if (temp < 0)
-        temp = -temp;
-
-      /* Find the number of bits needed for the magnitude of the coefficient */
-      nbits = 1;                /* there must be at least one 1 bit */
-      while ((temp >>= 1))
-        nbits++;
-      /* Check for out-of-range coefficient values */
-      if (nbits > MAX_COEF_BITS)
-        ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
-      /* Count Huffman symbol for run length / number of bits */
-      ac_counts[(r << 4) + nbits]++;
-
-      r = 0;
-    }
-  }
-
-  /* If the last coef(s) were zero, emit an end-of-block code */
-  if (r > 0)
-    ac_counts[0]++;
-}
-
-
-/*
- * Trial-encode one MCU's worth of Huffman-compressed coefficients.
- * No data is actually output, so no suspension return is possible.
- */
-
-METHODDEF(boolean)
-encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
-  int blkn, ci;
-  jpeg_component_info * compptr;
-
-  /* Take care of restart intervals if needed */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0) {
-      /* Re-initialize DC predictions to 0 */
-      for (ci = 0; ci < cinfo->comps_in_scan; ci++)
-        entropy->saved.last_dc_val[ci] = 0;
-      /* Update restart state */
-      entropy->restarts_to_go = cinfo->restart_interval;
-    }
-    entropy->restarts_to_go--;
-  }
-
-  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-    ci = cinfo->MCU_membership[blkn];
-    compptr = cinfo->cur_comp_info[ci];
-    htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],
-                    entropy->dc_count_ptrs[compptr->dc_tbl_no],
-                    entropy->ac_count_ptrs[compptr->ac_tbl_no]);
-    entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];
-  }
-
-  return TRUE;
-}
-
-
-/*
- * Generate the best Huffman code table for the given counts, fill htbl.
- * Note this is also used by jcphuff.c.
- *
- * The JPEG standard requires that no symbol be assigned a codeword of all
- * one bits (so that padding bits added at the end of a compressed segment
- * can't look like a valid code).  Because of the canonical ordering of
- * codewords, this just means that there must be an unused slot in the
- * longest codeword length category.  Section K.2 of the JPEG spec suggests
- * reserving such a slot by pretending that symbol 256 is a valid symbol
- * with count 1.  In theory that's not optimal; giving it count zero but
- * including it in the symbol set anyway should give a better Huffman code.
- * But the theoretically better code actually seems to come out worse in
- * practice, because it produces more all-ones bytes (which incur stuffed
- * zero bytes in the final file).  In any case the difference is tiny.
- *
- * The JPEG standard requires Huffman codes to be no more than 16 bits long.
- * If some symbols have a very small but nonzero probability, the Huffman tree
- * must be adjusted to meet the code length restriction.  We currently use
- * the adjustment method suggested in JPEG section K.2.  This method is *not*
- * optimal; it may not choose the best possible limited-length code.  But
- * typically only very-low-frequency symbols will be given less-than-optimal
- * lengths, so the code is almost optimal.  Experimental comparisons against
- * an optimal limited-length-code algorithm indicate that the difference is
- * microscopic --- usually less than a hundredth of a percent of total size.
- * So the extra complexity of an optimal algorithm doesn't seem worthwhile.
- */
-
-GLOBAL(void)
-jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
-{
-#define MAX_CLEN 32             /* assumed maximum initial code length */
-  UINT8 bits[MAX_CLEN+1];       /* bits[k] = # of symbols with code length k */
-  int codesize[257];            /* codesize[k] = code length of symbol k */
-  int others[257];              /* next symbol in current branch of tree */
-  int c1, c2;
-  int p, i, j;
-  long v;
-
-  /* This algorithm is explained in section K.2 of the JPEG standard */
-
-  MEMZERO(bits, SIZEOF(bits));
-  MEMZERO(codesize, SIZEOF(codesize));
-  for (i = 0; i < 257; i++)
-    others[i] = -1;             /* init links to empty */
-
-  freq[256] = 1;                /* make sure 256 has a nonzero count */
-  /* Including the pseudo-symbol 256 in the Huffman procedure guarantees
-   * that no real symbol is given code-value of all ones, because 256
-   * will be placed last in the largest codeword category.
-   */
-
-  /* Huffman's basic algorithm to assign optimal code lengths to symbols */
-
-  for (;;) {
-    /* Find the smallest nonzero frequency, set c1 = its symbol */
-    /* In case of ties, take the larger symbol number */
-    c1 = -1;
-    v = 1000000000L;
-    for (i = 0; i <= 256; i++) {
-      if (freq[i] && freq[i] <= v) {
-        v = freq[i];
-        c1 = i;
-      }
-    }
-
-    /* Find the next smallest nonzero frequency, set c2 = its symbol */
-    /* In case of ties, take the larger symbol number */
-    c2 = -1;
-    v = 1000000000L;
-    for (i = 0; i <= 256; i++) {
-      if (freq[i] && freq[i] <= v && i != c1) {
-        v = freq[i];
-        c2 = i;
-      }
-    }
-
-    /* Done if we've merged everything into one frequency */
-    if (c2 < 0)
-      break;
-
-    /* Else merge the two counts/trees */
-    freq[c1] += freq[c2];
-    freq[c2] = 0;
-
-    /* Increment the codesize of everything in c1's tree branch */
-    codesize[c1]++;
-    while (others[c1] >= 0) {
-      c1 = others[c1];
-      codesize[c1]++;
-    }
-
-    others[c1] = c2;            /* chain c2 onto c1's tree branch */
-
-    /* Increment the codesize of everything in c2's tree branch */
-    codesize[c2]++;
-    while (others[c2] >= 0) {
-      c2 = others[c2];
-      codesize[c2]++;
-    }
-  }
-
-  /* Now count the number of symbols of each code length */
-  for (i = 0; i <= 256; i++) {
-    if (codesize[i]) {
-      /* The JPEG standard seems to think that this can't happen, */
-      /* but I'm paranoid... */
-      if (codesize[i] > MAX_CLEN)
-        ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
-
-      bits[codesize[i]]++;
-    }
-  }
-
-  /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
-   * Huffman procedure assigned any such lengths, we must adjust the coding.
-   * Here is what the JPEG spec says about how this next bit works:
-   * Since symbols are paired for the longest Huffman code, the symbols are
-   * removed from this length category two at a time.  The prefix for the pair
-   * (which is one bit shorter) is allocated to one of the pair; then,
-   * skipping the BITS entry for that prefix length, a code word from the next
-   * shortest nonzero BITS entry is converted into a prefix for two code words
-   * one bit longer.
-   */
-
-  for (i = MAX_CLEN; i > 16; i--) {
-    while (bits[i] > 0) {
-      j = i - 2;                /* find length of new prefix to be used */
-      while (bits[j] == 0)
-        j--;
-
-      bits[i] -= 2;             /* remove two symbols */
-      bits[i-1]++;              /* one goes in this length */
-      bits[j+1] += 2;           /* two new symbols in this length */
-      bits[j]--;                /* symbol of this length is now a prefix */
-    }
-  }
-
-  /* Remove the count for the pseudo-symbol 256 from the largest codelength */
-  while (bits[i] == 0)          /* find largest codelength still in use */
-    i--;
-  bits[i]--;
-
-  /* Return final symbol counts (only for lengths 0..16) */
-  MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
-
-  /* Return a list of the symbols sorted by code length */
-  /* It's not real clear to me why we don't need to consider the codelength
-   * changes made above, but the JPEG spec seems to think this works.
-   */
-  p = 0;
-  for (i = 1; i <= MAX_CLEN; i++) {
-    for (j = 0; j <= 255; j++) {
-      if (codesize[j] == i) {
-        htbl->huffval[p] = (UINT8) j;
-        p++;
-      }
-    }
-  }
-
-  /* Set sent_table FALSE so updated table will be written to JPEG file. */
-  htbl->sent_table = FALSE;
-}
-
-
-/*
- * Finish up a statistics-gathering pass and create the new Huffman tables.
- */
-
-METHODDEF(void)
-finish_pass_gather (j_compress_ptr cinfo)
-{
-  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
-  int ci, dctbl, actbl;
-  jpeg_component_info * compptr;
-  JHUFF_TBL **htblptr;
-  boolean did_dc[NUM_HUFF_TBLS];
-  boolean did_ac[NUM_HUFF_TBLS];
-
-  /* It's important not to apply jpeg_gen_optimal_table more than once
-   * per table, because it clobbers the input frequency counts!
-   */
-  MEMZERO(did_dc, SIZEOF(did_dc));
-  MEMZERO(did_ac, SIZEOF(did_ac));
-
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    dctbl = compptr->dc_tbl_no;
-    actbl = compptr->ac_tbl_no;
-    if (! did_dc[dctbl]) {
-      htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];
-      if (*htblptr == NULL)
-        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
-      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);
-      did_dc[dctbl] = TRUE;
-    }
-    if (! did_ac[actbl]) {
-      htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];
-      if (*htblptr == NULL)
-        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
-      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);
-      did_ac[actbl] = TRUE;
-    }
-  }
-}
-
-
-#endif /* ENTROPY_OPT_SUPPORTED */
-
-
-/*
- * Module initialization routine for Huffman entropy encoding.
- */
-
-GLOBAL(void)
-jinit_huff_encoder (j_compress_ptr cinfo)
-{
-  huff_entropy_ptr entropy;
-  int i;
-
-  entropy = (huff_entropy_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(huff_entropy_encoder));
-  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
-  entropy->pub.start_pass = start_pass_huff;
-
-  /* Mark tables unallocated */
-  for (i = 0; i < NUM_HUFF_TBLS; i++) {
-    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
-#ifdef ENTROPY_OPT_SUPPORTED
-    entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
-#endif
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jchuff.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jchuff.h
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains declarations for Huffman entropy encoding routines
- * that are shared between the sequential encoder (jchuff.c) and the
- * progressive encoder (jcphuff.c).  No other modules need to see these.
- */
-
-/* The legal range of a DCT coefficient is
- *  -1024 .. +1023  for 8-bit data;
- * -16384 .. +16383 for 12-bit data.
- * Hence the magnitude should always fit in 10 or 14 bits respectively.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define MAX_COEF_BITS 10
-#else
-#define MAX_COEF_BITS 14
-#endif
-
-/* Derived data constructed for each Huffman table */
-
-typedef struct {
-  unsigned int ehufco[256];     /* code for each symbol */
-  char ehufsi[256];             /* length of code for each symbol */
-  /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */
-} c_derived_tbl;
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_make_c_derived_tbl jMkCDerived
-#define jpeg_gen_optimal_table  jGenOptTbl
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-/* Expand a Huffman table definition into the derived format */
-EXTERN(void) jpeg_make_c_derived_tbl
-        JPP((j_compress_ptr cinfo, boolean isDC, int tblno,
-             c_derived_tbl ** pdtbl));
-
-/* Generate an optimal table definition given the specified counts */
-EXTERN(void) jpeg_gen_optimal_table
-        JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]));
--- a/src/share/native/sun/awt/image/jpeg/jcinit.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcinit.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains initialization logic for the JPEG compressor.
- * This routine is in charge of selecting the modules to be executed and
- * making an initialization call to each one.
- *
- * Logically, this code belongs in jcmaster.c.  It's split out because
- * linking this routine implies linking the entire compression library.
- * For a transcoding-only application, we want to be able to use jcmaster.c
- * without linking in the whole library.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Master selection of compression modules.
- * This is done once at the start of processing an image.  We determine
- * which modules will be used and give them appropriate initialization calls.
- */
-
-GLOBAL(void)
-jinit_compress_master (j_compress_ptr cinfo)
-{
-  /* Initialize master control (includes parameter checking/processing) */
-  jinit_c_master_control(cinfo, FALSE /* full compression */);
-
-  /* Preprocessing */
-  if (! cinfo->raw_data_in) {
-    jinit_color_converter(cinfo);
-    jinit_downsampler(cinfo);
-    jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);
-  }
-  /* Forward DCT */
-  jinit_forward_dct(cinfo);
-  /* Entropy encoding: either Huffman or arithmetic coding. */
-  if (cinfo->arith_code) {
-    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-  } else {
-    if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
-      jinit_phuff_encoder(cinfo);
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-    } else
-      jinit_huff_encoder(cinfo);
-  }
-
-  /* Need a full-image coefficient buffer in any multi-pass mode. */
-  jinit_c_coef_controller(cinfo,
-                (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));
-  jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
-
-  jinit_marker_writer(cinfo);
-
-  /* We can now tell the memory manager to allocate virtual arrays. */
-  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
-
-  /* Write the datastream header (SOI) immediately.
-   * Frame and scan headers are postponed till later.
-   * This lets application insert special markers after the SOI.
-   */
-  (*cinfo->marker->write_file_header) (cinfo);
-}
--- a/src/share/native/sun/awt/image/jpeg/jcmainct.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,297 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcmainct.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the main buffer controller for compression.
- * The main buffer lies between the pre-processor and the JPEG
- * compressor proper; it holds downsampled data in the JPEG colorspace.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Note: currently, there is no operating mode in which a full-image buffer
- * is needed at this step.  If there were, that mode could not be used with
- * "raw data" input, since this module is bypassed in that case.  However,
- * we've left the code here for possible use in special applications.
- */
-#undef FULL_MAIN_BUFFER_SUPPORTED
-
-
-/* Private buffer controller object */
-
-typedef struct {
-  struct jpeg_c_main_controller pub; /* public fields */
-
-  JDIMENSION cur_iMCU_row;      /* number of current iMCU row */
-  JDIMENSION rowgroup_ctr;      /* counts row groups received in iMCU row */
-  boolean suspended;            /* remember if we suspended output */
-  J_BUF_MODE pass_mode;         /* current operating mode */
-
-  /* If using just a strip buffer, this points to the entire set of buffers
-   * (we allocate one for each component).  In the full-image case, this
-   * points to the currently accessible strips of the virtual arrays.
-   */
-  JSAMPARRAY buffer[MAX_COMPONENTS];
-
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-  /* If using full-image storage, this array holds pointers to virtual-array
-   * control blocks for each component.  Unused if not full-image storage.
-   */
-  jvirt_sarray_ptr whole_image[MAX_COMPONENTS];
-#endif
-} my_main_controller;
-
-typedef my_main_controller * my_main_ptr;
-
-
-/* Forward declarations */
-METHODDEF(void) process_data_simple_main
-        JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
-             JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-METHODDEF(void) process_data_buffer_main
-        JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
-             JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
-#endif
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-
-  /* Do nothing in raw-data mode. */
-  if (cinfo->raw_data_in)
-    return;
-
-  _main->cur_iMCU_row = 0;      /* initialize counters */
-  _main->rowgroup_ctr = 0;
-  _main->suspended = FALSE;
-  _main->pass_mode = pass_mode; /* save mode for use by process_data */
-
-  switch (pass_mode) {
-  case JBUF_PASS_THRU:
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-    if (_main->whole_image[0] != NULL)
-      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-#endif
-    _main->pub.process_data = process_data_simple_main;
-    break;
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-  case JBUF_SAVE_SOURCE:
-  case JBUF_CRANK_DEST:
-  case JBUF_SAVE_AND_PASS:
-    if (_main->whole_image[0] == NULL)
-      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    _main->pub.process_data = process_data_buffer_main;
-    break;
-#endif
-  default:
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    break;
-  }
-}
-
-
-/*
- * Process some data.
- * This routine handles the simple pass-through mode,
- * where we have only a strip buffer.
- */
-
-METHODDEF(void)
-process_data_simple_main (j_compress_ptr cinfo,
-                          JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
-                          JDIMENSION in_rows_avail)
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-
-  while (_main->cur_iMCU_row < cinfo->total_iMCU_rows) {
-    /* Read input data if we haven't filled the main buffer yet */
-    if (_main->rowgroup_ctr < DCTSIZE)
-      (*cinfo->prep->pre_process_data) (cinfo,
-                                        input_buf, in_row_ctr, in_rows_avail,
-                                        _main->buffer, &_main->rowgroup_ctr,
-                                        (JDIMENSION) DCTSIZE);
-
-    /* If we don't have a full iMCU row buffered, return to application for
-     * more data.  Note that preprocessor will always pad to fill the iMCU row
-     * at the bottom of the image.
-     */
-    if (_main->rowgroup_ctr != DCTSIZE)
-      return;
-
-    /* Send the completed row to the compressor */
-    if (! (*cinfo->coef->compress_data) (cinfo, _main->buffer)) {
-      /* If compressor did not consume the whole row, then we must need to
-       * suspend processing and return to the application.  In this situation
-       * we pretend we didn't yet consume the last input row; otherwise, if
-       * it happened to be the last row of the image, the application would
-       * think we were done.
-       */
-      if (! _main->suspended) {
-        (*in_row_ctr)--;
-        _main->suspended = TRUE;
-      }
-      return;
-    }
-    /* We did finish the row.  Undo our little suspension hack if a previous
-     * call suspended; then mark the main buffer empty.
-     */
-    if (_main->suspended) {
-      (*in_row_ctr)++;
-      _main->suspended = FALSE;
-    }
-    _main->rowgroup_ctr = 0;
-    _main->cur_iMCU_row++;
-  }
-}
-
-
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-
-/*
- * Process some data.
- * This routine handles all of the modes that use a full-size buffer.
- */
-
-METHODDEF(void)
-process_data_buffer_main (j_compress_ptr cinfo,
-                          JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
-                          JDIMENSION in_rows_avail)
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-  int ci;
-  jpeg_component_info *compptr;
-  boolean writing = (_main->pass_mode != JBUF_CRANK_DEST);
-
-  while (_main->cur_iMCU_row < cinfo->total_iMCU_rows) {
-    /* Realign the virtual buffers if at the start of an iMCU row. */
-    if (_main->rowgroup_ctr == 0) {
-      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-           ci++, compptr++) {
-        _main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
-          ((j_common_ptr) cinfo, _main->whole_image[ci],
-           _main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
-           (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
-      }
-      /* In a read pass, pretend we just read some source data. */
-      if (! writing) {
-        *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
-        _main->rowgroup_ctr = DCTSIZE;
-      }
-    }
-
-    /* If a write pass, read input data until the current iMCU row is full. */
-    /* Note: preprocessor will pad if necessary to fill the last iMCU row. */
-    if (writing) {
-      (*cinfo->prep->pre_process_data) (cinfo,
-                                        input_buf, in_row_ctr, in_rows_avail,
-                                        _main->buffer, &_main->rowgroup_ctr,
-                                        (JDIMENSION) DCTSIZE);
-      /* Return to application if we need more data to fill the iMCU row. */
-      if (_main->rowgroup_ctr < DCTSIZE)
-        return;
-    }
-
-    /* Emit data, unless this is a sink-only pass. */
-    if (_main->pass_mode != JBUF_SAVE_SOURCE) {
-      if (! (*cinfo->coef->compress_data) (cinfo, _main->buffer)) {
-        /* If compressor did not consume the whole row, then we must need to
-         * suspend processing and return to the application.  In this situation
-         * we pretend we didn't yet consume the last input row; otherwise, if
-         * it happened to be the last row of the image, the application would
-         * think we were done.
-         */
-        if (! _main->suspended) {
-          (*in_row_ctr)--;
-          _main->suspended = TRUE;
-        }
-        return;
-      }
-      /* We did finish the row.  Undo our little suspension hack if a previous
-       * call suspended; then mark the main buffer empty.
-       */
-      if (_main->suspended) {
-        (*in_row_ctr)++;
-        _main->suspended = FALSE;
-      }
-    }
-
-    /* If get here, we are done with this iMCU row.  Mark buffer empty. */
-    _main->rowgroup_ctr = 0;
-    _main->cur_iMCU_row++;
-  }
-}
-
-#endif /* FULL_MAIN_BUFFER_SUPPORTED */
-
-
-/*
- * Initialize main buffer controller.
- */
-
-GLOBAL(void)
-jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
-{
-  my_main_ptr _main;
-  int ci;
-  jpeg_component_info *compptr;
-
-  _main = (my_main_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_main_controller));
-  cinfo->main = (struct jpeg_c_main_controller *) _main;
-  _main->pub.start_pass = start_pass_main;
-
-  /* We don't need to create a buffer in raw-data mode. */
-  if (cinfo->raw_data_in)
-    return;
-
-  /* Create the buffer.  It holds downsampled data, so each component
-   * may be of a different size.
-   */
-  if (need_full_buffer) {
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-    /* Allocate a full-image virtual array for each component */
-    /* Note we pad the bottom to a multiple of the iMCU height */
-    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-         ci++, compptr++) {
-      _main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
-        ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
-         compptr->width_in_blocks * DCTSIZE,
-         (JDIMENSION) jround_up((long) compptr->height_in_blocks,
-                                (long) compptr->v_samp_factor) * DCTSIZE,
-         (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
-    }
-#else
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-#endif
-  } else {
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-    _main->whole_image[0] = NULL; /* flag for no virtual arrays */
-#endif
-    /* Allocate a strip buffer for each component */
-    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-         ci++, compptr++) {
-      _main->buffer[ci] = (*cinfo->mem->alloc_sarray)
-        ((j_common_ptr) cinfo, JPOOL_IMAGE,
-         compptr->width_in_blocks * DCTSIZE,
-         (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
-    }
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jcmarker.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,682 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcmarker.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains routines to write JPEG datastream markers.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-typedef enum {                  /* JPEG marker codes */
-  M_SOF0  = 0xc0,
-  M_SOF1  = 0xc1,
-  M_SOF2  = 0xc2,
-  M_SOF3  = 0xc3,
-
-  M_SOF5  = 0xc5,
-  M_SOF6  = 0xc6,
-  M_SOF7  = 0xc7,
-
-  M_JPG   = 0xc8,
-  M_SOF9  = 0xc9,
-  M_SOF10 = 0xca,
-  M_SOF11 = 0xcb,
-
-  M_SOF13 = 0xcd,
-  M_SOF14 = 0xce,
-  M_SOF15 = 0xcf,
-
-  M_DHT   = 0xc4,
-
-  M_DAC   = 0xcc,
-
-  M_RST0  = 0xd0,
-  M_RST1  = 0xd1,
-  M_RST2  = 0xd2,
-  M_RST3  = 0xd3,
-  M_RST4  = 0xd4,
-  M_RST5  = 0xd5,
-  M_RST6  = 0xd6,
-  M_RST7  = 0xd7,
-
-  M_SOI   = 0xd8,
-  M_EOI   = 0xd9,
-  M_SOS   = 0xda,
-  M_DQT   = 0xdb,
-  M_DNL   = 0xdc,
-  M_DRI   = 0xdd,
-  M_DHP   = 0xde,
-  M_EXP   = 0xdf,
-
-  M_APP0  = 0xe0,
-  M_APP1  = 0xe1,
-  M_APP2  = 0xe2,
-  M_APP3  = 0xe3,
-  M_APP4  = 0xe4,
-  M_APP5  = 0xe5,
-  M_APP6  = 0xe6,
-  M_APP7  = 0xe7,
-  M_APP8  = 0xe8,
-  M_APP9  = 0xe9,
-  M_APP10 = 0xea,
-  M_APP11 = 0xeb,
-  M_APP12 = 0xec,
-  M_APP13 = 0xed,
-  M_APP14 = 0xee,
-  M_APP15 = 0xef,
-
-  M_JPG0  = 0xf0,
-  M_JPG13 = 0xfd,
-  M_COM   = 0xfe,
-
-  M_TEM   = 0x01,
-
-  M_ERROR = 0x100
-} JPEG_MARKER;
-
-
-/* Private state */
-
-typedef struct {
-  struct jpeg_marker_writer pub; /* public fields */
-
-  unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */
-} my_marker_writer;
-
-typedef my_marker_writer * my_marker_ptr;
-
-
-/*
- * Basic output routines.
- *
- * Note that we do not support suspension while writing a marker.
- * Therefore, an application using suspension must ensure that there is
- * enough buffer space for the initial markers (typ. 600-700 bytes) before
- * calling jpeg_start_compress, and enough space to write the trailing EOI
- * (a few bytes) before calling jpeg_finish_compress.  Multipass compression
- * modes are not supported at all with suspension, so those two are the only
- * points where markers will be written.
- */
-
-LOCAL(void)
-emit_byte (j_compress_ptr cinfo, int val)
-/* Emit a byte */
-{
-  struct jpeg_destination_mgr * dest = cinfo->dest;
-
-  *(dest->next_output_byte)++ = (JOCTET) val;
-  if (--dest->free_in_buffer == 0) {
-    if (! (*dest->empty_output_buffer) (cinfo))
-      ERREXIT(cinfo, JERR_CANT_SUSPEND);
-  }
-}
-
-
-LOCAL(void)
-emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)
-/* Emit a marker code */
-{
-  emit_byte(cinfo, 0xFF);
-  emit_byte(cinfo, (int) mark);
-}
-
-
-LOCAL(void)
-emit_2bytes (j_compress_ptr cinfo, int value)
-/* Emit a 2-byte integer; these are always MSB first in JPEG files */
-{
-  emit_byte(cinfo, (value >> 8) & 0xFF);
-  emit_byte(cinfo, value & 0xFF);
-}
-
-
-/*
- * Routines to write specific marker types.
- */
-
-LOCAL(int)
-emit_dqt (j_compress_ptr cinfo, int index)
-/* Emit a DQT marker */
-/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */
-{
-  JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];
-  int prec;
-  int i;
-
-  if (qtbl == NULL)
-    ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
-
-  prec = 0;
-  for (i = 0; i < DCTSIZE2; i++) {
-    if (qtbl->quantval[i] > 255)
-      prec = 1;
-  }
-
-  if (! qtbl->sent_table) {
-    emit_marker(cinfo, M_DQT);
-
-    emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);
-
-    emit_byte(cinfo, index + (prec<<4));
-
-    for (i = 0; i < DCTSIZE2; i++) {
-      /* The table entries must be emitted in zigzag order. */
-      unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];
-      if (prec)
-        emit_byte(cinfo, (int) (qval >> 8));
-      emit_byte(cinfo, (int) (qval & 0xFF));
-    }
-
-    qtbl->sent_table = TRUE;
-  }
-
-  return prec;
-}
-
-
-LOCAL(void)
-emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
-/* Emit a DHT marker */
-{
-  JHUFF_TBL * htbl;
-  int length, i;
-
-  if (is_ac) {
-    htbl = cinfo->ac_huff_tbl_ptrs[index];
-    index += 0x10;              /* output index has AC bit set */
-  } else {
-    htbl = cinfo->dc_huff_tbl_ptrs[index];
-  }
-
-  if (htbl == NULL)
-    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);
-
-  if (! htbl->sent_table) {
-    emit_marker(cinfo, M_DHT);
-
-    length = 0;
-    for (i = 1; i <= 16; i++)
-      length += htbl->bits[i];
-
-    emit_2bytes(cinfo, length + 2 + 1 + 16);
-    emit_byte(cinfo, index);
-
-    for (i = 1; i <= 16; i++)
-      emit_byte(cinfo, htbl->bits[i]);
-
-    for (i = 0; i < length; i++)
-      emit_byte(cinfo, htbl->huffval[i]);
-
-    htbl->sent_table = TRUE;
-  }
-}
-
-
-LOCAL(void)
-emit_dac (j_compress_ptr cinfo)
-/* Emit a DAC marker */
-/* Since the useful info is so small, we want to emit all the tables in */
-/* one DAC marker.  Therefore this routine does its own scan of the table. */
-{
-#ifdef C_ARITH_CODING_SUPPORTED
-  char dc_in_use[NUM_ARITH_TBLS];
-  char ac_in_use[NUM_ARITH_TBLS];
-  int length, i;
-  jpeg_component_info *compptr;
-
-  for (i = 0; i < NUM_ARITH_TBLS; i++)
-    dc_in_use[i] = ac_in_use[i] = 0;
-
-  for (i = 0; i < cinfo->comps_in_scan; i++) {
-    compptr = cinfo->cur_comp_info[i];
-    dc_in_use[compptr->dc_tbl_no] = 1;
-    ac_in_use[compptr->ac_tbl_no] = 1;
-  }
-
-  length = 0;
-  for (i = 0; i < NUM_ARITH_TBLS; i++)
-    length += dc_in_use[i] + ac_in_use[i];
-
-  emit_marker(cinfo, M_DAC);
-
-  emit_2bytes(cinfo, length*2 + 2);
-
-  for (i = 0; i < NUM_ARITH_TBLS; i++) {
-    if (dc_in_use[i]) {
-      emit_byte(cinfo, i);
-      emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));
-    }
-    if (ac_in_use[i]) {
-      emit_byte(cinfo, i + 0x10);
-      emit_byte(cinfo, cinfo->arith_ac_K[i]);
-    }
-  }
-#endif /* C_ARITH_CODING_SUPPORTED */
-}
-
-
-LOCAL(void)
-emit_dri (j_compress_ptr cinfo)
-/* Emit a DRI marker */
-{
-  emit_marker(cinfo, M_DRI);
-
-  emit_2bytes(cinfo, 4);        /* fixed length */
-
-  emit_2bytes(cinfo, (int) cinfo->restart_interval);
-}
-
-
-LOCAL(void)
-emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
-/* Emit a SOF marker */
-{
-  int ci;
-  jpeg_component_info *compptr;
-
-  emit_marker(cinfo, code);
-
-  emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */
-
-  /* Make sure image isn't bigger than SOF field can handle */
-  if ((long) cinfo->image_height > 65535L ||
-      (long) cinfo->image_width > 65535L)
-    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);
-
-  emit_byte(cinfo, cinfo->data_precision);
-  emit_2bytes(cinfo, (int) cinfo->image_height);
-  emit_2bytes(cinfo, (int) cinfo->image_width);
-
-  emit_byte(cinfo, cinfo->num_components);
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    emit_byte(cinfo, compptr->component_id);
-    emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);
-    emit_byte(cinfo, compptr->quant_tbl_no);
-  }
-}
-
-
-LOCAL(void)
-emit_sos (j_compress_ptr cinfo)
-/* Emit a SOS marker */
-{
-  int i, td, ta;
-  jpeg_component_info *compptr;
-
-  emit_marker(cinfo, M_SOS);
-
-  emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */
-
-  emit_byte(cinfo, cinfo->comps_in_scan);
-
-  for (i = 0; i < cinfo->comps_in_scan; i++) {
-    compptr = cinfo->cur_comp_info[i];
-    emit_byte(cinfo, compptr->component_id);
-    td = compptr->dc_tbl_no;
-    ta = compptr->ac_tbl_no;
-    if (cinfo->progressive_mode) {
-      /* Progressive mode: only DC or only AC tables are used in one scan;
-       * furthermore, Huffman coding of DC refinement uses no table at all.
-       * We emit 0 for unused field(s); this is recommended by the P&M text
-       * but does not seem to be specified in the standard.
-       */
-      if (cinfo->Ss == 0) {
-        ta = 0;                 /* DC scan */
-        if (cinfo->Ah != 0 && !cinfo->arith_code)
-          td = 0;               /* no DC table either */
-      } else {
-        td = 0;                 /* AC scan */
-      }
-    }
-    emit_byte(cinfo, (td << 4) + ta);
-  }
-
-  emit_byte(cinfo, cinfo->Ss);
-  emit_byte(cinfo, cinfo->Se);
-  emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);
-}
-
-
-LOCAL(void)
-emit_jfif_app0 (j_compress_ptr cinfo)
-/* Emit a JFIF-compliant APP0 marker */
-{
-  /*
-   * Length of APP0 block       (2 bytes)
-   * Block ID                   (4 bytes - ASCII "JFIF")
-   * Zero byte                  (1 byte to terminate the ID string)
-   * Version Major, Minor       (2 bytes - major first)
-   * Units                      (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)
-   * Xdpu                       (2 bytes - dots per unit horizontal)
-   * Ydpu                       (2 bytes - dots per unit vertical)
-   * Thumbnail X size           (1 byte)
-   * Thumbnail Y size           (1 byte)
-   */
-
-  emit_marker(cinfo, M_APP0);
-
-  emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */
-
-  emit_byte(cinfo, 0x4A);       /* Identifier: ASCII "JFIF" */
-  emit_byte(cinfo, 0x46);
-  emit_byte(cinfo, 0x49);
-  emit_byte(cinfo, 0x46);
-  emit_byte(cinfo, 0);
-  emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */
-  emit_byte(cinfo, cinfo->JFIF_minor_version);
-  emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */
-  emit_2bytes(cinfo, (int) cinfo->X_density);
-  emit_2bytes(cinfo, (int) cinfo->Y_density);
-  emit_byte(cinfo, 0);          /* No thumbnail image */
-  emit_byte(cinfo, 0);
-}
-
-
-LOCAL(void)
-emit_adobe_app14 (j_compress_ptr cinfo)
-/* Emit an Adobe APP14 marker */
-{
-  /*
-   * Length of APP14 block      (2 bytes)
-   * Block ID                   (5 bytes - ASCII "Adobe")
-   * Version Number             (2 bytes - currently 100)
-   * Flags0                     (2 bytes - currently 0)
-   * Flags1                     (2 bytes - currently 0)
-   * Color transform            (1 byte)
-   *
-   * Although Adobe TN 5116 mentions Version = 101, all the Adobe files
-   * now in circulation seem to use Version = 100, so that's what we write.
-   *
-   * We write the color transform byte as 1 if the JPEG color space is
-   * YCbCr, 2 if it's YCCK, 0 otherwise.  Adobe's definition has to do with
-   * whether the encoder performed a transformation, which is pretty useless.
-   */
-
-  emit_marker(cinfo, M_APP14);
-
-  emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */
-
-  emit_byte(cinfo, 0x41);       /* Identifier: ASCII "Adobe" */
-  emit_byte(cinfo, 0x64);
-  emit_byte(cinfo, 0x6F);
-  emit_byte(cinfo, 0x62);
-  emit_byte(cinfo, 0x65);
-  emit_2bytes(cinfo, 100);      /* Version */
-  emit_2bytes(cinfo, 0);        /* Flags0 */
-  emit_2bytes(cinfo, 0);        /* Flags1 */
-  switch (cinfo->jpeg_color_space) {
-  case JCS_YCbCr:
-    emit_byte(cinfo, 1);        /* Color transform = 1 */
-    break;
-  case JCS_YCCK:
-    emit_byte(cinfo, 2);        /* Color transform = 2 */
-    break;
-  default:
-    emit_byte(cinfo, 0);        /* Color transform = 0 */
-    break;
-  }
-}
-
-
-/*
- * These routines allow writing an arbitrary marker with parameters.
- * The only intended use is to emit COM or APPn markers after calling
- * write_file_header and before calling write_frame_header.
- * Other uses are not guaranteed to produce desirable results.
- * Counting the parameter bytes properly is the caller's responsibility.
- */
-
-METHODDEF(void)
-write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
-/* Emit an arbitrary marker header */
-{
-  if (datalen > (unsigned int) 65533)           /* safety check */
-    ERREXIT(cinfo, JERR_BAD_LENGTH);
-
-  emit_marker(cinfo, (JPEG_MARKER) marker);
-
-  emit_2bytes(cinfo, (int) (datalen + 2));      /* total length */
-}
-
-METHODDEF(void)
-write_marker_byte (j_compress_ptr cinfo, int val)
-/* Emit one byte of marker parameters following write_marker_header */
-{
-  emit_byte(cinfo, val);
-}
-
-
-/*
- * Write datastream header.
- * This consists of an SOI and optional APPn markers.
- * We recommend use of the JFIF marker, but not the Adobe marker,
- * when using YCbCr or grayscale data.  The JFIF marker should NOT
- * be used for any other JPEG colorspace.  The Adobe marker is helpful
- * to distinguish RGB, CMYK, and YCCK colorspaces.
- * Note that an application can write additional header markers after
- * jpeg_start_compress returns.
- */
-
-METHODDEF(void)
-write_file_header (j_compress_ptr cinfo)
-{
-  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-
-  emit_marker(cinfo, M_SOI);    /* first the SOI */
-
-  /* SOI is defined to reset restart interval to 0 */
-  marker->last_restart_interval = 0;
-
-  if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */
-    emit_jfif_app0(cinfo);
-  if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */
-    emit_adobe_app14(cinfo);
-}
-
-
-/*
- * Write frame header.
- * This consists of DQT and SOFn markers.
- * Note that we do not emit the SOF until we have emitted the DQT(s).
- * This avoids compatibility problems with incorrect implementations that
- * try to error-check the quant table numbers as soon as they see the SOF.
- */
-
-METHODDEF(void)
-write_frame_header (j_compress_ptr cinfo)
-{
-  int ci, prec;
-  boolean is_baseline;
-  jpeg_component_info *compptr;
-
-  /* Emit DQT for each quantization table.
-   * Note that emit_dqt() suppresses any duplicate tables.
-   */
-  prec = 0;
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    prec += emit_dqt(cinfo, compptr->quant_tbl_no);
-  }
-  /* now prec is nonzero iff there are any 16-bit quant tables. */
-
-  /* Check for a non-baseline specification.
-   * Note we assume that Huffman table numbers won't be changed later.
-   */
-  if (cinfo->arith_code || cinfo->progressive_mode ||
-      cinfo->data_precision != 8) {
-    is_baseline = FALSE;
-  } else {
-    is_baseline = TRUE;
-    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-         ci++, compptr++) {
-      if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)
-        is_baseline = FALSE;
-    }
-    if (prec && is_baseline) {
-      is_baseline = FALSE;
-      /* If it's baseline except for quantizer size, warn the user */
-      TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);
-    }
-  }
-
-  /* Emit the proper SOF marker */
-  if (cinfo->arith_code) {
-    emit_sof(cinfo, M_SOF9);    /* SOF code for arithmetic coding */
-  } else {
-    if (cinfo->progressive_mode)
-      emit_sof(cinfo, M_SOF2);  /* SOF code for progressive Huffman */
-    else if (is_baseline)
-      emit_sof(cinfo, M_SOF0);  /* SOF code for baseline implementation */
-    else
-      emit_sof(cinfo, M_SOF1);  /* SOF code for non-baseline Huffman file */
-  }
-}
-
-
-/*
- * Write scan header.
- * This consists of DHT or DAC markers, optional DRI, and SOS.
- * Compressed data will be written following the SOS.
- */
-
-METHODDEF(void)
-write_scan_header (j_compress_ptr cinfo)
-{
-  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-  int i;
-  jpeg_component_info *compptr;
-
-  if (cinfo->arith_code) {
-    /* Emit arith conditioning info.  We may have some duplication
-     * if the file has multiple scans, but it's so small it's hardly
-     * worth worrying about.
-     */
-    emit_dac(cinfo);
-  } else {
-    /* Emit Huffman tables.
-     * Note that emit_dht() suppresses any duplicate tables.
-     */
-    for (i = 0; i < cinfo->comps_in_scan; i++) {
-      compptr = cinfo->cur_comp_info[i];
-      if (cinfo->progressive_mode) {
-        /* Progressive mode: only DC or only AC tables are used in one scan */
-        if (cinfo->Ss == 0) {
-          if (cinfo->Ah == 0)   /* DC needs no table for refinement scan */
-            emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
-        } else {
-          emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
-        }
-      } else {
-        /* Sequential mode: need both DC and AC tables */
-        emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
-        emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
-      }
-    }
-  }
-
-  /* Emit DRI if required --- note that DRI value could change for each scan.
-   * We avoid wasting space with unnecessary DRIs, however.
-   */
-  if (cinfo->restart_interval != marker->last_restart_interval) {
-    emit_dri(cinfo);
-    marker->last_restart_interval = cinfo->restart_interval;
-  }
-
-  emit_sos(cinfo);
-}
-
-
-/*
- * Write datastream trailer.
- */
-
-METHODDEF(void)
-write_file_trailer (j_compress_ptr cinfo)
-{
-  emit_marker(cinfo, M_EOI);
-}
-
-
-/*
- * Write an abbreviated table-specification datastream.
- * This consists of SOI, DQT and DHT tables, and EOI.
- * Any table that is defined and not marked sent_table = TRUE will be
- * emitted.  Note that all tables will be marked sent_table = TRUE at exit.
- */
-
-METHODDEF(void)
-write_tables_only (j_compress_ptr cinfo)
-{
-  int i;
-
-  emit_marker(cinfo, M_SOI);
-
-  /* Emit DQT for each quantization table.
-   * Only emit those tables that are actually associated with image components,
-   * if there are any image components, which will usually not be the case.
-   * Note that emit_dqt() suppresses any duplicate tables.
-   */
-  if (cinfo->num_components > 0) {
-      int ci;
-      jpeg_component_info *compptr;
-      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-           ci++, compptr++) {
-          (void) emit_dqt(cinfo, compptr->quant_tbl_no);
-      }
-  } else {
-      for (i = 0; i < NUM_QUANT_TBLS; i++) {
-          if (cinfo->quant_tbl_ptrs[i] != NULL)
-              (void) emit_dqt(cinfo, i);
-      }
-  }
-
-  if (! cinfo->arith_code) {
-    for (i = 0; i < NUM_HUFF_TBLS; i++) {
-      if (cinfo->dc_huff_tbl_ptrs[i] != NULL)
-        emit_dht(cinfo, i, FALSE);
-      if (cinfo->ac_huff_tbl_ptrs[i] != NULL)
-        emit_dht(cinfo, i, TRUE);
-    }
-  }
-
-  emit_marker(cinfo, M_EOI);
-}
-
-
-/*
- * Initialize the marker writer module.
- */
-
-GLOBAL(void)
-jinit_marker_writer (j_compress_ptr cinfo)
-{
-  my_marker_ptr marker;
-
-  /* Create the subobject */
-  marker = (my_marker_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_marker_writer));
-  cinfo->marker = (struct jpeg_marker_writer *) marker;
-  /* Initialize method pointers */
-  marker->pub.write_file_header = write_file_header;
-  marker->pub.write_frame_header = write_frame_header;
-  marker->pub.write_scan_header = write_scan_header;
-  marker->pub.write_file_trailer = write_file_trailer;
-  marker->pub.write_tables_only = write_tables_only;
-  marker->pub.write_marker_header = write_marker_header;
-  marker->pub.write_marker_byte = write_marker_byte;
-  /* Initialize private state */
-  marker->last_restart_interval = 0;
-}
--- a/src/share/native/sun/awt/image/jpeg/jcmaster.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,594 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcmaster.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains master control logic for the JPEG compressor.
- * These routines are concerned with parameter validation, initial setup,
- * and inter-pass control (determining the number of passes and the work
- * to be done in each pass).
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private state */
-
-typedef enum {
-        main_pass,              /* input data, also do first output step */
-        huff_opt_pass,          /* Huffman code optimization pass */
-        output_pass             /* data output pass */
-} c_pass_type;
-
-typedef struct {
-  struct jpeg_comp_master pub;  /* public fields */
-
-  c_pass_type pass_type;        /* the type of the current pass */
-
-  int pass_number;              /* # of passes completed */
-  int total_passes;             /* total # of passes needed */
-
-  int scan_number;              /* current index in scan_info[] */
-} my_comp_master;
-
-typedef my_comp_master * my_master_ptr;
-
-
-/*
- * Support routines that do various essential calculations.
- */
-
-LOCAL(void)
-initial_setup (j_compress_ptr cinfo)
-/* Do computations that are needed before master selection phase */
-{
-  int ci;
-  jpeg_component_info *compptr;
-  long samplesperrow;
-  JDIMENSION jd_samplesperrow;
-
-  /* Sanity check on image dimensions */
-  if (cinfo->image_height <= 0 || cinfo->image_width <= 0
-      || cinfo->num_components <= 0 || cinfo->input_components <= 0)
-    ERREXIT(cinfo, JERR_EMPTY_IMAGE);
-
-  /* Make sure image isn't bigger than I can handle */
-  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
-      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
-    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
-
-  /* Width of an input scanline must be representable as JDIMENSION. */
-  samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
-  jd_samplesperrow = (JDIMENSION) samplesperrow;
-  if ((long) jd_samplesperrow != samplesperrow)
-    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
-
-  /* For now, precision must match compiled-in value... */
-  if (cinfo->data_precision != BITS_IN_JSAMPLE)
-    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
-
-  /* Check that number of components won't exceed internal array sizes */
-  if (cinfo->num_components > MAX_COMPONENTS)
-    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
-             MAX_COMPONENTS);
-
-  /* Compute maximum sampling factors; check factor validity */
-  cinfo->max_h_samp_factor = 1;
-  cinfo->max_v_samp_factor = 1;
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
-        compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
-      ERREXIT(cinfo, JERR_BAD_SAMPLING);
-    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
-                                   compptr->h_samp_factor);
-    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
-                                   compptr->v_samp_factor);
-  }
-
-  /* Compute dimensions of components */
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Fill in the correct component_index value; don't rely on application */
-    compptr->component_index = ci;
-    /* For compression, we never do DCT scaling. */
-    compptr->DCT_scaled_size = DCTSIZE;
-    /* Size in DCT blocks */
-    compptr->width_in_blocks = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
-                    (long) (cinfo->max_h_samp_factor * DCTSIZE));
-    compptr->height_in_blocks = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
-                    (long) (cinfo->max_v_samp_factor * DCTSIZE));
-    /* Size in samples */
-    compptr->downsampled_width = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
-                    (long) cinfo->max_h_samp_factor);
-    compptr->downsampled_height = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
-                    (long) cinfo->max_v_samp_factor);
-    /* Mark component needed (this flag isn't actually used for compression) */
-    compptr->component_needed = TRUE;
-  }
-
-  /* Compute number of fully interleaved MCU rows (number of times that
-   * main controller will call coefficient controller).
-   */
-  cinfo->total_iMCU_rows = (JDIMENSION)
-    jdiv_round_up((long) cinfo->image_height,
-                  (long) (cinfo->max_v_samp_factor*DCTSIZE));
-}
-
-
-#ifdef C_MULTISCAN_FILES_SUPPORTED
-
-LOCAL(void)
-validate_script (j_compress_ptr cinfo)
-/* Verify that the scan script in cinfo->scan_info[] is valid; also
- * determine whether it uses progressive JPEG, and set cinfo->progressive_mode.
- */
-{
-  const jpeg_scan_info * scanptr;
-  int scanno, ncomps, ci, coefi, thisi;
-  int Ss, Se, Ah, Al;
-  boolean component_sent[MAX_COMPONENTS];
-#ifdef C_PROGRESSIVE_SUPPORTED
-  int * last_bitpos_ptr;
-  int last_bitpos[MAX_COMPONENTS][DCTSIZE2];
-  /* -1 until that coefficient has been seen; then last Al for it */
-#endif
-
-  if (cinfo->num_scans <= 0)
-    ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);
-
-  /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;
-   * for progressive JPEG, no scan can have this.
-   */
-  scanptr = cinfo->scan_info;
-  if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {
-#ifdef C_PROGRESSIVE_SUPPORTED
-    cinfo->progressive_mode = TRUE;
-    last_bitpos_ptr = & last_bitpos[0][0];
-    for (ci = 0; ci < cinfo->num_components; ci++)
-      for (coefi = 0; coefi < DCTSIZE2; coefi++)
-        *last_bitpos_ptr++ = -1;
-#else
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-  } else {
-    cinfo->progressive_mode = FALSE;
-    for (ci = 0; ci < cinfo->num_components; ci++)
-      component_sent[ci] = FALSE;
-  }
-
-  for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {
-    /* Validate component indexes */
-    ncomps = scanptr->comps_in_scan;
-    if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)
-      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);
-    for (ci = 0; ci < ncomps; ci++) {
-      thisi = scanptr->component_index[ci];
-      if (thisi < 0 || thisi >= cinfo->num_components)
-        ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
-      /* Components must appear in SOF order within each scan */
-      if (ci > 0 && thisi <= scanptr->component_index[ci-1])
-        ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
-    }
-    /* Validate progression parameters */
-    Ss = scanptr->Ss;
-    Se = scanptr->Se;
-    Ah = scanptr->Ah;
-    Al = scanptr->Al;
-    if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
-      /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that
-       * seems wrong: the upper bound ought to depend on data precision.
-       * Perhaps they really meant 0..N+1 for N-bit precision.
-       * Here we allow 0..10 for 8-bit data; Al larger than 10 results in
-       * out-of-range reconstructed DC values during the first DC scan,
-       * which might cause problems for some decoders.
-       */
-#if BITS_IN_JSAMPLE == 8
-#define MAX_AH_AL 10
-#else
-#define MAX_AH_AL 13
-#endif
-      if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||
-          Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)
-        ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
-      if (Ss == 0) {
-        if (Se != 0)            /* DC and AC together not OK */
-          ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
-      } else {
-        if (ncomps != 1)        /* AC scans must be for only one component */
-          ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
-      }
-      for (ci = 0; ci < ncomps; ci++) {
-        last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];
-        if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */
-          ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
-        for (coefi = Ss; coefi <= Se; coefi++) {
-          if (last_bitpos_ptr[coefi] < 0) {
-            /* first scan of this coefficient */
-            if (Ah != 0)
-              ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
-          } else {
-            /* not first scan */
-            if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)
-              ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
-          }
-          last_bitpos_ptr[coefi] = Al;
-        }
-      }
-#endif
-    } else {
-      /* For sequential JPEG, all progression parameters must be these: */
-      if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)
-        ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
-      /* Make sure components are not sent twice */
-      for (ci = 0; ci < ncomps; ci++) {
-        thisi = scanptr->component_index[ci];
-        if (component_sent[thisi])
-          ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
-        component_sent[thisi] = TRUE;
-      }
-    }
-  }
-
-  /* Now verify that everything got sent. */
-  if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
-    /* For progressive mode, we only check that at least some DC data
-     * got sent for each component; the spec does not require that all bits
-     * of all coefficients be transmitted.  Would it be wiser to enforce
-     * transmission of all coefficient bits??
-     */
-    for (ci = 0; ci < cinfo->num_components; ci++) {
-      if (last_bitpos[ci][0] < 0)
-        ERREXIT(cinfo, JERR_MISSING_DATA);
-    }
-#endif
-  } else {
-    for (ci = 0; ci < cinfo->num_components; ci++) {
-      if (! component_sent[ci])
-        ERREXIT(cinfo, JERR_MISSING_DATA);
-    }
-  }
-}
-
-#endif /* C_MULTISCAN_FILES_SUPPORTED */
-
-
-LOCAL(void)
-select_scan_parameters (j_compress_ptr cinfo)
-/* Set up the scan parameters for the current scan */
-{
-  int ci;
-
-#ifdef C_MULTISCAN_FILES_SUPPORTED
-  if (cinfo->scan_info != NULL) {
-    /* Prepare for current scan --- the script is already validated */
-    my_master_ptr master = (my_master_ptr) cinfo->master;
-    const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;
-
-    cinfo->comps_in_scan = scanptr->comps_in_scan;
-    for (ci = 0; ci < scanptr->comps_in_scan; ci++) {
-      cinfo->cur_comp_info[ci] =
-        &cinfo->comp_info[scanptr->component_index[ci]];
-    }
-    cinfo->Ss = scanptr->Ss;
-    cinfo->Se = scanptr->Se;
-    cinfo->Ah = scanptr->Ah;
-    cinfo->Al = scanptr->Al;
-  }
-  else
-#endif
-  {
-    /* Prepare for single sequential-JPEG scan containing all components */
-    if (cinfo->num_components > MAX_COMPS_IN_SCAN)
-      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
-               MAX_COMPS_IN_SCAN);
-    cinfo->comps_in_scan = cinfo->num_components;
-    for (ci = 0; ci < cinfo->num_components; ci++) {
-      cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];
-    }
-    cinfo->Ss = 0;
-    cinfo->Se = DCTSIZE2-1;
-    cinfo->Ah = 0;
-    cinfo->Al = 0;
-  }
-}
-
-
-LOCAL(void)
-per_scan_setup (j_compress_ptr cinfo)
-/* Do computations that are needed before processing a JPEG scan */
-/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */
-{
-  int ci, mcublks, tmp;
-  jpeg_component_info *compptr;
-
-  if (cinfo->comps_in_scan == 1) {
-
-    /* Noninterleaved (single-component) scan */
-    compptr = cinfo->cur_comp_info[0];
-
-    /* Overall image size in MCUs */
-    cinfo->MCUs_per_row = compptr->width_in_blocks;
-    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
-
-    /* For noninterleaved scan, always one block per MCU */
-    compptr->MCU_width = 1;
-    compptr->MCU_height = 1;
-    compptr->MCU_blocks = 1;
-    compptr->MCU_sample_width = DCTSIZE;
-    compptr->last_col_width = 1;
-    /* For noninterleaved scans, it is convenient to define last_row_height
-     * as the number of block rows present in the last iMCU row.
-     */
-    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
-    if (tmp == 0) tmp = compptr->v_samp_factor;
-    compptr->last_row_height = tmp;
-
-    /* Prepare array describing MCU composition */
-    cinfo->blocks_in_MCU = 1;
-    cinfo->MCU_membership[0] = 0;
-
-  } else {
-
-    /* Interleaved (multi-component) scan */
-    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
-      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
-               MAX_COMPS_IN_SCAN);
-
-    /* Overall image size in MCUs */
-    cinfo->MCUs_per_row = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width,
-                    (long) (cinfo->max_h_samp_factor*DCTSIZE));
-    cinfo->MCU_rows_in_scan = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height,
-                    (long) (cinfo->max_v_samp_factor*DCTSIZE));
-
-    cinfo->blocks_in_MCU = 0;
-
-    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-      compptr = cinfo->cur_comp_info[ci];
-      /* Sampling factors give # of blocks of component in each MCU */
-      compptr->MCU_width = compptr->h_samp_factor;
-      compptr->MCU_height = compptr->v_samp_factor;
-      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
-      compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE;
-      /* Figure number of non-dummy blocks in last MCU column & row */
-      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
-      if (tmp == 0) tmp = compptr->MCU_width;
-      compptr->last_col_width = tmp;
-      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
-      if (tmp == 0) tmp = compptr->MCU_height;
-      compptr->last_row_height = tmp;
-      /* Prepare array describing MCU composition */
-      mcublks = compptr->MCU_blocks;
-      if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)
-        ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
-      while (mcublks-- > 0) {
-        cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
-      }
-    }
-
-  }
-
-  /* Convert restart specified in rows to actual MCU count. */
-  /* Note that count must fit in 16 bits, so we provide limiting. */
-  if (cinfo->restart_in_rows > 0) {
-    long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;
-    cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);
-  }
-}
-
-
-/*
- * Per-pass setup.
- * This is called at the beginning of each pass.  We determine which modules
- * will be active during this pass and give them appropriate start_pass calls.
- * We also set is_last_pass to indicate whether any more passes will be
- * required.
- */
-
-METHODDEF(void)
-prepare_for_pass (j_compress_ptr cinfo)
-{
-  my_master_ptr master = (my_master_ptr) cinfo->master;
-
-  switch (master->pass_type) {
-  case main_pass:
-    /* Initial pass: will collect input data, and do either Huffman
-     * optimization or data output for the first scan.
-     */
-    select_scan_parameters(cinfo);
-    per_scan_setup(cinfo);
-    if (! cinfo->raw_data_in) {
-      (*cinfo->cconvert->start_pass) (cinfo);
-      (*cinfo->downsample->start_pass) (cinfo);
-      (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);
-    }
-    (*cinfo->fdct->start_pass) (cinfo);
-    (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);
-    (*cinfo->coef->start_pass) (cinfo,
-                                (master->total_passes > 1 ?
-                                 JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
-    (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
-    if (cinfo->optimize_coding) {
-      /* No immediate data output; postpone writing frame/scan headers */
-      master->pub.call_pass_startup = FALSE;
-    } else {
-      /* Will write frame/scan headers at first jpeg_write_scanlines call */
-      master->pub.call_pass_startup = TRUE;
-    }
-    break;
-#ifdef ENTROPY_OPT_SUPPORTED
-  case huff_opt_pass:
-    /* Do Huffman optimization for a scan after the first one. */
-    select_scan_parameters(cinfo);
-    per_scan_setup(cinfo);
-    if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) {
-      (*cinfo->entropy->start_pass) (cinfo, TRUE);
-      (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
-      master->pub.call_pass_startup = FALSE;
-      break;
-    }
-    /* Special case: Huffman DC refinement scans need no Huffman table
-     * and therefore we can skip the optimization pass for them.
-     */
-    master->pass_type = output_pass;
-    master->pass_number++;
-    /*FALLTHROUGH*/
-#endif
-  case output_pass:
-    /* Do a data-output pass. */
-    /* We need not repeat per-scan setup if prior optimization pass did it. */
-    if (! cinfo->optimize_coding) {
-      select_scan_parameters(cinfo);
-      per_scan_setup(cinfo);
-    }
-    (*cinfo->entropy->start_pass) (cinfo, FALSE);
-    (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
-    /* We emit frame/scan headers now */
-    if (master->scan_number == 0)
-      (*cinfo->marker->write_frame_header) (cinfo);
-    (*cinfo->marker->write_scan_header) (cinfo);
-    master->pub.call_pass_startup = FALSE;
-    break;
-  default:
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-  }
-
-  master->pub.is_last_pass = (master->pass_number == master->total_passes-1);
-
-  /* Set up progress monitor's pass info if present */
-  if (cinfo->progress != NULL) {
-    cinfo->progress->completed_passes = master->pass_number;
-    cinfo->progress->total_passes = master->total_passes;
-  }
-}
-
-
-/*
- * Special start-of-pass hook.
- * This is called by jpeg_write_scanlines if call_pass_startup is TRUE.
- * In single-pass processing, we need this hook because we don't want to
- * write frame/scan headers during jpeg_start_compress; we want to let the
- * application write COM markers etc. between jpeg_start_compress and the
- * jpeg_write_scanlines loop.
- * In multi-pass processing, this routine is not used.
- */
-
-METHODDEF(void)
-pass_startup (j_compress_ptr cinfo)
-{
-  cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */
-
-  (*cinfo->marker->write_frame_header) (cinfo);
-  (*cinfo->marker->write_scan_header) (cinfo);
-}
-
-
-/*
- * Finish up at end of pass.
- */
-
-METHODDEF(void)
-finish_pass_master (j_compress_ptr cinfo)
-{
-  my_master_ptr master = (my_master_ptr) cinfo->master;
-
-  /* The entropy coder always needs an end-of-pass call,
-   * either to analyze statistics or to flush its output buffer.
-   */
-  (*cinfo->entropy->finish_pass) (cinfo);
-
-  /* Update state for next pass */
-  switch (master->pass_type) {
-  case main_pass:
-    /* next pass is either output of scan 0 (after optimization)
-     * or output of scan 1 (if no optimization).
-     */
-    master->pass_type = output_pass;
-    if (! cinfo->optimize_coding)
-      master->scan_number++;
-    break;
-  case huff_opt_pass:
-    /* next pass is always output of current scan */
-    master->pass_type = output_pass;
-    break;
-  case output_pass:
-    /* next pass is either optimization or output of next scan */
-    if (cinfo->optimize_coding)
-      master->pass_type = huff_opt_pass;
-    master->scan_number++;
-    break;
-  }
-
-  master->pass_number++;
-}
-
-
-/*
- * Initialize master compression control.
- */
-
-GLOBAL(void)
-jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
-{
-  my_master_ptr master;
-
-  master = (my_master_ptr)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  SIZEOF(my_comp_master));
-  cinfo->master = (struct jpeg_comp_master *) master;
-  master->pub.prepare_for_pass = prepare_for_pass;
-  master->pub.pass_startup = pass_startup;
-  master->pub.finish_pass = finish_pass_master;
-  master->pub.is_last_pass = FALSE;
-
-  /* Validate parameters, determine derived values */
-  initial_setup(cinfo);
-
-  if (cinfo->scan_info != NULL) {
-#ifdef C_MULTISCAN_FILES_SUPPORTED
-    validate_script(cinfo);
-#else
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-  } else {
-    cinfo->progressive_mode = FALSE;
-    cinfo->num_scans = 1;
-  }
-
-  if (cinfo->progressive_mode)  /*  TEMPORARY HACK ??? */
-    cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */
-
-  /* Initialize my private state */
-  if (transcode_only) {
-    /* no main pass in transcoding */
-    if (cinfo->optimize_coding)
-      master->pass_type = huff_opt_pass;
-    else
-      master->pass_type = output_pass;
-  } else {
-    /* for normal compression, first pass is always this type: */
-    master->pass_type = main_pass;
-  }
-  master->scan_number = 0;
-  master->pass_number = 0;
-  if (cinfo->optimize_coding)
-    master->total_passes = cinfo->num_scans * 2;
-  else
-    master->total_passes = cinfo->num_scans;
-}
--- a/src/share/native/sun/awt/image/jpeg/jcomapi.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcomapi.c
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface routines that are used for both
- * compression and decompression.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Abort processing of a JPEG compression or decompression operation,
- * but don't destroy the object itself.
- *
- * For this, we merely clean up all the nonpermanent memory pools.
- * Note that temp files (virtual arrays) are not allowed to belong to
- * the permanent pool, so we will be able to close all temp files here.
- * Closing a data source or destination, if necessary, is the application's
- * responsibility.
- */
-
-GLOBAL(void)
-jpeg_abort (j_common_ptr cinfo)
-{
-  int pool;
-
-  /* Do nothing if called on a not-initialized or destroyed JPEG object. */
-  if (cinfo->mem == NULL)
-    return;
-
-  /* Releasing pools in reverse order might help avoid fragmentation
-   * with some (brain-damaged) malloc libraries.
-   */
-  for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {
-    (*cinfo->mem->free_pool) (cinfo, pool);
-  }
-
-  /* Reset overall state for possible reuse of object */
-  if (cinfo->is_decompressor) {
-    cinfo->global_state = DSTATE_START;
-    /* Try to keep application from accessing now-deleted marker list.
-     * A bit kludgy to do it here, but this is the most central place.
-     */
-    ((j_decompress_ptr) cinfo)->marker_list = NULL;
-  } else {
-    cinfo->global_state = CSTATE_START;
-  }
-}
-
-
-/*
- * Destruction of a JPEG object.
- *
- * Everything gets deallocated except the master jpeg_compress_struct itself
- * and the error manager struct.  Both of these are supplied by the application
- * and must be freed, if necessary, by the application.  (Often they are on
- * the stack and so don't need to be freed anyway.)
- * Closing a data source or destination, if necessary, is the application's
- * responsibility.
- */
-
-GLOBAL(void)
-jpeg_destroy (j_common_ptr cinfo)
-{
-  /* We need only tell the memory manager to release everything. */
-  /* NB: mem pointer is NULL if memory mgr failed to initialize. */
-  if (cinfo->mem != NULL)
-    (*cinfo->mem->self_destruct) (cinfo);
-  cinfo->mem = NULL;            /* be safe if jpeg_destroy is called twice */
-  cinfo->global_state = 0;      /* mark it destroyed */
-}
-
-
-/*
- * Convenience routines for allocating quantization and Huffman tables.
- * (Would jutils.c be a more reasonable place to put these?)
- */
-
-GLOBAL(JQUANT_TBL *)
-jpeg_alloc_quant_table (j_common_ptr cinfo)
-{
-  JQUANT_TBL *tbl;
-
-  tbl = (JQUANT_TBL *)
-    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));
-  tbl->sent_table = FALSE;      /* make sure this is false in any new table */
-  return tbl;
-}
-
-
-GLOBAL(JHUFF_TBL *)
-jpeg_alloc_huff_table (j_common_ptr cinfo)
-{
-  JHUFF_TBL *tbl;
-
-  tbl = (JHUFF_TBL *)
-    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));
-  tbl->sent_table = FALSE;      /* make sure this is false in any new table */
-  return tbl;
-}
--- a/src/share/native/sun/awt/image/jpeg/jconfig.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/* jconfig.cfg --- source file edited by configure script */
-/* see jconfig.doc for explanations */
-
-#define HAVE_PROTOTYPES
-#define HAVE_UNSIGNED_CHAR
-#define HAVE_UNSIGNED_SHORT
-#undef void
-#undef const
-#undef CHAR_IS_UNSIGNED
-#define HAVE_STDDEF_H
-#define HAVE_STDLIB_H
-#undef NEED_BSD_STRINGS
-#undef NEED_SYS_TYPES_H
-#undef NEED_FAR_POINTERS
-#define NEED_SHORT_EXTERNAL_NAMES
-/* Define this if you get warnings about undefined structures. */
-#undef INCOMPLETE_TYPES_BROKEN
-
-#ifdef JPEG_INTERNALS
-
-#undef RIGHT_SHIFT_IS_UNSIGNED
-/* These are for configuring the JPEG memory manager. */
-#undef DEFAULT_MAX_MEM
-#undef NO_MKTEMP
-
-#endif /* JPEG_INTERNALS */
-
-#ifdef JPEG_CJPEG_DJPEG
-
-#define BMP_SUPPORTED           /* BMP image file format */
-#define GIF_SUPPORTED           /* GIF image file format */
-#define PPM_SUPPORTED           /* PBMPLUS PPM/PGM image file format */
-#undef RLE_SUPPORTED            /* Utah RLE image file format */
-#define TARGA_SUPPORTED         /* Targa image file format */
-
-#undef TWO_FILE_COMMANDLINE
-#undef NEED_SIGNAL_CATCHER
-#undef DONT_USE_B_MODE
-
-/* Define this if you want percent-done progress reports from cjpeg/djpeg. */
-#undef PROGRESS_REPORT
-
-#endif /* JPEG_CJPEG_DJPEG */
--- a/src/share/native/sun/awt/image/jpeg/jcparam.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,614 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcparam.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains optional default-setting code for the JPEG compressor.
- * Applications do not have to use this file, but those that don't use it
- * must know a lot more about the innards of the JPEG code.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Quantization table setup routines
- */
-
-GLOBAL(void)
-jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
-                      const unsigned int *basic_table,
-                      int scale_factor, boolean force_baseline)
-/* Define a quantization table equal to the basic_table times
- * a scale factor (given as a percentage).
- * If force_baseline is TRUE, the computed quantization table entries
- * are limited to 1..255 for JPEG baseline compatibility.
- */
-{
-  JQUANT_TBL ** qtblptr;
-  int i;
-  long temp;
-
-  /* Safety check to ensure start_compress not called yet. */
-  if (cinfo->global_state != CSTATE_START)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)
-    ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);
-
-  qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];
-
-  if (*qtblptr == NULL)
-    *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);
-
-  for (i = 0; i < DCTSIZE2; i++) {
-    temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;
-    /* limit the values to the valid range */
-    if (temp <= 0L) temp = 1L;
-    if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */
-    if (force_baseline && temp > 255L)
-      temp = 255L;              /* limit to baseline range if requested */
-    (*qtblptr)->quantval[i] = (UINT16) temp;
-  }
-
-  /* Initialize sent_table FALSE so table will be written to JPEG file. */
-  (*qtblptr)->sent_table = FALSE;
-}
-
-
-GLOBAL(void)
-jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,
-                         boolean force_baseline)
-/* Set or change the 'quality' (quantization) setting, using default tables
- * and a straight percentage-scaling quality scale.  In most cases it's better
- * to use jpeg_set_quality (below); this entry point is provided for
- * applications that insist on a linear percentage scaling.
- */
-{
-  /* These are the sample quantization tables given in JPEG spec section K.1.
-   * The spec says that the values given produce "good" quality, and
-   * when divided by 2, "very good" quality.
-   */
-  static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
-    16,  11,  10,  16,  24,  40,  51,  61,
-    12,  12,  14,  19,  26,  58,  60,  55,
-    14,  13,  16,  24,  40,  57,  69,  56,
-    14,  17,  22,  29,  51,  87,  80,  62,
-    18,  22,  37,  56,  68, 109, 103,  77,
-    24,  35,  55,  64,  81, 104, 113,  92,
-    49,  64,  78,  87, 103, 121, 120, 101,
-    72,  92,  95,  98, 112, 100, 103,  99
-  };
-  static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
-    17,  18,  24,  47,  99,  99,  99,  99,
-    18,  21,  26,  66,  99,  99,  99,  99,
-    24,  26,  56,  99,  99,  99,  99,  99,
-    47,  66,  99,  99,  99,  99,  99,  99,
-    99,  99,  99,  99,  99,  99,  99,  99,
-    99,  99,  99,  99,  99,  99,  99,  99,
-    99,  99,  99,  99,  99,  99,  99,  99,
-    99,  99,  99,  99,  99,  99,  99,  99
-  };
-
-  /* Set up two quantization tables using the specified scaling */
-  jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
-                       scale_factor, force_baseline);
-  jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
-                       scale_factor, force_baseline);
-}
-
-
-GLOBAL(int)
-jpeg_quality_scaling (int quality)
-/* Convert a user-specified quality rating to a percentage scaling factor
- * for an underlying quantization table, using our recommended scaling curve.
- * The input 'quality' factor should be 0 (terrible) to 100 (very good).
- */
-{
-  /* Safety limit on quality factor.  Convert 0 to 1 to avoid zero divide. */
-  if (quality <= 0) quality = 1;
-  if (quality > 100) quality = 100;
-
-  /* The basic table is used as-is (scaling 100) for a quality of 50.
-   * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;
-   * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table
-   * to make all the table entries 1 (hence, minimum quantization loss).
-   * Qualities 1..50 are converted to scaling percentage 5000/Q.
-   */
-  if (quality < 50)
-    quality = 5000 / quality;
-  else
-    quality = 200 - quality*2;
-
-  return quality;
-}
-
-
-GLOBAL(void)
-jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
-/* Set or change the 'quality' (quantization) setting, using default tables.
- * This is the standard quality-adjusting entry point for typical user
- * interfaces; only those who want detailed control over quantization tables
- * would use the preceding three routines directly.
- */
-{
-  /* Convert user 0-100 rating to percentage scaling */
-  quality = jpeg_quality_scaling(quality);
-
-  /* Set up standard quality tables */
-  jpeg_set_linear_quality(cinfo, quality, force_baseline);
-}
-
-
-/*
- * Huffman table setup routines
- */
-
-LOCAL(void)
-add_huff_table (j_compress_ptr cinfo,
-                JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
-/* Define a Huffman table */
-{
-  int nsymbols, len;
-
-  if (*htblptr == NULL)
-    *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
-
-  /* Copy the number-of-symbols-of-each-code-length counts */
-  MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
-
-  /* Validate the counts.  We do this here mainly so we can copy the right
-   * number of symbols from the val[] array, without risking marching off
-   * the end of memory.  jchuff.c will do a more thorough test later.
-   */
-  nsymbols = 0;
-  for (len = 1; len <= 16; len++)
-    nsymbols += bits[len];
-  if (nsymbols < 1 || nsymbols > 256)
-    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-
-  MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
-
-  /* Initialize sent_table FALSE so table will be written to JPEG file. */
-  (*htblptr)->sent_table = FALSE;
-}
-
-
-LOCAL(void)
-std_huff_tables (j_compress_ptr cinfo)
-/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
-/* IMPORTANT: these are only valid for 8-bit data precision! */
-{
-  static const UINT8 bits_dc_luminance[17] =
-    { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
-  static const UINT8 val_dc_luminance[] =
-    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
-
-  static const UINT8 bits_dc_chrominance[17] =
-    { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
-  static const UINT8 val_dc_chrominance[] =
-    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
-
-  static const UINT8 bits_ac_luminance[17] =
-    { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
-  static const UINT8 val_ac_luminance[] =
-    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
-      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
-      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
-      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
-      0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
-      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
-      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
-      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
-      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
-      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
-      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
-      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
-      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
-      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
-      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
-      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
-      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
-      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
-      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
-      0xf9, 0xfa };
-
-  static const UINT8 bits_ac_chrominance[17] =
-    { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
-  static const UINT8 val_ac_chrominance[] =
-    { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
-      0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
-      0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
-      0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
-      0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
-      0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
-      0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
-      0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
-      0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
-      0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
-      0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
-      0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-      0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
-      0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
-      0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
-      0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
-      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
-      0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
-      0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
-      0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
-      0xf9, 0xfa };
-
-  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
-                 bits_dc_luminance, val_dc_luminance);
-  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
-                 bits_ac_luminance, val_ac_luminance);
-  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
-                 bits_dc_chrominance, val_dc_chrominance);
-  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
-                 bits_ac_chrominance, val_ac_chrominance);
-}
-
-
-/*
- * Default parameter setup for compression.
- *
- * Applications that don't choose to use this routine must do their
- * own setup of all these parameters.  Alternately, you can call this
- * to establish defaults and then alter parameters selectively.  This
- * is the recommended approach since, if we add any new parameters,
- * your code will still work (they'll be set to reasonable defaults).
- */
-
-GLOBAL(void)
-jpeg_set_defaults (j_compress_ptr cinfo)
-{
-  int i;
-
-  /* Safety check to ensure start_compress not called yet. */
-  if (cinfo->global_state != CSTATE_START)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  /* Allocate comp_info array large enough for maximum component count.
-   * Array is made permanent in case application wants to compress
-   * multiple images at same param settings.
-   */
-  if (cinfo->comp_info == NULL)
-    cinfo->comp_info = (jpeg_component_info *)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
-                                  MAX_COMPONENTS * SIZEOF(jpeg_component_info));
-
-  /* Initialize everything not dependent on the color space */
-
-  cinfo->data_precision = BITS_IN_JSAMPLE;
-  /* Set up two quantization tables using default quality of 75 */
-  jpeg_set_quality(cinfo, 75, TRUE);
-  /* Set up two Huffman tables */
-  std_huff_tables(cinfo);
-
-  /* Initialize default arithmetic coding conditioning */
-  for (i = 0; i < NUM_ARITH_TBLS; i++) {
-    cinfo->arith_dc_L[i] = 0;
-    cinfo->arith_dc_U[i] = 1;
-    cinfo->arith_ac_K[i] = 5;
-  }
-
-  /* Default is no multiple-scan output */
-  cinfo->scan_info = NULL;
-  cinfo->num_scans = 0;
-
-  /* Expect normal source image, not raw downsampled data */
-  cinfo->raw_data_in = FALSE;
-
-  /* Use Huffman coding, not arithmetic coding, by default */
-  cinfo->arith_code = FALSE;
-
-  /* By default, don't do extra passes to optimize entropy coding */
-  cinfo->optimize_coding = FALSE;
-  /* The standard Huffman tables are only valid for 8-bit data precision.
-   * If the precision is higher, force optimization on so that usable
-   * tables will be computed.  This test can be removed if default tables
-   * are supplied that are valid for the desired precision.
-   */
-  if (cinfo->data_precision > 8)
-    cinfo->optimize_coding = TRUE;
-
-  /* By default, use the simpler non-cosited sampling alignment */
-  cinfo->CCIR601_sampling = FALSE;
-
-  /* No input smoothing */
-  cinfo->smoothing_factor = 0;
-
-  /* DCT algorithm preference */
-  cinfo->dct_method = JDCT_DEFAULT;
-
-  /* No restart markers */
-  cinfo->restart_interval = 0;
-  cinfo->restart_in_rows = 0;
-
-  /* Fill in default JFIF marker parameters.  Note that whether the marker
-   * will actually be written is determined by jpeg_set_colorspace.
-   *
-   * By default, the library emits JFIF version code 1.01.
-   * An application that wants to emit JFIF 1.02 extension markers should set
-   * JFIF_minor_version to 2.  We could probably get away with just defaulting
-   * to 1.02, but there may still be some decoders in use that will complain
-   * about that; saying 1.01 should minimize compatibility problems.
-   */
-  cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
-  cinfo->JFIF_minor_version = 1;
-  cinfo->density_unit = 0;      /* Pixel size is unknown by default */
-  cinfo->X_density = 1;         /* Pixel aspect ratio is square by default */
-  cinfo->Y_density = 1;
-
-  /* Choose JPEG colorspace based on input space, set defaults accordingly */
-
-  jpeg_default_colorspace(cinfo);
-}
-
-
-/*
- * Select an appropriate JPEG colorspace for in_color_space.
- */
-
-GLOBAL(void)
-jpeg_default_colorspace (j_compress_ptr cinfo)
-{
-  switch (cinfo->in_color_space) {
-  case JCS_GRAYSCALE:
-    jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
-    break;
-  case JCS_RGB:
-    jpeg_set_colorspace(cinfo, JCS_YCbCr);
-    break;
-  case JCS_YCbCr:
-    jpeg_set_colorspace(cinfo, JCS_YCbCr);
-    break;
-  case JCS_CMYK:
-    jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */
-    break;
-  case JCS_YCCK:
-    jpeg_set_colorspace(cinfo, JCS_YCCK);
-    break;
-  case JCS_UNKNOWN:
-    jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
-    break;
-  default:
-    ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
-  }
-}
-
-
-/*
- * Set the JPEG colorspace, and choose colorspace-dependent default values.
- */
-
-GLOBAL(void)
-jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
-{
-  jpeg_component_info * compptr;
-  int ci;
-
-#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl)  \
-  (compptr = &cinfo->comp_info[index], \
-   compptr->component_id = (id), \
-   compptr->h_samp_factor = (hsamp), \
-   compptr->v_samp_factor = (vsamp), \
-   compptr->quant_tbl_no = (quant), \
-   compptr->dc_tbl_no = (dctbl), \
-   compptr->ac_tbl_no = (actbl) )
-
-  /* Safety check to ensure start_compress not called yet. */
-  if (cinfo->global_state != CSTATE_START)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  /* For all colorspaces, we use Q and Huff tables 0 for luminance components,
-   * tables 1 for chrominance components.
-   */
-
-  cinfo->jpeg_color_space = colorspace;
-
-  cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */
-  cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
-
-  switch (colorspace) {
-  case JCS_GRAYSCALE:
-    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
-    cinfo->num_components = 1;
-    /* JFIF specifies component ID 1 */
-    SET_COMP(0, 1, 1,1, 0, 0,0);
-    break;
-  case JCS_RGB:
-    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
-    cinfo->num_components = 3;
-    SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
-    SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
-    SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
-    break;
-  case JCS_YCbCr:
-    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
-    cinfo->num_components = 3;
-    /* JFIF specifies component IDs 1,2,3 */
-    /* We default to 2x2 subsamples of chrominance */
-    SET_COMP(0, 1, 2,2, 0, 0,0);
-    SET_COMP(1, 2, 1,1, 1, 1,1);
-    SET_COMP(2, 3, 1,1, 1, 1,1);
-    break;
-  case JCS_CMYK:
-    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
-    cinfo->num_components = 4;
-    SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);
-    SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);
-    SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);
-    SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);
-    break;
-  case JCS_YCCK:
-    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
-    cinfo->num_components = 4;
-    SET_COMP(0, 1, 2,2, 0, 0,0);
-    SET_COMP(1, 2, 1,1, 1, 1,1);
-    SET_COMP(2, 3, 1,1, 1, 1,1);
-    SET_COMP(3, 4, 2,2, 0, 0,0);
-    break;
-  case JCS_UNKNOWN:
-    cinfo->num_components = cinfo->input_components;
-    if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
-      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
-               MAX_COMPONENTS);
-    for (ci = 0; ci < cinfo->num_components; ci++) {
-      SET_COMP(ci, ci, 1,1, 0, 0,0);
-    }
-    break;
-  default:
-    ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-  }
-}
-
-
-#ifdef C_PROGRESSIVE_SUPPORTED
-
-LOCAL(jpeg_scan_info *)
-fill_a_scan (jpeg_scan_info * scanptr, int ci,
-             int Ss, int Se, int Ah, int Al)
-/* Support routine: generate one scan for specified component */
-{
-  scanptr->comps_in_scan = 1;
-  scanptr->component_index[0] = ci;
-  scanptr->Ss = Ss;
-  scanptr->Se = Se;
-  scanptr->Ah = Ah;
-  scanptr->Al = Al;
-  scanptr++;
-  return scanptr;
-}
-
-LOCAL(jpeg_scan_info *)
-fill_scans (jpeg_scan_info * scanptr, int ncomps,
-            int Ss, int Se, int Ah, int Al)
-/* Support routine: generate one scan for each component */
-{
-  int ci;
-
-  for (ci = 0; ci < ncomps; ci++) {
-    scanptr->comps_in_scan = 1;
-    scanptr->component_index[0] = ci;
-    scanptr->Ss = Ss;
-    scanptr->Se = Se;
-    scanptr->Ah = Ah;
-    scanptr->Al = Al;
-    scanptr++;
-  }
-  return scanptr;
-}
-
-LOCAL(jpeg_scan_info *)
-fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)
-/* Support routine: generate interleaved DC scan if possible, else N scans */
-{
-  int ci;
-
-  if (ncomps <= MAX_COMPS_IN_SCAN) {
-    /* Single interleaved DC scan */
-    scanptr->comps_in_scan = ncomps;
-    for (ci = 0; ci < ncomps; ci++)
-      scanptr->component_index[ci] = ci;
-    scanptr->Ss = scanptr->Se = 0;
-    scanptr->Ah = Ah;
-    scanptr->Al = Al;
-    scanptr++;
-  } else {
-    /* Noninterleaved DC scan for each component */
-    scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
-  }
-  return scanptr;
-}
-
-
-/*
- * Create a recommended progressive-JPEG script.
- * cinfo->num_components and cinfo->jpeg_color_space must be correct.
- */
-
-GLOBAL(void)
-jpeg_simple_progression (j_compress_ptr cinfo)
-{
-  int ncomps = cinfo->num_components;
-  int nscans;
-  jpeg_scan_info * scanptr;
-
-  /* Safety check to ensure start_compress not called yet. */
-  if (cinfo->global_state != CSTATE_START)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  /* Figure space needed for script.  Calculation must match code below! */
-  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
-    /* Custom script for YCbCr color images. */
-    nscans = 10;
-  } else {
-    /* All-purpose script for other color spaces. */
-    if (ncomps > MAX_COMPS_IN_SCAN)
-      nscans = 6 * ncomps;      /* 2 DC + 4 AC scans per component */
-    else
-      nscans = 2 + 4 * ncomps;  /* 2 DC scans; 4 AC scans per component */
-  }
-
-  /* Allocate space for script.
-   * We need to put it in the permanent pool in case the application performs
-   * multiple compressions without changing the settings.  To avoid a memory
-   * leak if jpeg_simple_progression is called repeatedly for the same JPEG
-   * object, we try to re-use previously allocated space, and we allocate
-   * enough space to handle YCbCr even if initially asked for grayscale.
-   */
-  if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
-    cinfo->script_space_size = MAX(nscans, 10);
-    cinfo->script_space = (jpeg_scan_info *)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
-                        cinfo->script_space_size * SIZEOF(jpeg_scan_info));
-  }
-  scanptr = cinfo->script_space;
-  cinfo->scan_info = scanptr;
-  cinfo->num_scans = nscans;
-
-  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
-    /* Custom script for YCbCr color images. */
-    /* Initial DC scan */
-    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
-    /* Initial AC scan: get some luma data out in a hurry */
-    scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);
-    /* Chroma data is too small to be worth expending many scans on */
-    scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
-    scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);
-    /* Complete spectral selection for luma AC */
-    scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);
-    /* Refine next bit of luma AC */
-    scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);
-    /* Finish DC successive approximation */
-    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
-    /* Finish AC successive approximation */
-    scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
-    scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);
-    /* Luma bottom bit comes last since it's usually largest scan */
-    scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
-  } else {
-    /* All-purpose script for other color spaces. */
-    /* Successive approximation first pass */
-    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
-    scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
-    scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);
-    /* Successive approximation second pass */
-    scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);
-    /* Successive approximation final pass */
-    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
-    scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
-  }
-}
-
-#endif /* C_PROGRESSIVE_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jcphuff.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,837 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcphuff.c
- *
- * Copyright (C) 1995-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains Huffman entropy encoding routines for progressive JPEG.
- *
- * We do not support output suspension in this module, since the library
- * currently does not allow multiple-scan files to be written with output
- * suspension.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jchuff.h"             /* Declarations shared with jchuff.c */
-
-#ifdef C_PROGRESSIVE_SUPPORTED
-
-/* Expanded entropy encoder object for progressive Huffman encoding. */
-
-typedef struct {
-  struct jpeg_entropy_encoder pub; /* public fields */
-
-  /* Mode flag: TRUE for optimization, FALSE for actual data output */
-  boolean gather_statistics;
-
-  /* Bit-level coding status.
-   * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.
-   */
-  JOCTET * next_output_byte;    /* => next byte to write in buffer */
-  size_t free_in_buffer;        /* # of byte spaces remaining in buffer */
-  INT32 put_buffer;             /* current bit-accumulation buffer */
-  int put_bits;                 /* # of bits now in it */
-  j_compress_ptr cinfo;         /* link to cinfo (needed for dump_buffer) */
-
-  /* Coding status for DC components */
-  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-
-  /* Coding status for AC components */
-  int ac_tbl_no;                /* the table number of the single component */
-  unsigned int EOBRUN;          /* run length of EOBs */
-  unsigned int BE;              /* # of buffered correction bits before MCU */
-  char * bit_buffer;            /* buffer for correction bits (1 per char) */
-  /* packing correction bits tightly would save some space but cost time... */
-
-  unsigned int restarts_to_go;  /* MCUs left in this restart interval */
-  int next_restart_num;         /* next restart number to write (0-7) */
-
-  /* Pointers to derived tables (these workspaces have image lifespan).
-   * Since any one scan codes only DC or only AC, we only need one set
-   * of tables, not one for DC and one for AC.
-   */
-  c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
-
-  /* Statistics tables for optimization; again, one set is enough */
-  long * count_ptrs[NUM_HUFF_TBLS];
-} phuff_entropy_encoder;
-
-typedef phuff_entropy_encoder * phuff_entropy_ptr;
-
-/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit
- * buffer can hold.  Larger sizes may slightly improve compression, but
- * 1000 is already well into the realm of overkill.
- * The minimum safe size is 64 bits.
- */
-
-#define MAX_CORR_BITS  1000     /* Max # of correction bits I can buffer */
-
-/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
- * We assume that int right shift is unsigned if INT32 right shift is,
- * which should be safe.
- */
-
-#ifdef RIGHT_SHIFT_IS_UNSIGNED
-#define ISHIFT_TEMPS    int ishift_temp;
-#define IRIGHT_SHIFT(x,shft)  \
-        ((ishift_temp = (x)) < 0 ? \
-         (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
-         (ishift_temp >> (shft)))
-#else
-#define ISHIFT_TEMPS
-#define IRIGHT_SHIFT(x,shft)    ((x) >> (shft))
-#endif
-
-/* Forward declarations */
-METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,
-                                            JBLOCKROW *MCU_data));
-METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,
-                                            JBLOCKROW *MCU_data));
-METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,
-                                             JBLOCKROW *MCU_data));
-METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,
-                                             JBLOCKROW *MCU_data));
-METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));
-METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));
-
-
-/*
- * Initialize for a Huffman-compressed scan using progressive JPEG.
- */
-
-METHODDEF(void)
-start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  boolean is_DC_band;
-  int ci, tbl;
-  jpeg_component_info * compptr;
-
-  entropy->cinfo = cinfo;
-  entropy->gather_statistics = gather_statistics;
-
-  is_DC_band = (cinfo->Ss == 0);
-
-  /* We assume jcmaster.c already validated the scan parameters. */
-
-  /* Select execution routines */
-  if (cinfo->Ah == 0) {
-    if (is_DC_band)
-      entropy->pub.encode_mcu = encode_mcu_DC_first;
-    else
-      entropy->pub.encode_mcu = encode_mcu_AC_first;
-  } else {
-    if (is_DC_band)
-      entropy->pub.encode_mcu = encode_mcu_DC_refine;
-    else {
-      entropy->pub.encode_mcu = encode_mcu_AC_refine;
-      /* AC refinement needs a correction bit buffer */
-      if (entropy->bit_buffer == NULL)
-        entropy->bit_buffer = (char *)
-          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                      MAX_CORR_BITS * SIZEOF(char));
-    }
-  }
-  if (gather_statistics)
-    entropy->pub.finish_pass = finish_pass_gather_phuff;
-  else
-    entropy->pub.finish_pass = finish_pass_phuff;
-
-  /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
-   * for AC coefficients.
-   */
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    /* Initialize DC predictions to 0 */
-    entropy->last_dc_val[ci] = 0;
-    /* Get table index */
-    if (is_DC_band) {
-      if (cinfo->Ah != 0)       /* DC refinement needs no table */
-        continue;
-      tbl = compptr->dc_tbl_no;
-    } else {
-      entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
-    }
-    if (gather_statistics) {
-      /* Check for invalid table index */
-      /* (make_c_derived_tbl does this in the other path) */
-      if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
-        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
-      /* Allocate and zero the statistics tables */
-      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
-      if (entropy->count_ptrs[tbl] == NULL)
-        entropy->count_ptrs[tbl] = (long *)
-          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                      257 * SIZEOF(long));
-      MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
-    } else {
-      /* Compute derived values for Huffman table */
-      /* We may do this more than once for a table, but it's not expensive */
-      jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,
-                              & entropy->derived_tbls[tbl]);
-    }
-  }
-
-  /* Initialize AC stuff */
-  entropy->EOBRUN = 0;
-  entropy->BE = 0;
-
-  /* Initialize bit buffer to empty */
-  entropy->put_buffer = 0;
-  entropy->put_bits = 0;
-
-  /* Initialize restart stuff */
-  entropy->restarts_to_go = cinfo->restart_interval;
-  entropy->next_restart_num = 0;
-}
-
-
-/* Outputting bytes to the file.
- * NB: these must be called only when actually outputting,
- * that is, entropy->gather_statistics == FALSE.
- */
-
-/* Emit a byte */
-#define emit_byte(entropy,val)  \
-        { *(entropy)->next_output_byte++ = (JOCTET) (val);  \
-          if (--(entropy)->free_in_buffer == 0)  \
-            dump_buffer(entropy); }
-
-
-LOCAL(void)
-dump_buffer (phuff_entropy_ptr entropy)
-/* Empty the output buffer; we do not support suspension in this module. */
-{
-  struct jpeg_destination_mgr * dest = entropy->cinfo->dest;
-
-  if (! (*dest->empty_output_buffer) (entropy->cinfo))
-    ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);
-  /* After a successful buffer dump, must reset buffer pointers */
-  entropy->next_output_byte = dest->next_output_byte;
-  entropy->free_in_buffer = dest->free_in_buffer;
-}
-
-
-/* Outputting bits to the file */
-
-/* Only the right 24 bits of put_buffer are used; the valid bits are
- * left-justified in this part.  At most 16 bits can be passed to emit_bits
- * in one call, and we never retain more than 7 bits in put_buffer
- * between calls, so 24 bits are sufficient.
- */
-
-INLINE
-LOCAL(void)
-emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)
-/* Emit some bits, unless we are in gather mode */
-{
-  /* This routine is heavily used, so it's worth coding tightly. */
-  register INT32 put_buffer = (INT32) code;
-  register int put_bits = entropy->put_bits;
-
-  /* if size is 0, caller used an invalid Huffman table entry */
-  if (size == 0)
-    ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
-
-  if (entropy->gather_statistics)
-    return;                     /* do nothing if we're only getting stats */
-
-  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
-
-  put_bits += size;             /* new number of bits in buffer */
-
-  put_buffer <<= 24 - put_bits; /* align incoming bits */
-
-  put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */
-
-  while (put_bits >= 8) {
-    int c = (int) ((put_buffer >> 16) & 0xFF);
-
-    emit_byte(entropy, c);
-    if (c == 0xFF) {            /* need to stuff a zero byte? */
-      emit_byte(entropy, 0);
-    }
-    put_buffer <<= 8;
-    put_bits -= 8;
-  }
-
-  entropy->put_buffer = put_buffer; /* update variables */
-  entropy->put_bits = put_bits;
-}
-
-
-LOCAL(void)
-flush_bits (phuff_entropy_ptr entropy)
-{
-  emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */
-  entropy->put_buffer = 0;     /* and reset bit-buffer to empty */
-  entropy->put_bits = 0;
-}
-
-
-/*
- * Emit (or just count) a Huffman symbol.
- */
-
-INLINE
-LOCAL(void)
-emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)
-{
-  if (entropy->gather_statistics)
-    entropy->count_ptrs[tbl_no][symbol]++;
-  else {
-    c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];
-    emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
-  }
-}
-
-
-/*
- * Emit bits from a correction bit buffer.
- */
-
-LOCAL(void)
-emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,
-                    unsigned int nbits)
-{
-  if (entropy->gather_statistics)
-    return;                     /* no real work */
-
-  while (nbits > 0) {
-    emit_bits(entropy, (unsigned int) (*bufstart), 1);
-    bufstart++;
-    nbits--;
-  }
-}
-
-
-/*
- * Emit any pending EOBRUN symbol.
- */
-
-LOCAL(void)
-emit_eobrun (phuff_entropy_ptr entropy)
-{
-  register int temp, nbits;
-
-  if (entropy->EOBRUN > 0) {    /* if there is any pending EOBRUN */
-    temp = entropy->EOBRUN;
-    nbits = 0;
-    while ((temp >>= 1))
-      nbits++;
-    /* safety check: shouldn't happen given limited correction-bit buffer */
-    if (nbits > 14)
-      ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
-
-    emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
-    if (nbits)
-      emit_bits(entropy, entropy->EOBRUN, nbits);
-
-    entropy->EOBRUN = 0;
-
-    /* Emit any buffered correction bits */
-    emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);
-    entropy->BE = 0;
-  }
-}
-
-
-/*
- * Emit a restart marker & resynchronize predictions.
- */
-
-LOCAL(void)
-emit_restart (phuff_entropy_ptr entropy, int restart_num)
-{
-  int ci;
-
-  emit_eobrun(entropy);
-
-  if (! entropy->gather_statistics) {
-    flush_bits(entropy);
-    emit_byte(entropy, 0xFF);
-    emit_byte(entropy, JPEG_RST0 + restart_num);
-  }
-
-  if (entropy->cinfo->Ss == 0) {
-    /* Re-initialize DC predictions to 0 */
-    for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)
-      entropy->last_dc_val[ci] = 0;
-  } else {
-    /* Re-initialize all AC-related fields to 0 */
-    entropy->EOBRUN = 0;
-    entropy->BE = 0;
-  }
-}
-
-
-/*
- * MCU encoding for DC initial scan (either spectral selection,
- * or first pass of successive approximation).
- */
-
-METHODDEF(boolean)
-encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  register int temp, temp2;
-  register int nbits;
-  int blkn, ci;
-  int Al = cinfo->Al;
-  JBLOCKROW block;
-  jpeg_component_info * compptr;
-  ISHIFT_TEMPS
-
-  entropy->next_output_byte = cinfo->dest->next_output_byte;
-  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
-  /* Emit restart marker if needed */
-  if (cinfo->restart_interval)
-    if (entropy->restarts_to_go == 0)
-      emit_restart(entropy, entropy->next_restart_num);
-
-  /* Encode the MCU data blocks */
-  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-    block = MCU_data[blkn];
-    ci = cinfo->MCU_membership[blkn];
-    compptr = cinfo->cur_comp_info[ci];
-
-    /* Compute the DC value after the required point transform by Al.
-     * This is simply an arithmetic right shift.
-     */
-    temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
-
-    /* DC differences are figured on the point-transformed values. */
-    temp = temp2 - entropy->last_dc_val[ci];
-    entropy->last_dc_val[ci] = temp2;
-
-    /* Encode the DC coefficient difference per section G.1.2.1 */
-    temp2 = temp;
-    if (temp < 0) {
-      temp = -temp;             /* temp is abs value of input */
-      /* For a negative input, want temp2 = bitwise complement of abs(input) */
-      /* This code assumes we are on a two's complement machine */
-      temp2--;
-    }
-
-    /* Find the number of bits needed for the magnitude of the coefficient */
-    nbits = 0;
-    while (temp) {
-      nbits++;
-      temp >>= 1;
-    }
-    /* Check for out-of-range coefficient values.
-     * Since we're encoding a difference, the range limit is twice as much.
-     */
-    if (nbits > MAX_COEF_BITS+1)
-      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
-    /* Count/emit the Huffman-coded symbol for the number of bits */
-    emit_symbol(entropy, compptr->dc_tbl_no, nbits);
-
-    /* Emit that number of bits of the value, if positive, */
-    /* or the complement of its magnitude, if negative. */
-    if (nbits)                  /* emit_bits rejects calls with size 0 */
-      emit_bits(entropy, (unsigned int) temp2, nbits);
-  }
-
-  cinfo->dest->next_output_byte = entropy->next_output_byte;
-  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-
-  /* Update restart-interval state too */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0) {
-      entropy->restarts_to_go = cinfo->restart_interval;
-      entropy->next_restart_num++;
-      entropy->next_restart_num &= 7;
-    }
-    entropy->restarts_to_go--;
-  }
-
-  return TRUE;
-}
-
-
-/*
- * MCU encoding for AC initial scan (either spectral selection,
- * or first pass of successive approximation).
- */
-
-METHODDEF(boolean)
-encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  register int temp, temp2;
-  register int nbits;
-  register int r, k;
-  int Se = cinfo->Se;
-  int Al = cinfo->Al;
-  JBLOCKROW block;
-
-  entropy->next_output_byte = cinfo->dest->next_output_byte;
-  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
-  /* Emit restart marker if needed */
-  if (cinfo->restart_interval)
-    if (entropy->restarts_to_go == 0)
-      emit_restart(entropy, entropy->next_restart_num);
-
-  /* Encode the MCU data block */
-  block = MCU_data[0];
-
-  /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */
-
-  r = 0;                        /* r = run length of zeros */
-
-  for (k = cinfo->Ss; k <= Se; k++) {
-    if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {
-      r++;
-      continue;
-    }
-    /* We must apply the point transform by Al.  For AC coefficients this
-     * is an integer division with rounding towards 0.  To do this portably
-     * in C, we shift after obtaining the absolute value; so the code is
-     * interwoven with finding the abs value (temp) and output bits (temp2).
-     */
-    if (temp < 0) {
-      temp = -temp;             /* temp is abs value of input */
-      temp >>= Al;              /* apply the point transform */
-      /* For a negative coef, want temp2 = bitwise complement of abs(coef) */
-      temp2 = ~temp;
-    } else {
-      temp >>= Al;              /* apply the point transform */
-      temp2 = temp;
-    }
-    /* Watch out for case that nonzero coef is zero after point transform */
-    if (temp == 0) {
-      r++;
-      continue;
-    }
-
-    /* Emit any pending EOBRUN */
-    if (entropy->EOBRUN > 0)
-      emit_eobrun(entropy);
-    /* if run length > 15, must emit special run-length-16 codes (0xF0) */
-    while (r > 15) {
-      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
-      r -= 16;
-    }
-
-    /* Find the number of bits needed for the magnitude of the coefficient */
-    nbits = 1;                  /* there must be at least one 1 bit */
-    while ((temp >>= 1))
-      nbits++;
-    /* Check for out-of-range coefficient values */
-    if (nbits > MAX_COEF_BITS)
-      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
-    /* Count/emit Huffman symbol for run length / number of bits */
-    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
-
-    /* Emit that number of bits of the value, if positive, */
-    /* or the complement of its magnitude, if negative. */
-    emit_bits(entropy, (unsigned int) temp2, nbits);
-
-    r = 0;                      /* reset zero run length */
-  }
-
-  if (r > 0) {                  /* If there are trailing zeroes, */
-    entropy->EOBRUN++;          /* count an EOB */
-    if (entropy->EOBRUN == 0x7FFF)
-      emit_eobrun(entropy);     /* force it out to avoid overflow */
-  }
-
-  cinfo->dest->next_output_byte = entropy->next_output_byte;
-  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-
-  /* Update restart-interval state too */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0) {
-      entropy->restarts_to_go = cinfo->restart_interval;
-      entropy->next_restart_num++;
-      entropy->next_restart_num &= 7;
-    }
-    entropy->restarts_to_go--;
-  }
-
-  return TRUE;
-}
-
-
-/*
- * MCU encoding for DC successive approximation refinement scan.
- * Note: we assume such scans can be multi-component, although the spec
- * is not very clear on the point.
- */
-
-METHODDEF(boolean)
-encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  register int temp;
-  int blkn;
-  int Al = cinfo->Al;
-  JBLOCKROW block;
-
-  entropy->next_output_byte = cinfo->dest->next_output_byte;
-  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
-  /* Emit restart marker if needed */
-  if (cinfo->restart_interval)
-    if (entropy->restarts_to_go == 0)
-      emit_restart(entropy, entropy->next_restart_num);
-
-  /* Encode the MCU data blocks */
-  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-    block = MCU_data[blkn];
-
-    /* We simply emit the Al'th bit of the DC coefficient value. */
-    temp = (*block)[0];
-    emit_bits(entropy, (unsigned int) (temp >> Al), 1);
-  }
-
-  cinfo->dest->next_output_byte = entropy->next_output_byte;
-  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-
-  /* Update restart-interval state too */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0) {
-      entropy->restarts_to_go = cinfo->restart_interval;
-      entropy->next_restart_num++;
-      entropy->next_restart_num &= 7;
-    }
-    entropy->restarts_to_go--;
-  }
-
-  return TRUE;
-}
-
-
-/*
- * MCU encoding for AC successive approximation refinement scan.
- */
-
-METHODDEF(boolean)
-encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  register int temp;
-  register int r, k;
-  int EOB;
-  char *BR_buffer;
-  unsigned int BR;
-  int Se = cinfo->Se;
-  int Al = cinfo->Al;
-  JBLOCKROW block;
-  int absvalues[DCTSIZE2];
-
-  entropy->next_output_byte = cinfo->dest->next_output_byte;
-  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
-  /* Emit restart marker if needed */
-  if (cinfo->restart_interval)
-    if (entropy->restarts_to_go == 0)
-      emit_restart(entropy, entropy->next_restart_num);
-
-  /* Encode the MCU data block */
-  block = MCU_data[0];
-
-  /* It is convenient to make a pre-pass to determine the transformed
-   * coefficients' absolute values and the EOB position.
-   */
-  EOB = 0;
-  for (k = cinfo->Ss; k <= Se; k++) {
-    temp = (*block)[jpeg_natural_order[k]];
-    /* We must apply the point transform by Al.  For AC coefficients this
-     * is an integer division with rounding towards 0.  To do this portably
-     * in C, we shift after obtaining the absolute value.
-     */
-    if (temp < 0)
-      temp = -temp;             /* temp is abs value of input */
-    temp >>= Al;                /* apply the point transform */
-    absvalues[k] = temp;        /* save abs value for main pass */
-    if (temp == 1)
-      EOB = k;                  /* EOB = index of last newly-nonzero coef */
-  }
-
-  /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */
-
-  r = 0;                        /* r = run length of zeros */
-  BR = 0;                       /* BR = count of buffered bits added now */
-  BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */
-
-  for (k = cinfo->Ss; k <= Se; k++) {
-    if ((temp = absvalues[k]) == 0) {
-      r++;
-      continue;
-    }
-
-    /* Emit any required ZRLs, but not if they can be folded into EOB */
-    while (r > 15 && k <= EOB) {
-      /* emit any pending EOBRUN and the BE correction bits */
-      emit_eobrun(entropy);
-      /* Emit ZRL */
-      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
-      r -= 16;
-      /* Emit buffered correction bits that must be associated with ZRL */
-      emit_buffered_bits(entropy, BR_buffer, BR);
-      BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
-      BR = 0;
-    }
-
-    /* If the coef was previously nonzero, it only needs a correction bit.
-     * NOTE: a straight translation of the spec's figure G.7 would suggest
-     * that we also need to test r > 15.  But if r > 15, we can only get here
-     * if k > EOB, which implies that this coefficient is not 1.
-     */
-    if (temp > 1) {
-      /* The correction bit is the next bit of the absolute value. */
-      BR_buffer[BR++] = (char) (temp & 1);
-      continue;
-    }
-
-    /* Emit any pending EOBRUN and the BE correction bits */
-    emit_eobrun(entropy);
-
-    /* Count/emit Huffman symbol for run length / number of bits */
-    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
-
-    /* Emit output bit for newly-nonzero coef */
-    temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;
-    emit_bits(entropy, (unsigned int) temp, 1);
-
-    /* Emit buffered correction bits that must be associated with this code */
-    emit_buffered_bits(entropy, BR_buffer, BR);
-    BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
-    BR = 0;
-    r = 0;                      /* reset zero run length */
-  }
-
-  if (r > 0 || BR > 0) {        /* If there are trailing zeroes, */
-    entropy->EOBRUN++;          /* count an EOB */
-    entropy->BE += BR;          /* concat my correction bits to older ones */
-    /* We force out the EOB if we risk either:
-     * 1. overflow of the EOB counter;
-     * 2. overflow of the correction bit buffer during the next MCU.
-     */
-    if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))
-      emit_eobrun(entropy);
-  }
-
-  cinfo->dest->next_output_byte = entropy->next_output_byte;
-  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-
-  /* Update restart-interval state too */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0) {
-      entropy->restarts_to_go = cinfo->restart_interval;
-      entropy->next_restart_num++;
-      entropy->next_restart_num &= 7;
-    }
-    entropy->restarts_to_go--;
-  }
-
-  return TRUE;
-}
-
-
-/*
- * Finish up at the end of a Huffman-compressed progressive scan.
- */
-
-METHODDEF(void)
-finish_pass_phuff (j_compress_ptr cinfo)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-
-  entropy->next_output_byte = cinfo->dest->next_output_byte;
-  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
-  /* Flush out any buffered data */
-  emit_eobrun(entropy);
-  flush_bits(entropy);
-
-  cinfo->dest->next_output_byte = entropy->next_output_byte;
-  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-}
-
-
-/*
- * Finish up a statistics-gathering pass and create the new Huffman tables.
- */
-
-METHODDEF(void)
-finish_pass_gather_phuff (j_compress_ptr cinfo)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  boolean is_DC_band;
-  int ci, tbl;
-  jpeg_component_info * compptr;
-  JHUFF_TBL **htblptr;
-  boolean did[NUM_HUFF_TBLS];
-
-  /* Flush out buffered data (all we care about is counting the EOB symbol) */
-  emit_eobrun(entropy);
-
-  is_DC_band = (cinfo->Ss == 0);
-
-  /* It's important not to apply jpeg_gen_optimal_table more than once
-   * per table, because it clobbers the input frequency counts!
-   */
-  MEMZERO(did, SIZEOF(did));
-
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    if (is_DC_band) {
-      if (cinfo->Ah != 0)       /* DC refinement needs no table */
-        continue;
-      tbl = compptr->dc_tbl_no;
-    } else {
-      tbl = compptr->ac_tbl_no;
-    }
-    if (! did[tbl]) {
-      if (is_DC_band)
-        htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
-      else
-        htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
-      if (*htblptr == NULL)
-        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
-      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
-      did[tbl] = TRUE;
-    }
-  }
-}
-
-
-/*
- * Module initialization routine for progressive Huffman entropy encoding.
- */
-
-GLOBAL(void)
-jinit_phuff_encoder (j_compress_ptr cinfo)
-{
-  phuff_entropy_ptr entropy;
-  int i;
-
-  entropy = (phuff_entropy_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(phuff_entropy_encoder));
-  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
-  entropy->pub.start_pass = start_pass_phuff;
-
-  /* Mark tables unallocated */
-  for (i = 0; i < NUM_HUFF_TBLS; i++) {
-    entropy->derived_tbls[i] = NULL;
-    entropy->count_ptrs[i] = NULL;
-  }
-  entropy->bit_buffer = NULL;   /* needed only in AC refinement scan */
-}
-
-#endif /* C_PROGRESSIVE_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jcprepct.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,358 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcprepct.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the compression preprocessing controller.
- * This controller manages the color conversion, downsampling,
- * and edge expansion steps.
- *
- * Most of the complexity here is associated with buffering input rows
- * as required by the downsampler.  See the comments at the head of
- * jcsample.c for the downsampler's needs.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* At present, jcsample.c can request context rows only for smoothing.
- * In the future, we might also need context rows for CCIR601 sampling
- * or other more-complex downsampling procedures.  The code to support
- * context rows should be compiled only if needed.
- */
-#ifdef INPUT_SMOOTHING_SUPPORTED
-#define CONTEXT_ROWS_SUPPORTED
-#endif
-
-
-/*
- * For the simple (no-context-row) case, we just need to buffer one
- * row group's worth of pixels for the downsampling step.  At the bottom of
- * the image, we pad to a full row group by replicating the last pixel row.
- * The downsampler's last output row is then replicated if needed to pad
- * out to a full iMCU row.
- *
- * When providing context rows, we must buffer three row groups' worth of
- * pixels.  Three row groups are physically allocated, but the row pointer
- * arrays are made five row groups high, with the extra pointers above and
- * below "wrapping around" to point to the last and first real row groups.
- * This allows the downsampler to access the proper context rows.
- * At the top and bottom of the image, we create dummy context rows by
- * copying the first or last real pixel row.  This copying could be avoided
- * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the
- * trouble on the compression side.
- */
-
-
-/* Private buffer controller object */
-
-typedef struct {
-  struct jpeg_c_prep_controller pub; /* public fields */
-
-  /* Downsampling input buffer.  This buffer holds color-converted data
-   * until we have enough to do a downsample step.
-   */
-  JSAMPARRAY color_buf[MAX_COMPONENTS];
-
-  JDIMENSION rows_to_go;        /* counts rows remaining in source image */
-  int next_buf_row;             /* index of next row to store in color_buf */
-
-#ifdef CONTEXT_ROWS_SUPPORTED   /* only needed for context case */
-  int this_row_group;           /* starting row index of group to process */
-  int next_buf_stop;            /* downsample when we reach this index */
-#endif
-} my_prep_controller;
-
-typedef my_prep_controller * my_prep_ptr;
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
-{
-  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
-
-  if (pass_mode != JBUF_PASS_THRU)
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-
-  /* Initialize total-height counter for detecting bottom of image */
-  prep->rows_to_go = cinfo->image_height;
-  /* Mark the conversion buffer empty */
-  prep->next_buf_row = 0;
-#ifdef CONTEXT_ROWS_SUPPORTED
-  /* Preset additional state variables for context mode.
-   * These aren't used in non-context mode, so we needn't test which mode.
-   */
-  prep->this_row_group = 0;
-  /* Set next_buf_stop to stop after two row groups have been read in. */
-  prep->next_buf_stop = 2 * cinfo->max_v_samp_factor;
-#endif
-}
-
-
-/*
- * Expand an image vertically from height input_rows to height output_rows,
- * by duplicating the bottom row.
- */
-
-LOCAL(void)
-expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,
-                    int input_rows, int output_rows)
-{
-  register int row;
-
-  for (row = input_rows; row < output_rows; row++) {
-    jcopy_sample_rows(image_data, input_rows-1, image_data, row,
-                      1, num_cols);
-  }
-}
-
-
-/*
- * Process some data in the simple no-context case.
- *
- * Preprocessor output data is counted in "row groups".  A row group
- * is defined to be v_samp_factor sample rows of each component.
- * Downsampling will produce this much data from each max_v_samp_factor
- * input rows.
- */
-
-METHODDEF(void)
-pre_process_data (j_compress_ptr cinfo,
-                  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
-                  JDIMENSION in_rows_avail,
-                  JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
-                  JDIMENSION out_row_groups_avail)
-{
-  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
-  int numrows, ci;
-  JDIMENSION inrows;
-  jpeg_component_info * compptr;
-
-  while (*in_row_ctr < in_rows_avail &&
-         *out_row_group_ctr < out_row_groups_avail) {
-    /* Do color conversion to fill the conversion buffer. */
-    inrows = in_rows_avail - *in_row_ctr;
-    numrows = cinfo->max_v_samp_factor - prep->next_buf_row;
-    numrows = (int) MIN((JDIMENSION) numrows, inrows);
-    (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
-                                       prep->color_buf,
-                                       (JDIMENSION) prep->next_buf_row,
-                                       numrows);
-    *in_row_ctr += numrows;
-    prep->next_buf_row += numrows;
-    prep->rows_to_go -= numrows;
-    /* If at bottom of image, pad to fill the conversion buffer. */
-    if (prep->rows_to_go == 0 &&
-        prep->next_buf_row < cinfo->max_v_samp_factor) {
-      for (ci = 0; ci < cinfo->num_components; ci++) {
-        expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
-                           prep->next_buf_row, cinfo->max_v_samp_factor);
-      }
-      prep->next_buf_row = cinfo->max_v_samp_factor;
-    }
-    /* If we've filled the conversion buffer, empty it. */
-    if (prep->next_buf_row == cinfo->max_v_samp_factor) {
-      (*cinfo->downsample->downsample) (cinfo,
-                                        prep->color_buf, (JDIMENSION) 0,
-                                        output_buf, *out_row_group_ctr);
-      prep->next_buf_row = 0;
-      (*out_row_group_ctr)++;
-    }
-    /* If at bottom of image, pad the output to a full iMCU height.
-     * Note we assume the caller is providing a one-iMCU-height output buffer!
-     */
-    if (prep->rows_to_go == 0 &&
-        *out_row_group_ctr < out_row_groups_avail) {
-      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-           ci++, compptr++) {
-        expand_bottom_edge(output_buf[ci],
-                           compptr->width_in_blocks * DCTSIZE,
-                           (int) (*out_row_group_ctr * compptr->v_samp_factor),
-                           (int) (out_row_groups_avail * compptr->v_samp_factor));
-      }
-      *out_row_group_ctr = out_row_groups_avail;
-      break;                    /* can exit outer loop without test */
-    }
-  }
-}
-
-
-#ifdef CONTEXT_ROWS_SUPPORTED
-
-/*
- * Process some data in the context case.
- */
-
-METHODDEF(void)
-pre_process_context (j_compress_ptr cinfo,
-                     JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
-                     JDIMENSION in_rows_avail,
-                     JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
-                     JDIMENSION out_row_groups_avail)
-{
-  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
-  int numrows, ci;
-  int buf_height = cinfo->max_v_samp_factor * 3;
-  JDIMENSION inrows;
-
-  while (*out_row_group_ctr < out_row_groups_avail) {
-    if (*in_row_ctr < in_rows_avail) {
-      /* Do color conversion to fill the conversion buffer. */
-      inrows = in_rows_avail - *in_row_ctr;
-      numrows = prep->next_buf_stop - prep->next_buf_row;
-      numrows = (int) MIN((JDIMENSION) numrows, inrows);
-      (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
-                                         prep->color_buf,
-                                         (JDIMENSION) prep->next_buf_row,
-                                         numrows);
-      /* Pad at top of image, if first time through */
-      if (prep->rows_to_go == cinfo->image_height) {
-        for (ci = 0; ci < cinfo->num_components; ci++) {
-          int row;
-          for (row = 1; row <= cinfo->max_v_samp_factor; row++) {
-            jcopy_sample_rows(prep->color_buf[ci], 0,
-                              prep->color_buf[ci], -row,
-                              1, cinfo->image_width);
-          }
-        }
-      }
-      *in_row_ctr += numrows;
-      prep->next_buf_row += numrows;
-      prep->rows_to_go -= numrows;
-    } else {
-      /* Return for more data, unless we are at the bottom of the image. */
-      if (prep->rows_to_go != 0)
-        break;
-      /* When at bottom of image, pad to fill the conversion buffer. */
-      if (prep->next_buf_row < prep->next_buf_stop) {
-        for (ci = 0; ci < cinfo->num_components; ci++) {
-          expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
-                             prep->next_buf_row, prep->next_buf_stop);
-        }
-        prep->next_buf_row = prep->next_buf_stop;
-      }
-    }
-    /* If we've gotten enough data, downsample a row group. */
-    if (prep->next_buf_row == prep->next_buf_stop) {
-      (*cinfo->downsample->downsample) (cinfo,
-                                        prep->color_buf,
-                                        (JDIMENSION) prep->this_row_group,
-                                        output_buf, *out_row_group_ctr);
-      (*out_row_group_ctr)++;
-      /* Advance pointers with wraparound as necessary. */
-      prep->this_row_group += cinfo->max_v_samp_factor;
-      if (prep->this_row_group >= buf_height)
-        prep->this_row_group = 0;
-      if (prep->next_buf_row >= buf_height)
-        prep->next_buf_row = 0;
-      prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor;
-    }
-  }
-}
-
-
-/*
- * Create the wrapped-around downsampling input buffer needed for context mode.
- */
-
-LOCAL(void)
-create_context_buffer (j_compress_ptr cinfo)
-{
-  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
-  int rgroup_height = cinfo->max_v_samp_factor;
-  int ci, i;
-  jpeg_component_info * compptr;
-  JSAMPARRAY true_buffer, fake_buffer;
-
-  /* Grab enough space for fake row pointers for all the components;
-   * we need five row groups' worth of pointers for each component.
-   */
-  fake_buffer = (JSAMPARRAY)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (cinfo->num_components * 5 * rgroup_height) *
-                                SIZEOF(JSAMPROW));
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Allocate the actual buffer space (3 row groups) for this component.
-     * We make the buffer wide enough to allow the downsampler to edge-expand
-     * horizontally within the buffer, if it so chooses.
-     */
-    true_buffer = (*cinfo->mem->alloc_sarray)
-      ((j_common_ptr) cinfo, JPOOL_IMAGE,
-       (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
-                      cinfo->max_h_samp_factor) / compptr->h_samp_factor),
-       (JDIMENSION) (3 * rgroup_height));
-    /* Copy true buffer row pointers into the middle of the fake row array */
-    MEMCOPY(fake_buffer + rgroup_height, true_buffer,
-            3 * rgroup_height * SIZEOF(JSAMPROW));
-    /* Fill in the above and below wraparound pointers */
-    for (i = 0; i < rgroup_height; i++) {
-      fake_buffer[i] = true_buffer[2 * rgroup_height + i];
-      fake_buffer[4 * rgroup_height + i] = true_buffer[i];
-    }
-    prep->color_buf[ci] = fake_buffer + rgroup_height;
-    fake_buffer += 5 * rgroup_height; /* point to space for next component */
-  }
-}
-
-#endif /* CONTEXT_ROWS_SUPPORTED */
-
-
-/*
- * Initialize preprocessing controller.
- */
-
-GLOBAL(void)
-jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)
-{
-  my_prep_ptr prep;
-  int ci;
-  jpeg_component_info * compptr;
-
-  if (need_full_buffer)         /* safety check */
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-
-  prep = (my_prep_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_prep_controller));
-  cinfo->prep = (struct jpeg_c_prep_controller *) prep;
-  prep->pub.start_pass = start_pass_prep;
-
-  /* Allocate the color conversion buffer.
-   * We make the buffer wide enough to allow the downsampler to edge-expand
-   * horizontally within the buffer, if it so chooses.
-   */
-  if (cinfo->downsample->need_context_rows) {
-    /* Set up to provide context rows */
-#ifdef CONTEXT_ROWS_SUPPORTED
-    prep->pub.pre_process_data = pre_process_context;
-    create_context_buffer(cinfo);
-#else
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-  } else {
-    /* No context, just make it tall enough for one row group */
-    prep->pub.pre_process_data = pre_process_data;
-    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-         ci++, compptr++) {
-      prep->color_buf[ci] = (*cinfo->mem->alloc_sarray)
-        ((j_common_ptr) cinfo, JPOOL_IMAGE,
-         (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
-                        cinfo->max_h_samp_factor) / compptr->h_samp_factor),
-         (JDIMENSION) cinfo->max_v_samp_factor);
-    }
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jcsample.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,523 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jcsample.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains downsampling routines.
- *
- * Downsampling input data is counted in "row groups".  A row group
- * is defined to be max_v_samp_factor pixel rows of each component,
- * from which the downsampler produces v_samp_factor sample rows.
- * A single row group is processed in each call to the downsampler module.
- *
- * The downsampler is responsible for edge-expansion of its output data
- * to fill an integral number of DCT blocks horizontally.  The source buffer
- * may be modified if it is helpful for this purpose (the source buffer is
- * allocated wide enough to correspond to the desired output width).
- * The caller (the prep controller) is responsible for vertical padding.
- *
- * The downsampler may request "context rows" by setting need_context_rows
- * during startup.  In this case, the input arrays will contain at least
- * one row group's worth of pixels above and below the passed-in data;
- * the caller will create dummy rows at image top and bottom by replicating
- * the first or last real pixel row.
- *
- * An excellent reference for image resampling is
- *   Digital Image Warping, George Wolberg, 1990.
- *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
- *
- * The downsampling algorithm used here is a simple average of the source
- * pixels covered by the output pixel.  The hi-falutin sampling literature
- * refers to this as a "box filter".  In general the characteristics of a box
- * filter are not very good, but for the specific cases we normally use (1:1
- * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not
- * nearly so bad.  If you intend to use other sampling ratios, you'd be well
- * advised to improve this code.
- *
- * A simple input-smoothing capability is provided.  This is mainly intended
- * for cleaning up color-dithered GIF input files (if you find it inadequate,
- * we suggest using an external filtering program such as pnmconvol).  When
- * enabled, each input pixel P is replaced by a weighted sum of itself and its
- * eight neighbors.  P's weight is 1-8*SF and each neighbor's weight is SF,
- * where SF = (smoothing_factor / 1024).
- * Currently, smoothing is only supported for 2h2v sampling factors.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Pointer to routine to downsample a single component */
-typedef JMETHOD(void, downsample1_ptr,
-                (j_compress_ptr cinfo, jpeg_component_info * compptr,
-                 JSAMPARRAY input_data, JSAMPARRAY output_data));
-
-/* Private subobject */
-
-typedef struct {
-  struct jpeg_downsampler pub;  /* public fields */
-
-  /* Downsampling method pointers, one per component */
-  downsample1_ptr methods[MAX_COMPONENTS];
-} my_downsampler;
-
-typedef my_downsampler * my_downsample_ptr;
-
-
-/*
- * Initialize for a downsampling pass.
- */
-
-METHODDEF(void)
-start_pass_downsample (j_compress_ptr cinfo)
-{
-  /* no work for now */
-}
-
-
-/*
- * Expand a component horizontally from width input_cols to width output_cols,
- * by duplicating the rightmost samples.
- */
-
-LOCAL(void)
-expand_right_edge (JSAMPARRAY image_data, int num_rows,
-                   JDIMENSION input_cols, JDIMENSION output_cols)
-{
-  register JSAMPROW ptr;
-  register JSAMPLE pixval;
-  register int count;
-  int row;
-  int numcols = (int) (output_cols - input_cols);
-
-  if (numcols > 0) {
-    for (row = 0; row < num_rows; row++) {
-      ptr = image_data[row] + input_cols;
-      pixval = ptr[-1];         /* don't need GETJSAMPLE() here */
-      for (count = numcols; count > 0; count--)
-        *ptr++ = pixval;
-    }
-  }
-}
-
-
-/*
- * Do downsampling for a whole row group (all components).
- *
- * In this version we simply downsample each component independently.
- */
-
-METHODDEF(void)
-sep_downsample (j_compress_ptr cinfo,
-                JSAMPIMAGE input_buf, JDIMENSION in_row_index,
-                JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)
-{
-  my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;
-  int ci;
-  jpeg_component_info * compptr;
-  JSAMPARRAY in_ptr, out_ptr;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    in_ptr = input_buf[ci] + in_row_index;
-    out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);
-    (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);
-  }
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * One row group is processed per call.
- * This version handles arbitrary integral sampling ratios, without smoothing.
- * Note that this version is not actually used for customary sampling ratios.
- */
-
-METHODDEF(void)
-int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
-                JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
-  int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;
-  JDIMENSION outcol, outcol_h;  /* outcol_h == outcol*h_expand */
-  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
-  JSAMPROW inptr, outptr;
-  INT32 outvalue;
-
-  h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;
-  v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;
-  numpix = h_expand * v_expand;
-  numpix2 = numpix/2;
-
-  /* Expand input data enough to let all the output samples be generated
-   * by the standard loop.  Special-casing padded output would be more
-   * efficient.
-   */
-  expand_right_edge(input_data, cinfo->max_v_samp_factor,
-                    cinfo->image_width, output_cols * h_expand);
-
-  inrow = 0;
-  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
-    outptr = output_data[outrow];
-    for (outcol = 0, outcol_h = 0; outcol < output_cols;
-         outcol++, outcol_h += h_expand) {
-      outvalue = 0;
-      for (v = 0; v < v_expand; v++) {
-        inptr = input_data[inrow+v] + outcol_h;
-        for (h = 0; h < h_expand; h++) {
-          outvalue += (INT32) GETJSAMPLE(*inptr++);
-        }
-      }
-      *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);
-    }
-    inrow += v_expand;
-  }
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the special case of a full-size component,
- * without smoothing.
- */
-
-METHODDEF(void)
-fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
-                     JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
-  /* Copy the data */
-  jcopy_sample_rows(input_data, 0, output_data, 0,
-                    cinfo->max_v_samp_factor, cinfo->image_width);
-  /* Edge-expand */
-  expand_right_edge(output_data, cinfo->max_v_samp_factor,
-                    cinfo->image_width, compptr->width_in_blocks * DCTSIZE);
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the common case of 2:1 horizontal and 1:1 vertical,
- * without smoothing.
- *
- * A note about the "bias" calculations: when rounding fractional values to
- * integer, we do not want to always round 0.5 up to the next integer.
- * If we did that, we'd introduce a noticeable bias towards larger values.
- * Instead, this code is arranged so that 0.5 will be rounded up or down at
- * alternate pixel locations (a simple ordered dither pattern).
- */
-
-METHODDEF(void)
-h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
-                 JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
-  int outrow;
-  JDIMENSION outcol;
-  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
-  register JSAMPROW inptr, outptr;
-  register int bias;
-
-  /* Expand input data enough to let all the output samples be generated
-   * by the standard loop.  Special-casing padded output would be more
-   * efficient.
-   */
-  expand_right_edge(input_data, cinfo->max_v_samp_factor,
-                    cinfo->image_width, output_cols * 2);
-
-  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
-    outptr = output_data[outrow];
-    inptr = input_data[outrow];
-    bias = 0;                   /* bias = 0,1,0,1,... for successive samples */
-    for (outcol = 0; outcol < output_cols; outcol++) {
-      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])
-                              + bias) >> 1);
-      bias ^= 1;                /* 0=>1, 1=>0 */
-      inptr += 2;
-    }
-  }
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
- * without smoothing.
- */
-
-METHODDEF(void)
-h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
-                 JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
-  int inrow, outrow;
-  JDIMENSION outcol;
-  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
-  register JSAMPROW inptr0, inptr1, outptr;
-  register int bias;
-
-  /* Expand input data enough to let all the output samples be generated
-   * by the standard loop.  Special-casing padded output would be more
-   * efficient.
-   */
-  expand_right_edge(input_data, cinfo->max_v_samp_factor,
-                    cinfo->image_width, output_cols * 2);
-
-  inrow = 0;
-  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
-    outptr = output_data[outrow];
-    inptr0 = input_data[inrow];
-    inptr1 = input_data[inrow+1];
-    bias = 1;                   /* bias = 1,2,1,2,... for successive samples */
-    for (outcol = 0; outcol < output_cols; outcol++) {
-      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
-                              GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])
-                              + bias) >> 2);
-      bias ^= 3;                /* 1=>2, 2=>1 */
-      inptr0 += 2; inptr1 += 2;
-    }
-    inrow += 2;
-  }
-}
-
-
-#ifdef INPUT_SMOOTHING_SUPPORTED
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
- * with smoothing.  One row of context is required.
- */
-
-METHODDEF(void)
-h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
-                        JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
-  int inrow, outrow;
-  JDIMENSION colctr;
-  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
-  register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;
-  INT32 membersum, neighsum, memberscale, neighscale;
-
-  /* Expand input data enough to let all the output samples be generated
-   * by the standard loop.  Special-casing padded output would be more
-   * efficient.
-   */
-  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
-                    cinfo->image_width, output_cols * 2);
-
-  /* We don't bother to form the individual "smoothed" input pixel values;
-   * we can directly compute the output which is the average of the four
-   * smoothed values.  Each of the four member pixels contributes a fraction
-   * (1-8*SF) to its own smoothed image and a fraction SF to each of the three
-   * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final
-   * output.  The four corner-adjacent neighbor pixels contribute a fraction
-   * SF to just one smoothed pixel, or SF/4 to the final output; while the
-   * eight edge-adjacent neighbors contribute SF to each of two smoothed
-   * pixels, or SF/2 overall.  In order to use integer arithmetic, these
-   * factors are scaled by 2^16 = 65536.
-   * Also recall that SF = smoothing_factor / 1024.
-   */
-
-  memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */
-  neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */
-
-  inrow = 0;
-  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
-    outptr = output_data[outrow];
-    inptr0 = input_data[inrow];
-    inptr1 = input_data[inrow+1];
-    above_ptr = input_data[inrow-1];
-    below_ptr = input_data[inrow+2];
-
-    /* Special case for first column: pretend column -1 is same as column 0 */
-    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
-                GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
-    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
-               GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
-               GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +
-               GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);
-    neighsum += neighsum;
-    neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +
-                GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);
-    membersum = membersum * memberscale + neighsum * neighscale;
-    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
-    inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
-
-    for (colctr = output_cols - 2; colctr > 0; colctr--) {
-      /* sum of pixels directly mapped to this output element */
-      membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
-                  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
-      /* sum of edge-neighbor pixels */
-      neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
-                 GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
-                 GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +
-                 GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);
-      /* The edge-neighbors count twice as much as corner-neighbors */
-      neighsum += neighsum;
-      /* Add in the corner-neighbors */
-      neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +
-                  GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);
-      /* form final output scaled up by 2^16 */
-      membersum = membersum * memberscale + neighsum * neighscale;
-      /* round, descale and output it */
-      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
-      inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
-    }
-
-    /* Special case for last column */
-    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
-                GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
-    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
-               GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
-               GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +
-               GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);
-    neighsum += neighsum;
-    neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +
-                GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);
-    membersum = membersum * memberscale + neighsum * neighscale;
-    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
-
-    inrow += 2;
-  }
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the special case of a full-size component,
- * with smoothing.  One row of context is required.
- */
-
-METHODDEF(void)
-fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,
-                            JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
-  int outrow;
-  JDIMENSION colctr;
-  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
-  register JSAMPROW inptr, above_ptr, below_ptr, outptr;
-  INT32 membersum, neighsum, memberscale, neighscale;
-  int colsum, lastcolsum, nextcolsum;
-
-  /* Expand input data enough to let all the output samples be generated
-   * by the standard loop.  Special-casing padded output would be more
-   * efficient.
-   */
-  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
-                    cinfo->image_width, output_cols);
-
-  /* Each of the eight neighbor pixels contributes a fraction SF to the
-   * smoothed pixel, while the main pixel contributes (1-8*SF).  In order
-   * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.
-   * Also recall that SF = smoothing_factor / 1024.
-   */
-
-  memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */
-  neighscale = cinfo->smoothing_factor * 64; /* scaled SF */
-
-  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
-    outptr = output_data[outrow];
-    inptr = input_data[outrow];
-    above_ptr = input_data[outrow-1];
-    below_ptr = input_data[outrow+1];
-
-    /* Special case for first column */
-    colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +
-             GETJSAMPLE(*inptr);
-    membersum = GETJSAMPLE(*inptr++);
-    nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
-                 GETJSAMPLE(*inptr);
-    neighsum = colsum + (colsum - membersum) + nextcolsum;
-    membersum = membersum * memberscale + neighsum * neighscale;
-    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
-    lastcolsum = colsum; colsum = nextcolsum;
-
-    for (colctr = output_cols - 2; colctr > 0; colctr--) {
-      membersum = GETJSAMPLE(*inptr++);
-      above_ptr++; below_ptr++;
-      nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
-                   GETJSAMPLE(*inptr);
-      neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
-      membersum = membersum * memberscale + neighsum * neighscale;
-      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
-      lastcolsum = colsum; colsum = nextcolsum;
-    }
-
-    /* Special case for last column */
-    membersum = GETJSAMPLE(*inptr);
-    neighsum = lastcolsum + (colsum - membersum) + colsum;
-    membersum = membersum * memberscale + neighsum * neighscale;
-    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
-
-  }
-}
-
-#endif /* INPUT_SMOOTHING_SUPPORTED */
-
-
-/*
- * Module initialization routine for downsampling.
- * Note that we must select a routine for each component.
- */
-
-GLOBAL(void)
-jinit_downsampler (j_compress_ptr cinfo)
-{
-  my_downsample_ptr downsample;
-  int ci;
-  jpeg_component_info * compptr;
-  boolean smoothok = TRUE;
-
-  downsample = (my_downsample_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_downsampler));
-  cinfo->downsample = (struct jpeg_downsampler *) downsample;
-  downsample->pub.start_pass = start_pass_downsample;
-  downsample->pub.downsample = sep_downsample;
-  downsample->pub.need_context_rows = FALSE;
-
-  if (cinfo->CCIR601_sampling)
-    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
-
-  /* Verify we can handle the sampling factors, and set up method pointers */
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&
-        compptr->v_samp_factor == cinfo->max_v_samp_factor) {
-#ifdef INPUT_SMOOTHING_SUPPORTED
-      if (cinfo->smoothing_factor) {
-        downsample->methods[ci] = fullsize_smooth_downsample;
-        downsample->pub.need_context_rows = TRUE;
-      } else
-#endif
-        downsample->methods[ci] = fullsize_downsample;
-    } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
-               compptr->v_samp_factor == cinfo->max_v_samp_factor) {
-      smoothok = FALSE;
-      downsample->methods[ci] = h2v1_downsample;
-    } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
-               compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {
-#ifdef INPUT_SMOOTHING_SUPPORTED
-      if (cinfo->smoothing_factor) {
-        downsample->methods[ci] = h2v2_smooth_downsample;
-        downsample->pub.need_context_rows = TRUE;
-      } else
-#endif
-        downsample->methods[ci] = h2v2_downsample;
-    } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&
-               (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {
-      smoothok = FALSE;
-      downsample->methods[ci] = int_downsample;
-    } else
-      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
-  }
-
-#ifdef INPUT_SMOOTHING_SUPPORTED
-  if (cinfo->smoothing_factor && !smoothok)
-    TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);
-#endif
-}
--- a/src/share/native/sun/awt/image/jpeg/jctrans.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,392 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jctrans.c
- *
- * Copyright (C) 1995-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains library routines for transcoding compression,
- * that is, writing raw DCT coefficient arrays to an output JPEG file.
- * The routines in jcapimin.c will also be needed by a transcoder.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Forward declarations */
-LOCAL(void) transencode_master_selection
-        JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
-LOCAL(void) transencode_coef_controller
-        JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
-
-
-/*
- * Compression initialization for writing raw-coefficient data.
- * Before calling this, all parameters and a data destination must be set up.
- * Call jpeg_finish_compress() to actually write the data.
- *
- * The number of passed virtual arrays must match cinfo->num_components.
- * Note that the virtual arrays need not be filled or even realized at
- * the time write_coefficients is called; indeed, if the virtual arrays
- * were requested from this compression object's memory manager, they
- * typically will be realized during this routine and filled afterwards.
- */
-
-GLOBAL(void)
-jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)
-{
-  if (cinfo->global_state != CSTATE_START)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  /* Mark all tables to be written */
-  jpeg_suppress_tables(cinfo, FALSE);
-  /* (Re)initialize error mgr and destination modules */
-  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
-  (*cinfo->dest->init_destination) (cinfo);
-  /* Perform master selection of active modules */
-  transencode_master_selection(cinfo, coef_arrays);
-  /* Wait for jpeg_finish_compress() call */
-  cinfo->next_scanline = 0;     /* so jpeg_write_marker works */
-  cinfo->global_state = CSTATE_WRCOEFS;
-}
-
-
-/*
- * Initialize the compression object with default parameters,
- * then copy from the source object all parameters needed for lossless
- * transcoding.  Parameters that can be varied without loss (such as
- * scan script and Huffman optimization) are left in their default states.
- */
-
-GLOBAL(void)
-jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
-                               j_compress_ptr dstinfo)
-{
-  JQUANT_TBL ** qtblptr;
-  jpeg_component_info *incomp, *outcomp;
-  JQUANT_TBL *c_quant, *slot_quant;
-  int tblno, ci, coefi;
-
-  /* Safety check to ensure start_compress not called yet. */
-  if (dstinfo->global_state != CSTATE_START)
-    ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);
-  /* Copy fundamental image dimensions */
-  dstinfo->image_width = srcinfo->image_width;
-  dstinfo->image_height = srcinfo->image_height;
-  dstinfo->input_components = srcinfo->num_components;
-  dstinfo->in_color_space = srcinfo->jpeg_color_space;
-  /* Initialize all parameters to default values */
-  jpeg_set_defaults(dstinfo);
-  /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
-   * Fix it to get the right header markers for the image colorspace.
-   */
-  jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
-  dstinfo->data_precision = srcinfo->data_precision;
-  dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
-  /* Copy the source's quantization tables. */
-  for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {
-    if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {
-      qtblptr = & dstinfo->quant_tbl_ptrs[tblno];
-      if (*qtblptr == NULL)
-        *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);
-      MEMCOPY((*qtblptr)->quantval,
-              srcinfo->quant_tbl_ptrs[tblno]->quantval,
-              SIZEOF((*qtblptr)->quantval));
-      (*qtblptr)->sent_table = FALSE;
-    }
-  }
-  /* Copy the source's per-component info.
-   * Note we assume jpeg_set_defaults has allocated the dest comp_info array.
-   */
-  dstinfo->num_components = srcinfo->num_components;
-  if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)
-    ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,
-             MAX_COMPONENTS);
-  for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;
-       ci < dstinfo->num_components; ci++, incomp++, outcomp++) {
-    outcomp->component_id = incomp->component_id;
-    outcomp->h_samp_factor = incomp->h_samp_factor;
-    outcomp->v_samp_factor = incomp->v_samp_factor;
-    outcomp->quant_tbl_no = incomp->quant_tbl_no;
-    /* Make sure saved quantization table for component matches the qtable
-     * slot.  If not, the input file re-used this qtable slot.
-     * IJG encoder currently cannot duplicate this.
-     */
-    tblno = outcomp->quant_tbl_no;
-    if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||
-        srcinfo->quant_tbl_ptrs[tblno] == NULL)
-      ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);
-    slot_quant = srcinfo->quant_tbl_ptrs[tblno];
-    c_quant = incomp->quant_table;
-    if (c_quant != NULL) {
-      for (coefi = 0; coefi < DCTSIZE2; coefi++) {
-        if (c_quant->quantval[coefi] != slot_quant->quantval[coefi])
-          ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
-      }
-    }
-    /* Note: we do not copy the source's Huffman table assignments;
-     * instead we rely on jpeg_set_colorspace to have made a suitable choice.
-     */
-  }
-  /* Also copy JFIF version and resolution information, if available.
-   * Strictly speaking this isn't "critical" info, but it's nearly
-   * always appropriate to copy it if available.  In particular,
-   * if the application chooses to copy JFIF 1.02 extension markers from
-   * the source file, we need to copy the version to make sure we don't
-   * emit a file that has 1.02 extensions but a claimed version of 1.01.
-   * We will *not*, however, copy version info from mislabeled "2.01" files.
-   */
-  if (srcinfo->saw_JFIF_marker) {
-    if (srcinfo->JFIF_major_version == 1) {
-      dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
-      dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
-    }
-    dstinfo->density_unit = srcinfo->density_unit;
-    dstinfo->X_density = srcinfo->X_density;
-    dstinfo->Y_density = srcinfo->Y_density;
-  }
-}
-
-
-/*
- * Master selection of compression modules for transcoding.
- * This substitutes for jcinit.c's initialization of the full compressor.
- */
-
-LOCAL(void)
-transencode_master_selection (j_compress_ptr cinfo,
-                              jvirt_barray_ptr * coef_arrays)
-{
-  /* Although we don't actually use input_components for transcoding,
-   * jcmaster.c's initial_setup will complain if input_components is 0.
-   */
-  cinfo->input_components = 1;
-  /* Initialize master control (includes parameter checking/processing) */
-  jinit_c_master_control(cinfo, TRUE /* transcode only */);
-
-  /* Entropy encoding: either Huffman or arithmetic coding. */
-  if (cinfo->arith_code) {
-    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-  } else {
-    if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
-      jinit_phuff_encoder(cinfo);
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-    } else
-      jinit_huff_encoder(cinfo);
-  }
-
-  /* We need a special coefficient buffer controller. */
-  transencode_coef_controller(cinfo, coef_arrays);
-
-  jinit_marker_writer(cinfo);
-
-  /* We can now tell the memory manager to allocate virtual arrays. */
-  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
-
-  /* Write the datastream header (SOI, JFIF) immediately.
-   * Frame and scan headers are postponed till later.
-   * This lets application insert special markers after the SOI.
-   */
-  (*cinfo->marker->write_file_header) (cinfo);
-}
-
-
-/*
- * The rest of this file is a special implementation of the coefficient
- * buffer controller.  This is similar to jccoefct.c, but it handles only
- * output from presupplied virtual arrays.  Furthermore, we generate any
- * dummy padding blocks on-the-fly rather than expecting them to be present
- * in the arrays.
- */
-
-/* Private buffer controller object */
-
-typedef struct {
-  struct jpeg_c_coef_controller pub; /* public fields */
-
-  JDIMENSION iMCU_row_num;      /* iMCU row # within image */
-  JDIMENSION mcu_ctr;           /* counts MCUs processed in current row */
-  int MCU_vert_offset;          /* counts MCU rows within iMCU row */
-  int MCU_rows_per_iMCU_row;    /* number of such rows needed */
-
-  /* Virtual block array for each component. */
-  jvirt_barray_ptr * whole_image;
-
-  /* Workspace for constructing dummy blocks at right/bottom edges. */
-  JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];
-} my_coef_controller;
-
-typedef my_coef_controller * my_coef_ptr;
-
-
-LOCAL(void)
-start_iMCU_row (j_compress_ptr cinfo)
-/* Reset within-iMCU-row counters for a new row */
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
-  /* In an interleaved scan, an MCU row is the same as an iMCU row.
-   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
-   * But at the bottom of the image, process only what's left.
-   */
-  if (cinfo->comps_in_scan > 1) {
-    coef->MCU_rows_per_iMCU_row = 1;
-  } else {
-    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
-      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
-    else
-      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
-  }
-
-  coef->mcu_ctr = 0;
-  coef->MCU_vert_offset = 0;
-}
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
-  if (pass_mode != JBUF_CRANK_DEST)
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-
-  coef->iMCU_row_num = 0;
-  start_iMCU_row(cinfo);
-}
-
-
-/*
- * Process some data.
- * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
- * per call, ie, v_samp_factor block rows for each component in the scan.
- * The data is obtained from the virtual arrays and fed to the entropy coder.
- * Returns TRUE if the iMCU row is completed, FALSE if suspended.
- *
- * NB: input_buf is ignored; it is likely to be a NULL pointer.
- */
-
-METHODDEF(boolean)
-compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  JDIMENSION MCU_col_num;       /* index of current MCU within row */
-  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
-  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
-  int blkn, ci, xindex, yindex, yoffset, blockcnt;
-  JDIMENSION start_col;
-  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
-  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
-  JBLOCKROW buffer_ptr;
-  jpeg_component_info *compptr;
-
-  /* Align the virtual buffers for the components used in this scan. */
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    buffer[ci] = (*cinfo->mem->access_virt_barray)
-      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
-       coef->iMCU_row_num * compptr->v_samp_factor,
-       (JDIMENSION) compptr->v_samp_factor, FALSE);
-  }
-
-  /* Loop to process one whole iMCU row */
-  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
-       yoffset++) {
-    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
-         MCU_col_num++) {
-      /* Construct list of pointers to DCT blocks belonging to this MCU */
-      blkn = 0;                 /* index of current DCT block within MCU */
-      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-        compptr = cinfo->cur_comp_info[ci];
-        start_col = MCU_col_num * compptr->MCU_width;
-        blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
-                                                : compptr->last_col_width;
-        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
-          if (coef->iMCU_row_num < last_iMCU_row ||
-              yindex+yoffset < compptr->last_row_height) {
-            /* Fill in pointers to real blocks in this row */
-            buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
-            for (xindex = 0; xindex < blockcnt; xindex++)
-              MCU_buffer[blkn++] = buffer_ptr++;
-          } else {
-            /* At bottom of image, need a whole row of dummy blocks */
-            xindex = 0;
-          }
-          /* Fill in any dummy blocks needed in this row.
-           * Dummy blocks are filled in the same way as in jccoefct.c:
-           * all zeroes in the AC entries, DC entries equal to previous
-           * block's DC value.  The init routine has already zeroed the
-           * AC entries, so we need only set the DC entries correctly.
-           */
-          for (; xindex < compptr->MCU_width; xindex++) {
-            MCU_buffer[blkn] = coef->dummy_buffer[blkn];
-            MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];
-            blkn++;
-          }
-        }
-      }
-      /* Try to write the MCU. */
-      if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
-        /* Suspension forced; update state counters and exit */
-        coef->MCU_vert_offset = yoffset;
-        coef->mcu_ctr = MCU_col_num;
-        return FALSE;
-      }
-    }
-    /* Completed an MCU row, but perhaps not an iMCU row */
-    coef->mcu_ctr = 0;
-  }
-  /* Completed the iMCU row, advance counters for next one */
-  coef->iMCU_row_num++;
-  start_iMCU_row(cinfo);
-  return TRUE;
-}
-
-
-/*
- * Initialize coefficient buffer controller.
- *
- * Each passed coefficient array must be the right size for that
- * coefficient: width_in_blocks wide and height_in_blocks high,
- * with unitheight at least v_samp_factor.
- */
-
-LOCAL(void)
-transencode_coef_controller (j_compress_ptr cinfo,
-                             jvirt_barray_ptr * coef_arrays)
-{
-  my_coef_ptr coef;
-  JBLOCKROW buffer;
-  int i;
-
-  coef = (my_coef_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_coef_controller));
-  cinfo->coef = (struct jpeg_c_coef_controller *) coef;
-  coef->pub.start_pass = start_pass_coef;
-  coef->pub.compress_data = compress_output;
-
-  /* Save pointer to virtual arrays */
-  coef->whole_image = coef_arrays;
-
-  /* Allocate and pre-zero space for dummy DCT blocks. */
-  buffer = (JBLOCKROW)
-    (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
-  jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
-  for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
-    coef->dummy_buffer[i] = buffer + i;
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jdapimin.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,399 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdapimin.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface code for the decompression half
- * of the JPEG library.  These are the "minimum" API routines that may be
- * needed in either the normal full-decompression case or the
- * transcoding-only case.
- *
- * Most of the routines intended to be called directly by an application
- * are in this file or in jdapistd.c.  But also see jcomapi.c for routines
- * shared by compression and decompression, and jdtrans.c for the transcoding
- * case.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Initialization of a JPEG decompression object.
- * The error manager must already be set up (in case memory manager fails).
- */
-
-GLOBAL(void)
-jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)
-{
-  int i;
-
-  /* Guard against version mismatches between library and caller. */
-  cinfo->mem = NULL;            /* so jpeg_destroy knows mem mgr not called */
-  if (version != JPEG_LIB_VERSION)
-    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
-  if (structsize != SIZEOF(struct jpeg_decompress_struct))
-    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
-             (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);
-
-  /* For debugging purposes, we zero the whole master structure.
-   * But the application has already set the err pointer, and may have set
-   * client_data, so we have to save and restore those fields.
-   * Note: if application hasn't set client_data, tools like Purify may
-   * complain here.
-   */
-  {
-    struct jpeg_error_mgr * err = cinfo->err;
-    void * client_data = cinfo->client_data; /* ignore Purify complaint here */
-    MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));
-    cinfo->err = err;
-    cinfo->client_data = client_data;
-  }
-  cinfo->is_decompressor = TRUE;
-
-  /* Initialize a memory manager instance for this object */
-  jinit_memory_mgr((j_common_ptr) cinfo);
-
-  /* Zero out pointers to permanent structures. */
-  cinfo->progress = NULL;
-  cinfo->src = NULL;
-
-  for (i = 0; i < NUM_QUANT_TBLS; i++)
-    cinfo->quant_tbl_ptrs[i] = NULL;
-
-  for (i = 0; i < NUM_HUFF_TBLS; i++) {
-    cinfo->dc_huff_tbl_ptrs[i] = NULL;
-    cinfo->ac_huff_tbl_ptrs[i] = NULL;
-  }
-
-  /* Initialize marker processor so application can override methods
-   * for COM, APPn markers before calling jpeg_read_header.
-   */
-  cinfo->marker_list = NULL;
-  jinit_marker_reader(cinfo);
-
-  /* And initialize the overall input controller. */
-  jinit_input_controller(cinfo);
-
-  /* OK, I'm ready */
-  cinfo->global_state = DSTATE_START;
-}
-
-
-/*
- * Destruction of a JPEG decompression object
- */
-
-GLOBAL(void)
-jpeg_destroy_decompress (j_decompress_ptr cinfo)
-{
-  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
-}
-
-
-/*
- * Abort processing of a JPEG decompression operation,
- * but don't destroy the object itself.
- */
-
-GLOBAL(void)
-jpeg_abort_decompress (j_decompress_ptr cinfo)
-{
-  jpeg_abort((j_common_ptr) cinfo); /* use common routine */
-}
-
-
-/*
- * Set default decompression parameters.
- */
-
-LOCAL(void)
-default_decompress_parms (j_decompress_ptr cinfo)
-{
-  /* Guess the input colorspace, and set output colorspace accordingly. */
-  /* (Wish JPEG committee had provided a real way to specify this...) */
-  /* Note application may override our guesses. */
-  switch (cinfo->num_components) {
-  case 1:
-    cinfo->jpeg_color_space = JCS_GRAYSCALE;
-    cinfo->out_color_space = JCS_GRAYSCALE;
-    break;
-
-  case 3:
-    if (cinfo->saw_JFIF_marker) {
-      cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
-    } else if (cinfo->saw_Adobe_marker) {
-      switch (cinfo->Adobe_transform) {
-      case 0:
-        cinfo->jpeg_color_space = JCS_RGB;
-        break;
-      case 1:
-        cinfo->jpeg_color_space = JCS_YCbCr;
-        break;
-      default:
-        WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
-        cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
-        break;
-      }
-    } else {
-      /* Saw no special markers, try to guess from the component IDs */
-      int cid0 = cinfo->comp_info[0].component_id;
-      int cid1 = cinfo->comp_info[1].component_id;
-      int cid2 = cinfo->comp_info[2].component_id;
-
-      if (cid0 == 1 && cid1 == 2 && cid2 == 3)
-        cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
-      else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
-        cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
-      else {
-        TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
-        cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
-      }
-    }
-    /* Always guess RGB is proper output colorspace. */
-    cinfo->out_color_space = JCS_RGB;
-    break;
-
-  case 4:
-    if (cinfo->saw_Adobe_marker) {
-      switch (cinfo->Adobe_transform) {
-      case 0:
-        cinfo->jpeg_color_space = JCS_CMYK;
-        break;
-      case 2:
-        cinfo->jpeg_color_space = JCS_YCCK;
-        break;
-      default:
-        WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
-        cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
-        break;
-      }
-    } else {
-      /* No special markers, assume straight CMYK. */
-      cinfo->jpeg_color_space = JCS_CMYK;
-    }
-    cinfo->out_color_space = JCS_CMYK;
-    break;
-
-  default:
-    cinfo->jpeg_color_space = JCS_UNKNOWN;
-    cinfo->out_color_space = JCS_UNKNOWN;
-    break;
-  }
-
-  /* Set defaults for other decompression parameters. */
-  cinfo->scale_num = 1;         /* 1:1 scaling */
-  cinfo->scale_denom = 1;
-  cinfo->output_gamma = 1.0;
-  cinfo->buffered_image = FALSE;
-  cinfo->raw_data_out = FALSE;
-  cinfo->dct_method = JDCT_DEFAULT;
-  cinfo->do_fancy_upsampling = TRUE;
-  cinfo->do_block_smoothing = TRUE;
-  cinfo->quantize_colors = FALSE;
-  /* We set these in case application only sets quantize_colors. */
-  cinfo->dither_mode = JDITHER_FS;
-#ifdef QUANT_2PASS_SUPPORTED
-  cinfo->two_pass_quantize = TRUE;
-#else
-  cinfo->two_pass_quantize = FALSE;
-#endif
-  cinfo->desired_number_of_colors = 256;
-  cinfo->colormap = NULL;
-  /* Initialize for no mode change in buffered-image mode. */
-  cinfo->enable_1pass_quant = FALSE;
-  cinfo->enable_external_quant = FALSE;
-  cinfo->enable_2pass_quant = FALSE;
-}
-
-
-/*
- * Decompression startup: read start of JPEG datastream to see what's there.
- * Need only initialize JPEG object and supply a data source before calling.
- *
- * This routine will read as far as the first SOS marker (ie, actual start of
- * compressed data), and will save all tables and parameters in the JPEG
- * object.  It will also initialize the decompression parameters to default
- * values, and finally return JPEG_HEADER_OK.  On return, the application may
- * adjust the decompression parameters and then call jpeg_start_decompress.
- * (Or, if the application only wanted to determine the image parameters,
- * the data need not be decompressed.  In that case, call jpeg_abort or
- * jpeg_destroy to release any temporary space.)
- * If an abbreviated (tables only) datastream is presented, the routine will
- * return JPEG_HEADER_TABLES_ONLY upon reaching EOI.  The application may then
- * re-use the JPEG object to read the abbreviated image datastream(s).
- * It is unnecessary (but OK) to call jpeg_abort in this case.
- * The JPEG_SUSPENDED return code only occurs if the data source module
- * requests suspension of the decompressor.  In this case the application
- * should load more source data and then re-call jpeg_read_header to resume
- * processing.
- * If a non-suspending data source is used and require_image is TRUE, then the
- * return code need not be inspected since only JPEG_HEADER_OK is possible.
- *
- * This routine is now just a front end to jpeg_consume_input, with some
- * extra error checking.
- */
-
-GLOBAL(int)
-jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)
-{
-  int retcode;
-
-  if (cinfo->global_state != DSTATE_START &&
-      cinfo->global_state != DSTATE_INHEADER)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  retcode = jpeg_consume_input(cinfo);
-
-  switch (retcode) {
-  case JPEG_REACHED_SOS:
-    retcode = JPEG_HEADER_OK;
-    break;
-  case JPEG_REACHED_EOI:
-    if (require_image)          /* Complain if application wanted an image */
-      ERREXIT(cinfo, JERR_NO_IMAGE);
-    /* Reset to start state; it would be safer to require the application to
-     * call jpeg_abort, but we can't change it now for compatibility reasons.
-     * A side effect is to free any temporary memory (there shouldn't be any).
-     */
-    jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */
-    retcode = JPEG_HEADER_TABLES_ONLY;
-    break;
-  case JPEG_SUSPENDED:
-    /* no work */
-    break;
-  }
-
-  return retcode;
-}
-
-
-/*
- * Consume data in advance of what the decompressor requires.
- * This can be called at any time once the decompressor object has
- * been created and a data source has been set up.
- *
- * This routine is essentially a state machine that handles a couple
- * of critical state-transition actions, namely initial setup and
- * transition from header scanning to ready-for-start_decompress.
- * All the actual input is done via the input controller's consume_input
- * method.
- */
-
-GLOBAL(int)
-jpeg_consume_input (j_decompress_ptr cinfo)
-{
-  int retcode = JPEG_SUSPENDED;
-
-  /* NB: every possible DSTATE value should be listed in this switch */
-  switch (cinfo->global_state) {
-  case DSTATE_START:
-    /* Start-of-datastream actions: reset appropriate modules */
-    (*cinfo->inputctl->reset_input_controller) (cinfo);
-    /* Initialize application's data source module */
-    (*cinfo->src->init_source) (cinfo);
-    cinfo->global_state = DSTATE_INHEADER;
-    /*FALLTHROUGH*/
-  case DSTATE_INHEADER:
-    retcode = (*cinfo->inputctl->consume_input) (cinfo);
-    if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
-      /* Set up default parameters based on header data */
-      default_decompress_parms(cinfo);
-      /* Set global state: ready for start_decompress */
-      cinfo->global_state = DSTATE_READY;
-    }
-    break;
-  case DSTATE_READY:
-    /* Can't advance past first SOS until start_decompress is called */
-    retcode = JPEG_REACHED_SOS;
-    break;
-  case DSTATE_PRELOAD:
-  case DSTATE_PRESCAN:
-  case DSTATE_SCANNING:
-  case DSTATE_RAW_OK:
-  case DSTATE_BUFIMAGE:
-  case DSTATE_BUFPOST:
-  case DSTATE_STOPPING:
-    retcode = (*cinfo->inputctl->consume_input) (cinfo);
-    break;
-  default:
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  }
-  return retcode;
-}
-
-
-/*
- * Have we finished reading the input file?
- */
-
-GLOBAL(boolean)
-jpeg_input_complete (j_decompress_ptr cinfo)
-{
-  /* Check for valid jpeg object */
-  if (cinfo->global_state < DSTATE_START ||
-      cinfo->global_state > DSTATE_STOPPING)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  return cinfo->inputctl->eoi_reached;
-}
-
-
-/*
- * Is there more than one scan?
- */
-
-GLOBAL(boolean)
-jpeg_has_multiple_scans (j_decompress_ptr cinfo)
-{
-  /* Only valid after jpeg_read_header completes */
-  if (cinfo->global_state < DSTATE_READY ||
-      cinfo->global_state > DSTATE_STOPPING)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  return cinfo->inputctl->has_multiple_scans;
-}
-
-
-/*
- * Finish JPEG decompression.
- *
- * This will normally just verify the file trailer and release temp storage.
- *
- * Returns FALSE if suspended.  The return value need be inspected only if
- * a suspending data source is used.
- */
-
-GLOBAL(boolean)
-jpeg_finish_decompress (j_decompress_ptr cinfo)
-{
-  if ((cinfo->global_state == DSTATE_SCANNING ||
-       cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {
-    /* Terminate final pass of non-buffered mode */
-    if (cinfo->output_scanline < cinfo->output_height)
-      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
-    (*cinfo->master->finish_output_pass) (cinfo);
-    cinfo->global_state = DSTATE_STOPPING;
-  } else if (cinfo->global_state == DSTATE_BUFIMAGE) {
-    /* Finishing after a buffered-image operation */
-    cinfo->global_state = DSTATE_STOPPING;
-  } else if (cinfo->global_state != DSTATE_STOPPING) {
-    /* STOPPING = repeat call after a suspension, anything else is error */
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  }
-  /* Read until EOI */
-  while (! cinfo->inputctl->eoi_reached) {
-    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
-      return FALSE;             /* Suspend, come back later */
-  }
-  /* Do final cleanup */
-  (*cinfo->src->term_source) (cinfo);
-  /* We can use jpeg_abort to release memory and reset global_state */
-  jpeg_abort((j_common_ptr) cinfo);
-  return TRUE;
-}
--- a/src/share/native/sun/awt/image/jpeg/jdapistd.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,279 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdapistd.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface code for the decompression half
- * of the JPEG library.  These are the "standard" API routines that are
- * used in the normal full-decompression case.  They are not used by a
- * transcoding-only application.  Note that if an application links in
- * jpeg_start_decompress, it will end up linking in the entire decompressor.
- * We thus must separate this file from jdapimin.c to avoid linking the
- * whole decompression library into a transcoder.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Forward declarations */
-LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));
-
-
-/*
- * Decompression initialization.
- * jpeg_read_header must be completed before calling this.
- *
- * If a multipass operating mode was selected, this will do all but the
- * last pass, and thus may take a great deal of time.
- *
- * Returns FALSE if suspended.  The return value need be inspected only if
- * a suspending data source is used.
- */
-
-GLOBAL(boolean)
-jpeg_start_decompress (j_decompress_ptr cinfo)
-{
-  if (cinfo->global_state == DSTATE_READY) {
-    /* First call: initialize master control, select active modules */
-    jinit_master_decompress(cinfo);
-    if (cinfo->buffered_image) {
-      /* No more work here; expecting jpeg_start_output next */
-      cinfo->global_state = DSTATE_BUFIMAGE;
-      return TRUE;
-    }
-    cinfo->global_state = DSTATE_PRELOAD;
-  }
-  if (cinfo->global_state == DSTATE_PRELOAD) {
-    /* If file has multiple scans, absorb them all into the coef buffer */
-    if (cinfo->inputctl->has_multiple_scans) {
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-      for (;;) {
-        int retcode;
-        /* Call progress monitor hook if present */
-        if (cinfo->progress != NULL)
-          (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
-        /* Absorb some more input */
-        retcode = (*cinfo->inputctl->consume_input) (cinfo);
-        if (retcode == JPEG_SUSPENDED)
-          return FALSE;
-        if (retcode == JPEG_REACHED_EOI)
-          break;
-        /* Advance progress counter if appropriate */
-        if (cinfo->progress != NULL &&
-            (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
-          if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
-            /* jdmaster underestimated number of scans; ratchet up one scan */
-            cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
-          }
-        }
-      }
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
-    }
-    cinfo->output_scan_number = cinfo->input_scan_number;
-  } else if (cinfo->global_state != DSTATE_PRESCAN)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  /* Perform any dummy output passes, and set up for the final pass */
-  return output_pass_setup(cinfo);
-}
-
-
-/*
- * Set up for an output pass, and perform any dummy pass(es) needed.
- * Common subroutine for jpeg_start_decompress and jpeg_start_output.
- * Entry: global_state = DSTATE_PRESCAN only if previously suspended.
- * Exit: If done, returns TRUE and sets global_state for proper output mode.
- *       If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.
- */
-
-LOCAL(boolean)
-output_pass_setup (j_decompress_ptr cinfo)
-{
-  if (cinfo->global_state != DSTATE_PRESCAN) {
-    /* First call: do pass setup */
-    (*cinfo->master->prepare_for_output_pass) (cinfo);
-    cinfo->output_scanline = 0;
-    cinfo->global_state = DSTATE_PRESCAN;
-  }
-  /* Loop over any required dummy passes */
-  while (cinfo->master->is_dummy_pass) {
-#ifdef QUANT_2PASS_SUPPORTED
-    /* Crank through the dummy pass */
-    while (cinfo->output_scanline < cinfo->output_height) {
-      JDIMENSION last_scanline;
-      /* Call progress monitor hook if present */
-      if (cinfo->progress != NULL) {
-        cinfo->progress->pass_counter = (long) cinfo->output_scanline;
-        cinfo->progress->pass_limit = (long) cinfo->output_height;
-        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
-      }
-      /* Process some data */
-      last_scanline = cinfo->output_scanline;
-      (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
-                                    &cinfo->output_scanline, (JDIMENSION) 0);
-      if (cinfo->output_scanline == last_scanline)
-        return FALSE;           /* No progress made, must suspend */
-    }
-    /* Finish up dummy pass, and set up for another one */
-    (*cinfo->master->finish_output_pass) (cinfo);
-    (*cinfo->master->prepare_for_output_pass) (cinfo);
-    cinfo->output_scanline = 0;
-#else
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif /* QUANT_2PASS_SUPPORTED */
-  }
-  /* Ready for application to drive output pass through
-   * jpeg_read_scanlines or jpeg_read_raw_data.
-   */
-  cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
-  return TRUE;
-}
-
-
-/*
- * Read some scanlines of data from the JPEG decompressor.
- *
- * The return value will be the number of lines actually read.
- * This may be less than the number requested in several cases,
- * including bottom of image, data source suspension, and operating
- * modes that emit multiple scanlines at a time.
- *
- * Note: we warn about excess calls to jpeg_read_scanlines() since
- * this likely signals an application programmer error.  However,
- * an oversize buffer (max_lines > scanlines remaining) is not an error.
- */
-
-GLOBAL(JDIMENSION)
-jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
-                     JDIMENSION max_lines)
-{
-  JDIMENSION row_ctr;
-
-  if (cinfo->global_state != DSTATE_SCANNING)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  if (cinfo->output_scanline >= cinfo->output_height) {
-    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
-    return 0;
-  }
-
-  /* Call progress monitor hook if present */
-  if (cinfo->progress != NULL) {
-    cinfo->progress->pass_counter = (long) cinfo->output_scanline;
-    cinfo->progress->pass_limit = (long) cinfo->output_height;
-    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
-  }
-
-  /* Process some data */
-  row_ctr = 0;
-  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
-  cinfo->output_scanline += row_ctr;
-  return row_ctr;
-}
-
-
-/*
- * Alternate entry point to read raw data.
- * Processes exactly one iMCU row per call, unless suspended.
- */
-
-GLOBAL(JDIMENSION)
-jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
-                    JDIMENSION max_lines)
-{
-  JDIMENSION lines_per_iMCU_row;
-
-  if (cinfo->global_state != DSTATE_RAW_OK)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  if (cinfo->output_scanline >= cinfo->output_height) {
-    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
-    return 0;
-  }
-
-  /* Call progress monitor hook if present */
-  if (cinfo->progress != NULL) {
-    cinfo->progress->pass_counter = (long) cinfo->output_scanline;
-    cinfo->progress->pass_limit = (long) cinfo->output_height;
-    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
-  }
-
-  /* Verify that at least one iMCU row can be returned. */
-  lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;
-  if (max_lines < lines_per_iMCU_row)
-    ERREXIT(cinfo, JERR_BUFFER_SIZE);
-
-  /* Decompress directly into user's buffer. */
-  if (! (*cinfo->coef->decompress_data) (cinfo, data))
-    return 0;                   /* suspension forced, can do nothing more */
-
-  /* OK, we processed one iMCU row. */
-  cinfo->output_scanline += lines_per_iMCU_row;
-  return lines_per_iMCU_row;
-}
-
-
-/* Additional entry points for buffered-image mode. */
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-
-/*
- * Initialize for an output pass in buffered-image mode.
- */
-
-GLOBAL(boolean)
-jpeg_start_output (j_decompress_ptr cinfo, int scan_number)
-{
-  if (cinfo->global_state != DSTATE_BUFIMAGE &&
-      cinfo->global_state != DSTATE_PRESCAN)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  /* Limit scan number to valid range */
-  if (scan_number <= 0)
-    scan_number = 1;
-  if (cinfo->inputctl->eoi_reached &&
-      scan_number > cinfo->input_scan_number)
-    scan_number = cinfo->input_scan_number;
-  cinfo->output_scan_number = scan_number;
-  /* Perform any dummy output passes, and set up for the real pass */
-  return output_pass_setup(cinfo);
-}
-
-
-/*
- * Finish up after an output pass in buffered-image mode.
- *
- * Returns FALSE if suspended.  The return value need be inspected only if
- * a suspending data source is used.
- */
-
-GLOBAL(boolean)
-jpeg_finish_output (j_decompress_ptr cinfo)
-{
-  if ((cinfo->global_state == DSTATE_SCANNING ||
-       cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {
-    /* Terminate this pass. */
-    /* We do not require the whole pass to have been completed. */
-    (*cinfo->master->finish_output_pass) (cinfo);
-    cinfo->global_state = DSTATE_BUFPOST;
-  } else if (cinfo->global_state != DSTATE_BUFPOST) {
-    /* BUFPOST = repeat call after a suspension, anything else is error */
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  }
-  /* Read markers looking for SOS or EOI */
-  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
-         ! cinfo->inputctl->eoi_reached) {
-    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
-      return FALSE;             /* Suspend, come back later */
-  }
-  cinfo->global_state = DSTATE_BUFIMAGE;
-  return TRUE;
-}
-
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jdcoefct.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,740 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdcoefct.c
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the coefficient buffer controller for decompression.
- * This controller is the top level of the JPEG decompressor proper.
- * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
- *
- * In buffered-image mode, this controller is the interface between
- * input-oriented processing and output-oriented processing.
- * Also, the input side (only) is used when reading a file for transcoding.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-/* Block smoothing is only applicable for progressive JPEG, so: */
-#ifndef D_PROGRESSIVE_SUPPORTED
-#undef BLOCK_SMOOTHING_SUPPORTED
-#endif
-
-/* Private buffer controller object */
-
-typedef struct {
-  struct jpeg_d_coef_controller pub; /* public fields */
-
-  /* These variables keep track of the current location of the input side. */
-  /* cinfo->input_iMCU_row is also used for this. */
-  JDIMENSION MCU_ctr;           /* counts MCUs processed in current row */
-  int MCU_vert_offset;          /* counts MCU rows within iMCU row */
-  int MCU_rows_per_iMCU_row;    /* number of such rows needed */
-
-  /* The output side's location is represented by cinfo->output_iMCU_row. */
-
-  /* In single-pass modes, it's sufficient to buffer just one MCU.
-   * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,
-   * and let the entropy decoder write into that workspace each time.
-   * (On 80x86, the workspace is FAR even though it's not really very big;
-   * this is to keep the module interfaces unchanged when a large coefficient
-   * buffer is necessary.)
-   * In multi-pass modes, this array points to the current MCU's blocks
-   * within the virtual arrays; it is used only by the input side.
-   */
-  JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-  /* In multi-pass modes, we need a virtual block array for each component. */
-  jvirt_barray_ptr whole_image[MAX_COMPONENTS];
-#endif
-
-#ifdef BLOCK_SMOOTHING_SUPPORTED
-  /* When doing block smoothing, we latch coefficient Al values here */
-  int * coef_bits_latch;
-#define SAVED_COEFS  6          /* we save coef_bits[0..5] */
-#endif
-} my_coef_controller;
-
-typedef my_coef_controller * my_coef_ptr;
-
-/* Forward declarations */
-METHODDEF(int) decompress_onepass
-        JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-METHODDEF(int) decompress_data
-        JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
-#endif
-#ifdef BLOCK_SMOOTHING_SUPPORTED
-LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo));
-METHODDEF(int) decompress_smooth_data
-        JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
-#endif
-
-
-LOCAL(void)
-start_iMCU_row (j_decompress_ptr cinfo)
-/* Reset within-iMCU-row counters for a new row (input side) */
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
-  /* In an interleaved scan, an MCU row is the same as an iMCU row.
-   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
-   * But at the bottom of the image, process only what's left.
-   */
-  if (cinfo->comps_in_scan > 1) {
-    coef->MCU_rows_per_iMCU_row = 1;
-  } else {
-    if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1))
-      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
-    else
-      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
-  }
-
-  coef->MCU_ctr = 0;
-  coef->MCU_vert_offset = 0;
-}
-
-
-/*
- * Initialize for an input processing pass.
- */
-
-METHODDEF(void)
-start_input_pass (j_decompress_ptr cinfo)
-{
-  cinfo->input_iMCU_row = 0;
-  start_iMCU_row(cinfo);
-}
-
-
-/*
- * Initialize for an output processing pass.
- */
-
-METHODDEF(void)
-start_output_pass (j_decompress_ptr cinfo)
-{
-#ifdef BLOCK_SMOOTHING_SUPPORTED
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
-  /* If multipass, check to see whether to use block smoothing on this pass */
-  if (coef->pub.coef_arrays != NULL) {
-    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
-      coef->pub.decompress_data = decompress_smooth_data;
-    else
-      coef->pub.decompress_data = decompress_data;
-  }
-#endif
-  cinfo->output_iMCU_row = 0;
-}
-
-
-/*
- * Decompress and return some data in the single-pass case.
- * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
- * Input and output must run in lockstep since we have only a one-MCU buffer.
- * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
- *
- * NB: output_buf contains a plane for each component in image,
- * which we index according to the component's SOF position.
- */
-
-METHODDEF(int)
-decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  JDIMENSION MCU_col_num;       /* index of current MCU within row */
-  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
-  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
-  int blkn, ci, xindex, yindex, yoffset, useful_width;
-  JSAMPARRAY output_ptr;
-  JDIMENSION start_col, output_col;
-  jpeg_component_info *compptr;
-  inverse_DCT_method_ptr inverse_DCT;
-
-  /* Loop to process as much as one whole iMCU row */
-  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
-       yoffset++) {
-    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
-         MCU_col_num++) {
-      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
-      jzero_far((void FAR *) coef->MCU_buffer[0],
-                (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
-      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
-        /* Suspension forced; update state counters and exit */
-        coef->MCU_vert_offset = yoffset;
-        coef->MCU_ctr = MCU_col_num;
-        return JPEG_SUSPENDED;
-      }
-      /* Determine where data should go in output_buf and do the IDCT thing.
-       * We skip dummy blocks at the right and bottom edges (but blkn gets
-       * incremented past them!).  Note the inner loop relies on having
-       * allocated the MCU_buffer[] blocks sequentially.
-       */
-      blkn = 0;                 /* index of current DCT block within MCU */
-      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-        compptr = cinfo->cur_comp_info[ci];
-        /* Don't bother to IDCT an uninteresting component. */
-        if (! compptr->component_needed) {
-          blkn += compptr->MCU_blocks;
-          continue;
-        }
-        inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
-        useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
-                                                    : compptr->last_col_width;
-        output_ptr = output_buf[compptr->component_index] +
-          yoffset * compptr->DCT_scaled_size;
-        start_col = MCU_col_num * compptr->MCU_sample_width;
-        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
-          if (cinfo->input_iMCU_row < last_iMCU_row ||
-              yoffset+yindex < compptr->last_row_height) {
-            output_col = start_col;
-            for (xindex = 0; xindex < useful_width; xindex++) {
-              (*inverse_DCT) (cinfo, compptr,
-                              (JCOEFPTR) coef->MCU_buffer[blkn+xindex],
-                              output_ptr, output_col);
-              output_col += compptr->DCT_scaled_size;
-            }
-          }
-          blkn += compptr->MCU_width;
-          output_ptr += compptr->DCT_scaled_size;
-        }
-      }
-    }
-    /* Completed an MCU row, but perhaps not an iMCU row */
-    coef->MCU_ctr = 0;
-  }
-  /* Completed the iMCU row, advance counters for next one */
-  cinfo->output_iMCU_row++;
-  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
-    start_iMCU_row(cinfo);
-    return JPEG_ROW_COMPLETED;
-  }
-  /* Completed the scan */
-  (*cinfo->inputctl->finish_input_pass) (cinfo);
-  return JPEG_SCAN_COMPLETED;
-}
-
-
-/*
- * Dummy consume-input routine for single-pass operation.
- */
-
-METHODDEF(int)
-dummy_consume_data (j_decompress_ptr cinfo)
-{
-  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
-}
-
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-
-/*
- * Consume input data and store it in the full-image coefficient buffer.
- * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
- * ie, v_samp_factor block rows for each component in the scan.
- * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
- */
-
-METHODDEF(int)
-consume_data (j_decompress_ptr cinfo)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  JDIMENSION MCU_col_num;       /* index of current MCU within row */
-  int blkn, ci, xindex, yindex, yoffset;
-  JDIMENSION start_col;
-  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
-  JBLOCKROW buffer_ptr;
-  jpeg_component_info *compptr;
-
-  /* Align the virtual buffers for the components used in this scan. */
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    buffer[ci] = (*cinfo->mem->access_virt_barray)
-      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
-       cinfo->input_iMCU_row * compptr->v_samp_factor,
-       (JDIMENSION) compptr->v_samp_factor, TRUE);
-    /* Note: entropy decoder expects buffer to be zeroed,
-     * but this is handled automatically by the memory manager
-     * because we requested a pre-zeroed array.
-     */
-  }
-
-  /* Loop to process one whole iMCU row */
-  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
-       yoffset++) {
-    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
-         MCU_col_num++) {
-      /* Construct list of pointers to DCT blocks belonging to this MCU */
-      blkn = 0;                 /* index of current DCT block within MCU */
-      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-        compptr = cinfo->cur_comp_info[ci];
-        start_col = MCU_col_num * compptr->MCU_width;
-        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
-          buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
-          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
-            coef->MCU_buffer[blkn++] = buffer_ptr++;
-          }
-        }
-      }
-      /* Try to fetch the MCU. */
-      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
-        /* Suspension forced; update state counters and exit */
-        coef->MCU_vert_offset = yoffset;
-        coef->MCU_ctr = MCU_col_num;
-        return JPEG_SUSPENDED;
-      }
-    }
-    /* Completed an MCU row, but perhaps not an iMCU row */
-    coef->MCU_ctr = 0;
-  }
-  /* Completed the iMCU row, advance counters for next one */
-  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
-    start_iMCU_row(cinfo);
-    return JPEG_ROW_COMPLETED;
-  }
-  /* Completed the scan */
-  (*cinfo->inputctl->finish_input_pass) (cinfo);
-  return JPEG_SCAN_COMPLETED;
-}
-
-
-/*
- * Decompress and return some data in the multi-pass case.
- * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
- * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
- *
- * NB: output_buf contains a plane for each component in image.
- */
-
-METHODDEF(int)
-decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
-  JDIMENSION block_num;
-  int ci, block_row, block_rows;
-  JBLOCKARRAY buffer;
-  JBLOCKROW buffer_ptr;
-  JSAMPARRAY output_ptr;
-  JDIMENSION output_col;
-  jpeg_component_info *compptr;
-  inverse_DCT_method_ptr inverse_DCT;
-
-  /* Force some input to be done if we are getting ahead of the input. */
-  while (cinfo->input_scan_number < cinfo->output_scan_number ||
-         (cinfo->input_scan_number == cinfo->output_scan_number &&
-          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
-    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
-      return JPEG_SUSPENDED;
-  }
-
-  /* OK, output from the virtual arrays. */
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Don't bother to IDCT an uninteresting component. */
-    if (! compptr->component_needed)
-      continue;
-    /* Align the virtual buffer for this component. */
-    buffer = (*cinfo->mem->access_virt_barray)
-      ((j_common_ptr) cinfo, coef->whole_image[ci],
-       cinfo->output_iMCU_row * compptr->v_samp_factor,
-       (JDIMENSION) compptr->v_samp_factor, FALSE);
-    /* Count non-dummy DCT block rows in this iMCU row. */
-    if (cinfo->output_iMCU_row < last_iMCU_row)
-      block_rows = compptr->v_samp_factor;
-    else {
-      /* NB: can't use last_row_height here; it is input-side-dependent! */
-      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
-      if (block_rows == 0) block_rows = compptr->v_samp_factor;
-    }
-    inverse_DCT = cinfo->idct->inverse_DCT[ci];
-    output_ptr = output_buf[ci];
-    /* Loop over all DCT blocks to be processed. */
-    for (block_row = 0; block_row < block_rows; block_row++) {
-      buffer_ptr = buffer[block_row];
-      output_col = 0;
-      for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) {
-        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr,
-                        output_ptr, output_col);
-        buffer_ptr++;
-        output_col += compptr->DCT_scaled_size;
-      }
-      output_ptr += compptr->DCT_scaled_size;
-    }
-  }
-
-  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
-    return JPEG_ROW_COMPLETED;
-  return JPEG_SCAN_COMPLETED;
-}
-
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
-
-
-#ifdef BLOCK_SMOOTHING_SUPPORTED
-
-/*
- * This code applies interblock smoothing as described by section K.8
- * of the JPEG standard: the first 5 AC coefficients are estimated from
- * the DC values of a DCT block and its 8 neighboring blocks.
- * We apply smoothing only for progressive JPEG decoding, and only if
- * the coefficients it can estimate are not yet known to full precision.
- */
-
-/* Natural-order array positions of the first 5 zigzag-order coefficients */
-#define Q01_POS  1
-#define Q10_POS  8
-#define Q20_POS  16
-#define Q11_POS  9
-#define Q02_POS  2
-
-/*
- * Determine whether block smoothing is applicable and safe.
- * We also latch the current states of the coef_bits[] entries for the
- * AC coefficients; otherwise, if the input side of the decompressor
- * advances into a new scan, we might think the coefficients are known
- * more accurately than they really are.
- */
-
-LOCAL(boolean)
-smoothing_ok (j_decompress_ptr cinfo)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  boolean smoothing_useful = FALSE;
-  int ci, coefi;
-  jpeg_component_info *compptr;
-  JQUANT_TBL * qtable;
-  int * coef_bits;
-  int * coef_bits_latch;
-
-  if (! cinfo->progressive_mode || cinfo->coef_bits == NULL)
-    return FALSE;
-
-  /* Allocate latch area if not already done */
-  if (coef->coef_bits_latch == NULL)
-    coef->coef_bits_latch = (int *)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  cinfo->num_components *
-                                  (SAVED_COEFS * SIZEOF(int)));
-  coef_bits_latch = coef->coef_bits_latch;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* All components' quantization values must already be latched. */
-    if ((qtable = compptr->quant_table) == NULL)
-      return FALSE;
-    /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */
-    if (qtable->quantval[0] == 0 ||
-        qtable->quantval[Q01_POS] == 0 ||
-        qtable->quantval[Q10_POS] == 0 ||
-        qtable->quantval[Q20_POS] == 0 ||
-        qtable->quantval[Q11_POS] == 0 ||
-        qtable->quantval[Q02_POS] == 0)
-      return FALSE;
-    /* DC values must be at least partly known for all components. */
-    coef_bits = cinfo->coef_bits[ci];
-    if (coef_bits[0] < 0)
-      return FALSE;
-    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
-    for (coefi = 1; coefi <= 5; coefi++) {
-      coef_bits_latch[coefi] = coef_bits[coefi];
-      if (coef_bits[coefi] != 0)
-        smoothing_useful = TRUE;
-    }
-    coef_bits_latch += SAVED_COEFS;
-  }
-
-  return smoothing_useful;
-}
-
-
-/*
- * Variant of decompress_data for use when doing block smoothing.
- */
-
-METHODDEF(int)
-decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
-{
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
-  JDIMENSION block_num, last_block_column;
-  int ci, block_row, block_rows, access_rows;
-  JBLOCKARRAY buffer;
-  JBLOCKROW buffer_ptr, prev_block_row, next_block_row;
-  JSAMPARRAY output_ptr;
-  JDIMENSION output_col;
-  jpeg_component_info *compptr;
-  inverse_DCT_method_ptr inverse_DCT;
-  boolean first_row, last_row;
-  JBLOCK workspace;
-  int *coef_bits;
-  JQUANT_TBL *quanttbl;
-  INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;
-  int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;
-  int Al, pred;
-
-  /* Force some input to be done if we are getting ahead of the input. */
-  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
-         ! cinfo->inputctl->eoi_reached) {
-    if (cinfo->input_scan_number == cinfo->output_scan_number) {
-      /* If input is working on current scan, we ordinarily want it to
-       * have completed the current row.  But if input scan is DC,
-       * we want it to keep one row ahead so that next block row's DC
-       * values are up to date.
-       */
-      JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;
-      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)
-        break;
-    }
-    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
-      return JPEG_SUSPENDED;
-  }
-
-  /* OK, output from the virtual arrays. */
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Don't bother to IDCT an uninteresting component. */
-    if (! compptr->component_needed)
-      continue;
-    /* Count non-dummy DCT block rows in this iMCU row. */
-    if (cinfo->output_iMCU_row < last_iMCU_row) {
-      block_rows = compptr->v_samp_factor;
-      access_rows = block_rows * 2; /* this and next iMCU row */
-      last_row = FALSE;
-    } else {
-      /* NB: can't use last_row_height here; it is input-side-dependent! */
-      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
-      if (block_rows == 0) block_rows = compptr->v_samp_factor;
-      access_rows = block_rows; /* this iMCU row only */
-      last_row = TRUE;
-    }
-    /* Align the virtual buffer for this component. */
-    if (cinfo->output_iMCU_row > 0) {
-      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
-      buffer = (*cinfo->mem->access_virt_barray)
-        ((j_common_ptr) cinfo, coef->whole_image[ci],
-         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
-         (JDIMENSION) access_rows, FALSE);
-      buffer += compptr->v_samp_factor; /* point to current iMCU row */
-      first_row = FALSE;
-    } else {
-      buffer = (*cinfo->mem->access_virt_barray)
-        ((j_common_ptr) cinfo, coef->whole_image[ci],
-         (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);
-      first_row = TRUE;
-    }
-    /* Fetch component-dependent info */
-    coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
-    quanttbl = compptr->quant_table;
-    Q00 = quanttbl->quantval[0];
-    Q01 = quanttbl->quantval[Q01_POS];
-    Q10 = quanttbl->quantval[Q10_POS];
-    Q20 = quanttbl->quantval[Q20_POS];
-    Q11 = quanttbl->quantval[Q11_POS];
-    Q02 = quanttbl->quantval[Q02_POS];
-    inverse_DCT = cinfo->idct->inverse_DCT[ci];
-    output_ptr = output_buf[ci];
-    /* Loop over all DCT blocks to be processed. */
-    for (block_row = 0; block_row < block_rows; block_row++) {
-      buffer_ptr = buffer[block_row];
-      if (first_row && block_row == 0)
-        prev_block_row = buffer_ptr;
-      else
-        prev_block_row = buffer[block_row-1];
-      if (last_row && block_row == block_rows-1)
-        next_block_row = buffer_ptr;
-      else
-        next_block_row = buffer[block_row+1];
-      /* We fetch the surrounding DC values using a sliding-register approach.
-       * Initialize all nine here so as to do the right thing on narrow pics.
-       */
-      DC1 = DC2 = DC3 = (int) prev_block_row[0][0];
-      DC4 = DC5 = DC6 = (int) buffer_ptr[0][0];
-      DC7 = DC8 = DC9 = (int) next_block_row[0][0];
-      output_col = 0;
-      last_block_column = compptr->width_in_blocks - 1;
-      for (block_num = 0; block_num <= last_block_column; block_num++) {
-        /* Fetch current DCT block into workspace so we can modify it. */
-        jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1);
-        /* Update DC values */
-        if (block_num < last_block_column) {
-          DC3 = (int) prev_block_row[1][0];
-          DC6 = (int) buffer_ptr[1][0];
-          DC9 = (int) next_block_row[1][0];
-        }
-        /* Compute coefficient estimates per K.8.
-         * An estimate is applied only if coefficient is still zero,
-         * and is not known to be fully accurate.
-         */
-        /* AC01 */
-        if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) {
-          num = 36 * Q00 * (DC4 - DC6);
-          if (num >= 0) {
-            pred = (int) (((Q01<<7) + num) / (Q01<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-          } else {
-            pred = (int) (((Q01<<7) - num) / (Q01<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-            pred = -pred;
-          }
-          workspace[1] = (JCOEF) pred;
-        }
-        /* AC10 */
-        if ((Al=coef_bits[2]) != 0 && workspace[8] == 0) {
-          num = 36 * Q00 * (DC2 - DC8);
-          if (num >= 0) {
-            pred = (int) (((Q10<<7) + num) / (Q10<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-          } else {
-            pred = (int) (((Q10<<7) - num) / (Q10<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-            pred = -pred;
-          }
-          workspace[8] = (JCOEF) pred;
-        }
-        /* AC20 */
-        if ((Al=coef_bits[3]) != 0 && workspace[16] == 0) {
-          num = 9 * Q00 * (DC2 + DC8 - 2*DC5);
-          if (num >= 0) {
-            pred = (int) (((Q20<<7) + num) / (Q20<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-          } else {
-            pred = (int) (((Q20<<7) - num) / (Q20<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-            pred = -pred;
-          }
-          workspace[16] = (JCOEF) pred;
-        }
-        /* AC11 */
-        if ((Al=coef_bits[4]) != 0 && workspace[9] == 0) {
-          num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);
-          if (num >= 0) {
-            pred = (int) (((Q11<<7) + num) / (Q11<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-          } else {
-            pred = (int) (((Q11<<7) - num) / (Q11<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-            pred = -pred;
-          }
-          workspace[9] = (JCOEF) pred;
-        }
-        /* AC02 */
-        if ((Al=coef_bits[5]) != 0 && workspace[2] == 0) {
-          num = 9 * Q00 * (DC4 + DC6 - 2*DC5);
-          if (num >= 0) {
-            pred = (int) (((Q02<<7) + num) / (Q02<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-          } else {
-            pred = (int) (((Q02<<7) - num) / (Q02<<8));
-            if (Al > 0 && pred >= (1<<Al))
-              pred = (1<<Al)-1;
-            pred = -pred;
-          }
-          workspace[2] = (JCOEF) pred;
-        }
-        /* OK, do the IDCT */
-        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace,
-                        output_ptr, output_col);
-        /* Advance for next column */
-        DC1 = DC2; DC2 = DC3;
-        DC4 = DC5; DC5 = DC6;
-        DC7 = DC8; DC8 = DC9;
-        buffer_ptr++, prev_block_row++, next_block_row++;
-        output_col += compptr->DCT_scaled_size;
-      }
-      output_ptr += compptr->DCT_scaled_size;
-    }
-  }
-
-  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
-    return JPEG_ROW_COMPLETED;
-  return JPEG_SCAN_COMPLETED;
-}
-
-#endif /* BLOCK_SMOOTHING_SUPPORTED */
-
-
-/*
- * Initialize coefficient buffer controller.
- */
-
-GLOBAL(void)
-jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
-{
-  my_coef_ptr coef;
-
-  coef = (my_coef_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_coef_controller));
-  cinfo->coef = (struct jpeg_d_coef_controller *) coef;
-  coef->pub.start_input_pass = start_input_pass;
-  coef->pub.start_output_pass = start_output_pass;
-#ifdef BLOCK_SMOOTHING_SUPPORTED
-  coef->coef_bits_latch = NULL;
-#endif
-
-  /* Create the coefficient buffer. */
-  if (need_full_buffer) {
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-    /* Allocate a full-image virtual array for each component, */
-    /* padded to a multiple of samp_factor DCT blocks in each direction. */
-    /* Note we ask for a pre-zeroed array. */
-    int ci, access_rows;
-    jpeg_component_info *compptr;
-
-    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-         ci++, compptr++) {
-      access_rows = compptr->v_samp_factor;
-#ifdef BLOCK_SMOOTHING_SUPPORTED
-      /* If block smoothing could be used, need a bigger window */
-      if (cinfo->progressive_mode)
-        access_rows *= 3;
-#endif
-      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
-        ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE,
-         (JDIMENSION) jround_up((long) compptr->width_in_blocks,
-                                (long) compptr->h_samp_factor),
-         (JDIMENSION) jround_up((long) compptr->height_in_blocks,
-                                (long) compptr->v_samp_factor),
-         (JDIMENSION) access_rows);
-    }
-    coef->pub.consume_data = consume_data;
-    coef->pub.decompress_data = decompress_data;
-    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
-#else
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-  } else {
-    /* We only need a single-MCU buffer. */
-    JBLOCKROW buffer;
-    int i;
-
-    buffer = (JBLOCKROW)
-      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
-    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
-      coef->MCU_buffer[i] = buffer + i;
-    }
-    coef->pub.consume_data = dummy_consume_data;
-    coef->pub.decompress_data = decompress_onepass;
-    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jdcolor.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,398 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdcolor.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains output colorspace conversion routines.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private subobject */
-
-typedef struct {
-  struct jpeg_color_deconverter pub; /* public fields */
-
-  /* Private state for YCC->RGB conversion */
-  int * Cr_r_tab;               /* => table for Cr to R conversion */
-  int * Cb_b_tab;               /* => table for Cb to B conversion */
-  INT32 * Cr_g_tab;             /* => table for Cr to G conversion */
-  INT32 * Cb_g_tab;             /* => table for Cb to G conversion */
-} my_color_deconverter;
-
-typedef my_color_deconverter * my_cconvert_ptr;
-
-
-/**************** YCbCr -> RGB conversion: most common case **************/
-
-/*
- * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
- * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
- * The conversion equations to be implemented are therefore
- *      R = Y                + 1.40200 * Cr
- *      G = Y - 0.34414 * Cb - 0.71414 * Cr
- *      B = Y + 1.77200 * Cb
- * where Cb and Cr represent the incoming values less CENTERJSAMPLE.
- * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
- *
- * To avoid floating-point arithmetic, we represent the fractional constants
- * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
- * the products by 2^16, with appropriate rounding, to get the correct answer.
- * Notice that Y, being an integral input, does not contribute any fraction
- * so it need not participate in the rounding.
- *
- * For even more speed, we avoid doing any multiplications in the inner loop
- * by precalculating the constants times Cb and Cr for all possible values.
- * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
- * for 12-bit samples it is still acceptable.  It's not very reasonable for
- * 16-bit samples, but if you want lossless storage you shouldn't be changing
- * colorspace anyway.
- * The Cr=>R and Cb=>B values can be rounded to integers in advance; the
- * values for the G calculation are left scaled up, since we must add them
- * together before rounding.
- */
-
-#define SCALEBITS       16      /* speediest right-shift on some machines */
-#define ONE_HALF        ((INT32) 1 << (SCALEBITS-1))
-#define FIX(x)          ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
-
-
-/*
- * Initialize tables for YCC->RGB colorspace conversion.
- */
-
-LOCAL(void)
-build_ycc_rgb_table (j_decompress_ptr cinfo)
-{
-  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
-  int i;
-  INT32 x;
-  SHIFT_TEMPS
-
-  cconvert->Cr_r_tab = (int *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (MAXJSAMPLE+1) * SIZEOF(int));
-  cconvert->Cb_b_tab = (int *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (MAXJSAMPLE+1) * SIZEOF(int));
-  cconvert->Cr_g_tab = (INT32 *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (MAXJSAMPLE+1) * SIZEOF(INT32));
-  cconvert->Cb_g_tab = (INT32 *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (MAXJSAMPLE+1) * SIZEOF(INT32));
-
-  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
-    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
-    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
-    /* Cr=>R value is nearest int to 1.40200 * x */
-    cconvert->Cr_r_tab[i] = (int)
-                    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
-    /* Cb=>B value is nearest int to 1.77200 * x */
-    cconvert->Cb_b_tab[i] = (int)
-                    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
-    /* Cr=>G value is scaled-up -0.71414 * x */
-    cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
-    /* Cb=>G value is scaled-up -0.34414 * x */
-    /* We also add in ONE_HALF so that need not do it in inner loop */
-    cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
-  }
-}
-
-
-/*
- * Convert some rows of samples to the output colorspace.
- *
- * Note that we change from noninterleaved, one-plane-per-component format
- * to interleaved-pixel format.  The output buffer is therefore three times
- * as wide as the input buffer.
- * A starting row offset is provided only for the input buffer.  The caller
- * can easily adjust the passed output_buf value to accommodate any row
- * offset required on that side.
- */
-
-METHODDEF(void)
-ycc_rgb_convert (j_decompress_ptr cinfo,
-                 JSAMPIMAGE input_buf, JDIMENSION input_row,
-                 JSAMPARRAY output_buf, int num_rows)
-{
-  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
-  register int y, cb, cr;
-  register JSAMPROW outptr;
-  register JSAMPROW inptr0, inptr1, inptr2;
-  register JDIMENSION col;
-  JDIMENSION num_cols = cinfo->output_width;
-  /* copy these pointers into registers if possible */
-  register JSAMPLE * range_limit = cinfo->sample_range_limit;
-  register int * Crrtab = cconvert->Cr_r_tab;
-  register int * Cbbtab = cconvert->Cb_b_tab;
-  register INT32 * Crgtab = cconvert->Cr_g_tab;
-  register INT32 * Cbgtab = cconvert->Cb_g_tab;
-  SHIFT_TEMPS
-
-  while (--num_rows >= 0) {
-    inptr0 = input_buf[0][input_row];
-    inptr1 = input_buf[1][input_row];
-    inptr2 = input_buf[2][input_row];
-    input_row++;
-    outptr = *output_buf++;
-    for (col = 0; col < num_cols; col++) {
-      y  = GETJSAMPLE(inptr0[col]);
-      cb = GETJSAMPLE(inptr1[col]);
-      cr = GETJSAMPLE(inptr2[col]);
-      /* Range-limiting is essential due to noise introduced by DCT losses. */
-      outptr[RGB_RED] =   range_limit[y + Crrtab[cr]];
-      outptr[RGB_GREEN] = range_limit[y +
-                              ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
-                                                 SCALEBITS))];
-      outptr[RGB_BLUE] =  range_limit[y + Cbbtab[cb]];
-      outptr += RGB_PIXELSIZE;
-    }
-  }
-}
-
-
-/**************** Cases other than YCbCr -> RGB **************/
-
-
-/*
- * Color conversion for no colorspace change: just copy the data,
- * converting from separate-planes to interleaved representation.
- */
-
-METHODDEF(void)
-null_convert (j_decompress_ptr cinfo,
-              JSAMPIMAGE input_buf, JDIMENSION input_row,
-              JSAMPARRAY output_buf, int num_rows)
-{
-  register JSAMPROW inptr, outptr;
-  register JDIMENSION count;
-  register int num_components = cinfo->num_components;
-  JDIMENSION num_cols = cinfo->output_width;
-  int ci;
-
-  while (--num_rows >= 0) {
-    for (ci = 0; ci < num_components; ci++) {
-      inptr = input_buf[ci][input_row];
-      outptr = output_buf[0] + ci;
-      for (count = num_cols; count > 0; count--) {
-        *outptr = *inptr++;     /* needn't bother with GETJSAMPLE() here */
-        outptr += num_components;
-      }
-    }
-    input_row++;
-    output_buf++;
-  }
-}
-
-
-/*
- * Color conversion for grayscale: just copy the data.
- * This also works for YCbCr -> grayscale conversion, in which
- * we just copy the Y (luminance) component and ignore chrominance.
- */
-
-METHODDEF(void)
-grayscale_convert (j_decompress_ptr cinfo,
-                   JSAMPIMAGE input_buf, JDIMENSION input_row,
-                   JSAMPARRAY output_buf, int num_rows)
-{
-  jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,
-                    num_rows, cinfo->output_width);
-}
-
-/*
- * Convert grayscale to RGB: just duplicate the graylevel three times.
- * This is provided to support applications that don't want to cope
- * with grayscale as a separate case.
- */
-
-METHODDEF(void)
-gray_rgb_convert (j_decompress_ptr cinfo,
-                  JSAMPIMAGE input_buf, JDIMENSION input_row,
-                  JSAMPARRAY output_buf, int num_rows)
-{
-  register JSAMPROW inptr, outptr;
-  register JDIMENSION col;
-  JDIMENSION num_cols = cinfo->output_width;
-
-  while (--num_rows >= 0) {
-    inptr = input_buf[0][input_row++];
-    outptr = *output_buf++;
-    for (col = 0; col < num_cols; col++) {
-      /* We can dispense with GETJSAMPLE() here */
-      outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
-      outptr += RGB_PIXELSIZE;
-    }
-  }
-}
-
-
-/*
- * Adobe-style YCCK->CMYK conversion.
- * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
- * conversion as above, while passing K (black) unchanged.
- * We assume build_ycc_rgb_table has been called.
- */
-
-METHODDEF(void)
-ycck_cmyk_convert (j_decompress_ptr cinfo,
-                   JSAMPIMAGE input_buf, JDIMENSION input_row,
-                   JSAMPARRAY output_buf, int num_rows)
-{
-  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
-  register int y, cb, cr;
-  register JSAMPROW outptr;
-  register JSAMPROW inptr0, inptr1, inptr2, inptr3;
-  register JDIMENSION col;
-  JDIMENSION num_cols = cinfo->output_width;
-  /* copy these pointers into registers if possible */
-  register JSAMPLE * range_limit = cinfo->sample_range_limit;
-  register int * Crrtab = cconvert->Cr_r_tab;
-  register int * Cbbtab = cconvert->Cb_b_tab;
-  register INT32 * Crgtab = cconvert->Cr_g_tab;
-  register INT32 * Cbgtab = cconvert->Cb_g_tab;
-  SHIFT_TEMPS
-
-  while (--num_rows >= 0) {
-    inptr0 = input_buf[0][input_row];
-    inptr1 = input_buf[1][input_row];
-    inptr2 = input_buf[2][input_row];
-    inptr3 = input_buf[3][input_row];
-    input_row++;
-    outptr = *output_buf++;
-    for (col = 0; col < num_cols; col++) {
-      y  = GETJSAMPLE(inptr0[col]);
-      cb = GETJSAMPLE(inptr1[col]);
-      cr = GETJSAMPLE(inptr2[col]);
-      /* Range-limiting is essential due to noise introduced by DCT losses. */
-      outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])];   /* red */
-      outptr[1] = range_limit[MAXJSAMPLE - (y +                 /* green */
-                              ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
-                                                 SCALEBITS)))];
-      outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])];   /* blue */
-      /* K passes through unchanged */
-      outptr[3] = inptr3[col];  /* don't need GETJSAMPLE here */
-      outptr += 4;
-    }
-  }
-}
-
-
-/*
- * Empty method for start_pass.
- */
-
-METHODDEF(void)
-start_pass_dcolor (j_decompress_ptr cinfo)
-{
-  /* no work needed */
-}
-
-
-/*
- * Module initialization routine for output colorspace conversion.
- */
-
-GLOBAL(void)
-jinit_color_deconverter (j_decompress_ptr cinfo)
-{
-  my_cconvert_ptr cconvert;
-  int ci;
-
-  cconvert = (my_cconvert_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_color_deconverter));
-  cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
-  cconvert->pub.start_pass = start_pass_dcolor;
-
-  /* Make sure num_components agrees with jpeg_color_space */
-  switch (cinfo->jpeg_color_space) {
-  case JCS_GRAYSCALE:
-    if (cinfo->num_components != 1)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    break;
-  case JCS_RGB:
-  case JCS_YCbCr:
-    if (cinfo->num_components != 3)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    break;
-
-  case JCS_CMYK:
-  case JCS_YCCK:
-    if (cinfo->num_components != 4)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    break;
-
-  default:                      /* JCS_UNKNOWN can be anything */
-    if (cinfo->num_components < 1)
-      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
-    break;
-  }
-
-  /* Set out_color_components and conversion method based on requested space.
-   * Also clear the component_needed flags for any unused components,
-   * so that earlier pipeline stages can avoid useless computation.
-   */
-
-  switch (cinfo->out_color_space) {
-  case JCS_GRAYSCALE:
-    cinfo->out_color_components = 1;
-    if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
-        cinfo->jpeg_color_space == JCS_YCbCr) {
-      cconvert->pub.color_convert = grayscale_convert;
-      /* For color->grayscale conversion, only the Y (0) component is needed */
-      for (ci = 1; ci < cinfo->num_components; ci++)
-        cinfo->comp_info[ci].component_needed = FALSE;
-    } else
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-
-  case JCS_RGB:
-    cinfo->out_color_components = RGB_PIXELSIZE;
-    if (cinfo->jpeg_color_space == JCS_YCbCr) {
-      cconvert->pub.color_convert = ycc_rgb_convert;
-      build_ycc_rgb_table(cinfo);
-    } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
-      cconvert->pub.color_convert = gray_rgb_convert;
-    } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {
-      cconvert->pub.color_convert = null_convert;
-    } else
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-
-  case JCS_CMYK:
-    cinfo->out_color_components = 4;
-    if (cinfo->jpeg_color_space == JCS_YCCK) {
-      cconvert->pub.color_convert = ycck_cmyk_convert;
-      build_ycc_rgb_table(cinfo);
-    } else if (cinfo->jpeg_color_space == JCS_CMYK) {
-      cconvert->pub.color_convert = null_convert;
-    } else
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-
-  default:
-    /* Permit null conversion to same output space */
-    if (cinfo->out_color_space == cinfo->jpeg_color_space) {
-      cinfo->out_color_components = cinfo->num_components;
-      cconvert->pub.color_convert = null_convert;
-    } else                      /* unsupported non-null conversion */
-      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
-    break;
-  }
-
-  if (cinfo->quantize_colors)
-    cinfo->output_components = 1; /* single colormapped output component */
-  else
-    cinfo->output_components = cinfo->out_color_components;
-}
--- a/src/share/native/sun/awt/image/jpeg/jdct.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdct.h
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This include file contains common declarations for the forward and
- * inverse DCT modules.  These declarations are private to the DCT managers
- * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms.
- * The individual DCT algorithms are kept in separate files to ease
- * machine-dependent tuning (e.g., assembly coding).
- */
-
-
-/*
- * A forward DCT routine is given a pointer to a work area of type DCTELEM[];
- * the DCT is to be performed in-place in that buffer.  Type DCTELEM is int
- * for 8-bit samples, INT32 for 12-bit samples.  (NOTE: Floating-point DCT
- * implementations use an array of type FAST_FLOAT, instead.)
- * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE).
- * The DCT outputs are returned scaled up by a factor of 8; they therefore
- * have a range of +-8K for 8-bit data, +-128K for 12-bit data.  This
- * convention improves accuracy in integer implementations and saves some
- * work in floating-point ones.
- * Quantization of the output coefficients is done by jcdctmgr.c.
- */
-
-#if BITS_IN_JSAMPLE == 8
-typedef int DCTELEM;            /* 16 or 32 bits is fine */
-#else
-typedef INT32 DCTELEM;          /* must have 32 bits */
-#endif
-
-typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data));
-typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data));
-
-
-/*
- * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer
- * to an output sample array.  The routine must dequantize the input data as
- * well as perform the IDCT; for dequantization, it uses the multiplier table
- * pointed to by compptr->dct_table.  The output data is to be placed into the
- * sample array starting at a specified column.  (Any row offset needed will
- * be applied to the array pointer before it is passed to the IDCT code.)
- * Note that the number of samples emitted by the IDCT routine is
- * DCT_scaled_size * DCT_scaled_size.
- */
-
-/* typedef inverse_DCT_method_ptr is declared in jpegint.h */
-
-/*
- * Each IDCT routine has its own ideas about the best dct_table element type.
- */
-
-typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */
-#if BITS_IN_JSAMPLE == 8
-typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */
-#define IFAST_SCALE_BITS  2     /* fractional bits in scale factors */
-#else
-typedef INT32 IFAST_MULT_TYPE;  /* need 32 bits for scaled quantizers */
-#define IFAST_SCALE_BITS  13    /* fractional bits in scale factors */
-#endif
-typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */
-
-
-/*
- * Each IDCT routine is responsible for range-limiting its results and
- * converting them to unsigned form (0..MAXJSAMPLE).  The raw outputs could
- * be quite far out of range if the input data is corrupt, so a bulletproof
- * range-limiting step is required.  We use a mask-and-table-lookup method
- * to do the combined operations quickly.  See the comments with
- * prepare_range_limit_table (in jdmaster.c) for more info.
- */
-
-#define IDCT_range_limit(cinfo)  ((cinfo)->sample_range_limit + CENTERJSAMPLE)
-
-#define RANGE_MASK  (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */
-
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_fdct_islow         jFDislow
-#define jpeg_fdct_ifast         jFDifast
-#define jpeg_fdct_float         jFDfloat
-#define jpeg_idct_islow         jRDislow
-#define jpeg_idct_ifast         jRDifast
-#define jpeg_idct_float         jRDfloat
-#define jpeg_idct_4x4           jRD4x4
-#define jpeg_idct_2x2           jRD2x2
-#define jpeg_idct_1x1           jRD1x1
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-/* Extern declarations for the forward and inverse DCT routines. */
-
-EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data));
-EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data));
-EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data));
-
-EXTERN(void) jpeg_idct_islow
-    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
-         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_ifast
-    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
-         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_float
-    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
-         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_4x4
-    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
-         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_2x2
-    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
-         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_1x1
-    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
-         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-
-
-/*
- * Macros for handling fixed-point arithmetic; these are used by many
- * but not all of the DCT/IDCT modules.
- *
- * All values are expected to be of type INT32.
- * Fractional constants are scaled left by CONST_BITS bits.
- * CONST_BITS is defined within each module using these macros,
- * and may differ from one module to the next.
- */
-
-#define ONE     ((INT32) 1)
-#define CONST_SCALE (ONE << CONST_BITS)
-
-/* Convert a positive real constant to an integer scaled by CONST_SCALE.
- * Caution: some C compilers fail to reduce "FIX(constant)" at compile time,
- * thus causing a lot of useless floating-point operations at run time.
- */
-
-#define FIX(x)  ((INT32) ((x) * CONST_SCALE + 0.5))
-
-/* Descale and correctly round an INT32 value that's scaled by N bits.
- * We assume RIGHT_SHIFT rounds towards minus infinity, so adding
- * the fudge factor is correct for either sign of X.
- */
-
-#define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
-
-/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
- * This macro is used only when the two inputs will actually be no more than
- * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
- * full 32x32 multiply.  This provides a useful speedup on many machines.
- * Unfortunately there is no way to specify a 16x16->32 multiply portably
- * in C, but some C compilers will do the right thing if you provide the
- * correct combination of casts.
- */
-
-#ifdef SHORTxSHORT_32           /* may work if 'int' is 32 bits */
-#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT16) (const)))
-#endif
-#ifdef SHORTxLCONST_32          /* known to work with Microsoft C 6.0 */
-#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT32) (const)))
-#endif
-
-#ifndef MULTIPLY16C16           /* default definition */
-#define MULTIPLY16C16(var,const)  ((var) * (const))
-#endif
-
-/* Same except both inputs are variables. */
-
-#ifdef SHORTxSHORT_32           /* may work if 'int' is 32 bits */
-#define MULTIPLY16V16(var1,var2)  (((INT16) (var1)) * ((INT16) (var2)))
-#endif
-
-#ifndef MULTIPLY16V16           /* default definition */
-#define MULTIPLY16V16(var1,var2)  ((var1) * (var2))
-#endif
--- a/src/share/native/sun/awt/image/jpeg/jddctmgr.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jddctmgr.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the inverse-DCT management logic.
- * This code selects a particular IDCT implementation to be used,
- * and it performs related housekeeping chores.  No code in this file
- * is executed per IDCT step, only during output pass setup.
- *
- * Note that the IDCT routines are responsible for performing coefficient
- * dequantization as well as the IDCT proper.  This module sets up the
- * dequantization multiplier table needed by the IDCT routine.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-
-/*
- * The decompressor input side (jdinput.c) saves away the appropriate
- * quantization table for each component at the start of the first scan
- * involving that component.  (This is necessary in order to correctly
- * decode files that reuse Q-table slots.)
- * When we are ready to make an output pass, the saved Q-table is converted
- * to a multiplier table that will actually be used by the IDCT routine.
- * The multiplier table contents are IDCT-method-dependent.  To support
- * application changes in IDCT method between scans, we can remake the
- * multiplier tables if necessary.
- * In buffered-image mode, the first output pass may occur before any data
- * has been seen for some components, and thus before their Q-tables have
- * been saved away.  To handle this case, multiplier tables are preset
- * to zeroes; the result of the IDCT will be a neutral gray level.
- */
-
-
-/* Private subobject for this module */
-
-typedef struct {
-  struct jpeg_inverse_dct pub;  /* public fields */
-
-  /* This array contains the IDCT method code that each multiplier table
-   * is currently set up for, or -1 if it's not yet set up.
-   * The actual multiplier tables are pointed to by dct_table in the
-   * per-component comp_info structures.
-   */
-  int cur_method[MAX_COMPONENTS];
-} my_idct_controller;
-
-typedef my_idct_controller * my_idct_ptr;
-
-
-/* Allocated multiplier tables: big enough for any supported variant */
-
-typedef union {
-  ISLOW_MULT_TYPE islow_array[DCTSIZE2];
-#ifdef DCT_IFAST_SUPPORTED
-  IFAST_MULT_TYPE ifast_array[DCTSIZE2];
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
-  FLOAT_MULT_TYPE float_array[DCTSIZE2];
-#endif
-} multiplier_table;
-
-
-/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
- * so be sure to compile that code if either ISLOW or SCALING is requested.
- */
-#ifdef DCT_ISLOW_SUPPORTED
-#define PROVIDE_ISLOW_TABLES
-#else
-#ifdef IDCT_SCALING_SUPPORTED
-#define PROVIDE_ISLOW_TABLES
-#endif
-#endif
-
-
-/*
- * Prepare for an output pass.
- * Here we select the proper IDCT routine for each component and build
- * a matching multiplier table.
- */
-
-METHODDEF(void)
-start_pass (j_decompress_ptr cinfo)
-{
-  my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
-  int ci, i;
-  jpeg_component_info *compptr;
-  int method = 0;
-  inverse_DCT_method_ptr method_ptr = NULL;
-  JQUANT_TBL * qtbl;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Select the proper IDCT routine for this component's scaling */
-    switch (compptr->DCT_scaled_size) {
-#ifdef IDCT_SCALING_SUPPORTED
-    case 1:
-      method_ptr = jpeg_idct_1x1;
-      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
-      break;
-    case 2:
-      method_ptr = jpeg_idct_2x2;
-      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
-      break;
-    case 4:
-      method_ptr = jpeg_idct_4x4;
-      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
-      break;
-#endif
-    case DCTSIZE:
-      switch (cinfo->dct_method) {
-#ifdef DCT_ISLOW_SUPPORTED
-      case JDCT_ISLOW:
-        method_ptr = jpeg_idct_islow;
-        method = JDCT_ISLOW;
-        break;
-#endif
-#ifdef DCT_IFAST_SUPPORTED
-      case JDCT_IFAST:
-        method_ptr = jpeg_idct_ifast;
-        method = JDCT_IFAST;
-        break;
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
-      case JDCT_FLOAT:
-        method_ptr = jpeg_idct_float;
-        method = JDCT_FLOAT;
-        break;
-#endif
-      default:
-        ERREXIT(cinfo, JERR_NOT_COMPILED);
-        break;
-      }
-      break;
-    default:
-      ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);
-      break;
-    }
-    idct->pub.inverse_DCT[ci] = method_ptr;
-    /* Create multiplier table from quant table.
-     * However, we can skip this if the component is uninteresting
-     * or if we already built the table.  Also, if no quant table
-     * has yet been saved for the component, we leave the
-     * multiplier table all-zero; we'll be reading zeroes from the
-     * coefficient controller's buffer anyway.
-     */
-    if (! compptr->component_needed || idct->cur_method[ci] == method)
-      continue;
-    qtbl = compptr->quant_table;
-    if (qtbl == NULL)           /* happens if no data yet for component */
-      continue;
-    idct->cur_method[ci] = method;
-    switch (method) {
-#ifdef PROVIDE_ISLOW_TABLES
-    case JDCT_ISLOW:
-      {
-        /* For LL&M IDCT method, multipliers are equal to raw quantization
-         * coefficients, but are stored as ints to ensure access efficiency.
-         */
-        ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
-        for (i = 0; i < DCTSIZE2; i++) {
-          ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
-        }
-      }
-      break;
-#endif
-#ifdef DCT_IFAST_SUPPORTED
-    case JDCT_IFAST:
-      {
-        /* For AA&N IDCT method, multipliers are equal to quantization
-         * coefficients scaled by scalefactor[row]*scalefactor[col], where
-         *   scalefactor[0] = 1
-         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
-         * For integer operation, the multiplier table is to be scaled by
-         * IFAST_SCALE_BITS.
-         */
-        IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
-#define CONST_BITS 14
-        static const INT16 aanscales[DCTSIZE2] = {
-          /* precomputed values scaled up by 14 bits */
-          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
-          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
-          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
-          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
-          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
-          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
-           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
-           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
-        };
-        SHIFT_TEMPS
-
-        for (i = 0; i < DCTSIZE2; i++) {
-          ifmtbl[i] = (IFAST_MULT_TYPE)
-            DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
-                                  (INT32) aanscales[i]),
-                    CONST_BITS-IFAST_SCALE_BITS);
-        }
-      }
-      break;
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
-    case JDCT_FLOAT:
-      {
-        /* For float AA&N IDCT method, multipliers are equal to quantization
-         * coefficients scaled by scalefactor[row]*scalefactor[col], where
-         *   scalefactor[0] = 1
-         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
-         */
-        FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
-        int row, col;
-        static const double aanscalefactor[DCTSIZE] = {
-          1.0, 1.387039845, 1.306562965, 1.175875602,
-          1.0, 0.785694958, 0.541196100, 0.275899379
-        };
-
-        i = 0;
-        for (row = 0; row < DCTSIZE; row++) {
-          for (col = 0; col < DCTSIZE; col++) {
-            fmtbl[i] = (FLOAT_MULT_TYPE)
-              ((double) qtbl->quantval[i] *
-               aanscalefactor[row] * aanscalefactor[col]);
-            i++;
-          }
-        }
-      }
-      break;
-#endif
-    default:
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-      break;
-    }
-  }
-}
-
-
-/*
- * Initialize IDCT manager.
- */
-
-GLOBAL(void)
-jinit_inverse_dct (j_decompress_ptr cinfo)
-{
-  my_idct_ptr idct;
-  int ci;
-  jpeg_component_info *compptr;
-
-  idct = (my_idct_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_idct_controller));
-  cinfo->idct = (struct jpeg_inverse_dct *) idct;
-  idct->pub.start_pass = start_pass;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Allocate and pre-zero a multiplier table for each component */
-    compptr->dct_table =
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  SIZEOF(multiplier_table));
-    MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));
-    /* Mark multiplier table not yet set up for any method */
-    idct->cur_method[ci] = -1;
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jdhuff.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,655 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdhuff.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains Huffman entropy decoding routines.
- *
- * Much of the complexity here has to do with supporting input suspension.
- * If the data source module demands suspension, we want to be able to back
- * up to the start of the current MCU.  To do this, we copy state variables
- * into local working storage, and update them back to the permanent
- * storage only upon successful completion of an MCU.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdhuff.h"             /* Declarations shared with jdphuff.c */
-
-
-/*
- * Expanded entropy decoder object for Huffman decoding.
- *
- * The savable_state subrecord contains fields that change within an MCU,
- * but must not be updated permanently until we complete the MCU.
- */
-
-typedef struct {
-  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-} savable_state;
-
-/* This macro is to work around compilers with missing or broken
- * structure assignment.  You'll need to fix this code if you have
- * such a compiler and you change MAX_COMPS_IN_SCAN.
- */
-
-#ifndef NO_STRUCT_ASSIGN
-#define ASSIGN_STATE(dest,src)  ((dest) = (src))
-#else
-#if MAX_COMPS_IN_SCAN == 4
-#define ASSIGN_STATE(dest,src)  \
-        ((dest).last_dc_val[0] = (src).last_dc_val[0], \
-         (dest).last_dc_val[1] = (src).last_dc_val[1], \
-         (dest).last_dc_val[2] = (src).last_dc_val[2], \
-         (dest).last_dc_val[3] = (src).last_dc_val[3])
-#endif
-#endif
-
-
-typedef struct {
-  struct jpeg_entropy_decoder pub; /* public fields */
-
-  /* These fields are loaded into local variables at start of each MCU.
-   * In case of suspension, we exit WITHOUT updating them.
-   */
-  bitread_perm_state bitstate;  /* Bit buffer at start of MCU */
-  savable_state saved;          /* Other state at start of MCU */
-
-  /* These fields are NOT loaded into local working state. */
-  unsigned int restarts_to_go;  /* MCUs left in this restart interval */
-
-  /* Pointers to derived tables (these workspaces have image lifespan) */
-  d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
-  d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
-
-  /* Precalculated info set up by start_pass for use in decode_mcu: */
-
-  /* Pointers to derived tables to be used for each block within an MCU */
-  d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];
-  d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];
-  /* Whether we care about the DC and AC coefficient values for each block */
-  boolean dc_needed[D_MAX_BLOCKS_IN_MCU];
-  boolean ac_needed[D_MAX_BLOCKS_IN_MCU];
-} huff_entropy_decoder;
-
-typedef huff_entropy_decoder * huff_entropy_ptr;
-
-
-/*
- * Initialize for a Huffman-compressed scan.
- */
-
-METHODDEF(void)
-start_pass_huff_decoder (j_decompress_ptr cinfo)
-{
-  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
-  int ci, blkn, dctbl, actbl;
-  jpeg_component_info * compptr;
-
-  /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
-   * This ought to be an error condition, but we make it a warning because
-   * there are some baseline files out there with all zeroes in these bytes.
-   */
-  if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
-      cinfo->Ah != 0 || cinfo->Al != 0)
-    WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
-
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    dctbl = compptr->dc_tbl_no;
-    actbl = compptr->ac_tbl_no;
-    /* Compute derived values for Huffman tables */
-    /* We may do this more than once for a table, but it's not expensive */
-    jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,
-                            & entropy->dc_derived_tbls[dctbl]);
-    jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,
-                            & entropy->ac_derived_tbls[actbl]);
-    /* Initialize DC predictions to 0 */
-    entropy->saved.last_dc_val[ci] = 0;
-  }
-
-  /* Precalculate decoding info for each block in an MCU of this scan */
-  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-    ci = cinfo->MCU_membership[blkn];
-    compptr = cinfo->cur_comp_info[ci];
-    /* Precalculate which table to use for each block */
-    entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
-    entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
-    /* Decide whether we really care about the coefficient values */
-    if (compptr->component_needed) {
-      entropy->dc_needed[blkn] = TRUE;
-      /* we don't need the ACs if producing a 1/8th-size image */
-      entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);
-    } else {
-      entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;
-    }
-  }
-
-  /* Initialize bitread state variables */
-  entropy->bitstate.bits_left = 0;
-  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
-  entropy->pub.insufficient_data = FALSE;
-
-  /* Initialize restart counter */
-  entropy->restarts_to_go = cinfo->restart_interval;
-}
-
-
-/*
- * Compute the derived values for a Huffman table.
- * This routine also performs some validation checks on the table.
- *
- * Note this is also used by jdphuff.c.
- */
-
-GLOBAL(void)
-jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
-                         d_derived_tbl ** pdtbl)
-{
-  JHUFF_TBL *htbl;
-  d_derived_tbl *dtbl;
-  int p, i, l, si, numsymbols;
-  int lookbits, ctr;
-  char huffsize[257];
-  unsigned int huffcode[257];
-  unsigned int code;
-
-  /* Note that huffsize[] and huffcode[] are filled in code-length order,
-   * paralleling the order of the symbols themselves in htbl->huffval[].
-   */
-
-  /* Find the input Huffman table */
-  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
-    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
-  htbl =
-    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
-  if (htbl == NULL)
-    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
-
-  /* Allocate a workspace if we haven't already done so. */
-  if (*pdtbl == NULL)
-    *pdtbl = (d_derived_tbl *)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  SIZEOF(d_derived_tbl));
-  dtbl = *pdtbl;
-  dtbl->pub = htbl;             /* fill in back link */
-
-  /* Figure C.1: make table of Huffman code length for each symbol */
-
-  p = 0;
-  for (l = 1; l <= 16; l++) {
-    i = (int) htbl->bits[l];
-    if (i < 0 || p + i > 256)   /* protect against table overrun */
-      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-    while (i--)
-      huffsize[p++] = (char) l;
-  }
-  huffsize[p] = 0;
-  numsymbols = p;
-
-  /* Figure C.2: generate the codes themselves */
-  /* We also validate that the counts represent a legal Huffman code tree. */
-
-  code = 0;
-  si = huffsize[0];
-  p = 0;
-  while (huffsize[p]) {
-    while (((int) huffsize[p]) == si) {
-      huffcode[p++] = code;
-      code++;
-    }
-    /* code is now 1 more than the last code used for codelength si; but
-     * it must still fit in si bits, since no code is allowed to be all ones.
-     */
-    if (((INT32) code) >= (((INT32) 1) << si))
-      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-    code <<= 1;
-    si++;
-  }
-
-  /* Figure F.15: generate decoding tables for bit-sequential decoding */
-
-  p = 0;
-  for (l = 1; l <= 16; l++) {
-    if (htbl->bits[l]) {
-      /* valoffset[l] = huffval[] index of 1st symbol of code length l,
-       * minus the minimum code of length l
-       */
-      dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];
-      p += htbl->bits[l];
-      dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
-    } else {
-      dtbl->maxcode[l] = -1;    /* -1 if no codes of this length */
-    }
-  }
-  dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */
-
-  /* Compute lookahead tables to speed up decoding.
-   * First we set all the table entries to 0, indicating "too long";
-   * then we iterate through the Huffman codes that are short enough and
-   * fill in all the entries that correspond to bit sequences starting
-   * with that code.
-   */
-
-  MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));
-
-  p = 0;
-  for (l = 1; l <= HUFF_LOOKAHEAD; l++) {
-    for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {
-      /* l = current code's length, p = its index in huffcode[] & huffval[]. */
-      /* Generate left-justified code followed by all possible bit sequences */
-      lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
-      for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {
-        dtbl->look_nbits[lookbits] = l;
-        dtbl->look_sym[lookbits] = htbl->huffval[p];
-        lookbits++;
-      }
-    }
-  }
-
-  /* Validate symbols as being reasonable.
-   * For AC tables, we make no check, but accept all byte values 0..255.
-   * For DC tables, we require the symbols to be in range 0..15.
-   * (Tighter bounds could be applied depending on the data depth and mode,
-   * but this is sufficient to ensure safe decoding.)
-   */
-  if (isDC) {
-    for (i = 0; i < numsymbols; i++) {
-      int sym = htbl->huffval[i];
-      if (sym < 0 || sym > 15)
-        ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-    }
-  }
-}
-
-
-/*
- * Out-of-line code for bit fetching (shared with jdphuff.c).
- * See jdhuff.h for info about usage.
- * Note: current values of get_buffer and bits_left are passed as parameters,
- * but are returned in the corresponding fields of the state struct.
- *
- * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width
- * of get_buffer to be used.  (On machines with wider words, an even larger
- * buffer could be used.)  However, on some machines 32-bit shifts are
- * quite slow and take time proportional to the number of places shifted.
- * (This is true with most PC compilers, for instance.)  In this case it may
- * be a win to set MIN_GET_BITS to the minimum value of 15.  This reduces the
- * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.
- */
-
-#ifdef SLOW_SHIFT_32
-#define MIN_GET_BITS  15        /* minimum allowable value */
-#else
-#define MIN_GET_BITS  (BIT_BUF_SIZE-7)
-#endif
-
-
-GLOBAL(boolean)
-jpeg_fill_bit_buffer (bitread_working_state * state,
-                      register bit_buf_type get_buffer, register int bits_left,
-                      int nbits)
-/* Load up the bit buffer to a depth of at least nbits */
-{
-  /* Copy heavily used state fields into locals (hopefully registers) */
-  register const JOCTET * next_input_byte = state->next_input_byte;
-  register size_t bytes_in_buffer = state->bytes_in_buffer;
-  j_decompress_ptr cinfo = state->cinfo;
-
-  /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */
-  /* (It is assumed that no request will be for more than that many bits.) */
-  /* We fail to do so only if we hit a marker or are forced to suspend. */
-
-  if (cinfo->unread_marker == 0) {      /* cannot advance past a marker */
-    while (bits_left < MIN_GET_BITS) {
-      register int c;
-
-      /* Attempt to read a byte */
-      if (bytes_in_buffer == 0) {
-        if (! (*cinfo->src->fill_input_buffer) (cinfo))
-          return FALSE;
-        next_input_byte = cinfo->src->next_input_byte;
-        bytes_in_buffer = cinfo->src->bytes_in_buffer;
-      }
-      bytes_in_buffer--;
-      c = GETJOCTET(*next_input_byte++);
-
-      /* If it's 0xFF, check and discard stuffed zero byte */
-      if (c == 0xFF) {
-        /* Loop here to discard any padding FF's on terminating marker,
-         * so that we can save a valid unread_marker value.  NOTE: we will
-         * accept multiple FF's followed by a 0 as meaning a single FF data
-         * byte.  This data pattern is not valid according to the standard.
-         */
-        do {
-          if (bytes_in_buffer == 0) {
-            if (! (*cinfo->src->fill_input_buffer) (cinfo))
-              return FALSE;
-            next_input_byte = cinfo->src->next_input_byte;
-            bytes_in_buffer = cinfo->src->bytes_in_buffer;
-          }
-          bytes_in_buffer--;
-          c = GETJOCTET(*next_input_byte++);
-        } while (c == 0xFF);
-
-        if (c == 0) {
-          /* Found FF/00, which represents an FF data byte */
-          c = 0xFF;
-        } else {
-          /* Oops, it's actually a marker indicating end of compressed data.
-           * Save the marker code for later use.
-           * Fine point: it might appear that we should save the marker into
-           * bitread working state, not straight into permanent state.  But
-           * once we have hit a marker, we cannot need to suspend within the
-           * current MCU, because we will read no more bytes from the data
-           * source.  So it is OK to update permanent state right away.
-           */
-          cinfo->unread_marker = c;
-          /* See if we need to insert some fake zero bits. */
-          goto no_more_bytes;
-        }
-      }
-
-      /* OK, load c into get_buffer */
-      get_buffer = (get_buffer << 8) | c;
-      bits_left += 8;
-    } /* end while */
-  } else {
-  no_more_bytes:
-    /* We get here if we've read the marker that terminates the compressed
-     * data segment.  There should be enough bits in the buffer register
-     * to satisfy the request; if so, no problem.
-     */
-    if (nbits > bits_left) {
-      /* Uh-oh.  Report corrupted data to user and stuff zeroes into
-       * the data stream, so that we can produce some kind of image.
-       * We use a nonvolatile flag to ensure that only one warning message
-       * appears per data segment.
-       */
-      if (! cinfo->entropy->insufficient_data) {
-        WARNMS(cinfo, JWRN_HIT_MARKER);
-        cinfo->entropy->insufficient_data = TRUE;
-      }
-      /* Fill the buffer with zero bits */
-      get_buffer <<= MIN_GET_BITS - bits_left;
-      bits_left = MIN_GET_BITS;
-    }
-  }
-
-  /* Unload the local registers */
-  state->next_input_byte = next_input_byte;
-  state->bytes_in_buffer = bytes_in_buffer;
-  state->get_buffer = get_buffer;
-  state->bits_left = bits_left;
-
-  return TRUE;
-}
-
-
-/*
- * Out-of-line code for Huffman code decoding.
- * See jdhuff.h for info about usage.
- */
-
-GLOBAL(int)
-jpeg_huff_decode (bitread_working_state * state,
-                  register bit_buf_type get_buffer, register int bits_left,
-                  d_derived_tbl * htbl, int min_bits)
-{
-  register int l = min_bits;
-  register INT32 code;
-
-  /* HUFF_DECODE has determined that the code is at least min_bits */
-  /* bits long, so fetch that many bits in one swoop. */
-
-  CHECK_BIT_BUFFER(*state, l, return -1);
-  code = GET_BITS(l);
-
-  /* Collect the rest of the Huffman code one bit at a time. */
-  /* This is per Figure F.16 in the JPEG spec. */
-
-  while (code > htbl->maxcode[l]) {
-    code <<= 1;
-    CHECK_BIT_BUFFER(*state, 1, return -1);
-    code |= GET_BITS(1);
-    l++;
-  }
-
-  /* Unload the local registers */
-  state->get_buffer = get_buffer;
-  state->bits_left = bits_left;
-
-  /* With garbage input we may reach the sentinel value l = 17. */
-
-  if (l > 16) {
-    WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);
-    return 0;                   /* fake a zero as the safest result */
-  }
-
-  return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];
-}
-
-
-/*
- * Figure F.12: extend sign bit.
- * On some machines, a shift and add will be faster than a table lookup.
- */
-
-#ifdef AVOID_TABLES
-
-#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
-
-#else
-
-#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
-
-static const int extend_test[16] =   /* entry n is 2**(n-1) */
-  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
-    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
-
-static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
-  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
-    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
-    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
-    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
-
-#endif /* AVOID_TABLES */
-
-
-/*
- * Check for a restart marker & resynchronize decoder.
- * Returns FALSE if must suspend.
- */
-
-LOCAL(boolean)
-process_restart (j_decompress_ptr cinfo)
-{
-  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
-  int ci;
-
-  /* Throw away any unused bits remaining in bit buffer; */
-  /* include any full bytes in next_marker's count of discarded bytes */
-  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
-  entropy->bitstate.bits_left = 0;
-
-  /* Advance past the RSTn marker */
-  if (! (*cinfo->marker->read_restart_marker) (cinfo))
-    return FALSE;
-
-  /* Re-initialize DC predictions to 0 */
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++)
-    entropy->saved.last_dc_val[ci] = 0;
-
-  /* Reset restart counter */
-  entropy->restarts_to_go = cinfo->restart_interval;
-
-  /* Reset out-of-data flag, unless read_restart_marker left us smack up
-   * against a marker.  In that case we will end up treating the next data
-   * segment as empty, and we can avoid producing bogus output pixels by
-   * leaving the flag set.
-   */
-  if (cinfo->unread_marker == 0)
-    entropy->pub.insufficient_data = FALSE;
-
-  return TRUE;
-}
-
-
-/*
- * Decode and return one MCU's worth of Huffman-compressed coefficients.
- * The coefficients are reordered from zigzag order into natural array order,
- * but are not dequantized.
- *
- * The i'th block of the MCU is stored into the block pointed to by
- * MCU_data[i].  WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER.
- * (Wholesale zeroing is usually a little faster than retail...)
- *
- * Returns FALSE if data source requested suspension.  In that case no
- * changes have been made to permanent state.  (Exception: some output
- * coefficients may already have been assigned.  This is harmless for
- * this module, since we'll just re-assign them on the next call.)
- */
-
-METHODDEF(boolean)
-decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
-  int blkn;
-  BITREAD_STATE_VARS;
-  savable_state state;
-
-  /* Process restart marker if needed; may have to suspend */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0)
-      if (! process_restart(cinfo))
-        return FALSE;
-  }
-
-  /* If we've run out of data, just leave the MCU set to zeroes.
-   * This way, we return uniform gray for the remainder of the segment.
-   */
-  if (! entropy->pub.insufficient_data) {
-
-    /* Load up working state */
-    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
-    ASSIGN_STATE(state, entropy->saved);
-
-    /* Outer loop handles each block in the MCU */
-
-    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-      JBLOCKROW block = MCU_data[blkn];
-      d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];
-      d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];
-      register int s, k, r;
-
-      /* Decode a single block's worth of coefficients */
-
-      /* Section F.2.2.1: decode the DC coefficient difference */
-      HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);
-      if (s) {
-        CHECK_BIT_BUFFER(br_state, s, return FALSE);
-        r = GET_BITS(s);
-        s = HUFF_EXTEND(r, s);
-      }
-
-      if (entropy->dc_needed[blkn]) {
-        /* Convert DC difference to actual value, update last_dc_val */
-        int ci = cinfo->MCU_membership[blkn];
-        s += state.last_dc_val[ci];
-        state.last_dc_val[ci] = s;
-        /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
-        (*block)[0] = (JCOEF) s;
-      }
-
-      if (entropy->ac_needed[blkn]) {
-
-        /* Section F.2.2.2: decode the AC coefficients */
-        /* Since zeroes are skipped, output area must be cleared beforehand */
-        for (k = 1; k < DCTSIZE2; k++) {
-          HUFF_DECODE(s, br_state, actbl, return FALSE, label2);
-
-          r = s >> 4;
-          s &= 15;
-
-          if (s) {
-            k += r;
-            CHECK_BIT_BUFFER(br_state, s, return FALSE);
-            r = GET_BITS(s);
-            s = HUFF_EXTEND(r, s);
-            /* Output coefficient in natural (dezigzagged) order.
-             * Note: the extra entries in jpeg_natural_order[] will save us
-             * if k >= DCTSIZE2, which could happen if the data is corrupted.
-             */
-            (*block)[jpeg_natural_order[k]] = (JCOEF) s;
-          } else {
-            if (r != 15)
-              break;
-            k += 15;
-          }
-        }
-
-      } else {
-
-        /* Section F.2.2.2: decode the AC coefficients */
-        /* In this path we just discard the values */
-        for (k = 1; k < DCTSIZE2; k++) {
-          HUFF_DECODE(s, br_state, actbl, return FALSE, label3);
-
-          r = s >> 4;
-          s &= 15;
-
-          if (s) {
-            k += r;
-            CHECK_BIT_BUFFER(br_state, s, return FALSE);
-            DROP_BITS(s);
-          } else {
-            if (r != 15)
-              break;
-            k += 15;
-          }
-        }
-
-      }
-    }
-
-    /* Completed MCU, so update state */
-    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
-    ASSIGN_STATE(entropy->saved, state);
-  }
-
-  /* Account for restart interval (no-op if not using restarts) */
-  entropy->restarts_to_go--;
-
-  return TRUE;
-}
-
-
-/*
- * Module initialization routine for Huffman entropy decoding.
- */
-
-GLOBAL(void)
-jinit_huff_decoder (j_decompress_ptr cinfo)
-{
-  huff_entropy_ptr entropy;
-  int i;
-
-  entropy = (huff_entropy_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(huff_entropy_decoder));
-  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
-  entropy->pub.start_pass = start_pass_huff_decoder;
-  entropy->pub.decode_mcu = decode_mcu;
-
-  /* Mark tables unallocated */
-  for (i = 0; i < NUM_HUFF_TBLS; i++) {
-    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jdhuff.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdhuff.h
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains declarations for Huffman entropy decoding routines
- * that are shared between the sequential decoder (jdhuff.c) and the
- * progressive decoder (jdphuff.c).  No other modules need to see these.
- */
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_make_d_derived_tbl jMkDDerived
-#define jpeg_fill_bit_buffer    jFilBitBuf
-#define jpeg_huff_decode        jHufDecode
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/* Derived data constructed for each Huffman table */
-
-#define HUFF_LOOKAHEAD  8       /* # of bits of lookahead */
-
-typedef struct {
-  /* Basic tables: (element [0] of each array is unused) */
-  INT32 maxcode[18];            /* largest code of length k (-1 if none) */
-  /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */
-  INT32 valoffset[17];          /* huffval[] offset for codes of length k */
-  /* valoffset[k] = huffval[] index of 1st symbol of code length k, less
-   * the smallest code of length k; so given a code of length k, the
-   * corresponding symbol is huffval[code + valoffset[k]]
-   */
-
-  /* Link to public Huffman table (needed only in jpeg_huff_decode) */
-  JHUFF_TBL *pub;
-
-  /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of
-   * the input data stream.  If the next Huffman code is no more
-   * than HUFF_LOOKAHEAD bits long, we can obtain its length and
-   * the corresponding symbol directly from these tables.
-   */
-  int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */
-  UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */
-} d_derived_tbl;
-
-/* Expand a Huffman table definition into the derived format */
-EXTERN(void) jpeg_make_d_derived_tbl
-        JPP((j_decompress_ptr cinfo, boolean isDC, int tblno,
-             d_derived_tbl ** pdtbl));
-
-
-/*
- * Fetching the next N bits from the input stream is a time-critical operation
- * for the Huffman decoders.  We implement it with a combination of inline
- * macros and out-of-line subroutines.  Note that N (the number of bits
- * demanded at one time) never exceeds 15 for JPEG use.
- *
- * We read source bytes into get_buffer and dole out bits as needed.
- * If get_buffer already contains enough bits, they are fetched in-line
- * by the macros CHECK_BIT_BUFFER and GET_BITS.  When there aren't enough
- * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer
- * as full as possible (not just to the number of bits needed; this
- * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).
- * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.
- * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains
- * at least the requested number of bits --- dummy zeroes are inserted if
- * necessary.
- */
-
-typedef INT32 bit_buf_type;     /* type of bit-extraction buffer */
-#define BIT_BUF_SIZE  32        /* size of buffer in bits */
-
-/* If long is > 32 bits on your machine, and shifting/masking longs is
- * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE
- * appropriately should be a win.  Unfortunately we can't define the size
- * with something like  #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)
- * because not all machines measure sizeof in 8-bit bytes.
- */
-
-typedef struct {                /* Bitreading state saved across MCUs */
-  bit_buf_type get_buffer;      /* current bit-extraction buffer */
-  int bits_left;                /* # of unused bits in it */
-} bitread_perm_state;
-
-typedef struct {                /* Bitreading working state within an MCU */
-  /* Current data source location */
-  /* We need a copy, rather than munging the original, in case of suspension */
-  const JOCTET * next_input_byte; /* => next byte to read from source */
-  size_t bytes_in_buffer;       /* # of bytes remaining in source buffer */
-  /* Bit input buffer --- note these values are kept in register variables,
-   * not in this struct, inside the inner loops.
-   */
-  bit_buf_type get_buffer;      /* current bit-extraction buffer */
-  int bits_left;                /* # of unused bits in it */
-  /* Pointer needed by jpeg_fill_bit_buffer. */
-  j_decompress_ptr cinfo;       /* back link to decompress master record */
-} bitread_working_state;
-
-/* Macros to declare and load/save bitread local variables. */
-#define BITREAD_STATE_VARS  \
-        register bit_buf_type get_buffer;  \
-        register int bits_left;  \
-        bitread_working_state br_state
-
-#define BITREAD_LOAD_STATE(cinfop,permstate)  \
-        br_state.cinfo = cinfop; \
-        br_state.next_input_byte = cinfop->src->next_input_byte; \
-        br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \
-        get_buffer = permstate.get_buffer; \
-        bits_left = permstate.bits_left;
-
-#define BITREAD_SAVE_STATE(cinfop,permstate)  \
-        cinfop->src->next_input_byte = br_state.next_input_byte; \
-        cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \
-        permstate.get_buffer = get_buffer; \
-        permstate.bits_left = bits_left
-
-/*
- * These macros provide the in-line portion of bit fetching.
- * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer
- * before using GET_BITS, PEEK_BITS, or DROP_BITS.
- * The variables get_buffer and bits_left are assumed to be locals,
- * but the state struct might not be (jpeg_huff_decode needs this).
- *      CHECK_BIT_BUFFER(state,n,action);
- *              Ensure there are N bits in get_buffer; if suspend, take action.
- *      val = GET_BITS(n);
- *              Fetch next N bits.
- *      val = PEEK_BITS(n);
- *              Fetch next N bits without removing them from the buffer.
- *      DROP_BITS(n);
- *              Discard next N bits.
- * The value N should be a simple variable, not an expression, because it
- * is evaluated multiple times.
- */
-
-#define CHECK_BIT_BUFFER(state,nbits,action) \
-        { if (bits_left < (nbits)) {  \
-            if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits))  \
-              { action; }  \
-            get_buffer = (state).get_buffer; bits_left = (state).bits_left; } }
-
-#define GET_BITS(nbits) \
-        (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1))
-
-#define PEEK_BITS(nbits) \
-        (((int) (get_buffer >> (bits_left -  (nbits)))) & ((1<<(nbits))-1))
-
-#define DROP_BITS(nbits) \
-        (bits_left -= (nbits))
-
-/* Load up the bit buffer to a depth of at least nbits */
-EXTERN(boolean) jpeg_fill_bit_buffer
-        JPP((bitread_working_state * state, register bit_buf_type get_buffer,
-             register int bits_left, int nbits));
-
-
-/*
- * Code for extracting next Huffman-coded symbol from input bit stream.
- * Again, this is time-critical and we make the main paths be macros.
- *
- * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits
- * without looping.  Usually, more than 95% of the Huffman codes will be 8
- * or fewer bits long.  The few overlength codes are handled with a loop,
- * which need not be inline code.
- *
- * Notes about the HUFF_DECODE macro:
- * 1. Near the end of the data segment, we may fail to get enough bits
- *    for a lookahead.  In that case, we do it the hard way.
- * 2. If the lookahead table contains no entry, the next code must be
- *    more than HUFF_LOOKAHEAD bits long.
- * 3. jpeg_huff_decode returns -1 if forced to suspend.
- */
-
-#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \
-{ register int nb, look; \
-  if (bits_left < HUFF_LOOKAHEAD) { \
-    if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \
-    get_buffer = state.get_buffer; bits_left = state.bits_left; \
-    if (bits_left < HUFF_LOOKAHEAD) { \
-      nb = 1; goto slowlabel; \
-    } \
-  } \
-  look = PEEK_BITS(HUFF_LOOKAHEAD); \
-  if ((nb = htbl->look_nbits[look]) != 0) { \
-    DROP_BITS(nb); \
-    result = htbl->look_sym[look]; \
-  } else { \
-    nb = HUFF_LOOKAHEAD+1; \
-slowlabel: \
-    if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \
-        { failaction; } \
-    get_buffer = state.get_buffer; bits_left = state.bits_left; \
-  } \
-}
-
-/* Out-of-line case for Huffman code fetching */
-EXTERN(int) jpeg_huff_decode
-        JPP((bitread_working_state * state, register bit_buf_type get_buffer,
-             register int bits_left, d_derived_tbl * htbl, int min_bits));
--- a/src/share/native/sun/awt/image/jpeg/jdinput.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,385 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdinput.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains input control logic for the JPEG decompressor.
- * These routines are concerned with controlling the decompressor's input
- * processing (marker reading and coefficient decoding).  The actual input
- * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private state */
-
-typedef struct {
-  struct jpeg_input_controller pub; /* public fields */
-
-  boolean inheaders;            /* TRUE until first SOS is reached */
-} my_input_controller;
-
-typedef my_input_controller * my_inputctl_ptr;
-
-
-/* Forward declarations */
-METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));
-
-
-/*
- * Routines to calculate various quantities related to the size of the image.
- */
-
-LOCAL(void)
-initial_setup (j_decompress_ptr cinfo)
-/* Called once, when first SOS marker is reached */
-{
-  int ci;
-  jpeg_component_info *compptr;
-
-  /* Make sure image isn't bigger than I can handle */
-  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
-      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
-    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
-
-  /* For now, precision must match compiled-in value... */
-  if (cinfo->data_precision != BITS_IN_JSAMPLE)
-    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
-
-  /* Check that number of components won't exceed internal array sizes */
-  if (cinfo->num_components > MAX_COMPONENTS)
-    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
-             MAX_COMPONENTS);
-
-  /* Compute maximum sampling factors; check factor validity */
-  cinfo->max_h_samp_factor = 1;
-  cinfo->max_v_samp_factor = 1;
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
-        compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
-      ERREXIT(cinfo, JERR_BAD_SAMPLING);
-    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
-                                   compptr->h_samp_factor);
-    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
-                                   compptr->v_samp_factor);
-  }
-
-  /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE.
-   * In the full decompressor, this will be overridden by jdmaster.c;
-   * but in the transcoder, jdmaster.c is not used, so we must do it here.
-   */
-  cinfo->min_DCT_scaled_size = DCTSIZE;
-
-  /* Compute dimensions of components */
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    compptr->DCT_scaled_size = DCTSIZE;
-    /* Size in DCT blocks */
-    compptr->width_in_blocks = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
-                    (long) (cinfo->max_h_samp_factor * DCTSIZE));
-    compptr->height_in_blocks = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
-                    (long) (cinfo->max_v_samp_factor * DCTSIZE));
-    /* downsampled_width and downsampled_height will also be overridden by
-     * jdmaster.c if we are doing full decompression.  The transcoder library
-     * doesn't use these values, but the calling application might.
-     */
-    /* Size in samples */
-    compptr->downsampled_width = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
-                    (long) cinfo->max_h_samp_factor);
-    compptr->downsampled_height = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
-                    (long) cinfo->max_v_samp_factor);
-    /* Mark component needed, until color conversion says otherwise */
-    compptr->component_needed = TRUE;
-    /* Mark no quantization table yet saved for component */
-    compptr->quant_table = NULL;
-  }
-
-  /* Compute number of fully interleaved MCU rows. */
-  cinfo->total_iMCU_rows = (JDIMENSION)
-    jdiv_round_up((long) cinfo->image_height,
-                  (long) (cinfo->max_v_samp_factor*DCTSIZE));
-
-  /* Decide whether file contains multiple scans */
-  if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)
-    cinfo->inputctl->has_multiple_scans = TRUE;
-  else
-    cinfo->inputctl->has_multiple_scans = FALSE;
-}
-
-
-LOCAL(void)
-per_scan_setup (j_decompress_ptr cinfo)
-/* Do computations that are needed before processing a JPEG scan */
-/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */
-{
-  int ci, mcublks, tmp;
-  jpeg_component_info *compptr;
-
-  if (cinfo->comps_in_scan == 1) {
-
-    /* Noninterleaved (single-component) scan */
-    compptr = cinfo->cur_comp_info[0];
-
-    /* Overall image size in MCUs */
-    cinfo->MCUs_per_row = compptr->width_in_blocks;
-    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
-
-    /* For noninterleaved scan, always one block per MCU */
-    compptr->MCU_width = 1;
-    compptr->MCU_height = 1;
-    compptr->MCU_blocks = 1;
-    compptr->MCU_sample_width = compptr->DCT_scaled_size;
-    compptr->last_col_width = 1;
-    /* For noninterleaved scans, it is convenient to define last_row_height
-     * as the number of block rows present in the last iMCU row.
-     */
-    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
-    if (tmp == 0) tmp = compptr->v_samp_factor;
-    compptr->last_row_height = tmp;
-
-    /* Prepare array describing MCU composition */
-    cinfo->blocks_in_MCU = 1;
-    cinfo->MCU_membership[0] = 0;
-
-  } else {
-
-    /* Interleaved (multi-component) scan */
-    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
-      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
-               MAX_COMPS_IN_SCAN);
-
-    /* Overall image size in MCUs */
-    cinfo->MCUs_per_row = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width,
-                    (long) (cinfo->max_h_samp_factor*DCTSIZE));
-    cinfo->MCU_rows_in_scan = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height,
-                    (long) (cinfo->max_v_samp_factor*DCTSIZE));
-
-    cinfo->blocks_in_MCU = 0;
-
-    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-      compptr = cinfo->cur_comp_info[ci];
-      /* Sampling factors give # of blocks of component in each MCU */
-      compptr->MCU_width = compptr->h_samp_factor;
-      compptr->MCU_height = compptr->v_samp_factor;
-      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
-      compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size;
-      /* Figure number of non-dummy blocks in last MCU column & row */
-      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
-      if (tmp == 0) tmp = compptr->MCU_width;
-      compptr->last_col_width = tmp;
-      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
-      if (tmp == 0) tmp = compptr->MCU_height;
-      compptr->last_row_height = tmp;
-      /* Prepare array describing MCU composition */
-      mcublks = compptr->MCU_blocks;
-      if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)
-        ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
-      while (mcublks-- > 0) {
-        cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
-      }
-    }
-
-  }
-}
-
-
-/*
- * Save away a copy of the Q-table referenced by each component present
- * in the current scan, unless already saved during a prior scan.
- *
- * In a multiple-scan JPEG file, the encoder could assign different components
- * the same Q-table slot number, but change table definitions between scans
- * so that each component uses a different Q-table.  (The IJG encoder is not
- * currently capable of doing this, but other encoders might.)  Since we want
- * to be able to dequantize all the components at the end of the file, this
- * means that we have to save away the table actually used for each component.
- * We do this by copying the table at the start of the first scan containing
- * the component.
- * The JPEG spec prohibits the encoder from changing the contents of a Q-table
- * slot between scans of a component using that slot.  If the encoder does so
- * anyway, this decoder will simply use the Q-table values that were current
- * at the start of the first scan for the component.
- *
- * The decompressor output side looks only at the saved quant tables,
- * not at the current Q-table slots.
- */
-
-LOCAL(void)
-latch_quant_tables (j_decompress_ptr cinfo)
-{
-  int ci, qtblno;
-  jpeg_component_info *compptr;
-  JQUANT_TBL * qtbl;
-
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    /* No work if we already saved Q-table for this component */
-    if (compptr->quant_table != NULL)
-      continue;
-    /* Make sure specified quantization table is present */
-    qtblno = compptr->quant_tbl_no;
-    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
-        cinfo->quant_tbl_ptrs[qtblno] == NULL)
-      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
-    /* OK, save away the quantization table */
-    qtbl = (JQUANT_TBL *)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  SIZEOF(JQUANT_TBL));
-    MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
-    compptr->quant_table = qtbl;
-  }
-}
-
-
-/*
- * Initialize the input modules to read a scan of compressed data.
- * The first call to this is done by jdmaster.c after initializing
- * the entire decompressor (during jpeg_start_decompress).
- * Subsequent calls come from consume_markers, below.
- */
-
-METHODDEF(void)
-start_input_pass (j_decompress_ptr cinfo)
-{
-  per_scan_setup(cinfo);
-  latch_quant_tables(cinfo);
-  (*cinfo->entropy->start_pass) (cinfo);
-  (*cinfo->coef->start_input_pass) (cinfo);
-  cinfo->inputctl->consume_input = cinfo->coef->consume_data;
-}
-
-
-/*
- * Finish up after inputting a compressed-data scan.
- * This is called by the coefficient controller after it's read all
- * the expected data of the scan.
- */
-
-METHODDEF(void)
-finish_input_pass (j_decompress_ptr cinfo)
-{
-  cinfo->inputctl->consume_input = consume_markers;
-}
-
-
-/*
- * Read JPEG markers before, between, or after compressed-data scans.
- * Change state as necessary when a new scan is reached.
- * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
- *
- * The consume_input method pointer points either here or to the
- * coefficient controller's consume_data routine, depending on whether
- * we are reading a compressed data segment or inter-segment markers.
- */
-
-METHODDEF(int)
-consume_markers (j_decompress_ptr cinfo)
-{
-  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
-  int val;
-
-  if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */
-    return JPEG_REACHED_EOI;
-
-  val = (*cinfo->marker->read_markers) (cinfo);
-
-  switch (val) {
-  case JPEG_REACHED_SOS:        /* Found SOS */
-    if (inputctl->inheaders) {  /* 1st SOS */
-      initial_setup(cinfo);
-      inputctl->inheaders = FALSE;
-      /* Note: start_input_pass must be called by jdmaster.c
-       * before any more input can be consumed.  jdapimin.c is
-       * responsible for enforcing this sequencing.
-       */
-    } else {                    /* 2nd or later SOS marker */
-      if (! inputctl->pub.has_multiple_scans)
-        ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */
-      start_input_pass(cinfo);
-    }
-    break;
-  case JPEG_REACHED_EOI:        /* Found EOI */
-    inputctl->pub.eoi_reached = TRUE;
-    if (inputctl->inheaders) {  /* Tables-only datastream, apparently */
-      if (cinfo->marker->saw_SOF)
-        ERREXIT(cinfo, JERR_SOF_NO_SOS);
-    } else {
-      /* Prevent infinite loop in coef ctlr's decompress_data routine
-       * if user set output_scan_number larger than number of scans.
-       */
-      if (cinfo->output_scan_number > cinfo->input_scan_number)
-        cinfo->output_scan_number = cinfo->input_scan_number;
-    }
-    break;
-  case JPEG_SUSPENDED:
-    break;
-  }
-
-  return val;
-}
-
-
-/*
- * Reset state to begin a fresh datastream.
- */
-
-METHODDEF(void)
-reset_input_controller (j_decompress_ptr cinfo)
-{
-  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
-
-  inputctl->pub.consume_input = consume_markers;
-  inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
-  inputctl->pub.eoi_reached = FALSE;
-  inputctl->inheaders = TRUE;
-  /* Reset other modules */
-  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
-  (*cinfo->marker->reset_marker_reader) (cinfo);
-  /* Reset progression state -- would be cleaner if entropy decoder did this */
-  cinfo->coef_bits = NULL;
-}
-
-
-/*
- * Initialize the input controller module.
- * This is called only once, when the decompression object is created.
- */
-
-GLOBAL(void)
-jinit_input_controller (j_decompress_ptr cinfo)
-{
-  my_inputctl_ptr inputctl;
-
-  /* Create subobject in permanent pool */
-  inputctl = (my_inputctl_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
-                                SIZEOF(my_input_controller));
-  cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
-  /* Initialize method pointers */
-  inputctl->pub.consume_input = consume_markers;
-  inputctl->pub.reset_input_controller = reset_input_controller;
-  inputctl->pub.start_input_pass = start_input_pass;
-  inputctl->pub.finish_input_pass = finish_input_pass;
-  /* Initialize state: can't use reset_input_controller since we don't
-   * want to try to reset other modules yet.
-   */
-  inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
-  inputctl->pub.eoi_reached = FALSE;
-  inputctl->inheaders = TRUE;
-}
--- a/src/share/native/sun/awt/image/jpeg/jdmainct.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,516 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdmainct.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the main buffer controller for decompression.
- * The main buffer lies between the JPEG decompressor proper and the
- * post-processor; it holds downsampled data in the JPEG colorspace.
- *
- * Note that this code is bypassed in raw-data mode, since the application
- * supplies the equivalent of the main buffer in that case.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * In the current system design, the main buffer need never be a full-image
- * buffer; any full-height buffers will be found inside the coefficient or
- * postprocessing controllers.  Nonetheless, the main controller is not
- * trivial.  Its responsibility is to provide context rows for upsampling/
- * rescaling, and doing this in an efficient fashion is a bit tricky.
- *
- * Postprocessor input data is counted in "row groups".  A row group
- * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
- * sample rows of each component.  (We require DCT_scaled_size values to be
- * chosen such that these numbers are integers.  In practice DCT_scaled_size
- * values will likely be powers of two, so we actually have the stronger
- * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)
- * Upsampling will typically produce max_v_samp_factor pixel rows from each
- * row group (times any additional scale factor that the upsampler is
- * applying).
- *
- * The coefficient controller will deliver data to us one iMCU row at a time;
- * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or
- * exactly min_DCT_scaled_size row groups.  (This amount of data corresponds
- * to one row of MCUs when the image is fully interleaved.)  Note that the
- * number of sample rows varies across components, but the number of row
- * groups does not.  Some garbage sample rows may be included in the last iMCU
- * row at the bottom of the image.
- *
- * Depending on the vertical scaling algorithm used, the upsampler may need
- * access to the sample row(s) above and below its current input row group.
- * The upsampler is required to set need_context_rows TRUE at global selection
- * time if so.  When need_context_rows is FALSE, this controller can simply
- * obtain one iMCU row at a time from the coefficient controller and dole it
- * out as row groups to the postprocessor.
- *
- * When need_context_rows is TRUE, this controller guarantees that the buffer
- * passed to postprocessing contains at least one row group's worth of samples
- * above and below the row group(s) being processed.  Note that the context
- * rows "above" the first passed row group appear at negative row offsets in
- * the passed buffer.  At the top and bottom of the image, the required
- * context rows are manufactured by duplicating the first or last real sample
- * row; this avoids having special cases in the upsampling inner loops.
- *
- * The amount of context is fixed at one row group just because that's a
- * convenient number for this controller to work with.  The existing
- * upsamplers really only need one sample row of context.  An upsampler
- * supporting arbitrary output rescaling might wish for more than one row
- * group of context when shrinking the image; tough, we don't handle that.
- * (This is justified by the assumption that downsizing will be handled mostly
- * by adjusting the DCT_scaled_size values, so that the actual scale factor at
- * the upsample step needn't be much less than one.)
- *
- * To provide the desired context, we have to retain the last two row groups
- * of one iMCU row while reading in the next iMCU row.  (The last row group
- * can't be processed until we have another row group for its below-context,
- * and so we have to save the next-to-last group too for its above-context.)
- * We could do this most simply by copying data around in our buffer, but
- * that'd be very slow.  We can avoid copying any data by creating a rather
- * strange pointer structure.  Here's how it works.  We allocate a workspace
- * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number
- * of row groups per iMCU row).  We create two sets of redundant pointers to
- * the workspace.  Labeling the physical row groups 0 to M+1, the synthesized
- * pointer lists look like this:
- *                   M+1                          M-1
- * master pointer --> 0         master pointer --> 0
- *                    1                            1
- *                   ...                          ...
- *                   M-3                          M-3
- *                   M-2                           M
- *                   M-1                          M+1
- *                    M                           M-2
- *                   M+1                          M-1
- *                    0                            0
- * We read alternate iMCU rows using each master pointer; thus the last two
- * row groups of the previous iMCU row remain un-overwritten in the workspace.
- * The pointer lists are set up so that the required context rows appear to
- * be adjacent to the proper places when we pass the pointer lists to the
- * upsampler.
- *
- * The above pictures describe the normal state of the pointer lists.
- * At top and bottom of the image, we diddle the pointer lists to duplicate
- * the first or last sample row as necessary (this is cheaper than copying
- * sample rows around).
- *
- * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1.  In that
- * situation each iMCU row provides only one row group so the buffering logic
- * must be different (eg, we must read two iMCU rows before we can emit the
- * first row group).  For now, we simply do not support providing context
- * rows when min_DCT_scaled_size is 1.  That combination seems unlikely to
- * be worth providing --- if someone wants a 1/8th-size preview, they probably
- * want it quick and dirty, so a context-free upsampler is sufficient.
- */
-
-
-/* Private buffer controller object */
-
-typedef struct {
-  struct jpeg_d_main_controller pub; /* public fields */
-
-  /* Pointer to allocated workspace (M or M+2 row groups). */
-  JSAMPARRAY buffer[MAX_COMPONENTS];
-
-  boolean buffer_full;          /* Have we gotten an iMCU row from decoder? */
-  JDIMENSION rowgroup_ctr;      /* counts row groups output to postprocessor */
-
-  /* Remaining fields are only used in the context case. */
-
-  /* These are the master pointers to the funny-order pointer lists. */
-  JSAMPIMAGE xbuffer[2];        /* pointers to weird pointer lists */
-
-  int whichptr;                 /* indicates which pointer set is now in use */
-  int context_state;            /* process_data state machine status */
-  JDIMENSION rowgroups_avail;   /* row groups available to postprocessor */
-  JDIMENSION iMCU_row_ctr;      /* counts iMCU rows to detect image top/bot */
-} my_main_controller;
-
-typedef my_main_controller * my_main_ptr;
-
-/* context_state values: */
-#define CTX_PREPARE_FOR_IMCU    0       /* need to prepare for MCU row */
-#define CTX_PROCESS_IMCU        1       /* feeding iMCU to postprocessor */
-#define CTX_POSTPONED_ROW       2       /* feeding postponed row group */
-
-
-/* Forward declarations */
-METHODDEF(void) process_data_simple_main
-        JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
-             JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
-METHODDEF(void) process_data_context_main
-        JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
-             JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
-#ifdef QUANT_2PASS_SUPPORTED
-METHODDEF(void) process_data_crank_post
-        JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
-             JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
-#endif
-
-
-LOCAL(void)
-alloc_funny_pointers (j_decompress_ptr cinfo)
-/* Allocate space for the funny pointer lists.
- * This is done only once, not once per pass.
- */
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-  int ci, rgroup;
-  int M = cinfo->min_DCT_scaled_size;
-  jpeg_component_info *compptr;
-  JSAMPARRAY xbuf;
-
-  /* Get top-level space for component array pointers.
-   * We alloc both arrays with one call to save a few cycles.
-   */
-  _main->xbuffer[0] = (JSAMPIMAGE)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
-  _main->xbuffer[1] = _main->xbuffer[0] + cinfo->num_components;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
-      cinfo->min_DCT_scaled_size; /* height of a row group of component */
-    /* Get space for pointer lists --- M+4 row groups in each list.
-     * We alloc both pointer lists with one call to save a few cycles.
-     */
-    xbuf = (JSAMPARRAY)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
-    xbuf += rgroup;             /* want one row group at negative offsets */
-    _main->xbuffer[0][ci] = xbuf;
-    xbuf += rgroup * (M + 4);
-    _main->xbuffer[1][ci] = xbuf;
-  }
-}
-
-
-LOCAL(void)
-make_funny_pointers (j_decompress_ptr cinfo)
-/* Create the funny pointer lists discussed in the comments above.
- * The actual workspace is already allocated (in main->buffer),
- * and the space for the pointer lists is allocated too.
- * This routine just fills in the curiously ordered lists.
- * This will be repeated at the beginning of each pass.
- */
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-  int ci, i, rgroup;
-  int M = cinfo->min_DCT_scaled_size;
-  jpeg_component_info *compptr;
-  JSAMPARRAY buf, xbuf0, xbuf1;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
-      cinfo->min_DCT_scaled_size; /* height of a row group of component */
-    xbuf0 = _main->xbuffer[0][ci];
-    xbuf1 = _main->xbuffer[1][ci];
-    /* First copy the workspace pointers as-is */
-    buf = _main->buffer[ci];
-    for (i = 0; i < rgroup * (M + 2); i++) {
-      xbuf0[i] = xbuf1[i] = buf[i];
-    }
-    /* In the second list, put the last four row groups in swapped order */
-    for (i = 0; i < rgroup * 2; i++) {
-      xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];
-      xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];
-    }
-    /* The wraparound pointers at top and bottom will be filled later
-     * (see set_wraparound_pointers, below).  Initially we want the "above"
-     * pointers to duplicate the first actual data line.  This only needs
-     * to happen in xbuffer[0].
-     */
-    for (i = 0; i < rgroup; i++) {
-      xbuf0[i - rgroup] = xbuf0[0];
-    }
-  }
-}
-
-
-LOCAL(void)
-set_wraparound_pointers (j_decompress_ptr cinfo)
-/* Set up the "wraparound" pointers at top and bottom of the pointer lists.
- * This changes the pointer list state from top-of-image to the normal state.
- */
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-  int ci, i, rgroup;
-  int M = cinfo->min_DCT_scaled_size;
-  jpeg_component_info *compptr;
-  JSAMPARRAY xbuf0, xbuf1;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
-      cinfo->min_DCT_scaled_size; /* height of a row group of component */
-    xbuf0 = _main->xbuffer[0][ci];
-    xbuf1 = _main->xbuffer[1][ci];
-    for (i = 0; i < rgroup; i++) {
-      xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
-      xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
-      xbuf0[rgroup*(M+2) + i] = xbuf0[i];
-      xbuf1[rgroup*(M+2) + i] = xbuf1[i];
-    }
-  }
-}
-
-
-LOCAL(void)
-set_bottom_pointers (j_decompress_ptr cinfo)
-/* Change the pointer lists to duplicate the last sample row at the bottom
- * of the image.  whichptr indicates which xbuffer holds the final iMCU row.
- * Also sets rowgroups_avail to indicate number of nondummy row groups in row.
- */
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-  int ci, i, rgroup, iMCUheight, rows_left;
-  jpeg_component_info *compptr;
-  JSAMPARRAY xbuf;
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Count sample rows in one iMCU row and in one row group */
-    iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size;
-    rgroup = iMCUheight / cinfo->min_DCT_scaled_size;
-    /* Count nondummy sample rows remaining for this component */
-    rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);
-    if (rows_left == 0) rows_left = iMCUheight;
-    /* Count nondummy row groups.  Should get same answer for each component,
-     * so we need only do it once.
-     */
-    if (ci == 0) {
-      _main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
-    }
-    /* Duplicate the last real sample row rgroup*2 times; this pads out the
-     * last partial rowgroup and ensures at least one full rowgroup of context.
-     */
-    xbuf = _main->xbuffer[_main->whichptr][ci];
-    for (i = 0; i < rgroup * 2; i++) {
-      xbuf[rows_left + i] = xbuf[rows_left-1];
-    }
-  }
-}
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-
-  switch (pass_mode) {
-  case JBUF_PASS_THRU:
-    if (cinfo->upsample->need_context_rows) {
-      _main->pub.process_data = process_data_context_main;
-      make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
-      _main->whichptr = 0;      /* Read first iMCU row into xbuffer[0] */
-      _main->context_state = CTX_PREPARE_FOR_IMCU;
-      _main->iMCU_row_ctr = 0;
-    } else {
-      /* Simple case with no context needed */
-      _main->pub.process_data = process_data_simple_main;
-    }
-    _main->buffer_full = FALSE; /* Mark buffer empty */
-    _main->rowgroup_ctr = 0;
-    break;
-#ifdef QUANT_2PASS_SUPPORTED
-  case JBUF_CRANK_DEST:
-    /* For last pass of 2-pass quantization, just crank the postprocessor */
-    _main->pub.process_data = process_data_crank_post;
-    break;
-#endif
-  default:
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    break;
-  }
-}
-
-
-/*
- * Process some data.
- * This handles the simple case where no context is required.
- */
-
-METHODDEF(void)
-process_data_simple_main (j_decompress_ptr cinfo,
-                          JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                          JDIMENSION out_rows_avail)
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-  JDIMENSION rowgroups_avail;
-
-  /* Read input data if we haven't filled the main buffer yet */
-  if (! _main->buffer_full) {
-    if (! (*cinfo->coef->decompress_data) (cinfo, _main->buffer))
-      return;                   /* suspension forced, can do nothing more */
-    _main->buffer_full = TRUE;  /* OK, we have an iMCU row to work with */
-  }
-
-  /* There are always min_DCT_scaled_size row groups in an iMCU row. */
-  rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;
-  /* Note: at the bottom of the image, we may pass extra garbage row groups
-   * to the postprocessor.  The postprocessor has to check for bottom
-   * of image anyway (at row resolution), so no point in us doing it too.
-   */
-
-  /* Feed the postprocessor */
-  (*cinfo->post->post_process_data) (cinfo, _main->buffer,
-                                     &_main->rowgroup_ctr, rowgroups_avail,
-                                     output_buf, out_row_ctr, out_rows_avail);
-
-  /* Has postprocessor consumed all the data yet? If so, mark buffer empty */
-  if (_main->rowgroup_ctr >= rowgroups_avail) {
-    _main->buffer_full = FALSE;
-    _main->rowgroup_ctr = 0;
-  }
-}
-
-
-/*
- * Process some data.
- * This handles the case where context rows must be provided.
- */
-
-METHODDEF(void)
-process_data_context_main (j_decompress_ptr cinfo,
-                           JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                           JDIMENSION out_rows_avail)
-{
-  my_main_ptr _main = (my_main_ptr) cinfo->main;
-
-  /* Read input data if we haven't filled the _main buffer yet */
-  if (! _main->buffer_full) {
-    if (! (*cinfo->coef->decompress_data) (cinfo,
-                                           _main->xbuffer[_main->whichptr]))
-      return;                   /* suspension forced, can do nothing more */
-    _main->buffer_full = TRUE;  /* OK, we have an iMCU row to work with */
-    _main->iMCU_row_ctr++;      /* count rows received */
-  }
-
-  /* Postprocessor typically will not swallow all the input data it is handed
-   * in one call (due to filling the output buffer first).  Must be prepared
-   * to exit and restart.  This switch lets us keep track of how far we got.
-   * Note that each case falls through to the next on successful completion.
-   */
-  switch (_main->context_state) {
-  case CTX_POSTPONED_ROW:
-    /* Call postprocessor using previously set pointers for postponed row */
-    (*cinfo->post->post_process_data) (cinfo, _main->xbuffer[_main->whichptr],
-                        &_main->rowgroup_ctr, _main->rowgroups_avail,
-                        output_buf, out_row_ctr, out_rows_avail);
-    if (_main->rowgroup_ctr < _main->rowgroups_avail)
-      return;                   /* Need to suspend */
-    _main->context_state = CTX_PREPARE_FOR_IMCU;
-    if (*out_row_ctr >= out_rows_avail)
-      return;                   /* Postprocessor exactly filled output buf */
-    /*FALLTHROUGH*/
-  case CTX_PREPARE_FOR_IMCU:
-    /* Prepare to process first M-1 row groups of this iMCU row */
-    _main->rowgroup_ctr = 0;
-    _main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);
-    /* Check for bottom of image: if so, tweak pointers to "duplicate"
-     * the last sample row, and adjust rowgroups_avail to ignore padding rows.
-     */
-    if (_main->iMCU_row_ctr == cinfo->total_iMCU_rows)
-      set_bottom_pointers(cinfo);
-    _main->context_state = CTX_PROCESS_IMCU;
-    /*FALLTHROUGH*/
-  case CTX_PROCESS_IMCU:
-    /* Call postprocessor using previously set pointers */
-    (*cinfo->post->post_process_data) (cinfo, _main->xbuffer[_main->whichptr],
-                        &_main->rowgroup_ctr, _main->rowgroups_avail,
-                        output_buf, out_row_ctr, out_rows_avail);
-    if (_main->rowgroup_ctr < _main->rowgroups_avail)
-      return;                   /* Need to suspend */
-    /* After the first iMCU, change wraparound pointers to normal state */
-    if (_main->iMCU_row_ctr == 1)
-      set_wraparound_pointers(cinfo);
-    /* Prepare to load new iMCU row using other xbuffer list */
-    _main->whichptr ^= 1;       /* 0=>1 or 1=>0 */
-    _main->buffer_full = FALSE;
-    /* Still need to process last row group of this iMCU row, */
-    /* which is saved at index M+1 of the other xbuffer */
-    _main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);
-    _main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);
-    _main->context_state = CTX_POSTPONED_ROW;
-  }
-}
-
-
-/*
- * Process some data.
- * Final pass of two-pass quantization: just call the postprocessor.
- * Source data will be the postprocessor controller's internal buffer.
- */
-
-#ifdef QUANT_2PASS_SUPPORTED
-
-METHODDEF(void)
-process_data_crank_post (j_decompress_ptr cinfo,
-                         JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                         JDIMENSION out_rows_avail)
-{
-  (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
-                                     (JDIMENSION *) NULL, (JDIMENSION) 0,
-                                     output_buf, out_row_ctr, out_rows_avail);
-}
-
-#endif /* QUANT_2PASS_SUPPORTED */
-
-
-/*
- * Initialize main buffer controller.
- */
-
-GLOBAL(void)
-jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
-{
-  my_main_ptr _main;
-  int ci, rgroup, ngroups;
-  jpeg_component_info *compptr;
-
-  _main = (my_main_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_main_controller));
-  cinfo->main = (struct jpeg_d_main_controller *) _main;
-  _main->pub.start_pass = start_pass_main;
-
-  if (need_full_buffer)         /* shouldn't happen */
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-
-  /* Allocate the workspace.
-   * ngroups is the number of row groups we need.
-   */
-  if (cinfo->upsample->need_context_rows) {
-    if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */
-      ERREXIT(cinfo, JERR_NOTIMPL);
-    alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */
-    ngroups = cinfo->min_DCT_scaled_size + 2;
-  } else {
-    ngroups = cinfo->min_DCT_scaled_size;
-  }
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
-      cinfo->min_DCT_scaled_size; /* height of a row group of component */
-    _main->buffer[ci] = (*cinfo->mem->alloc_sarray)
-                        ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                         compptr->width_in_blocks * compptr->DCT_scaled_size,
-                         (JDIMENSION) (rgroup * ngroups));
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jdmarker.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1390 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdmarker.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains routines to decode JPEG datastream markers.
- * Most of the complexity arises from our desire to support input
- * suspension: if not all of the data for a marker is available,
- * we must exit back to the application.  On resumption, we reprocess
- * the marker.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-typedef enum {                  /* JPEG marker codes */
-  M_SOF0  = 0xc0,
-  M_SOF1  = 0xc1,
-  M_SOF2  = 0xc2,
-  M_SOF3  = 0xc3,
-
-  M_SOF5  = 0xc5,
-  M_SOF6  = 0xc6,
-  M_SOF7  = 0xc7,
-
-  M_JPG   = 0xc8,
-  M_SOF9  = 0xc9,
-  M_SOF10 = 0xca,
-  M_SOF11 = 0xcb,
-
-  M_SOF13 = 0xcd,
-  M_SOF14 = 0xce,
-  M_SOF15 = 0xcf,
-
-  M_DHT   = 0xc4,
-
-  M_DAC   = 0xcc,
-
-  M_RST0  = 0xd0,
-  M_RST1  = 0xd1,
-  M_RST2  = 0xd2,
-  M_RST3  = 0xd3,
-  M_RST4  = 0xd4,
-  M_RST5  = 0xd5,
-  M_RST6  = 0xd6,
-  M_RST7  = 0xd7,
-
-  M_SOI   = 0xd8,
-  M_EOI   = 0xd9,
-  M_SOS   = 0xda,
-  M_DQT   = 0xdb,
-  M_DNL   = 0xdc,
-  M_DRI   = 0xdd,
-  M_DHP   = 0xde,
-  M_EXP   = 0xdf,
-
-  M_APP0  = 0xe0,
-  M_APP1  = 0xe1,
-  M_APP2  = 0xe2,
-  M_APP3  = 0xe3,
-  M_APP4  = 0xe4,
-  M_APP5  = 0xe5,
-  M_APP6  = 0xe6,
-  M_APP7  = 0xe7,
-  M_APP8  = 0xe8,
-  M_APP9  = 0xe9,
-  M_APP10 = 0xea,
-  M_APP11 = 0xeb,
-  M_APP12 = 0xec,
-  M_APP13 = 0xed,
-  M_APP14 = 0xee,
-  M_APP15 = 0xef,
-
-  M_JPG0  = 0xf0,
-  M_JPG13 = 0xfd,
-  M_COM   = 0xfe,
-
-  M_TEM   = 0x01,
-
-  M_ERROR = 0x100
-} JPEG_MARKER;
-
-
-/* Private state */
-
-typedef struct {
-  struct jpeg_marker_reader pub; /* public fields */
-
-  /* Application-overridable marker processing methods */
-  jpeg_marker_parser_method process_COM;
-  jpeg_marker_parser_method process_APPn[16];
-
-  /* Limit on marker data length to save for each marker type */
-  unsigned int length_limit_COM;
-  unsigned int length_limit_APPn[16];
-
-  /* Status of COM/APPn marker saving */
-  jpeg_saved_marker_ptr cur_marker;     /* NULL if not processing a marker */
-  unsigned int bytes_read;              /* data bytes read so far in marker */
-  /* Note: cur_marker is not linked into marker_list until it's all read. */
-} my_marker_reader;
-
-typedef my_marker_reader * my_marker_ptr;
-
-
-/*
- * Macros for fetching data from the data source module.
- *
- * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect
- * the current restart point; we update them only when we have reached a
- * suitable place to restart if a suspension occurs.
- */
-
-/* Declare and initialize local copies of input pointer/count */
-#define INPUT_VARS(cinfo)  \
-        struct jpeg_source_mgr * datasrc = (cinfo)->src;  \
-        const JOCTET * next_input_byte = datasrc->next_input_byte;  \
-        size_t bytes_in_buffer = datasrc->bytes_in_buffer
-
-/* Unload the local copies --- do this only at a restart boundary */
-#define INPUT_SYNC(cinfo)  \
-        ( datasrc->next_input_byte = next_input_byte,  \
-          datasrc->bytes_in_buffer = bytes_in_buffer )
-
-/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */
-#define INPUT_RELOAD(cinfo)  \
-        ( next_input_byte = datasrc->next_input_byte,  \
-          bytes_in_buffer = datasrc->bytes_in_buffer )
-
-/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.
- * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,
- * but we must reload the local copies after a successful fill.
- */
-#define MAKE_BYTE_AVAIL(cinfo,action)  \
-        if (bytes_in_buffer == 0) {  \
-          if (! (*datasrc->fill_input_buffer) (cinfo))  \
-            { action; }  \
-          INPUT_RELOAD(cinfo);  \
-        }
-
-/* Read a byte into variable V.
- * If must suspend, take the specified action (typically "return FALSE").
- */
-#define INPUT_BYTE(cinfo,V,action)  \
-        MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
-                  bytes_in_buffer--; \
-                  V = GETJOCTET(*next_input_byte++); )
-
-/* As above, but read two bytes interpreted as an unsigned 16-bit integer.
- * V should be declared unsigned int or perhaps INT32.
- */
-#define INPUT_2BYTES(cinfo,V,action)  \
-        MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
-                  bytes_in_buffer--; \
-                  V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
-                  MAKE_BYTE_AVAIL(cinfo,action); \
-                  bytes_in_buffer--; \
-                  V += GETJOCTET(*next_input_byte++); )
-
-
-/*
- * Routines to process JPEG markers.
- *
- * Entry condition: JPEG marker itself has been read and its code saved
- *   in cinfo->unread_marker; input restart point is just after the marker.
- *
- * Exit: if return TRUE, have read and processed any parameters, and have
- *   updated the restart point to point after the parameters.
- *   If return FALSE, was forced to suspend before reaching end of
- *   marker parameters; restart point has not been moved.  Same routine
- *   will be called again after application supplies more input data.
- *
- * This approach to suspension assumes that all of a marker's parameters
- * can fit into a single input bufferload.  This should hold for "normal"
- * markers.  Some COM/APPn markers might have large parameter segments
- * that might not fit.  If we are simply dropping such a marker, we use
- * skip_input_data to get past it, and thereby put the problem on the
- * source manager's shoulders.  If we are saving the marker's contents
- * into memory, we use a slightly different convention: when forced to
- * suspend, the marker processor updates the restart point to the end of
- * what it's consumed (ie, the end of the buffer) before returning FALSE.
- * On resumption, cinfo->unread_marker still contains the marker code,
- * but the data source will point to the next chunk of marker data.
- * The marker processor must retain internal state to deal with this.
- *
- * Note that we don't bother to avoid duplicate trace messages if a
- * suspension occurs within marker parameters.  Other side effects
- * require more care.
- */
-
-
-LOCAL(boolean)
-get_soi (j_decompress_ptr cinfo)
-/* Process an SOI marker */
-{
-  int i;
-
-  TRACEMS(cinfo, 1, JTRC_SOI);
-
-  if (cinfo->marker->saw_SOI)
-    ERREXIT(cinfo, JERR_SOI_DUPLICATE);
-
-  /* Reset all parameters that are defined to be reset by SOI */
-
-  for (i = 0; i < NUM_ARITH_TBLS; i++) {
-    cinfo->arith_dc_L[i] = 0;
-    cinfo->arith_dc_U[i] = 1;
-    cinfo->arith_ac_K[i] = 5;
-  }
-  cinfo->restart_interval = 0;
-
-  /* Set initial assumptions for colorspace etc */
-
-  cinfo->jpeg_color_space = JCS_UNKNOWN;
-  cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
-
-  cinfo->saw_JFIF_marker = FALSE;
-  cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */
-  cinfo->JFIF_minor_version = 1;
-  cinfo->density_unit = 0;
-  cinfo->X_density = 1;
-  cinfo->Y_density = 1;
-  cinfo->saw_Adobe_marker = FALSE;
-  cinfo->Adobe_transform = 0;
-
-  cinfo->marker->saw_SOI = TRUE;
-
-  return TRUE;
-}
-
-
-LOCAL(boolean)
-get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
-/* Process a SOFn marker */
-{
-  INT32 length;
-  int c, ci;
-  jpeg_component_info * compptr;
-  INPUT_VARS(cinfo);
-
-  cinfo->progressive_mode = is_prog;
-  cinfo->arith_code = is_arith;
-
-  INPUT_2BYTES(cinfo, length, return FALSE);
-
-  INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);
-  INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE);
-  INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE);
-  INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);
-
-  length -= 8;
-
-  TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
-           (int) cinfo->image_width, (int) cinfo->image_height,
-           cinfo->num_components);
-
-  if (cinfo->marker->saw_SOF)
-    ERREXIT(cinfo, JERR_SOF_DUPLICATE);
-
-  /* We don't support files in which the image height is initially specified */
-  /* as 0 and is later redefined by DNL.  As long as we have to check that,  */
-  /* might as well have a general sanity check. */
-  if (cinfo->image_height <= 0 || cinfo->image_width <= 0
-      || cinfo->num_components <= 0)
-    ERREXIT(cinfo, JERR_EMPTY_IMAGE);
-
-  if (length != (cinfo->num_components * 3))
-    ERREXIT(cinfo, JERR_BAD_LENGTH);
-
-  if (cinfo->comp_info == NULL) { /* do only once, even if suspend */
-    cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
-                        ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                         cinfo->num_components * SIZEOF(jpeg_component_info));
-    MEMZERO(cinfo->comp_info,
-            cinfo->num_components * SIZEOF(jpeg_component_info));
-  }
-
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    compptr->component_index = ci;
-    INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
-    INPUT_BYTE(cinfo, c, return FALSE);
-    compptr->h_samp_factor = (c >> 4) & 15;
-    compptr->v_samp_factor = (c     ) & 15;
-    INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);
-
-    TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
-             compptr->component_id, compptr->h_samp_factor,
-             compptr->v_samp_factor, compptr->quant_tbl_no);
-  }
-
-  cinfo->marker->saw_SOF = TRUE;
-
-  INPUT_SYNC(cinfo);
-  return TRUE;
-}
-
-
-LOCAL(boolean)
-get_sos (j_decompress_ptr cinfo)
-/* Process a SOS marker */
-{
-  INT32 length;
-  int i, ci, n, c, cc;
-  jpeg_component_info * compptr;
-  INPUT_VARS(cinfo);
-
-  if (! cinfo->marker->saw_SOF)
-    ERREXIT(cinfo, JERR_SOS_NO_SOF);
-
-  INPUT_2BYTES(cinfo, length, return FALSE);
-
-  INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */
-
-  TRACEMS1(cinfo, 1, JTRC_SOS, n);
-
-  if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)
-    ERREXIT(cinfo, JERR_BAD_LENGTH);
-
-  cinfo->comps_in_scan = n;
-
-  /* Collect the component-spec parameters */
-
-  for (i = 0; i < n; i++) {
-    INPUT_BYTE(cinfo, cc, return FALSE);
-    INPUT_BYTE(cinfo, c, return FALSE);
-
-    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-         ci++, compptr++) {
-      if (cc == compptr->component_id)
-        goto id_found;
-    }
-
-    ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
-
-  id_found:
-
-    cinfo->cur_comp_info[i] = compptr;
-    compptr->dc_tbl_no = (c >> 4) & 15;
-    compptr->ac_tbl_no = (c     ) & 15;
-
-    TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
-             compptr->dc_tbl_no, compptr->ac_tbl_no);
-
-    /* This CSi (cc) should differ from the previous CSi */
-    for (ci = 0; ci < i; ci++) {
-      if (cinfo->cur_comp_info[ci] == compptr)
-        ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
-    }
-  }
-
-  /* Collect the additional scan parameters Ss, Se, Ah/Al. */
-  INPUT_BYTE(cinfo, c, return FALSE);
-  cinfo->Ss = c;
-  INPUT_BYTE(cinfo, c, return FALSE);
-  cinfo->Se = c;
-  INPUT_BYTE(cinfo, c, return FALSE);
-  cinfo->Ah = (c >> 4) & 15;
-  cinfo->Al = (c     ) & 15;
-
-  TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
-           cinfo->Ah, cinfo->Al);
-
-  /* Prepare to scan data & restart markers */
-  cinfo->marker->next_restart_num = 0;
-
-  /* Count another SOS marker */
-  cinfo->input_scan_number++;
-
-  INPUT_SYNC(cinfo);
-  return TRUE;
-}
-
-
-#ifdef D_ARITH_CODING_SUPPORTED
-
-LOCAL(boolean)
-get_dac (j_decompress_ptr cinfo)
-/* Process a DAC marker */
-{
-  INT32 length;
-  int index, val;
-  INPUT_VARS(cinfo);
-
-  INPUT_2BYTES(cinfo, length, return FALSE);
-  length -= 2;
-
-  while (length > 0) {
-    INPUT_BYTE(cinfo, index, return FALSE);
-    INPUT_BYTE(cinfo, val, return FALSE);
-
-    length -= 2;
-
-    TRACEMS2(cinfo, 1, JTRC_DAC, index, val);
-
-    if (index < 0 || index >= (2*NUM_ARITH_TBLS))
-      ERREXIT1(cinfo, JERR_DAC_INDEX, index);
-
-    if (index >= NUM_ARITH_TBLS) { /* define AC table */
-      cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;
-    } else {                    /* define DC table */
-      cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);
-      cinfo->arith_dc_U[index] = (UINT8) (val >> 4);
-      if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])
-        ERREXIT1(cinfo, JERR_DAC_VALUE, val);
-    }
-  }
-
-  if (length != 0)
-    ERREXIT(cinfo, JERR_BAD_LENGTH);
-
-  INPUT_SYNC(cinfo);
-  return TRUE;
-}
-
-#else /* ! D_ARITH_CODING_SUPPORTED */
-
-#define get_dac(cinfo)  skip_variable(cinfo)
-
-#endif /* D_ARITH_CODING_SUPPORTED */
-
-
-LOCAL(boolean)
-get_dht (j_decompress_ptr cinfo)
-/* Process a DHT marker */
-{
-  INT32 length;
-  UINT8 bits[17];
-  UINT8 huffval[256];
-  int i, index, count;
-  JHUFF_TBL **htblptr;
-  INPUT_VARS(cinfo);
-
-  INPUT_2BYTES(cinfo, length, return FALSE);
-  length -= 2;
-
-  while (length > 16) {
-    INPUT_BYTE(cinfo, index, return FALSE);
-
-    TRACEMS1(cinfo, 1, JTRC_DHT, index);
-
-    bits[0] = 0;
-    count = 0;
-    for (i = 1; i <= 16; i++) {
-      INPUT_BYTE(cinfo, bits[i], return FALSE);
-      count += bits[i];
-    }
-
-    length -= 1 + 16;
-
-    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
-             bits[1], bits[2], bits[3], bits[4],
-             bits[5], bits[6], bits[7], bits[8]);
-    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
-             bits[9], bits[10], bits[11], bits[12],
-             bits[13], bits[14], bits[15], bits[16]);
-
-    /* Here we just do minimal validation of the counts to avoid walking
-     * off the end of our table space.  jdhuff.c will check more carefully.
-     */
-    if (count > 256 || ((INT32) count) > length)
-      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-
-    for (i = 0; i < count; i++)
-      INPUT_BYTE(cinfo, huffval[i], return FALSE);
-
-    length -= count;
-
-    if (index & 0x10) {         /* AC table definition */
-      index -= 0x10;
-      htblptr = &cinfo->ac_huff_tbl_ptrs[index];
-    } else {                    /* DC table definition */
-      htblptr = &cinfo->dc_huff_tbl_ptrs[index];
-    }
-
-    if (index < 0 || index >= NUM_HUFF_TBLS)
-      ERREXIT1(cinfo, JERR_DHT_INDEX, index);
-
-    if (*htblptr == NULL)
-      *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
-
-    MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
-    MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
-  }
-
-  if (length != 0)
-    ERREXIT(cinfo, JERR_BAD_LENGTH);
-
-  INPUT_SYNC(cinfo);
-  return TRUE;
-}
-
-
-LOCAL(boolean)
-get_dqt (j_decompress_ptr cinfo)
-/* Process a DQT marker */
-{
-  INT32 length;
-  int n, i, prec;
-  unsigned int tmp;
-  JQUANT_TBL *quant_ptr;
-  INPUT_VARS(cinfo);
-
-  INPUT_2BYTES(cinfo, length, return FALSE);
-  length -= 2;
-
-  while (length > 0) {
-    INPUT_BYTE(cinfo, n, return FALSE);
-    prec = n >> 4;
-    n &= 0x0F;
-
-    TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);
-
-    if (n >= NUM_QUANT_TBLS)
-      ERREXIT1(cinfo, JERR_DQT_INDEX, n);
-
-    if (cinfo->quant_tbl_ptrs[n] == NULL)
-      cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);
-    quant_ptr = cinfo->quant_tbl_ptrs[n];
-
-    for (i = 0; i < DCTSIZE2; i++) {
-      if (prec)
-        INPUT_2BYTES(cinfo, tmp, return FALSE);
-      else
-        INPUT_BYTE(cinfo, tmp, return FALSE);
-      /* We convert the zigzag-order table to natural array order. */
-      quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp;
-    }
-
-    if (cinfo->err->trace_level >= 2) {
-      for (i = 0; i < DCTSIZE2; i += 8) {
-        TRACEMS8(cinfo, 2, JTRC_QUANTVALS,
-                 quant_ptr->quantval[i],   quant_ptr->quantval[i+1],
-                 quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],
-                 quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],
-                 quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);
-      }
-    }
-
-    length -= DCTSIZE2+1;
-    if (prec) length -= DCTSIZE2;
-  }
-
-  if (length != 0)
-    ERREXIT(cinfo, JERR_BAD_LENGTH);
-
-  INPUT_SYNC(cinfo);
-  return TRUE;
-}
-
-
-LOCAL(boolean)
-get_dri (j_decompress_ptr cinfo)
-/* Process a DRI marker */
-{
-  INT32 length;
-  unsigned int tmp;
-  INPUT_VARS(cinfo);
-
-  INPUT_2BYTES(cinfo, length, return FALSE);
-
-  if (length != 4)
-    ERREXIT(cinfo, JERR_BAD_LENGTH);
-
-  INPUT_2BYTES(cinfo, tmp, return FALSE);
-
-  TRACEMS1(cinfo, 1, JTRC_DRI, tmp);
-
-  cinfo->restart_interval = tmp;
-
-  INPUT_SYNC(cinfo);
-  return TRUE;
-}
-
-
-/*
- * Routines for processing APPn and COM markers.
- * These are either saved in memory or discarded, per application request.
- * APP0 and APP14 are specially checked to see if they are
- * JFIF and Adobe markers, respectively.
- */
-
-#define APP0_DATA_LEN   14      /* Length of interesting data in APP0 */
-#define APP14_DATA_LEN  12      /* Length of interesting data in APP14 */
-#define APPN_DATA_LEN   14      /* Must be the largest of the above!! */
-
-
-LOCAL(void)
-examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
-              unsigned int datalen, INT32 remaining)
-/* Examine first few bytes from an APP0.
- * Take appropriate action if it is a JFIF marker.
- * datalen is # of bytes at data[], remaining is length of rest of marker data.
- */
-{
-  INT32 totallen = (INT32) datalen + remaining;
-
-  if (datalen >= APP0_DATA_LEN &&
-      GETJOCTET(data[0]) == 0x4A &&
-      GETJOCTET(data[1]) == 0x46 &&
-      GETJOCTET(data[2]) == 0x49 &&
-      GETJOCTET(data[3]) == 0x46 &&
-      GETJOCTET(data[4]) == 0) {
-    /* Found JFIF APP0 marker: save info */
-    cinfo->saw_JFIF_marker = TRUE;
-    cinfo->JFIF_major_version = GETJOCTET(data[5]);
-    cinfo->JFIF_minor_version = GETJOCTET(data[6]);
-    cinfo->density_unit = GETJOCTET(data[7]);
-    cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
-    cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
-    /* Check version.
-     * Major version must be 1, anything else signals an incompatible change.
-     * (We used to treat this as an error, but now it's a nonfatal warning,
-     * because some bozo at Hijaak couldn't read the spec.)
-     * Minor version should be 0..2, but process anyway if newer.
-     */
-    if (cinfo->JFIF_major_version != 1)
-      WARNMS2(cinfo, JWRN_JFIF_MAJOR,
-              cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
-    /* Generate trace messages */
-    TRACEMS5(cinfo, 1, JTRC_JFIF,
-             cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
-             cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
-    /* Validate thumbnail dimensions and issue appropriate messages */
-    if (GETJOCTET(data[12]) | GETJOCTET(data[13]))
-      TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,
-               GETJOCTET(data[12]), GETJOCTET(data[13]));
-    totallen -= APP0_DATA_LEN;
-    if (totallen !=
-        ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))
-      TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);
-  } else if (datalen >= 6 &&
-      GETJOCTET(data[0]) == 0x4A &&
-      GETJOCTET(data[1]) == 0x46 &&
-      GETJOCTET(data[2]) == 0x58 &&
-      GETJOCTET(data[3]) == 0x58 &&
-      GETJOCTET(data[4]) == 0) {
-    /* Found JFIF "JFXX" extension APP0 marker */
-    /* The library doesn't actually do anything with these,
-     * but we try to produce a helpful trace message.
-     */
-    switch (GETJOCTET(data[5])) {
-    case 0x10:
-      TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);
-      break;
-    case 0x11:
-      TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);
-      break;
-    case 0x13:
-      TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);
-      break;
-    default:
-      TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
-               GETJOCTET(data[5]), (int) totallen);
-      break;
-    }
-  } else {
-    /* Start of APP0 does not match "JFIF" or "JFXX", or too short */
-    TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);
-
-    /*
-     * In this case we have seen the APP0 marker but the remaining
-     * APP0 section may be corrupt.  Regardless, we will set the
-     * saw_JFIF_marker flag as it is important for making the
-     * correct choice of JPEG color space later (we will assume
-     * YCbCr in this case).  The version and density fields will
-     * contain default values, which should be sufficient for our needs.
-     */
-    cinfo->saw_JFIF_marker = TRUE;
-  }
-}
-
-
-LOCAL(void)
-examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,
-               unsigned int datalen, INT32 remaining)
-/* Examine first few bytes from an APP14.
- * Take appropriate action if it is an Adobe marker.
- * datalen is # of bytes at data[], remaining is length of rest of marker data.
- */
-{
-  unsigned int version, flags0, flags1, transform;
-
-  if (datalen >= APP14_DATA_LEN &&
-      GETJOCTET(data[0]) == 0x41 &&
-      GETJOCTET(data[1]) == 0x64 &&
-      GETJOCTET(data[2]) == 0x6F &&
-      GETJOCTET(data[3]) == 0x62 &&
-      GETJOCTET(data[4]) == 0x65) {
-    /* Found Adobe APP14 marker */
-    version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);
-    flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);
-    flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);
-    transform = GETJOCTET(data[11]);
-    TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);
-    cinfo->saw_Adobe_marker = TRUE;
-    cinfo->Adobe_transform = (UINT8) transform;
-  } else {
-    /* Start of APP14 does not match "Adobe", or too short */
-    TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));
-  }
-}
-
-
-METHODDEF(boolean)
-get_interesting_appn (j_decompress_ptr cinfo)
-/* Process an APP0 or APP14 marker without saving it */
-{
-  INT32 length;
-  JOCTET b[APPN_DATA_LEN];
-  unsigned int i, numtoread;
-  INPUT_VARS(cinfo);
-
-  INPUT_2BYTES(cinfo, length, return FALSE);
-  length -= 2;
-
-  /* get the interesting part of the marker data */
-  if (length >= APPN_DATA_LEN)
-    numtoread = APPN_DATA_LEN;
-  else if (length > 0)
-    numtoread = (unsigned int) length;
-  else
-    numtoread = 0;
-  for (i = 0; i < numtoread; i++)
-    INPUT_BYTE(cinfo, b[i], return FALSE);
-  length -= numtoread;
-
-  /* process it */
-  switch (cinfo->unread_marker) {
-  case M_APP0:
-    examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);
-    break;
-  case M_APP14:
-    examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);
-    break;
-  default:
-    /* can't get here unless jpeg_save_markers chooses wrong processor */
-    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
-    break;
-  }
-
-  /* skip any remaining data -- could be lots */
-  INPUT_SYNC(cinfo);
-  if (length > 0)
-    (*cinfo->src->skip_input_data) (cinfo, (long) length);
-
-  return TRUE;
-}
-
-
-#ifdef SAVE_MARKERS_SUPPORTED
-
-METHODDEF(boolean)
-save_marker (j_decompress_ptr cinfo)
-/* Save an APPn or COM marker into the marker list */
-{
-  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-  jpeg_saved_marker_ptr cur_marker = marker->cur_marker;
-  unsigned int bytes_read, data_length;
-  JOCTET FAR * data;
-  INT32 length = 0;
-  INPUT_VARS(cinfo);
-
-  if (cur_marker == NULL) {
-    /* begin reading a marker */
-    INPUT_2BYTES(cinfo, length, return FALSE);
-    length -= 2;
-    if (length >= 0) {          /* watch out for bogus length word */
-      /* figure out how much we want to save */
-      unsigned int limit;
-      if (cinfo->unread_marker == (int) M_COM)
-        limit = marker->length_limit_COM;
-      else
-        limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];
-      if ((unsigned int) length < limit)
-        limit = (unsigned int) length;
-      /* allocate and initialize the marker item */
-      cur_marker = (jpeg_saved_marker_ptr)
-        (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                    SIZEOF(struct jpeg_marker_struct) + limit);
-      cur_marker->next = NULL;
-      cur_marker->marker = (UINT8) cinfo->unread_marker;
-      cur_marker->original_length = (unsigned int) length;
-      cur_marker->data_length = limit;
-      /* data area is just beyond the jpeg_marker_struct */
-      data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);
-      marker->cur_marker = cur_marker;
-      marker->bytes_read = 0;
-      bytes_read = 0;
-      data_length = limit;
-    } else {
-      /* deal with bogus length word */
-      bytes_read = data_length = 0;
-      data = NULL;
-    }
-  } else {
-    /* resume reading a marker */
-    bytes_read = marker->bytes_read;
-    data_length = cur_marker->data_length;
-    data = cur_marker->data + bytes_read;
-  }
-
-  while (bytes_read < data_length) {
-    INPUT_SYNC(cinfo);          /* move the restart point to here */
-    marker->bytes_read = bytes_read;
-    /* If there's not at least one byte in buffer, suspend */
-    MAKE_BYTE_AVAIL(cinfo, return FALSE);
-    /* Copy bytes with reasonable rapidity */
-    while (bytes_read < data_length && bytes_in_buffer > 0) {
-      *data++ = *next_input_byte++;
-      bytes_in_buffer--;
-      bytes_read++;
-    }
-  }
-
-  /* Done reading what we want to read */
-  if (cur_marker != NULL) {     /* will be NULL if bogus length word */
-    /* Add new marker to end of list */
-    if (cinfo->marker_list == NULL) {
-      cinfo->marker_list = cur_marker;
-    } else {
-      jpeg_saved_marker_ptr prev = cinfo->marker_list;
-      while (prev->next != NULL)
-        prev = prev->next;
-      prev->next = cur_marker;
-    }
-    /* Reset pointer & calc remaining data length */
-    data = cur_marker->data;
-    length = cur_marker->original_length - data_length;
-  }
-  /* Reset to initial state for next marker */
-  marker->cur_marker = NULL;
-
-  /* Process the marker if interesting; else just make a generic trace msg */
-  switch (cinfo->unread_marker) {
-  case M_APP0:
-    examine_app0(cinfo, data, data_length, length);
-    break;
-  case M_APP14:
-    examine_app14(cinfo, data, data_length, length);
-    break;
-  default:
-    TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
-             (int) (data_length + length));
-    break;
-  }
-
-  /* skip any remaining data -- could be lots */
-  INPUT_SYNC(cinfo);            /* do before skip_input_data */
-  if (length > 0)
-    (*cinfo->src->skip_input_data) (cinfo, (long) length);
-
-  return TRUE;
-}
-
-#endif /* SAVE_MARKERS_SUPPORTED */
-
-
-METHODDEF(boolean)
-skip_variable (j_decompress_ptr cinfo)
-/* Skip over an unknown or uninteresting variable-length marker */
-{
-  INT32 length;
-  INPUT_VARS(cinfo);
-
-  INPUT_2BYTES(cinfo, length, return FALSE);
-  length -= 2;
-
-  TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);
-
-  INPUT_SYNC(cinfo);            /* do before skip_input_data */
-  if (length > 0)
-    (*cinfo->src->skip_input_data) (cinfo, (long) length);
-
-  return TRUE;
-}
-
-
-/*
- * Find the next JPEG marker, save it in cinfo->unread_marker.
- * Returns FALSE if had to suspend before reaching a marker;
- * in that case cinfo->unread_marker is unchanged.
- *
- * Note that the result might not be a valid marker code,
- * but it will never be 0 or FF.
- */
-
-LOCAL(boolean)
-next_marker (j_decompress_ptr cinfo)
-{
-  int c;
-  INPUT_VARS(cinfo);
-
-  for (;;) {
-    INPUT_BYTE(cinfo, c, return FALSE);
-    /* Skip any non-FF bytes.
-     * This may look a bit inefficient, but it will not occur in a valid file.
-     * We sync after each discarded byte so that a suspending data source
-     * can discard the byte from its buffer.
-     */
-    while (c != 0xFF) {
-      cinfo->marker->discarded_bytes++;
-      INPUT_SYNC(cinfo);
-      INPUT_BYTE(cinfo, c, return FALSE);
-    }
-    /* This loop swallows any duplicate FF bytes.  Extra FFs are legal as
-     * pad bytes, so don't count them in discarded_bytes.  We assume there
-     * will not be so many consecutive FF bytes as to overflow a suspending
-     * data source's input buffer.
-     */
-    do {
-      INPUT_BYTE(cinfo, c, return FALSE);
-    } while (c == 0xFF);
-    if (c != 0)
-      break;                    /* found a valid marker, exit loop */
-    /* Reach here if we found a stuffed-zero data sequence (FF/00).
-     * Discard it and loop back to try again.
-     */
-    cinfo->marker->discarded_bytes += 2;
-    INPUT_SYNC(cinfo);
-  }
-
-  if (cinfo->marker->discarded_bytes != 0) {
-    WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
-    cinfo->marker->discarded_bytes = 0;
-  }
-
-  cinfo->unread_marker = c;
-
-  INPUT_SYNC(cinfo);
-  return TRUE;
-}
-
-
-LOCAL(boolean)
-first_marker (j_decompress_ptr cinfo)
-/* Like next_marker, but used to obtain the initial SOI marker. */
-/* For this marker, we do not allow preceding garbage or fill; otherwise,
- * we might well scan an entire input file before realizing it ain't JPEG.
- * If an application wants to process non-JFIF files, it must seek to the
- * SOI before calling the JPEG library.
- */
-{
-  int c, c2;
-  INPUT_VARS(cinfo);
-
-  INPUT_BYTE(cinfo, c, return FALSE);
-  INPUT_BYTE(cinfo, c2, return FALSE);
-  if (c != 0xFF || c2 != (int) M_SOI)
-    ERREXIT2(cinfo, JERR_NO_SOI, c, c2);
-
-  cinfo->unread_marker = c2;
-
-  INPUT_SYNC(cinfo);
-  return TRUE;
-}
-
-
-/*
- * Read markers until SOS or EOI.
- *
- * Returns same codes as are defined for jpeg_consume_input:
- * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
- */
-
-METHODDEF(int)
-read_markers (j_decompress_ptr cinfo)
-{
-  /* Outer loop repeats once for each marker. */
-  for (;;) {
-    /* Collect the marker proper, unless we already did. */
-    /* NB: first_marker() enforces the requirement that SOI appear first. */
-    if (cinfo->unread_marker == 0) {
-      if (! cinfo->marker->saw_SOI) {
-        if (! first_marker(cinfo))
-          return JPEG_SUSPENDED;
-      } else {
-        if (! next_marker(cinfo))
-          return JPEG_SUSPENDED;
-      }
-    }
-    /* At this point cinfo->unread_marker contains the marker code and the
-     * input point is just past the marker proper, but before any parameters.
-     * A suspension will cause us to return with this state still true.
-     */
-    switch (cinfo->unread_marker) {
-    case M_SOI:
-      if (! get_soi(cinfo))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_SOF0:                /* Baseline */
-    case M_SOF1:                /* Extended sequential, Huffman */
-      if (! get_sof(cinfo, FALSE, FALSE))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_SOF2:                /* Progressive, Huffman */
-      if (! get_sof(cinfo, TRUE, FALSE))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_SOF9:                /* Extended sequential, arithmetic */
-      if (! get_sof(cinfo, FALSE, TRUE))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_SOF10:               /* Progressive, arithmetic */
-      if (! get_sof(cinfo, TRUE, TRUE))
-        return JPEG_SUSPENDED;
-      break;
-
-    /* Currently unsupported SOFn types */
-    case M_SOF3:                /* Lossless, Huffman */
-    case M_SOF5:                /* Differential sequential, Huffman */
-    case M_SOF6:                /* Differential progressive, Huffman */
-    case M_SOF7:                /* Differential lossless, Huffman */
-    case M_JPG:                 /* Reserved for JPEG extensions */
-    case M_SOF11:               /* Lossless, arithmetic */
-    case M_SOF13:               /* Differential sequential, arithmetic */
-    case M_SOF14:               /* Differential progressive, arithmetic */
-    case M_SOF15:               /* Differential lossless, arithmetic */
-      ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);
-      break;
-
-    case M_SOS:
-      if (! get_sos(cinfo))
-        return JPEG_SUSPENDED;
-      cinfo->unread_marker = 0; /* processed the marker */
-      return JPEG_REACHED_SOS;
-
-    case M_EOI:
-      TRACEMS(cinfo, 1, JTRC_EOI);
-      cinfo->unread_marker = 0; /* processed the marker */
-      return JPEG_REACHED_EOI;
-
-    case M_DAC:
-      if (! get_dac(cinfo))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_DHT:
-      if (! get_dht(cinfo))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_DQT:
-      if (! get_dqt(cinfo))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_DRI:
-      if (! get_dri(cinfo))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_APP0:
-    case M_APP1:
-    case M_APP2:
-    case M_APP3:
-    case M_APP4:
-    case M_APP5:
-    case M_APP6:
-    case M_APP7:
-    case M_APP8:
-    case M_APP9:
-    case M_APP10:
-    case M_APP11:
-    case M_APP12:
-    case M_APP13:
-    case M_APP14:
-    case M_APP15:
-      if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[
-                cinfo->unread_marker - (int) M_APP0]) (cinfo))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_COM:
-      if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
-        return JPEG_SUSPENDED;
-      break;
-
-    case M_RST0:                /* these are all parameterless */
-    case M_RST1:
-    case M_RST2:
-    case M_RST3:
-    case M_RST4:
-    case M_RST5:
-    case M_RST6:
-    case M_RST7:
-    case M_TEM:
-      TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
-      break;
-
-    case M_DNL:                 /* Ignore DNL ... perhaps the wrong thing */
-      if (! skip_variable(cinfo))
-        return JPEG_SUSPENDED;
-      break;
-
-    default:                    /* must be DHP, EXP, JPGn, or RESn */
-      /* For now, we treat the reserved markers as fatal errors since they are
-       * likely to be used to signal incompatible JPEG Part 3 extensions.
-       * Once the JPEG 3 version-number marker is well defined, this code
-       * ought to change!
-       * [To be behaviorally compatible with other popular image display
-       * applications, we are now treating these unknown markers as warnings,
-       * rather than errors.  This allows processing to continue, although
-       * any portions of the image after the bad marker may be corrupted
-       * and/or rendered gray.  See 4511441.]
-       */
-      WARNMS1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
-      break;
-    }
-    /* Successfully processed marker, so reset state variable */
-    cinfo->unread_marker = 0;
-  } /* end loop */
-}
-
-
-/*
- * Read a restart marker, which is expected to appear next in the datastream;
- * if the marker is not there, take appropriate recovery action.
- * Returns FALSE if suspension is required.
- *
- * This is called by the entropy decoder after it has read an appropriate
- * number of MCUs.  cinfo->unread_marker may be nonzero if the entropy decoder
- * has already read a marker from the data source.  Under normal conditions
- * cinfo->unread_marker will be reset to 0 before returning; if not reset,
- * it holds a marker which the decoder will be unable to read past.
- */
-
-METHODDEF(boolean)
-read_restart_marker (j_decompress_ptr cinfo)
-{
-  /* Obtain a marker unless we already did. */
-  /* Note that next_marker will complain if it skips any data. */
-  if (cinfo->unread_marker == 0) {
-    if (! next_marker(cinfo))
-      return FALSE;
-  }
-
-  if (cinfo->unread_marker ==
-      ((int) M_RST0 + cinfo->marker->next_restart_num)) {
-    /* Normal case --- swallow the marker and let entropy decoder continue */
-    TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);
-    cinfo->unread_marker = 0;
-  } else {
-    /* Uh-oh, the restart markers have been messed up. */
-    /* Let the data source manager determine how to resync. */
-    if (! (*cinfo->src->resync_to_restart) (cinfo,
-                                            cinfo->marker->next_restart_num))
-      return FALSE;
-  }
-
-  /* Update next-restart state */
-  cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
-
-  return TRUE;
-}
-
-
-/*
- * This is the default resync_to_restart method for data source managers
- * to use if they don't have any better approach.  Some data source managers
- * may be able to back up, or may have additional knowledge about the data
- * which permits a more intelligent recovery strategy; such managers would
- * presumably supply their own resync method.
- *
- * read_restart_marker calls resync_to_restart if it finds a marker other than
- * the restart marker it was expecting.  (This code is *not* used unless
- * a nonzero restart interval has been declared.)  cinfo->unread_marker is
- * the marker code actually found (might be anything, except 0 or FF).
- * The desired restart marker number (0..7) is passed as a parameter.
- * This routine is supposed to apply whatever error recovery strategy seems
- * appropriate in order to position the input stream to the next data segment.
- * Note that cinfo->unread_marker is treated as a marker appearing before
- * the current data-source input point; usually it should be reset to zero
- * before returning.
- * Returns FALSE if suspension is required.
- *
- * This implementation is substantially constrained by wanting to treat the
- * input as a data stream; this means we can't back up.  Therefore, we have
- * only the following actions to work with:
- *   1. Simply discard the marker and let the entropy decoder resume at next
- *      byte of file.
- *   2. Read forward until we find another marker, discarding intervening
- *      data.  (In theory we could look ahead within the current bufferload,
- *      without having to discard data if we don't find the desired marker.
- *      This idea is not implemented here, in part because it makes behavior
- *      dependent on buffer size and chance buffer-boundary positions.)
- *   3. Leave the marker unread (by failing to zero cinfo->unread_marker).
- *      This will cause the entropy decoder to process an empty data segment,
- *      inserting dummy zeroes, and then we will reprocess the marker.
- *
- * #2 is appropriate if we think the desired marker lies ahead, while #3 is
- * appropriate if the found marker is a future restart marker (indicating
- * that we have missed the desired restart marker, probably because it got
- * corrupted).
- * We apply #2 or #3 if the found marker is a restart marker no more than
- * two counts behind or ahead of the expected one.  We also apply #2 if the
- * found marker is not a legal JPEG marker code (it's certainly bogus data).
- * If the found marker is a restart marker more than 2 counts away, we do #1
- * (too much risk that the marker is erroneous; with luck we will be able to
- * resync at some future point).
- * For any valid non-restart JPEG marker, we apply #3.  This keeps us from
- * overrunning the end of a scan.  An implementation limited to single-scan
- * files might find it better to apply #2 for markers other than EOI, since
- * any other marker would have to be bogus data in that case.
- */
-
-GLOBAL(boolean)
-jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)
-{
-  int marker = cinfo->unread_marker;
-  int action = 1;
-
-  /* Always put up a warning. */
-  WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);
-
-  /* Outer loop handles repeated decision after scanning forward. */
-  for (;;) {
-    if (marker < (int) M_SOF0)
-      action = 2;               /* invalid marker */
-    else if (marker < (int) M_RST0 || marker > (int) M_RST7)
-      action = 3;               /* valid non-restart marker */
-    else {
-      if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||
-          marker == ((int) M_RST0 + ((desired+2) & 7)))
-        action = 3;             /* one of the next two expected restarts */
-      else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||
-               marker == ((int) M_RST0 + ((desired-2) & 7)))
-        action = 2;             /* a prior restart, so advance */
-      else
-        action = 1;             /* desired restart or too far away */
-    }
-    TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);
-    switch (action) {
-    case 1:
-      /* Discard marker and let entropy decoder resume processing. */
-      cinfo->unread_marker = 0;
-      return TRUE;
-    case 2:
-      /* Scan to the next marker, and repeat the decision loop. */
-      if (! next_marker(cinfo))
-        return FALSE;
-      marker = cinfo->unread_marker;
-      break;
-    case 3:
-      /* Return without advancing past this marker. */
-      /* Entropy decoder will be forced to process an empty segment. */
-      return TRUE;
-    }
-  } /* end loop */
-}
-
-
-/*
- * Reset marker processing state to begin a fresh datastream.
- */
-
-METHODDEF(void)
-reset_marker_reader (j_decompress_ptr cinfo)
-{
-  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-
-  cinfo->comp_info = NULL;              /* until allocated by get_sof */
-  cinfo->input_scan_number = 0;         /* no SOS seen yet */
-  cinfo->unread_marker = 0;             /* no pending marker */
-  marker->pub.saw_SOI = FALSE;          /* set internal state too */
-  marker->pub.saw_SOF = FALSE;
-  marker->pub.discarded_bytes = 0;
-  marker->cur_marker = NULL;
-}
-
-
-/*
- * Initialize the marker reader module.
- * This is called only once, when the decompression object is created.
- */
-
-GLOBAL(void)
-jinit_marker_reader (j_decompress_ptr cinfo)
-{
-  my_marker_ptr marker;
-  int i;
-
-  /* Create subobject in permanent pool */
-  marker = (my_marker_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
-                                SIZEOF(my_marker_reader));
-  cinfo->marker = (struct jpeg_marker_reader *) marker;
-  /* Initialize public method pointers */
-  marker->pub.reset_marker_reader = reset_marker_reader;
-  marker->pub.read_markers = read_markers;
-  marker->pub.read_restart_marker = read_restart_marker;
-  /* Initialize COM/APPn processing.
-   * By default, we examine and then discard APP0 and APP14.
-   * We also may need to save APP1 to detect the case of EXIF images (see 4881314).
-   * COM and all other APPn are simply discarded.
-   */
-  marker->process_COM = skip_variable;
-  marker->length_limit_COM = 0;
-  for (i = 0; i < 16; i++) {
-    marker->process_APPn[i] = skip_variable;
-    marker->length_limit_APPn[i] = 0;
-  }
-  marker->process_APPn[0] = get_interesting_appn;
-  marker->process_APPn[1] = save_marker;
-  marker->process_APPn[14] = get_interesting_appn;
-  /* Reset marker processing state */
-  reset_marker_reader(cinfo);
-}
-
-
-/*
- * Control saving of COM and APPn markers into marker_list.
- */
-
-#ifdef SAVE_MARKERS_SUPPORTED
-
-GLOBAL(void)
-jpeg_save_markers (j_decompress_ptr cinfo, int marker_code,
-                   unsigned int length_limit)
-{
-  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-  size_t maxlength;
-  jpeg_marker_parser_method processor;
-
-  /* Length limit mustn't be larger than what we can allocate
-   * (should only be a concern in a 16-bit environment).
-   */
-  maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);
-  if (length_limit > maxlength)
-    length_limit = (unsigned int) maxlength;
-
-  /* Choose processor routine to use.
-   * APP0/APP14 have special requirements.
-   */
-  if (length_limit) {
-    processor = save_marker;
-    /* If saving APP0/APP14, save at least enough for our internal use. */
-    if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)
-      length_limit = APP0_DATA_LEN;
-    else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)
-      length_limit = APP14_DATA_LEN;
-  } else {
-    processor = skip_variable;
-    /* If discarding APP0/APP14, use our regular on-the-fly processor. */
-    if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)
-      processor = get_interesting_appn;
-  }
-
-  if (marker_code == (int) M_COM) {
-    marker->process_COM = processor;
-    marker->length_limit_COM = length_limit;
-  } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {
-    marker->process_APPn[marker_code - (int) M_APP0] = processor;
-    marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;
-  } else
-    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
-}
-
-#endif /* SAVE_MARKERS_SUPPORTED */
-
-
-/*
- * Install a special processing method for COM or APPn markers.
- */
-
-GLOBAL(void)
-jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
-                           jpeg_marker_parser_method routine)
-{
-  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-
-  if (marker_code == (int) M_COM)
-    marker->process_COM = routine;
-  else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)
-    marker->process_APPn[marker_code - (int) M_APP0] = routine;
-  else
-    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
-}
--- a/src/share/native/sun/awt/image/jpeg/jdmaster.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,561 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdmaster.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains master control logic for the JPEG decompressor.
- * These routines are concerned with selecting the modules to be executed
- * and with determining the number of passes and the work to be done in each
- * pass.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private state */
-
-typedef struct {
-  struct jpeg_decomp_master pub; /* public fields */
-
-  int pass_number;              /* # of passes completed */
-
-  boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */
-
-  /* Saved references to initialized quantizer modules,
-   * in case we need to switch modes.
-   */
-  struct jpeg_color_quantizer * quantizer_1pass;
-  struct jpeg_color_quantizer * quantizer_2pass;
-} my_decomp_master;
-
-typedef my_decomp_master * my_master_ptr;
-
-
-/*
- * Determine whether merged upsample/color conversion should be used.
- * CRUCIAL: this must match the actual capabilities of jdmerge.c!
- */
-
-LOCAL(boolean)
-use_merged_upsample (j_decompress_ptr cinfo)
-{
-#ifdef UPSAMPLE_MERGING_SUPPORTED
-  /* Merging is the equivalent of plain box-filter upsampling */
-  if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
-    return FALSE;
-  /* jdmerge.c only supports YCC=>RGB color conversion */
-  if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
-      cinfo->out_color_space != JCS_RGB ||
-      cinfo->out_color_components != RGB_PIXELSIZE)
-    return FALSE;
-  /* and it only handles 2h1v or 2h2v sampling ratios */
-  if (cinfo->comp_info[0].h_samp_factor != 2 ||
-      cinfo->comp_info[1].h_samp_factor != 1 ||
-      cinfo->comp_info[2].h_samp_factor != 1 ||
-      cinfo->comp_info[0].v_samp_factor >  2 ||
-      cinfo->comp_info[1].v_samp_factor != 1 ||
-      cinfo->comp_info[2].v_samp_factor != 1)
-    return FALSE;
-  /* furthermore, it doesn't work if we've scaled the IDCTs differently */
-  if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
-      cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
-      cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)
-    return FALSE;
-  /* ??? also need to test for upsample-time rescaling, when & if supported */
-  return TRUE;                  /* by golly, it'll work... */
-#else
-  return FALSE;
-#endif
-}
-
-
-/*
- * Compute output image dimensions and related values.
- * NOTE: this is exported for possible use by application.
- * Hence it mustn't do anything that can't be done twice.
- * Also note that it may be called before the master module is initialized!
- */
-
-GLOBAL(void)
-jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
-/* Do computations that are needed before master selection phase */
-{
-#ifdef IDCT_SCALING_SUPPORTED
-  int ci;
-  jpeg_component_info *compptr;
-#endif
-
-  /* Prevent application from calling me at wrong times */
-  if (cinfo->global_state != DSTATE_READY)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-#ifdef IDCT_SCALING_SUPPORTED
-
-  /* Compute actual output image dimensions and DCT scaling choices. */
-  if (cinfo->scale_num * 8 <= cinfo->scale_denom) {
-    /* Provide 1/8 scaling */
-    cinfo->output_width = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width, 8L);
-    cinfo->output_height = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height, 8L);
-    cinfo->min_DCT_scaled_size = 1;
-  } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {
-    /* Provide 1/4 scaling */
-    cinfo->output_width = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width, 4L);
-    cinfo->output_height = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height, 4L);
-    cinfo->min_DCT_scaled_size = 2;
-  } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {
-    /* Provide 1/2 scaling */
-    cinfo->output_width = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width, 2L);
-    cinfo->output_height = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height, 2L);
-    cinfo->min_DCT_scaled_size = 4;
-  } else {
-    /* Provide 1/1 scaling */
-    cinfo->output_width = cinfo->image_width;
-    cinfo->output_height = cinfo->image_height;
-    cinfo->min_DCT_scaled_size = DCTSIZE;
-  }
-  /* In selecting the actual DCT scaling for each component, we try to
-   * scale up the chroma components via IDCT scaling rather than upsampling.
-   * This saves time if the upsampler gets to use 1:1 scaling.
-   * Note this code assumes that the supported DCT scalings are powers of 2.
-   */
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    int ssize = cinfo->min_DCT_scaled_size;
-    while (ssize < DCTSIZE &&
-           (compptr->h_samp_factor * ssize * 2 <=
-            cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&
-           (compptr->v_samp_factor * ssize * 2 <=
-            cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {
-      ssize = ssize * 2;
-    }
-    compptr->DCT_scaled_size = ssize;
-  }
-
-  /* Recompute downsampled dimensions of components;
-   * application needs to know these if using raw downsampled data.
-   */
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Size in samples, after IDCT scaling */
-    compptr->downsampled_width = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_width *
-                    (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),
-                    (long) (cinfo->max_h_samp_factor * DCTSIZE));
-    compptr->downsampled_height = (JDIMENSION)
-      jdiv_round_up((long) cinfo->image_height *
-                    (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),
-                    (long) (cinfo->max_v_samp_factor * DCTSIZE));
-  }
-
-#else /* !IDCT_SCALING_SUPPORTED */
-
-  /* Hardwire it to "no scaling" */
-  cinfo->output_width = cinfo->image_width;
-  cinfo->output_height = cinfo->image_height;
-  /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,
-   * and has computed unscaled downsampled_width and downsampled_height.
-   */
-
-#endif /* IDCT_SCALING_SUPPORTED */
-
-  /* Report number of components in selected colorspace. */
-  /* Probably this should be in the color conversion module... */
-  switch (cinfo->out_color_space) {
-  case JCS_GRAYSCALE:
-    cinfo->out_color_components = 1;
-    break;
-  case JCS_RGB:
-#if RGB_PIXELSIZE != 3
-    cinfo->out_color_components = RGB_PIXELSIZE;
-    break;
-#endif /* else share code with YCbCr */
-  case JCS_YCbCr:
-    cinfo->out_color_components = 3;
-    break;
-  case JCS_CMYK:
-  case JCS_YCCK:
-    cinfo->out_color_components = 4;
-    break;
-  default:                      /* else must be same colorspace as in file */
-    cinfo->out_color_components = cinfo->num_components;
-    break;
-  }
-  cinfo->output_components = (cinfo->quantize_colors ? 1 :
-                              cinfo->out_color_components);
-
-  /* See if upsampler will want to emit more than one row at a time */
-  if (use_merged_upsample(cinfo))
-    cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
-  else
-    cinfo->rec_outbuf_height = 1;
-}
-
-
-/*
- * Several decompression processes need to range-limit values to the range
- * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
- * due to noise introduced by quantization, roundoff error, etc.  These
- * processes are inner loops and need to be as fast as possible.  On most
- * machines, particularly CPUs with pipelines or instruction prefetch,
- * a (subscript-check-less) C table lookup
- *              x = sample_range_limit[x];
- * is faster than explicit tests
- *              if (x < 0)  x = 0;
- *              else if (x > MAXJSAMPLE)  x = MAXJSAMPLE;
- * These processes all use a common table prepared by the routine below.
- *
- * For most steps we can mathematically guarantee that the initial value
- * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
- * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial
- * limiting step (just after the IDCT), a wildly out-of-range value is
- * possible if the input data is corrupt.  To avoid any chance of indexing
- * off the end of memory and getting a bad-pointer trap, we perform the
- * post-IDCT limiting thus:
- *              x = range_limit[x & MASK];
- * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
- * samples.  Under normal circumstances this is more than enough range and
- * a correct output will be generated; with bogus input data the mask will
- * cause wraparound, and we will safely generate a bogus-but-in-range output.
- * For the post-IDCT step, we want to convert the data from signed to unsigned
- * representation by adding CENTERJSAMPLE at the same time that we limit it.
- * So the post-IDCT limiting table ends up looking like this:
- *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
- *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
- *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
- *   0,1,...,CENTERJSAMPLE-1
- * Negative inputs select values from the upper half of the table after
- * masking.
- *
- * We can save some space by overlapping the start of the post-IDCT table
- * with the simpler range limiting table.  The post-IDCT table begins at
- * sample_range_limit + CENTERJSAMPLE.
- *
- * Note that the table is allocated in near data space on PCs; it's small
- * enough and used often enough to justify this.
- */
-
-LOCAL(void)
-prepare_range_limit_table (j_decompress_ptr cinfo)
-/* Allocate and fill in the sample_range_limit table */
-{
-  JSAMPLE * table;
-  int i;
-
-  table = (JSAMPLE *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
-  table += (MAXJSAMPLE+1);      /* allow negative subscripts of simple table */
-  cinfo->sample_range_limit = table;
-  /* First segment of "simple" table: limit[x] = 0 for x < 0 */
-  MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
-  /* Main part of "simple" table: limit[x] = x */
-  for (i = 0; i <= MAXJSAMPLE; i++)
-    table[i] = (JSAMPLE) i;
-  table += CENTERJSAMPLE;       /* Point to where post-IDCT table starts */
-  /* End of simple table, rest of first half of post-IDCT table */
-  for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
-    table[i] = MAXJSAMPLE;
-  /* Second half of post-IDCT table */
-  MEMZERO(table + (2 * (MAXJSAMPLE+1)),
-          (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
-  MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
-          cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
-}
-
-
-/*
- * Master selection of decompression modules.
- * This is done once at jpeg_start_decompress time.  We determine
- * which modules will be used and give them appropriate initialization calls.
- * We also initialize the decompressor input side to begin consuming data.
- *
- * Since jpeg_read_header has finished, we know what is in the SOF
- * and (first) SOS markers.  We also have all the application parameter
- * settings.
- */
-
-LOCAL(void)
-master_selection (j_decompress_ptr cinfo)
-{
-  my_master_ptr master = (my_master_ptr) cinfo->master;
-  boolean use_c_buffer;
-  long samplesperrow;
-  JDIMENSION jd_samplesperrow;
-
-  /* Initialize dimensions and other stuff */
-  jpeg_calc_output_dimensions(cinfo);
-  prepare_range_limit_table(cinfo);
-
-  /* Width of an output scanline must be representable as JDIMENSION. */
-  samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
-  jd_samplesperrow = (JDIMENSION) samplesperrow;
-  if ((long) jd_samplesperrow != samplesperrow)
-    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
-
-  /* Initialize my private state */
-  master->pass_number = 0;
-  master->using_merged_upsample = use_merged_upsample(cinfo);
-
-  /* Color quantizer selection */
-  master->quantizer_1pass = NULL;
-  master->quantizer_2pass = NULL;
-  /* No mode changes if not using buffered-image mode. */
-  if (! cinfo->quantize_colors || ! cinfo->buffered_image) {
-    cinfo->enable_1pass_quant = FALSE;
-    cinfo->enable_external_quant = FALSE;
-    cinfo->enable_2pass_quant = FALSE;
-  }
-  if (cinfo->quantize_colors) {
-    if (cinfo->raw_data_out)
-      ERREXIT(cinfo, JERR_NOTIMPL);
-    /* 2-pass quantizer only works in 3-component color space. */
-    if (cinfo->out_color_components != 3) {
-      cinfo->enable_1pass_quant = TRUE;
-      cinfo->enable_external_quant = FALSE;
-      cinfo->enable_2pass_quant = FALSE;
-      cinfo->colormap = NULL;
-    } else if (cinfo->colormap != NULL) {
-      cinfo->enable_external_quant = TRUE;
-    } else if (cinfo->two_pass_quantize) {
-      cinfo->enable_2pass_quant = TRUE;
-    } else {
-      cinfo->enable_1pass_quant = TRUE;
-    }
-
-    if (cinfo->enable_1pass_quant) {
-#ifdef QUANT_1PASS_SUPPORTED
-      jinit_1pass_quantizer(cinfo);
-      master->quantizer_1pass = cinfo->cquantize;
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-    }
-
-    /* We use the 2-pass code to map to external colormaps. */
-    if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {
-#ifdef QUANT_2PASS_SUPPORTED
-      jinit_2pass_quantizer(cinfo);
-      master->quantizer_2pass = cinfo->cquantize;
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-    }
-    /* If both quantizers are initialized, the 2-pass one is left active;
-     * this is necessary for starting with quantization to an external map.
-     */
-  }
-
-  /* Post-processing: in particular, color conversion first */
-  if (! cinfo->raw_data_out) {
-    if (master->using_merged_upsample) {
-#ifdef UPSAMPLE_MERGING_SUPPORTED
-      jinit_merged_upsampler(cinfo); /* does color conversion too */
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-    } else {
-      jinit_color_deconverter(cinfo);
-      jinit_upsampler(cinfo);
-    }
-    jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);
-  }
-  /* Inverse DCT */
-  jinit_inverse_dct(cinfo);
-  /* Entropy decoding: either Huffman or arithmetic coding. */
-  if (cinfo->arith_code) {
-    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-  } else {
-    if (cinfo->progressive_mode) {
-#ifdef D_PROGRESSIVE_SUPPORTED
-      jinit_phuff_decoder(cinfo);
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-    } else
-      jinit_huff_decoder(cinfo);
-  }
-
-  /* Initialize principal buffer controllers. */
-  use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;
-  jinit_d_coef_controller(cinfo, use_c_buffer);
-
-  if (! cinfo->raw_data_out)
-    jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
-
-  /* We can now tell the memory manager to allocate virtual arrays. */
-  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
-
-  /* Initialize input side of decompressor to consume first scan. */
-  (*cinfo->inputctl->start_input_pass) (cinfo);
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-  /* If jpeg_start_decompress will read the whole file, initialize
-   * progress monitoring appropriately.  The input step is counted
-   * as one pass.
-   */
-  if (cinfo->progress != NULL && ! cinfo->buffered_image &&
-      cinfo->inputctl->has_multiple_scans) {
-    int nscans;
-    /* Estimate number of scans to set pass_limit. */
-    if (cinfo->progressive_mode) {
-      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
-      nscans = 2 + 3 * cinfo->num_components;
-    } else {
-      /* For a nonprogressive multiscan file, estimate 1 scan per component. */
-      nscans = cinfo->num_components;
-    }
-    cinfo->progress->pass_counter = 0L;
-    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
-    cinfo->progress->completed_passes = 0;
-    cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);
-    /* Count the input pass as done */
-    master->pass_number++;
-  }
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
-}
-
-
-/*
- * Per-pass setup.
- * This is called at the beginning of each output pass.  We determine which
- * modules will be active during this pass and give them appropriate
- * start_pass calls.  We also set is_dummy_pass to indicate whether this
- * is a "real" output pass or a dummy pass for color quantization.
- * (In the latter case, jdapistd.c will crank the pass to completion.)
- */
-
-METHODDEF(void)
-prepare_for_output_pass (j_decompress_ptr cinfo)
-{
-  my_master_ptr master = (my_master_ptr) cinfo->master;
-
-  if (master->pub.is_dummy_pass) {
-#ifdef QUANT_2PASS_SUPPORTED
-    /* Final pass of 2-pass quantization */
-    master->pub.is_dummy_pass = FALSE;
-    (*cinfo->cquantize->start_pass) (cinfo, FALSE);
-    (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
-    (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
-#else
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif /* QUANT_2PASS_SUPPORTED */
-  } else {
-    if (cinfo->quantize_colors && cinfo->colormap == NULL) {
-      /* Select new quantization method */
-      if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {
-        cinfo->cquantize = master->quantizer_2pass;
-        master->pub.is_dummy_pass = TRUE;
-      } else if (cinfo->enable_1pass_quant) {
-        cinfo->cquantize = master->quantizer_1pass;
-      } else {
-        ERREXIT(cinfo, JERR_MODE_CHANGE);
-      }
-    }
-    (*cinfo->idct->start_pass) (cinfo);
-    (*cinfo->coef->start_output_pass) (cinfo);
-    if (! cinfo->raw_data_out) {
-      if (! master->using_merged_upsample)
-        (*cinfo->cconvert->start_pass) (cinfo);
-      (*cinfo->upsample->start_pass) (cinfo);
-      if (cinfo->quantize_colors)
-        (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);
-      (*cinfo->post->start_pass) (cinfo,
-            (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
-      (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
-    }
-  }
-
-  /* Set up progress monitor's pass info if present */
-  if (cinfo->progress != NULL) {
-    cinfo->progress->completed_passes = master->pass_number;
-    cinfo->progress->total_passes = master->pass_number +
-                                    (master->pub.is_dummy_pass ? 2 : 1);
-    /* In buffered-image mode, we assume one more output pass if EOI not
-     * yet reached, but no more passes if EOI has been reached.
-     */
-    if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {
-      cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);
-    }
-  }
-}
-
-
-/*
- * Finish up at end of an output pass.
- */
-
-METHODDEF(void)
-finish_output_pass (j_decompress_ptr cinfo)
-{
-  my_master_ptr master = (my_master_ptr) cinfo->master;
-
-  if (cinfo->quantize_colors)
-    (*cinfo->cquantize->finish_pass) (cinfo);
-  master->pass_number++;
-}
-
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-
-/*
- * Switch to a new external colormap between output passes.
- */
-
-GLOBAL(void)
-jpeg_new_colormap (j_decompress_ptr cinfo)
-{
-  my_master_ptr master = (my_master_ptr) cinfo->master;
-
-  /* Prevent application from calling me at wrong times */
-  if (cinfo->global_state != DSTATE_BUFIMAGE)
-    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-  if (cinfo->quantize_colors && cinfo->enable_external_quant &&
-      cinfo->colormap != NULL) {
-    /* Select 2-pass quantizer for external colormap use */
-    cinfo->cquantize = master->quantizer_2pass;
-    /* Notify quantizer of colormap change */
-    (*cinfo->cquantize->new_color_map) (cinfo);
-    master->pub.is_dummy_pass = FALSE; /* just in case */
-  } else
-    ERREXIT(cinfo, JERR_MODE_CHANGE);
-}
-
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
-
-
-/*
- * Initialize master decompression control and select active modules.
- * This is performed at the start of jpeg_start_decompress.
- */
-
-GLOBAL(void)
-jinit_master_decompress (j_decompress_ptr cinfo)
-{
-  my_master_ptr master;
-
-  master = (my_master_ptr)
-      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                  SIZEOF(my_decomp_master));
-  cinfo->master = (struct jpeg_decomp_master *) master;
-  master->pub.prepare_for_output_pass = prepare_for_output_pass;
-  master->pub.finish_output_pass = finish_output_pass;
-
-  master->pub.is_dummy_pass = FALSE;
-
-  master_selection(cinfo);
-}
--- a/src/share/native/sun/awt/image/jpeg/jdmerge.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,404 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdmerge.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains code for merged upsampling/color conversion.
- *
- * This file combines functions from jdsample.c and jdcolor.c;
- * read those files first to understand what's going on.
- *
- * When the chroma components are to be upsampled by simple replication
- * (ie, box filtering), we can save some work in color conversion by
- * calculating all the output pixels corresponding to a pair of chroma
- * samples at one time.  In the conversion equations
- *      R = Y           + K1 * Cr
- *      G = Y + K2 * Cb + K3 * Cr
- *      B = Y + K4 * Cb
- * only the Y term varies among the group of pixels corresponding to a pair
- * of chroma samples, so the rest of the terms can be calculated just once.
- * At typical sampling ratios, this eliminates half or three-quarters of the
- * multiplications needed for color conversion.
- *
- * This file currently provides implementations for the following cases:
- *      YCbCr => RGB color conversion only.
- *      Sampling ratios of 2h1v or 2h2v.
- *      No scaling needed at upsample time.
- *      Corner-aligned (non-CCIR601) sampling alignment.
- * Other special cases could be added, but in most applications these are
- * the only common cases.  (For uncommon cases we fall back on the more
- * general code in jdsample.c and jdcolor.c.)
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-#ifdef UPSAMPLE_MERGING_SUPPORTED
-
-
-/* Private subobject */
-
-typedef struct {
-  struct jpeg_upsampler pub;    /* public fields */
-
-  /* Pointer to routine to do actual upsampling/conversion of one row group */
-  JMETHOD(void, upmethod, (j_decompress_ptr cinfo,
-                           JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
-                           JSAMPARRAY output_buf));
-
-  /* Private state for YCC->RGB conversion */
-  int * Cr_r_tab;               /* => table for Cr to R conversion */
-  int * Cb_b_tab;               /* => table for Cb to B conversion */
-  INT32 * Cr_g_tab;             /* => table for Cr to G conversion */
-  INT32 * Cb_g_tab;             /* => table for Cb to G conversion */
-
-  /* For 2:1 vertical sampling, we produce two output rows at a time.
-   * We need a "spare" row buffer to hold the second output row if the
-   * application provides just a one-row buffer; we also use the spare
-   * to discard the dummy last row if the image height is odd.
-   */
-  JSAMPROW spare_row;
-  boolean spare_full;           /* T if spare buffer is occupied */
-
-  JDIMENSION out_row_width;     /* samples per output row */
-  JDIMENSION rows_to_go;        /* counts rows remaining in image */
-} my_upsampler;
-
-typedef my_upsampler * my_upsample_ptr;
-
-#define SCALEBITS       16      /* speediest right-shift on some machines */
-#define ONE_HALF        ((INT32) 1 << (SCALEBITS-1))
-#define FIX(x)          ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
-
-
-/*
- * Initialize tables for YCC->RGB colorspace conversion.
- * This is taken directly from jdcolor.c; see that file for more info.
- */
-
-LOCAL(void)
-build_ycc_rgb_table (j_decompress_ptr cinfo)
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-  int i;
-  INT32 x;
-  SHIFT_TEMPS
-
-  upsample->Cr_r_tab = (int *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (MAXJSAMPLE+1) * SIZEOF(int));
-  upsample->Cb_b_tab = (int *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (MAXJSAMPLE+1) * SIZEOF(int));
-  upsample->Cr_g_tab = (INT32 *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (MAXJSAMPLE+1) * SIZEOF(INT32));
-  upsample->Cb_g_tab = (INT32 *)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                (MAXJSAMPLE+1) * SIZEOF(INT32));
-
-  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
-    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
-    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
-    /* Cr=>R value is nearest int to 1.40200 * x */
-    upsample->Cr_r_tab[i] = (int)
-                    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
-    /* Cb=>B value is nearest int to 1.77200 * x */
-    upsample->Cb_b_tab[i] = (int)
-                    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
-    /* Cr=>G value is scaled-up -0.71414 * x */
-    upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
-    /* Cb=>G value is scaled-up -0.34414 * x */
-    /* We also add in ONE_HALF so that need not do it in inner loop */
-    upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
-  }
-}
-
-
-/*
- * Initialize for an upsampling pass.
- */
-
-METHODDEF(void)
-start_pass_merged_upsample (j_decompress_ptr cinfo)
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-
-  /* Mark the spare buffer empty */
-  upsample->spare_full = FALSE;
-  /* Initialize total-height counter for detecting bottom of image */
-  upsample->rows_to_go = cinfo->output_height;
-}
-
-
-/*
- * Control routine to do upsampling (and color conversion).
- *
- * The control routine just handles the row buffering considerations.
- */
-
-METHODDEF(void)
-merged_2v_upsample (j_decompress_ptr cinfo,
-                    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-                    JDIMENSION in_row_groups_avail,
-                    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                    JDIMENSION out_rows_avail)
-/* 2:1 vertical sampling case: may need a spare row. */
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-  JSAMPROW work_ptrs[2];
-  JDIMENSION num_rows;          /* number of rows returned to caller */
-
-  if (upsample->spare_full) {
-    /* If we have a spare row saved from a previous cycle, just return it. */
-    jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,
-                      1, upsample->out_row_width);
-    num_rows = 1;
-    upsample->spare_full = FALSE;
-  } else {
-    /* Figure number of rows to return to caller. */
-    num_rows = 2;
-    /* Not more than the distance to the end of the image. */
-    if (num_rows > upsample->rows_to_go)
-      num_rows = upsample->rows_to_go;
-    /* And not more than what the client can accept: */
-    out_rows_avail -= *out_row_ctr;
-    if (num_rows > out_rows_avail)
-      num_rows = out_rows_avail;
-    /* Create output pointer array for upsampler. */
-    work_ptrs[0] = output_buf[*out_row_ctr];
-    if (num_rows > 1) {
-      work_ptrs[1] = output_buf[*out_row_ctr + 1];
-    } else {
-      work_ptrs[1] = upsample->spare_row;
-      upsample->spare_full = TRUE;
-    }
-    /* Now do the upsampling. */
-    (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);
-  }
-
-  /* Adjust counts */
-  *out_row_ctr += num_rows;
-  upsample->rows_to_go -= num_rows;
-  /* When the buffer is emptied, declare this input row group consumed */
-  if (! upsample->spare_full)
-    (*in_row_group_ctr)++;
-}
-
-
-METHODDEF(void)
-merged_1v_upsample (j_decompress_ptr cinfo,
-                    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-                    JDIMENSION in_row_groups_avail,
-                    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                    JDIMENSION out_rows_avail)
-/* 1:1 vertical sampling case: much easier, never need a spare row. */
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-
-  /* Just do the upsampling. */
-  (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
-                         output_buf + *out_row_ctr);
-  /* Adjust counts */
-  (*out_row_ctr)++;
-  (*in_row_group_ctr)++;
-}
-
-
-/*
- * These are the routines invoked by the control routines to do
- * the actual upsampling/conversion.  One row group is processed per call.
- *
- * Note: since we may be writing directly into application-supplied buffers,
- * we have to be honest about the output width; we can't assume the buffer
- * has been rounded up to an even width.
- */
-
-
-/*
- * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.
- */
-
-METHODDEF(void)
-h2v1_merged_upsample (j_decompress_ptr cinfo,
-                      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
-                      JSAMPARRAY output_buf)
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-  register int y, cred, cgreen, cblue;
-  int cb, cr;
-  register JSAMPROW outptr;
-  JSAMPROW inptr0, inptr1, inptr2;
-  JDIMENSION col;
-  /* copy these pointers into registers if possible */
-  register JSAMPLE * range_limit = cinfo->sample_range_limit;
-  int * Crrtab = upsample->Cr_r_tab;
-  int * Cbbtab = upsample->Cb_b_tab;
-  INT32 * Crgtab = upsample->Cr_g_tab;
-  INT32 * Cbgtab = upsample->Cb_g_tab;
-  SHIFT_TEMPS
-
-  inptr0 = input_buf[0][in_row_group_ctr];
-  inptr1 = input_buf[1][in_row_group_ctr];
-  inptr2 = input_buf[2][in_row_group_ctr];
-  outptr = output_buf[0];
-  /* Loop for each pair of output pixels */
-  for (col = cinfo->output_width >> 1; col > 0; col--) {
-    /* Do the chroma part of the calculation */
-    cb = GETJSAMPLE(*inptr1++);
-    cr = GETJSAMPLE(*inptr2++);
-    cred = Crrtab[cr];
-    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
-    cblue = Cbbtab[cb];
-    /* Fetch 2 Y values and emit 2 pixels */
-    y  = GETJSAMPLE(*inptr0++);
-    outptr[RGB_RED] =   range_limit[y + cred];
-    outptr[RGB_GREEN] = range_limit[y + cgreen];
-    outptr[RGB_BLUE] =  range_limit[y + cblue];
-    outptr += RGB_PIXELSIZE;
-    y  = GETJSAMPLE(*inptr0++);
-    outptr[RGB_RED] =   range_limit[y + cred];
-    outptr[RGB_GREEN] = range_limit[y + cgreen];
-    outptr[RGB_BLUE] =  range_limit[y + cblue];
-    outptr += RGB_PIXELSIZE;
-  }
-  /* If image width is odd, do the last output column separately */
-  if (cinfo->output_width & 1) {
-    cb = GETJSAMPLE(*inptr1);
-    cr = GETJSAMPLE(*inptr2);
-    cred = Crrtab[cr];
-    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
-    cblue = Cbbtab[cb];
-    y  = GETJSAMPLE(*inptr0);
-    outptr[RGB_RED] =   range_limit[y + cred];
-    outptr[RGB_GREEN] = range_limit[y + cgreen];
-    outptr[RGB_BLUE] =  range_limit[y + cblue];
-  }
-}
-
-
-/*
- * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.
- */
-
-METHODDEF(void)
-h2v2_merged_upsample (j_decompress_ptr cinfo,
-                      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
-                      JSAMPARRAY output_buf)
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-  register int y, cred, cgreen, cblue;
-  int cb, cr;
-  register JSAMPROW outptr0, outptr1;
-  JSAMPROW inptr00, inptr01, inptr1, inptr2;
-  JDIMENSION col;
-  /* copy these pointers into registers if possible */
-  register JSAMPLE * range_limit = cinfo->sample_range_limit;
-  int * Crrtab = upsample->Cr_r_tab;
-  int * Cbbtab = upsample->Cb_b_tab;
-  INT32 * Crgtab = upsample->Cr_g_tab;
-  INT32 * Cbgtab = upsample->Cb_g_tab;
-  SHIFT_TEMPS
-
-  inptr00 = input_buf[0][in_row_group_ctr*2];
-  inptr01 = input_buf[0][in_row_group_ctr*2 + 1];
-  inptr1 = input_buf[1][in_row_group_ctr];
-  inptr2 = input_buf[2][in_row_group_ctr];
-  outptr0 = output_buf[0];
-  outptr1 = output_buf[1];
-  /* Loop for each group of output pixels */
-  for (col = cinfo->output_width >> 1; col > 0; col--) {
-    /* Do the chroma part of the calculation */
-    cb = GETJSAMPLE(*inptr1++);
-    cr = GETJSAMPLE(*inptr2++);
-    cred = Crrtab[cr];
-    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
-    cblue = Cbbtab[cb];
-    /* Fetch 4 Y values and emit 4 pixels */
-    y  = GETJSAMPLE(*inptr00++);
-    outptr0[RGB_RED] =   range_limit[y + cred];
-    outptr0[RGB_GREEN] = range_limit[y + cgreen];
-    outptr0[RGB_BLUE] =  range_limit[y + cblue];
-    outptr0 += RGB_PIXELSIZE;
-    y  = GETJSAMPLE(*inptr00++);
-    outptr0[RGB_RED] =   range_limit[y + cred];
-    outptr0[RGB_GREEN] = range_limit[y + cgreen];
-    outptr0[RGB_BLUE] =  range_limit[y + cblue];
-    outptr0 += RGB_PIXELSIZE;
-    y  = GETJSAMPLE(*inptr01++);
-    outptr1[RGB_RED] =   range_limit[y + cred];
-    outptr1[RGB_GREEN] = range_limit[y + cgreen];
-    outptr1[RGB_BLUE] =  range_limit[y + cblue];
-    outptr1 += RGB_PIXELSIZE;
-    y  = GETJSAMPLE(*inptr01++);
-    outptr1[RGB_RED] =   range_limit[y + cred];
-    outptr1[RGB_GREEN] = range_limit[y + cgreen];
-    outptr1[RGB_BLUE] =  range_limit[y + cblue];
-    outptr1 += RGB_PIXELSIZE;
-  }
-  /* If image width is odd, do the last output column separately */
-  if (cinfo->output_width & 1) {
-    cb = GETJSAMPLE(*inptr1);
-    cr = GETJSAMPLE(*inptr2);
-    cred = Crrtab[cr];
-    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
-    cblue = Cbbtab[cb];
-    y  = GETJSAMPLE(*inptr00);
-    outptr0[RGB_RED] =   range_limit[y + cred];
-    outptr0[RGB_GREEN] = range_limit[y + cgreen];
-    outptr0[RGB_BLUE] =  range_limit[y + cblue];
-    y  = GETJSAMPLE(*inptr01);
-    outptr1[RGB_RED] =   range_limit[y + cred];
-    outptr1[RGB_GREEN] = range_limit[y + cgreen];
-    outptr1[RGB_BLUE] =  range_limit[y + cblue];
-  }
-}
-
-
-/*
- * Module initialization routine for merged upsampling/color conversion.
- *
- * NB: this is called under the conditions determined by use_merged_upsample()
- * in jdmaster.c.  That routine MUST correspond to the actual capabilities
- * of this module; no safety checks are made here.
- */
-
-GLOBAL(void)
-jinit_merged_upsampler (j_decompress_ptr cinfo)
-{
-  my_upsample_ptr upsample;
-
-  upsample = (my_upsample_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_upsampler));
-  cinfo->upsample = (struct jpeg_upsampler *) upsample;
-  upsample->pub.start_pass = start_pass_merged_upsample;
-  upsample->pub.need_context_rows = FALSE;
-
-  upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;
-
-  if (cinfo->max_v_samp_factor == 2) {
-    upsample->pub.upsample = merged_2v_upsample;
-    upsample->upmethod = h2v2_merged_upsample;
-    /* Allocate a spare row buffer */
-    upsample->spare_row = (JSAMPROW)
-      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
-  } else {
-    upsample->pub.upsample = merged_1v_upsample;
-    upsample->upmethod = h2v1_merged_upsample;
-    /* No spare row needed */
-    upsample->spare_row = NULL;
-  }
-
-  build_ycc_rgb_table(cinfo);
-}
-
-#endif /* UPSAMPLE_MERGING_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jdphuff.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,672 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdphuff.c
- *
- * Copyright (C) 1995-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains Huffman entropy decoding routines for progressive JPEG.
- *
- * Much of the complexity here has to do with supporting input suspension.
- * If the data source module demands suspension, we want to be able to back
- * up to the start of the current MCU.  To do this, we copy state variables
- * into local working storage, and update them back to the permanent
- * storage only upon successful completion of an MCU.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdhuff.h"             /* Declarations shared with jdhuff.c */
-
-
-#ifdef D_PROGRESSIVE_SUPPORTED
-
-/*
- * Expanded entropy decoder object for progressive Huffman decoding.
- *
- * The savable_state subrecord contains fields that change within an MCU,
- * but must not be updated permanently until we complete the MCU.
- */
-
-typedef struct {
-  unsigned int EOBRUN;                  /* remaining EOBs in EOBRUN */
-  int last_dc_val[MAX_COMPS_IN_SCAN];   /* last DC coef for each component */
-} savable_state;
-
-/* This macro is to work around compilers with missing or broken
- * structure assignment.  You'll need to fix this code if you have
- * such a compiler and you change MAX_COMPS_IN_SCAN.
- */
-
-#ifndef NO_STRUCT_ASSIGN
-#define ASSIGN_STATE(dest,src)  ((dest) = (src))
-#else
-#if MAX_COMPS_IN_SCAN == 4
-#define ASSIGN_STATE(dest,src)  \
-        ((dest).EOBRUN = (src).EOBRUN, \
-         (dest).last_dc_val[0] = (src).last_dc_val[0], \
-         (dest).last_dc_val[1] = (src).last_dc_val[1], \
-         (dest).last_dc_val[2] = (src).last_dc_val[2], \
-         (dest).last_dc_val[3] = (src).last_dc_val[3])
-#endif
-#endif
-
-
-typedef struct {
-  struct jpeg_entropy_decoder pub; /* public fields */
-
-  /* These fields are loaded into local variables at start of each MCU.
-   * In case of suspension, we exit WITHOUT updating them.
-   */
-  bitread_perm_state bitstate;  /* Bit buffer at start of MCU */
-  savable_state saved;          /* Other state at start of MCU */
-
-  /* These fields are NOT loaded into local working state. */
-  unsigned int restarts_to_go;  /* MCUs left in this restart interval */
-
-  /* Pointers to derived tables (these workspaces have image lifespan) */
-  d_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
-
-  d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */
-} phuff_entropy_decoder;
-
-typedef phuff_entropy_decoder * phuff_entropy_ptr;
-
-/* Forward declarations */
-METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo,
-                                            JBLOCKROW *MCU_data));
-METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo,
-                                            JBLOCKROW *MCU_data));
-METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo,
-                                             JBLOCKROW *MCU_data));
-METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo,
-                                             JBLOCKROW *MCU_data));
-
-
-/*
- * Initialize for a Huffman-compressed scan.
- */
-
-METHODDEF(void)
-start_pass_phuff_decoder (j_decompress_ptr cinfo)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  boolean is_DC_band, bad;
-  int ci, coefi, tbl;
-  int *coef_bit_ptr;
-  jpeg_component_info * compptr;
-
-  is_DC_band = (cinfo->Ss == 0);
-
-  /* Validate scan parameters */
-  bad = FALSE;
-  if (is_DC_band) {
-    if (cinfo->Se != 0)
-      bad = TRUE;
-  } else {
-    /* need not check Ss/Se < 0 since they came from unsigned bytes */
-    if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)
-      bad = TRUE;
-    /* AC scans may have only one component */
-    if (cinfo->comps_in_scan != 1)
-      bad = TRUE;
-  }
-  if (cinfo->Ah != 0) {
-    /* Successive approximation refinement scan: must have Al = Ah-1. */
-    if (cinfo->Al != cinfo->Ah-1)
-      bad = TRUE;
-  }
-  if (cinfo->Al > 13)           /* need not check for < 0 */
-    bad = TRUE;
-  /* Arguably the maximum Al value should be less than 13 for 8-bit precision,
-   * but the spec doesn't say so, and we try to be liberal about what we
-   * accept.  Note: large Al values could result in out-of-range DC
-   * coefficients during early scans, leading to bizarre displays due to
-   * overflows in the IDCT math.  But we won't crash.
-   */
-  if (bad)
-    ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
-             cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
-  /* Update progression status, and verify that scan order is legal.
-   * Note that inter-scan inconsistencies are treated as warnings
-   * not fatal errors ... not clear if this is right way to behave.
-   */
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    int cindex = cinfo->cur_comp_info[ci]->component_index;
-    coef_bit_ptr = & cinfo->coef_bits[cindex][0];
-    if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
-      WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
-    for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
-      int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
-      if (cinfo->Ah != expected)
-        WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
-      coef_bit_ptr[coefi] = cinfo->Al;
-    }
-  }
-
-  /* Select MCU decoding routine */
-  if (cinfo->Ah == 0) {
-    if (is_DC_band)
-      entropy->pub.decode_mcu = decode_mcu_DC_first;
-    else
-      entropy->pub.decode_mcu = decode_mcu_AC_first;
-  } else {
-    if (is_DC_band)
-      entropy->pub.decode_mcu = decode_mcu_DC_refine;
-    else
-      entropy->pub.decode_mcu = decode_mcu_AC_refine;
-  }
-
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-    compptr = cinfo->cur_comp_info[ci];
-    /* Make sure requested tables are present, and compute derived tables.
-     * We may build same derived table more than once, but it's not expensive.
-     */
-    if (is_DC_band) {
-      if (cinfo->Ah == 0) {     /* DC refinement needs no table */
-        tbl = compptr->dc_tbl_no;
-        jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,
-                                & entropy->derived_tbls[tbl]);
-      }
-    } else {
-      tbl = compptr->ac_tbl_no;
-      jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,
-                              & entropy->derived_tbls[tbl]);
-      /* remember the single active table */
-      entropy->ac_derived_tbl = entropy->derived_tbls[tbl];
-    }
-    /* Initialize DC predictions to 0 */
-    entropy->saved.last_dc_val[ci] = 0;
-  }
-
-  /* Initialize bitread state variables */
-  entropy->bitstate.bits_left = 0;
-  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
-  entropy->pub.insufficient_data = FALSE;
-
-  /* Initialize private state variables */
-  entropy->saved.EOBRUN = 0;
-
-  /* Initialize restart counter */
-  entropy->restarts_to_go = cinfo->restart_interval;
-}
-
-
-/*
- * Figure F.12: extend sign bit.
- * On some machines, a shift and add will be faster than a table lookup.
- */
-
-#ifdef AVOID_TABLES
-
-#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
-
-#else
-
-#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
-
-static const int extend_test[16] =   /* entry n is 2**(n-1) */
-  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
-    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
-
-static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
-  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
-    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
-    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
-    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
-
-#endif /* AVOID_TABLES */
-
-
-/*
- * Check for a restart marker & resynchronize decoder.
- * Returns FALSE if must suspend.
- */
-
-LOCAL(boolean)
-process_restart (j_decompress_ptr cinfo)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  int ci;
-
-  /* Throw away any unused bits remaining in bit buffer; */
-  /* include any full bytes in next_marker's count of discarded bytes */
-  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
-  entropy->bitstate.bits_left = 0;
-
-  /* Advance past the RSTn marker */
-  if (! (*cinfo->marker->read_restart_marker) (cinfo))
-    return FALSE;
-
-  /* Re-initialize DC predictions to 0 */
-  for (ci = 0; ci < cinfo->comps_in_scan; ci++)
-    entropy->saved.last_dc_val[ci] = 0;
-  /* Re-init EOB run count, too */
-  entropy->saved.EOBRUN = 0;
-
-  /* Reset restart counter */
-  entropy->restarts_to_go = cinfo->restart_interval;
-
-  /* Reset out-of-data flag, unless read_restart_marker left us smack up
-   * against a marker.  In that case we will end up treating the next data
-   * segment as empty, and we can avoid producing bogus output pixels by
-   * leaving the flag set.
-   */
-  if (cinfo->unread_marker == 0)
-    entropy->pub.insufficient_data = FALSE;
-
-  return TRUE;
-}
-
-
-/*
- * Huffman MCU decoding.
- * Each of these routines decodes and returns one MCU's worth of
- * Huffman-compressed coefficients.
- * The coefficients are reordered from zigzag order into natural array order,
- * but are not dequantized.
- *
- * The i'th block of the MCU is stored into the block pointed to by
- * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
- *
- * We return FALSE if data source requested suspension.  In that case no
- * changes have been made to permanent state.  (Exception: some output
- * coefficients may already have been assigned.  This is harmless for
- * spectral selection, since we'll just re-assign them on the next call.
- * Successive approximation AC refinement has to be more careful, however.)
- */
-
-/*
- * MCU decoding for DC initial scan (either spectral selection,
- * or first pass of successive approximation).
- */
-
-METHODDEF(boolean)
-decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  int Al = cinfo->Al;
-  register int s, r;
-  int blkn, ci;
-  JBLOCKROW block;
-  BITREAD_STATE_VARS;
-  savable_state state;
-  d_derived_tbl * tbl;
-  jpeg_component_info * compptr;
-
-  /* Process restart marker if needed; may have to suspend */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0)
-      if (! process_restart(cinfo))
-        return FALSE;
-  }
-
-  /* If we've run out of data, just leave the MCU set to zeroes.
-   * This way, we return uniform gray for the remainder of the segment.
-   */
-  if (! entropy->pub.insufficient_data) {
-
-    /* Load up working state */
-    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
-    ASSIGN_STATE(state, entropy->saved);
-
-    /* Outer loop handles each block in the MCU */
-
-    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-      block = MCU_data[blkn];
-      ci = cinfo->MCU_membership[blkn];
-      compptr = cinfo->cur_comp_info[ci];
-      tbl = entropy->derived_tbls[compptr->dc_tbl_no];
-
-      /* Decode a single block's worth of coefficients */
-
-      /* Section F.2.2.1: decode the DC coefficient difference */
-      HUFF_DECODE(s, br_state, tbl, return FALSE, label1);
-      if (s) {
-        CHECK_BIT_BUFFER(br_state, s, return FALSE);
-        r = GET_BITS(s);
-        s = HUFF_EXTEND(r, s);
-      }
-
-      /* Convert DC difference to actual value, update last_dc_val */
-      s += state.last_dc_val[ci];
-      state.last_dc_val[ci] = s;
-      /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */
-      (*block)[0] = (JCOEF) (s << Al);
-    }
-
-    /* Completed MCU, so update state */
-    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
-    ASSIGN_STATE(entropy->saved, state);
-  }
-
-  /* Account for restart interval (no-op if not using restarts) */
-  entropy->restarts_to_go--;
-
-  return TRUE;
-}
-
-
-/*
- * MCU decoding for AC initial scan (either spectral selection,
- * or first pass of successive approximation).
- */
-
-METHODDEF(boolean)
-decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  int Se = cinfo->Se;
-  int Al = cinfo->Al;
-  register int s, k, r;
-  unsigned int EOBRUN;
-  JBLOCKROW block;
-  BITREAD_STATE_VARS;
-  d_derived_tbl * tbl;
-
-  /* Process restart marker if needed; may have to suspend */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0)
-      if (! process_restart(cinfo))
-        return FALSE;
-  }
-
-  /* If we've run out of data, just leave the MCU set to zeroes.
-   * This way, we return uniform gray for the remainder of the segment.
-   */
-  if (! entropy->pub.insufficient_data) {
-
-    /* Load up working state.
-     * We can avoid loading/saving bitread state if in an EOB run.
-     */
-    EOBRUN = entropy->saved.EOBRUN;     /* only part of saved state we need */
-
-    /* There is always only one block per MCU */
-
-    if (EOBRUN > 0)             /* if it's a band of zeroes... */
-      EOBRUN--;                 /* ...process it now (we do nothing) */
-    else {
-      BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
-      block = MCU_data[0];
-      tbl = entropy->ac_derived_tbl;
-
-      for (k = cinfo->Ss; k <= Se; k++) {
-        HUFF_DECODE(s, br_state, tbl, return FALSE, label2);
-        r = s >> 4;
-        s &= 15;
-        if (s) {
-          k += r;
-          CHECK_BIT_BUFFER(br_state, s, return FALSE);
-          r = GET_BITS(s);
-          s = HUFF_EXTEND(r, s);
-          /* Scale and output coefficient in natural (dezigzagged) order */
-          (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al);
-        } else {
-          if (r == 15) {        /* ZRL */
-            k += 15;            /* skip 15 zeroes in band */
-          } else {              /* EOBr, run length is 2^r + appended bits */
-            EOBRUN = 1 << r;
-            if (r) {            /* EOBr, r > 0 */
-              CHECK_BIT_BUFFER(br_state, r, return FALSE);
-              r = GET_BITS(r);
-              EOBRUN += r;
-            }
-            EOBRUN--;           /* this band is processed at this moment */
-            break;              /* force end-of-band */
-          }
-        }
-      }
-
-      BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
-    }
-
-    /* Completed MCU, so update state */
-    entropy->saved.EOBRUN = EOBRUN;     /* only part of saved state we need */
-  }
-
-  /* Account for restart interval (no-op if not using restarts) */
-  entropy->restarts_to_go--;
-
-  return TRUE;
-}
-
-
-/*
- * MCU decoding for DC successive approximation refinement scan.
- * Note: we assume such scans can be multi-component, although the spec
- * is not very clear on the point.
- */
-
-METHODDEF(boolean)
-decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  int p1 = 1 << cinfo->Al;      /* 1 in the bit position being coded */
-  int blkn;
-  JBLOCKROW block;
-  BITREAD_STATE_VARS;
-
-  /* Process restart marker if needed; may have to suspend */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0)
-      if (! process_restart(cinfo))
-        return FALSE;
-  }
-
-  /* Not worth the cycles to check insufficient_data here,
-   * since we will not change the data anyway if we read zeroes.
-   */
-
-  /* Load up working state */
-  BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
-
-  /* Outer loop handles each block in the MCU */
-
-  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-    block = MCU_data[blkn];
-
-    /* Encoded data is simply the next bit of the two's-complement DC value */
-    CHECK_BIT_BUFFER(br_state, 1, return FALSE);
-    if (GET_BITS(1))
-      (*block)[0] |= p1;
-    /* Note: since we use |=, repeating the assignment later is safe */
-  }
-
-  /* Completed MCU, so update state */
-  BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
-
-  /* Account for restart interval (no-op if not using restarts) */
-  entropy->restarts_to_go--;
-
-  return TRUE;
-}
-
-
-/*
- * MCU decoding for AC successive approximation refinement scan.
- */
-
-METHODDEF(boolean)
-decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
-  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-  int Se = cinfo->Se;
-  int p1 = 1 << cinfo->Al;      /* 1 in the bit position being coded */
-  int m1 = (-1) << cinfo->Al;   /* -1 in the bit position being coded */
-  register int s, k, r;
-  unsigned int EOBRUN;
-  JBLOCKROW block;
-  JCOEFPTR thiscoef;
-  BITREAD_STATE_VARS;
-  d_derived_tbl * tbl;
-  int num_newnz;
-  int newnz_pos[DCTSIZE2];
-
-  /* Process restart marker if needed; may have to suspend */
-  if (cinfo->restart_interval) {
-    if (entropy->restarts_to_go == 0)
-      if (! process_restart(cinfo))
-        return FALSE;
-  }
-
-  /* If we've run out of data, don't modify the MCU.
-   */
-  if (! entropy->pub.insufficient_data) {
-
-    /* Load up working state */
-    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
-    EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
-
-    /* There is always only one block per MCU */
-    block = MCU_data[0];
-    tbl = entropy->ac_derived_tbl;
-
-    /* If we are forced to suspend, we must undo the assignments to any newly
-     * nonzero coefficients in the block, because otherwise we'd get confused
-     * next time about which coefficients were already nonzero.
-     * But we need not undo addition of bits to already-nonzero coefficients;
-     * instead, we can test the current bit to see if we already did it.
-     */
-    num_newnz = 0;
-
-    /* initialize coefficient loop counter to start of band */
-    k = cinfo->Ss;
-
-    if (EOBRUN == 0) {
-      for (; k <= Se; k++) {
-        HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
-        r = s >> 4;
-        s &= 15;
-        if (s) {
-          if (s != 1)           /* size of new coef should always be 1 */
-            WARNMS(cinfo, JWRN_HUFF_BAD_CODE);
-          CHECK_BIT_BUFFER(br_state, 1, goto undoit);
-          if (GET_BITS(1))
-            s = p1;             /* newly nonzero coef is positive */
-          else
-            s = m1;             /* newly nonzero coef is negative */
-        } else {
-          if (r != 15) {
-            EOBRUN = 1 << r;    /* EOBr, run length is 2^r + appended bits */
-            if (r) {
-              CHECK_BIT_BUFFER(br_state, r, goto undoit);
-              r = GET_BITS(r);
-              EOBRUN += r;
-            }
-            break;              /* rest of block is handled by EOB logic */
-          }
-          /* note s = 0 for processing ZRL */
-        }
-        /* Advance over already-nonzero coefs and r still-zero coefs,
-         * appending correction bits to the nonzeroes.  A correction bit is 1
-         * if the absolute value of the coefficient must be increased.
-         */
-        do {
-          thiscoef = *block + jpeg_natural_order[k];
-          if (*thiscoef != 0) {
-            CHECK_BIT_BUFFER(br_state, 1, goto undoit);
-            if (GET_BITS(1)) {
-              if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
-                if (*thiscoef >= 0)
-                  *thiscoef += p1;
-                else
-                  *thiscoef += m1;
-              }
-            }
-          } else {
-            if (--r < 0)
-              break;            /* reached target zero coefficient */
-          }
-          k++;
-        } while (k <= Se);
-        if (s) {
-          int pos = jpeg_natural_order[k];
-          /* Output newly nonzero coefficient */
-          (*block)[pos] = (JCOEF) s;
-          /* Remember its position in case we have to suspend */
-          newnz_pos[num_newnz++] = pos;
-        }
-      }
-    }
-
-    if (EOBRUN > 0) {
-      /* Scan any remaining coefficient positions after the end-of-band
-       * (the last newly nonzero coefficient, if any).  Append a correction
-       * bit to each already-nonzero coefficient.  A correction bit is 1
-       * if the absolute value of the coefficient must be increased.
-       */
-      for (; k <= Se; k++) {
-        thiscoef = *block + jpeg_natural_order[k];
-        if (*thiscoef != 0) {
-          CHECK_BIT_BUFFER(br_state, 1, goto undoit);
-          if (GET_BITS(1)) {
-            if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
-              if (*thiscoef >= 0)
-                *thiscoef += p1;
-              else
-                *thiscoef += m1;
-            }
-          }
-        }
-      }
-      /* Count one block completed in EOB run */
-      EOBRUN--;
-    }
-
-    /* Completed MCU, so update state */
-    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
-    entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
-  }
-
-  /* Account for restart interval (no-op if not using restarts) */
-  entropy->restarts_to_go--;
-
-  return TRUE;
-
-undoit:
-  /* Re-zero any output coefficients that we made newly nonzero */
-  while (num_newnz > 0)
-    (*block)[newnz_pos[--num_newnz]] = 0;
-
-  return FALSE;
-}
-
-
-/*
- * Module initialization routine for progressive Huffman entropy decoding.
- */
-
-GLOBAL(void)
-jinit_phuff_decoder (j_decompress_ptr cinfo)
-{
-  phuff_entropy_ptr entropy;
-  int *coef_bit_ptr;
-  int ci, i;
-
-  entropy = (phuff_entropy_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(phuff_entropy_decoder));
-  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
-  entropy->pub.start_pass = start_pass_phuff_decoder;
-
-  /* Mark derived tables unallocated */
-  for (i = 0; i < NUM_HUFF_TBLS; i++) {
-    entropy->derived_tbls[i] = NULL;
-  }
-
-  /* Create progression status table */
-  cinfo->coef_bits = (int (*)[DCTSIZE2])
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                cinfo->num_components*DCTSIZE2*SIZEOF(int));
-  coef_bit_ptr = & cinfo->coef_bits[0][0];
-  for (ci = 0; ci < cinfo->num_components; ci++)
-    for (i = 0; i < DCTSIZE2; i++)
-      *coef_bit_ptr++ = -1;
-}
-
-#endif /* D_PROGRESSIVE_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jdpostct.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdpostct.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the decompression postprocessing controller.
- * This controller manages the upsampling, color conversion, and color
- * quantization/reduction steps; specifically, it controls the buffering
- * between upsample/color conversion and color quantization/reduction.
- *
- * If no color quantization/reduction is required, then this module has no
- * work to do, and it just hands off to the upsample/color conversion code.
- * An integrated upsample/convert/quantize process would replace this module
- * entirely.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private buffer controller object */
-
-typedef struct {
-  struct jpeg_d_post_controller pub; /* public fields */
-
-  /* Color quantization source buffer: this holds output data from
-   * the upsample/color conversion step to be passed to the quantizer.
-   * For two-pass color quantization, we need a full-image buffer;
-   * for one-pass operation, a strip buffer is sufficient.
-   */
-  jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */
-  JSAMPARRAY buffer;            /* strip buffer, or current strip of virtual */
-  JDIMENSION strip_height;      /* buffer size in rows */
-  /* for two-pass mode only: */
-  JDIMENSION starting_row;      /* row # of first row in current strip */
-  JDIMENSION next_row;          /* index of next row to fill/empty in strip */
-} my_post_controller;
-
-typedef my_post_controller * my_post_ptr;
-
-
-/* Forward declarations */
-METHODDEF(void) post_process_1pass
-        JPP((j_decompress_ptr cinfo,
-             JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-             JDIMENSION in_row_groups_avail,
-             JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-             JDIMENSION out_rows_avail));
-#ifdef QUANT_2PASS_SUPPORTED
-METHODDEF(void) post_process_prepass
-        JPP((j_decompress_ptr cinfo,
-             JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-             JDIMENSION in_row_groups_avail,
-             JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-             JDIMENSION out_rows_avail));
-METHODDEF(void) post_process_2pass
-        JPP((j_decompress_ptr cinfo,
-             JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-             JDIMENSION in_row_groups_avail,
-             JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-             JDIMENSION out_rows_avail));
-#endif
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
-{
-  my_post_ptr post = (my_post_ptr) cinfo->post;
-
-  switch (pass_mode) {
-  case JBUF_PASS_THRU:
-    if (cinfo->quantize_colors) {
-      /* Single-pass processing with color quantization. */
-      post->pub.post_process_data = post_process_1pass;
-      /* We could be doing buffered-image output before starting a 2-pass
-       * color quantization; in that case, jinit_d_post_controller did not
-       * allocate a strip buffer.  Use the virtual-array buffer as workspace.
-       */
-      if (post->buffer == NULL) {
-        post->buffer = (*cinfo->mem->access_virt_sarray)
-          ((j_common_ptr) cinfo, post->whole_image,
-           (JDIMENSION) 0, post->strip_height, TRUE);
-      }
-    } else {
-      /* For single-pass processing without color quantization,
-       * I have no work to do; just call the upsampler directly.
-       */
-      post->pub.post_process_data = cinfo->upsample->upsample;
-    }
-    break;
-#ifdef QUANT_2PASS_SUPPORTED
-  case JBUF_SAVE_AND_PASS:
-    /* First pass of 2-pass quantization */
-    if (post->whole_image == NULL)
-      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    post->pub.post_process_data = post_process_prepass;
-    break;
-  case JBUF_CRANK_DEST:
-    /* Second pass of 2-pass quantization */
-    if (post->whole_image == NULL)
-      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    post->pub.post_process_data = post_process_2pass;
-    break;
-#endif /* QUANT_2PASS_SUPPORTED */
-  default:
-    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-    break;
-  }
-  post->starting_row = post->next_row = 0;
-}
-
-
-/*
- * Process some data in the one-pass (strip buffer) case.
- * This is used for color precision reduction as well as one-pass quantization.
- */
-
-METHODDEF(void)
-post_process_1pass (j_decompress_ptr cinfo,
-                    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-                    JDIMENSION in_row_groups_avail,
-                    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                    JDIMENSION out_rows_avail)
-{
-  my_post_ptr post = (my_post_ptr) cinfo->post;
-  JDIMENSION num_rows, max_rows;
-
-  /* Fill the buffer, but not more than what we can dump out in one go. */
-  /* Note we rely on the upsampler to detect bottom of image. */
-  max_rows = out_rows_avail - *out_row_ctr;
-  if (max_rows > post->strip_height)
-    max_rows = post->strip_height;
-  num_rows = 0;
-  (*cinfo->upsample->upsample) (cinfo,
-                input_buf, in_row_group_ctr, in_row_groups_avail,
-                post->buffer, &num_rows, max_rows);
-  /* Quantize and emit data. */
-  (*cinfo->cquantize->color_quantize) (cinfo,
-                post->buffer, output_buf + *out_row_ctr, (int) num_rows);
-  *out_row_ctr += num_rows;
-}
-
-
-#ifdef QUANT_2PASS_SUPPORTED
-
-/*
- * Process some data in the first pass of 2-pass quantization.
- */
-
-METHODDEF(void)
-post_process_prepass (j_decompress_ptr cinfo,
-                      JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-                      JDIMENSION in_row_groups_avail,
-                      JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                      JDIMENSION out_rows_avail)
-{
-  my_post_ptr post = (my_post_ptr) cinfo->post;
-  JDIMENSION old_next_row, num_rows;
-
-  /* Reposition virtual buffer if at start of strip. */
-  if (post->next_row == 0) {
-    post->buffer = (*cinfo->mem->access_virt_sarray)
-        ((j_common_ptr) cinfo, post->whole_image,
-         post->starting_row, post->strip_height, TRUE);
-  }
-
-  /* Upsample some data (up to a strip height's worth). */
-  old_next_row = post->next_row;
-  (*cinfo->upsample->upsample) (cinfo,
-                input_buf, in_row_group_ctr, in_row_groups_avail,
-                post->buffer, &post->next_row, post->strip_height);
-
-  /* Allow quantizer to scan new data.  No data is emitted, */
-  /* but we advance out_row_ctr so outer loop can tell when we're done. */
-  if (post->next_row > old_next_row) {
-    num_rows = post->next_row - old_next_row;
-    (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,
-                                         (JSAMPARRAY) NULL, (int) num_rows);
-    *out_row_ctr += num_rows;
-  }
-
-  /* Advance if we filled the strip. */
-  if (post->next_row >= post->strip_height) {
-    post->starting_row += post->strip_height;
-    post->next_row = 0;
-  }
-}
-
-
-/*
- * Process some data in the second pass of 2-pass quantization.
- */
-
-METHODDEF(void)
-post_process_2pass (j_decompress_ptr cinfo,
-                    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-                    JDIMENSION in_row_groups_avail,
-                    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                    JDIMENSION out_rows_avail)
-{
-  my_post_ptr post = (my_post_ptr) cinfo->post;
-  JDIMENSION num_rows, max_rows;
-
-  /* Reposition virtual buffer if at start of strip. */
-  if (post->next_row == 0) {
-    post->buffer = (*cinfo->mem->access_virt_sarray)
-        ((j_common_ptr) cinfo, post->whole_image,
-         post->starting_row, post->strip_height, FALSE);
-  }
-
-  /* Determine number of rows to emit. */
-  num_rows = post->strip_height - post->next_row; /* available in strip */
-  max_rows = out_rows_avail - *out_row_ctr; /* available in output area */
-  if (num_rows > max_rows)
-    num_rows = max_rows;
-  /* We have to check bottom of image here, can't depend on upsampler. */
-  max_rows = cinfo->output_height - post->starting_row;
-  if (num_rows > max_rows)
-    num_rows = max_rows;
-
-  /* Quantize and emit data. */
-  (*cinfo->cquantize->color_quantize) (cinfo,
-                post->buffer + post->next_row, output_buf + *out_row_ctr,
-                (int) num_rows);
-  *out_row_ctr += num_rows;
-
-  /* Advance if we filled the strip. */
-  post->next_row += num_rows;
-  if (post->next_row >= post->strip_height) {
-    post->starting_row += post->strip_height;
-    post->next_row = 0;
-  }
-}
-
-#endif /* QUANT_2PASS_SUPPORTED */
-
-
-/*
- * Initialize postprocessing controller.
- */
-
-GLOBAL(void)
-jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
-{
-  my_post_ptr post;
-
-  post = (my_post_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_post_controller));
-  cinfo->post = (struct jpeg_d_post_controller *) post;
-  post->pub.start_pass = start_pass_dpost;
-  post->whole_image = NULL;     /* flag for no virtual arrays */
-  post->buffer = NULL;          /* flag for no strip buffer */
-
-  /* Create the quantization buffer, if needed */
-  if (cinfo->quantize_colors) {
-    /* The buffer strip height is max_v_samp_factor, which is typically
-     * an efficient number of rows for upsampling to return.
-     * (In the presence of output rescaling, we might want to be smarter?)
-     */
-    post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;
-    if (need_full_buffer) {
-      /* Two-pass color quantization: need full-image storage. */
-      /* We round up the number of rows to a multiple of the strip height. */
-#ifdef QUANT_2PASS_SUPPORTED
-      post->whole_image = (*cinfo->mem->request_virt_sarray)
-        ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
-         cinfo->output_width * cinfo->out_color_components,
-         (JDIMENSION) jround_up((long) cinfo->output_height,
-                                (long) post->strip_height),
-         post->strip_height);
-#else
-      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-#endif /* QUANT_2PASS_SUPPORTED */
-    } else {
-      /* One-pass color quantization: just make a strip buffer. */
-      post->buffer = (*cinfo->mem->alloc_sarray)
-        ((j_common_ptr) cinfo, JPOOL_IMAGE,
-         cinfo->output_width * cinfo->out_color_components,
-         post->strip_height);
-    }
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jdsample.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,482 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdsample.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains upsampling routines.
- *
- * Upsampling input data is counted in "row groups".  A row group
- * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
- * sample rows of each component.  Upsampling will normally produce
- * max_v_samp_factor pixel rows from each row group (but this could vary
- * if the upsampler is applying a scale factor of its own).
- *
- * An excellent reference for image resampling is
- *   Digital Image Warping, George Wolberg, 1990.
- *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Pointer to routine to upsample a single component */
-typedef JMETHOD(void, upsample1_ptr,
-                (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-                 JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));
-
-/* Private subobject */
-
-typedef struct {
-  struct jpeg_upsampler pub;    /* public fields */
-
-  /* Color conversion buffer.  When using separate upsampling and color
-   * conversion steps, this buffer holds one upsampled row group until it
-   * has been color converted and output.
-   * Note: we do not allocate any storage for component(s) which are full-size,
-   * ie do not need rescaling.  The corresponding entry of color_buf[] is
-   * simply set to point to the input data array, thereby avoiding copying.
-   */
-  JSAMPARRAY color_buf[MAX_COMPONENTS];
-
-  /* Per-component upsampling method pointers */
-  upsample1_ptr methods[MAX_COMPONENTS];
-
-  int next_row_out;             /* counts rows emitted from color_buf */
-  JDIMENSION rows_to_go;        /* counts rows remaining in image */
-
-  /* Height of an input row group for each component. */
-  int rowgroup_height[MAX_COMPONENTS];
-
-  /* These arrays save pixel expansion factors so that int_expand need not
-   * recompute them each time.  They are unused for other upsampling methods.
-   */
-  UINT8 h_expand[MAX_COMPONENTS];
-  UINT8 v_expand[MAX_COMPONENTS];
-} my_upsampler;
-
-typedef my_upsampler * my_upsample_ptr;
-
-
-/*
- * Initialize for an upsampling pass.
- */
-
-METHODDEF(void)
-start_pass_upsample (j_decompress_ptr cinfo)
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-
-  /* Mark the conversion buffer empty */
-  upsample->next_row_out = cinfo->max_v_samp_factor;
-  /* Initialize total-height counter for detecting bottom of image */
-  upsample->rows_to_go = cinfo->output_height;
-}
-
-
-/*
- * Control routine to do upsampling (and color conversion).
- *
- * In this version we upsample each component independently.
- * We upsample one row group into the conversion buffer, then apply
- * color conversion a row at a time.
- */
-
-METHODDEF(void)
-sep_upsample (j_decompress_ptr cinfo,
-              JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
-              JDIMENSION in_row_groups_avail,
-              JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-              JDIMENSION out_rows_avail)
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-  int ci;
-  jpeg_component_info * compptr;
-  JDIMENSION num_rows;
-
-  /* Fill the conversion buffer, if it's empty */
-  if (upsample->next_row_out >= cinfo->max_v_samp_factor) {
-    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-         ci++, compptr++) {
-      /* Invoke per-component upsample method.  Notice we pass a POINTER
-       * to color_buf[ci], so that fullsize_upsample can change it.
-       */
-      (*upsample->methods[ci]) (cinfo, compptr,
-        input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]),
-        upsample->color_buf + ci);
-    }
-    upsample->next_row_out = 0;
-  }
-
-  /* Color-convert and emit rows */
-
-  /* How many we have in the buffer: */
-  num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out);
-  /* Not more than the distance to the end of the image.  Need this test
-   * in case the image height is not a multiple of max_v_samp_factor:
-   */
-  if (num_rows > upsample->rows_to_go)
-    num_rows = upsample->rows_to_go;
-  /* And not more than what the client can accept: */
-  out_rows_avail -= *out_row_ctr;
-  if (num_rows > out_rows_avail)
-    num_rows = out_rows_avail;
-
-  (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf,
-                                     (JDIMENSION) upsample->next_row_out,
-                                     output_buf + *out_row_ctr,
-                                     (int) num_rows);
-
-  /* Adjust counts */
-  *out_row_ctr += num_rows;
-  upsample->rows_to_go -= num_rows;
-  upsample->next_row_out += num_rows;
-  /* When the buffer is emptied, declare this input row group consumed */
-  if (upsample->next_row_out >= cinfo->max_v_samp_factor)
-    (*in_row_group_ctr)++;
-}
-
-
-/*
- * These are the routines invoked by sep_upsample to upsample pixel values
- * of a single component.  One row group is processed per call.
- */
-
-
-/*
- * For full-size components, we just make color_buf[ci] point at the
- * input buffer, and thus avoid copying any data.  Note that this is
- * safe only because sep_upsample doesn't declare the input row group
- * "consumed" until we are done color converting and emitting it.
- */
-
-METHODDEF(void)
-fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-                   JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
-  *output_data_ptr = input_data;
-}
-
-
-/*
- * This is a no-op version used for "uninteresting" components.
- * These components will not be referenced by color conversion.
- */
-
-METHODDEF(void)
-noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-               JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
-  *output_data_ptr = NULL;      /* safety check */
-}
-
-
-/*
- * This version handles any integral sampling ratios.
- * This is not used for typical JPEG files, so it need not be fast.
- * Nor, for that matter, is it particularly accurate: the algorithm is
- * simple replication of the input pixel onto the corresponding output
- * pixels.  The hi-falutin sampling literature refers to this as a
- * "box filter".  A box filter tends to introduce visible artifacts,
- * so if you are actually going to use 3:1 or 4:1 sampling ratios
- * you would be well advised to improve this code.
- */
-
-METHODDEF(void)
-int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-              JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
-  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-  JSAMPARRAY output_data = *output_data_ptr;
-  register JSAMPROW inptr, outptr;
-  register JSAMPLE invalue;
-  register int h;
-  JSAMPROW outend;
-  int h_expand, v_expand;
-  int inrow, outrow;
-
-  h_expand = upsample->h_expand[compptr->component_index];
-  v_expand = upsample->v_expand[compptr->component_index];
-
-  inrow = outrow = 0;
-  while (outrow < cinfo->max_v_samp_factor) {
-    /* Generate one output row with proper horizontal expansion */
-    inptr = input_data[inrow];
-    outptr = output_data[outrow];
-    outend = outptr + cinfo->output_width;
-    while (outptr < outend) {
-      invalue = *inptr++;       /* don't need GETJSAMPLE() here */
-      for (h = h_expand; h > 0; h--) {
-        *outptr++ = invalue;
-      }
-    }
-    /* Generate any additional output rows by duplicating the first one */
-    if (v_expand > 1) {
-      jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
-                        v_expand-1, cinfo->output_width);
-    }
-    inrow++;
-    outrow += v_expand;
-  }
-}
-
-
-/*
- * Fast processing for the common case of 2:1 horizontal and 1:1 vertical.
- * It's still a box filter.
- */
-
-METHODDEF(void)
-h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-               JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
-  JSAMPARRAY output_data = *output_data_ptr;
-  register JSAMPROW inptr, outptr;
-  register JSAMPLE invalue;
-  JSAMPROW outend;
-  int inrow;
-
-  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
-    inptr = input_data[inrow];
-    outptr = output_data[inrow];
-    outend = outptr + cinfo->output_width;
-    while (outptr < outend) {
-      invalue = *inptr++;       /* don't need GETJSAMPLE() here */
-      *outptr++ = invalue;
-      *outptr++ = invalue;
-    }
-  }
-}
-
-
-/*
- * Fast processing for the common case of 2:1 horizontal and 2:1 vertical.
- * It's still a box filter.
- */
-
-METHODDEF(void)
-h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-               JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
-  JSAMPARRAY output_data = *output_data_ptr;
-  register JSAMPROW inptr, outptr;
-  register JSAMPLE invalue;
-  JSAMPROW outend;
-  int inrow, outrow;
-
-  inrow = outrow = 0;
-  while (outrow < cinfo->max_v_samp_factor) {
-    inptr = input_data[inrow];
-    outptr = output_data[outrow];
-    outend = outptr + cinfo->output_width;
-    while (outptr < outend) {
-      invalue = *inptr++;       /* don't need GETJSAMPLE() here */
-      *outptr++ = invalue;
-      *outptr++ = invalue;
-    }
-    jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
-                      1, cinfo->output_width);
-    inrow++;
-    outrow += 2;
-  }
-}
-
-
-/*
- * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical.
- *
- * The upsampling algorithm is linear interpolation between pixel centers,
- * also known as a "triangle filter".  This is a good compromise between
- * speed and visual quality.  The centers of the output pixels are 1/4 and 3/4
- * of the way between input pixel centers.
- *
- * A note about the "bias" calculations: when rounding fractional values to
- * integer, we do not want to always round 0.5 up to the next integer.
- * If we did that, we'd introduce a noticeable bias towards larger values.
- * Instead, this code is arranged so that 0.5 will be rounded up or down at
- * alternate pixel locations (a simple ordered dither pattern).
- */
-
-METHODDEF(void)
-h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-                     JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
-  JSAMPARRAY output_data = *output_data_ptr;
-  register JSAMPROW inptr, outptr;
-  register int invalue;
-  register JDIMENSION colctr;
-  int inrow;
-
-  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
-    inptr = input_data[inrow];
-    outptr = output_data[inrow];
-    /* Special case for first column */
-    invalue = GETJSAMPLE(*inptr++);
-    *outptr++ = (JSAMPLE) invalue;
-    *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2);
-
-    for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
-      /* General case: 3/4 * nearer pixel + 1/4 * further pixel */
-      invalue = GETJSAMPLE(*inptr++) * 3;
-      *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2);
-      *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2);
-    }
-
-    /* Special case for last column */
-    invalue = GETJSAMPLE(*inptr);
-    *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2);
-    *outptr++ = (JSAMPLE) invalue;
-  }
-}
-
-
-/*
- * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical.
- * Again a triangle filter; see comments for h2v1 case, above.
- *
- * It is OK for us to reference the adjacent input rows because we demanded
- * context from the main buffer controller (see initialization code).
- */
-
-METHODDEF(void)
-h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-                     JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
-  JSAMPARRAY output_data = *output_data_ptr;
-  register JSAMPROW inptr0, inptr1, outptr;
-#if BITS_IN_JSAMPLE == 8
-  register int thiscolsum, lastcolsum, nextcolsum;
-#else
-  register INT32 thiscolsum, lastcolsum, nextcolsum;
-#endif
-  register JDIMENSION colctr;
-  int inrow, outrow, v;
-
-  inrow = outrow = 0;
-  while (outrow < cinfo->max_v_samp_factor) {
-    for (v = 0; v < 2; v++) {
-      /* inptr0 points to nearest input row, inptr1 points to next nearest */
-      inptr0 = input_data[inrow];
-      if (v == 0)               /* next nearest is row above */
-        inptr1 = input_data[inrow-1];
-      else                      /* next nearest is row below */
-        inptr1 = input_data[inrow+1];
-      outptr = output_data[outrow++];
-
-      /* Special case for first column */
-      thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
-      nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
-      *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4);
-      *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
-      lastcolsum = thiscolsum; thiscolsum = nextcolsum;
-
-      for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
-        /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */
-        /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */
-        nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
-        *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
-        *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
-        lastcolsum = thiscolsum; thiscolsum = nextcolsum;
-      }
-
-      /* Special case for last column */
-      *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
-      *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4);
-    }
-    inrow++;
-  }
-}
-
-
-/*
- * Module initialization routine for upsampling.
- */
-
-GLOBAL(void)
-jinit_upsampler (j_decompress_ptr cinfo)
-{
-  my_upsample_ptr upsample;
-  int ci;
-  jpeg_component_info * compptr;
-  boolean need_buffer, do_fancy;
-  int h_in_group, v_in_group, h_out_group, v_out_group;
-
-  upsample = (my_upsample_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_upsampler));
-  cinfo->upsample = (struct jpeg_upsampler *) upsample;
-  upsample->pub.start_pass = start_pass_upsample;
-  upsample->pub.upsample = sep_upsample;
-  upsample->pub.need_context_rows = FALSE; /* until we find out differently */
-
-  if (cinfo->CCIR601_sampling)  /* this isn't supported */
-    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
-
-  /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1,
-   * so don't ask for it.
-   */
-  do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1;
-
-  /* Verify we can handle the sampling factors, select per-component methods,
-   * and create storage as needed.
-   */
-  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
-       ci++, compptr++) {
-    /* Compute size of an "input group" after IDCT scaling.  This many samples
-     * are to be converted to max_h_samp_factor * max_v_samp_factor pixels.
-     */
-    h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) /
-                 cinfo->min_DCT_scaled_size;
-    v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
-                 cinfo->min_DCT_scaled_size;
-    h_out_group = cinfo->max_h_samp_factor;
-    v_out_group = cinfo->max_v_samp_factor;
-    upsample->rowgroup_height[ci] = v_in_group; /* save for use later */
-    need_buffer = TRUE;
-    if (! compptr->component_needed) {
-      /* Don't bother to upsample an uninteresting component. */
-      upsample->methods[ci] = noop_upsample;
-      need_buffer = FALSE;
-    } else if (h_in_group == h_out_group && v_in_group == v_out_group) {
-      /* Fullsize components can be processed without any work. */
-      upsample->methods[ci] = fullsize_upsample;
-      need_buffer = FALSE;
-    } else if (h_in_group * 2 == h_out_group &&
-               v_in_group == v_out_group) {
-      /* Special cases for 2h1v upsampling */
-      if (do_fancy && compptr->downsampled_width > 2)
-        upsample->methods[ci] = h2v1_fancy_upsample;
-      else
-        upsample->methods[ci] = h2v1_upsample;
-    } else if (h_in_group * 2 == h_out_group &&
-               v_in_group * 2 == v_out_group) {
-      /* Special cases for 2h2v upsampling */
-      if (do_fancy && compptr->downsampled_width > 2) {
-        upsample->methods[ci] = h2v2_fancy_upsample;
-        upsample->pub.need_context_rows = TRUE;
-      } else
-        upsample->methods[ci] = h2v2_upsample;
-    } else if ((h_out_group % h_in_group) == 0 &&
-               (v_out_group % v_in_group) == 0) {
-      /* Generic integral-factors upsampling method */
-      upsample->methods[ci] = int_upsample;
-      upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group);
-      upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);
-    } else
-      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
-    if (need_buffer) {
-      upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)
-        ((j_common_ptr) cinfo, JPOOL_IMAGE,
-         (JDIMENSION) jround_up((long) cinfo->output_width,
-                                (long) cinfo->max_h_samp_factor),
-         (JDIMENSION) cinfo->max_v_samp_factor);
-    }
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jdtrans.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jdtrans.c
- *
- * Copyright (C) 1995-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains library routines for transcoding decompression,
- * that is, reading raw DCT coefficient arrays from an input JPEG file.
- * The routines in jdapimin.c will also be needed by a transcoder.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Forward declarations */
-LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));
-
-
-/*
- * Read the coefficient arrays from a JPEG file.
- * jpeg_read_header must be completed before calling this.
- *
- * The entire image is read into a set of virtual coefficient-block arrays,
- * one per component.  The return value is a pointer to the array of
- * virtual-array descriptors.  These can be manipulated directly via the
- * JPEG memory manager, or handed off to jpeg_write_coefficients().
- * To release the memory occupied by the virtual arrays, call
- * jpeg_finish_decompress() when done with the data.
- *
- * An alternative usage is to simply obtain access to the coefficient arrays
- * during a buffered-image-mode decompression operation.  This is allowed
- * after any jpeg_finish_output() call.  The arrays can be accessed until
- * jpeg_finish_decompress() is called.  (Note that any call to the library
- * may reposition the arrays, so don't rely on access_virt_barray() results
- * to stay valid across library calls.)
- *
- * Returns NULL if suspended.  This case need be checked only if
- * a suspending data source is used.
- */
-
-GLOBAL(jvirt_barray_ptr *)
-jpeg_read_coefficients (j_decompress_ptr cinfo)
-{
-  if (cinfo->global_state == DSTATE_READY) {
-    /* First call: initialize active modules */
-    transdecode_master_selection(cinfo);
-    cinfo->global_state = DSTATE_RDCOEFS;
-  }
-  if (cinfo->global_state == DSTATE_RDCOEFS) {
-    /* Absorb whole file into the coef buffer */
-    for (;;) {
-      int retcode;
-      /* Call progress monitor hook if present */
-      if (cinfo->progress != NULL)
-        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
-      /* Absorb some more input */
-      retcode = (*cinfo->inputctl->consume_input) (cinfo);
-      if (retcode == JPEG_SUSPENDED)
-        return NULL;
-      if (retcode == JPEG_REACHED_EOI)
-        break;
-      /* Advance progress counter if appropriate */
-      if (cinfo->progress != NULL &&
-          (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
-        if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
-          /* startup underestimated number of scans; ratchet up one scan */
-          cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
-        }
-      }
-    }
-    /* Set state so that jpeg_finish_decompress does the right thing */
-    cinfo->global_state = DSTATE_STOPPING;
-  }
-  /* At this point we should be in state DSTATE_STOPPING if being used
-   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
-   * to the coefficients during a full buffered-image-mode decompression.
-   */
-  if ((cinfo->global_state == DSTATE_STOPPING ||
-       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
-    return cinfo->coef->coef_arrays;
-  }
-  /* Oops, improper usage */
-  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-  return NULL;                  /* keep compiler happy */
-}
-
-
-/*
- * Master selection of decompression modules for transcoding.
- * This substitutes for jdmaster.c's initialization of the full decompressor.
- */
-
-LOCAL(void)
-transdecode_master_selection (j_decompress_ptr cinfo)
-{
-  /* This is effectively a buffered-image operation. */
-  cinfo->buffered_image = TRUE;
-
-  /* Entropy decoding: either Huffman or arithmetic coding. */
-  if (cinfo->arith_code) {
-    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-  } else {
-    if (cinfo->progressive_mode) {
-#ifdef D_PROGRESSIVE_SUPPORTED
-      jinit_phuff_decoder(cinfo);
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-    } else
-      jinit_huff_decoder(cinfo);
-  }
-
-  /* Always get a full-image coefficient buffer. */
-  jinit_d_coef_controller(cinfo, TRUE);
-
-  /* We can now tell the memory manager to allocate virtual arrays. */
-  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
-
-  /* Initialize input side of decompressor to consume first scan. */
-  (*cinfo->inputctl->start_input_pass) (cinfo);
-
-  /* Initialize progress monitoring. */
-  if (cinfo->progress != NULL) {
-    int nscans;
-    /* Estimate number of scans to set pass_limit. */
-    if (cinfo->progressive_mode) {
-      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
-      nscans = 2 + 3 * cinfo->num_components;
-    } else if (cinfo->inputctl->has_multiple_scans) {
-      /* For a nonprogressive multiscan file, estimate 1 scan per component. */
-      nscans = cinfo->num_components;
-    } else {
-      nscans = 1;
-    }
-    cinfo->progress->pass_counter = 0L;
-    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
-    cinfo->progress->completed_passes = 0;
-    cinfo->progress->total_passes = 1;
-  }
-}
--- a/src/share/native/sun/awt/image/jpeg/jerror.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,272 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jerror.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains simple error-reporting and trace-message routines.
- * These are suitable for Unix-like systems and others where writing to
- * stderr is the right thing to do.  Many applications will want to replace
- * some or all of these routines.
- *
- * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,
- * you get a Windows-specific hack to display error messages in a dialog box.
- * It ain't much, but it beats dropping error messages into the bit bucket,
- * which is what happens to output to stderr under most Windows C compilers.
- *
- * These routines are used by both the compression and decompression code.
- */
-
-/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jversion.h"
-#include "jerror.h"
-
-#ifdef USE_WINDOWS_MESSAGEBOX
-#include <windows.h>
-#endif
-
-#ifndef EXIT_FAILURE            /* define exit() codes if not provided */
-#define EXIT_FAILURE  1
-#endif
-
-
-/*
- * Create the message string table.
- * We do this from the master message list in jerror.h by re-reading
- * jerror.h with a suitable definition for macro JMESSAGE.
- * The message table is made an external symbol just in case any applications
- * want to refer to it directly.
- */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_std_message_table  jMsgTable
-#endif
-
-#define JMESSAGE(code,string)   string ,
-
-const char * const jpeg_std_message_table[] = {
-#include "jerror.h"
-  NULL
-};
-
-
-/*
- * Error exit handler: must not return to caller.
- *
- * Applications may override this if they want to get control back after
- * an error.  Typically one would longjmp somewhere instead of exiting.
- * The setjmp buffer can be made a private field within an expanded error
- * handler object.  Note that the info needed to generate an error message
- * is stored in the error object, so you can generate the message now or
- * later, at your convenience.
- * You should make sure that the JPEG object is cleaned up (with jpeg_abort
- * or jpeg_destroy) at some point.
- */
-
-METHODDEF(void)
-error_exit (j_common_ptr cinfo)
-{
-  /* Always display the message */
-  (*cinfo->err->output_message) (cinfo);
-
-  /* Let the memory manager delete any temp files before we die */
-  jpeg_destroy(cinfo);
-
-  /*
-   * This should never happen since the Java library replaces the
-   * error_exit pointer in the error handler structs it uses.
-   *
-   * exit(EXIT_FAILURE);
-   */
-}
-
-
-/*
- * Actual output of an error or trace message.
- * Applications may override this method to send JPEG messages somewhere
- * other than stderr.
- *
- * On Windows, printing to stderr is generally completely useless,
- * so we provide optional code to produce an error-dialog popup.
- * Most Windows applications will still prefer to override this routine,
- * but if they don't, it'll do something at least marginally useful.
- *
- * NOTE: to use the library in an environment that doesn't support the
- * C stdio library, you may have to delete the call to fprintf() entirely,
- * not just not use this routine.
- */
-
-METHODDEF(void)
-output_message (j_common_ptr cinfo)
-{
-  char buffer[JMSG_LENGTH_MAX];
-
-  /* Create the message */
-  (*cinfo->err->format_message) (cinfo, buffer);
-
-#ifdef USE_WINDOWS_MESSAGEBOX
-  /* Display it in a message dialog box */
-  MessageBox(GetActiveWindow(), buffer, "JPEG Library Error",
-             MB_OK | MB_ICONERROR);
-#else
-  /* Send it to stderr, adding a newline */
-  fprintf(stderr, "%s\n", buffer);
-#endif
-}
-
-
-/*
- * Decide whether to emit a trace or warning message.
- * msg_level is one of:
- *   -1: recoverable corrupt-data warning, may want to abort.
- *    0: important advisory messages (always display to user).
- *    1: first level of tracing detail.
- *    2,3,...: successively more detailed tracing messages.
- * An application might override this method if it wanted to abort on warnings
- * or change the policy about which messages to display.
- */
-
-METHODDEF(void)
-emit_message (j_common_ptr cinfo, int msg_level)
-{
-  struct jpeg_error_mgr * err = cinfo->err;
-
-  if (msg_level < 0) {
-    /* It's a warning message.  Since corrupt files may generate many warnings,
-     * the policy implemented here is to show only the first warning,
-     * unless trace_level >= 3.
-     */
-    if (err->num_warnings == 0 || err->trace_level >= 3)
-      (*err->output_message) (cinfo);
-    /* Always count warnings in num_warnings. */
-    err->num_warnings++;
-  } else {
-    /* It's a trace message.  Show it if trace_level >= msg_level. */
-    if (err->trace_level >= msg_level)
-      (*err->output_message) (cinfo);
-  }
-}
-
-
-/*
- * Format a message string for the most recent JPEG error or message.
- * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX
- * characters.  Note that no '\n' character is added to the string.
- * Few applications should need to override this method.
- */
-
-METHODDEF(void)
-format_message (j_common_ptr cinfo, char * buffer)
-{
-
-/* Had to kill this function altogether
-   to avoid linking to VM when building the splash screen with static libjpeg */
-
-#ifndef SPLASHSCREEN
-  int jio_snprintf(char *str, size_t count, const char *fmt, ...);
-  struct jpeg_error_mgr * err = cinfo->err;
-  int msg_code = err->msg_code;
-  const char * msgtext = NULL;
-  const char * msgptr;
-  char ch;
-  boolean isstring;
-
-  /* Look up message string in proper table */
-  if (msg_code > 0 && msg_code <= err->last_jpeg_message) {
-    msgtext = err->jpeg_message_table[msg_code];
-  } else if (err->addon_message_table != NULL &&
-             msg_code >= err->first_addon_message &&
-             msg_code <= err->last_addon_message) {
-    msgtext = err->addon_message_table[msg_code - err->first_addon_message];
-  }
-
-  /* Defend against bogus message number */
-  if (msgtext == NULL) {
-    err->msg_parm.i[0] = msg_code;
-    msgtext = err->jpeg_message_table[0];
-  }
-
-  /* Check for string parameter, as indicated by %s in the message text */
-  isstring = FALSE;
-  msgptr = msgtext;
-  while ((ch = *msgptr++) != '\0') {
-    if (ch == '%') {
-      if (*msgptr == 's') isstring = TRUE;
-      break;
-    }
-  }
-
-  /* Format the message into the passed buffer */
-  if (isstring)
-    /* Buffer size is JMSG_LENGTH_MAX, quietly truncate on overflow */
-    (void) jio_snprintf(buffer, JMSG_LENGTH_MAX, msgtext, err->msg_parm.s);
-  else
-    /* Buffer size is JMSG_LENGTH_MAX, quietly truncate on overflow */
-    (void) jio_snprintf(buffer, JMSG_LENGTH_MAX, msgtext,
-                        err->msg_parm.i[0], err->msg_parm.i[1],
-                        err->msg_parm.i[2], err->msg_parm.i[3],
-                        err->msg_parm.i[4], err->msg_parm.i[5],
-                        err->msg_parm.i[6], err->msg_parm.i[7]);
-#else /* SPLASHSCREEN */
-        *buffer = '\0';
-#endif /* SPLASHSCREEN */
-}
-
-
-/*
- * Reset error state variables at start of a new image.
- * This is called during compression startup to reset trace/error
- * processing to default state, without losing any application-specific
- * method pointers.  An application might possibly want to override
- * this method if it has additional error processing state.
- */
-
-METHODDEF(void)
-reset_error_mgr (j_common_ptr cinfo)
-{
-  cinfo->err->num_warnings = 0;
-  /* trace_level is not reset since it is an application-supplied parameter */
-  cinfo->err->msg_code = 0;     /* may be useful as a flag for "no error" */
-}
-
-
-/*
- * Fill in the standard error-handling methods in a jpeg_error_mgr object.
- * Typical call is:
- *      struct jpeg_compress_struct cinfo;
- *      struct jpeg_error_mgr err;
- *
- *      cinfo.err = jpeg_std_error(&err);
- * after which the application may override some of the methods.
- */
-
-GLOBAL(struct jpeg_error_mgr *)
-jpeg_std_error (struct jpeg_error_mgr * err)
-{
-  err->error_exit = error_exit;
-  err->emit_message = emit_message;
-  err->output_message = output_message;
-  err->format_message = format_message;
-  err->reset_error_mgr = reset_error_mgr;
-
-  err->trace_level = 0;         /* default = no tracing */
-  err->num_warnings = 0;        /* no warnings emitted yet */
-  err->msg_code = 0;            /* may be useful as a flag for "no error" */
-
-  /* Initialize message table pointers */
-  err->jpeg_message_table = jpeg_std_message_table;
-  err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;
-
-  err->addon_message_table = NULL;
-  err->first_addon_message = 0; /* for safety */
-  err->last_addon_message = 0;
-
-  return err;
-}
--- a/src/share/native/sun/awt/image/jpeg/jerror.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jerror.h
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file defines the error and message codes for the JPEG library.
- * Edit this file to add new codes, or to translate the message strings to
- * some other language.
- * A set of error-reporting macros are defined too.  Some applications using
- * the JPEG library may wish to include this file to get the error codes
- * and/or the macros.
- */
-
-/*
- * To define the enum list of message codes, include this file without
- * defining macro JMESSAGE.  To create a message string table, include it
- * again with a suitable JMESSAGE definition (see jerror.c for an example).
- */
-#ifndef JMESSAGE
-#ifndef JERROR_H
-/* First time through, define the enum list */
-#define JMAKE_ENUM_LIST
-#else
-/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
-#define JMESSAGE(code,string)
-#endif /* JERROR_H */
-#endif /* JMESSAGE */
-
-#ifdef JMAKE_ENUM_LIST
-
-typedef enum {
-
-#define JMESSAGE(code,string)   code ,
-
-#endif /* JMAKE_ENUM_LIST */
-
-JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */
-
-/* For maintenance convenience, list is alphabetical by message code name */
-JMESSAGE(JERR_ARITH_NOTIMPL,
-         "Sorry, there are legal restrictions on arithmetic coding")
-JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")
-JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
-JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
-JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
-JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
-JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
-JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
-JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
-JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
-JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")
-JMESSAGE(JERR_BAD_LIB_VERSION,
-         "Wrong JPEG library version: library is %d, caller expects %d")
-JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")
-JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")
-JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")
-JMESSAGE(JERR_BAD_PROGRESSION,
-         "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")
-JMESSAGE(JERR_BAD_PROG_SCRIPT,
-         "Invalid progressive parameters at scan script entry %d")
-JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")
-JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")
-JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")
-JMESSAGE(JERR_BAD_STRUCT_SIZE,
-         "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")
-JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")
-JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")
-JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")
-JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")
-JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")
-JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")
-JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")
-JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")
-JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")
-JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")
-JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")
-JMESSAGE(JERR_EMS_READ, "Read from EMS failed")
-JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")
-JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
-JMESSAGE(JERR_FILE_READ, "Input file read error")
-JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
-JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
-JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
-JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
-JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
-JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
-JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")
-JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,
-         "Cannot transcode due to multiple use of quantization table %d")
-JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
-JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
-JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
-JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
-JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
-JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
-JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
-JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")
-JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")
-JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")
-JMESSAGE(JERR_QUANT_COMPONENTS,
-         "Cannot quantize more than %d color components")
-JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
-JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
-JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
-JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
-JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
-JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
-JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
-JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
-JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
-JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
-JMESSAGE(JERR_TFILE_WRITE,
-         "Write failed on temporary file --- out of disk space?")
-JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")
-JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")
-JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")
-JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")
-JMESSAGE(JERR_XMS_READ, "Read from XMS failed")
-JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")
-JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)
-JMESSAGE(JMSG_VERSION, JVERSION)
-JMESSAGE(JTRC_16BIT_TABLES,
-         "Caution: quantization tables are too coarse for baseline JPEG")
-JMESSAGE(JTRC_ADOBE,
-         "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")
-JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")
-JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")
-JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")
-JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")
-JMESSAGE(JTRC_DQT, "Define Quantization Table %d  precision %d")
-JMESSAGE(JTRC_DRI, "Define Restart Interval %u")
-JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")
-JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")
-JMESSAGE(JTRC_EOI, "End Of Image")
-JMESSAGE(JTRC_HUFFBITS, "        %3d %3d %3d %3d %3d %3d %3d %3d")
-JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d  %d")
-JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,
-         "Warning: thumbnail image size does not match data length %u")
-JMESSAGE(JTRC_JFIF_EXTENSION,
-         "JFIF extension marker: type 0x%02x, length %u")
-JMESSAGE(JTRC_JFIF_THUMBNAIL, "    with %d x %d thumbnail image")
-JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")
-JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")
-JMESSAGE(JTRC_QUANTVALS, "        %4u %4u %4u %4u %4u %4u %4u %4u")
-JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")
-JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")
-JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")
-JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")
-JMESSAGE(JTRC_RST, "RST%d")
-JMESSAGE(JTRC_SMOOTH_NOTIMPL,
-         "Smoothing not supported with nonstandard sampling ratios")
-JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")
-JMESSAGE(JTRC_SOF_COMPONENT, "    Component %d: %dhx%dv q=%d")
-JMESSAGE(JTRC_SOI, "Start of Image")
-JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")
-JMESSAGE(JTRC_SOS_COMPONENT, "    Component %d: dc=%d ac=%d")
-JMESSAGE(JTRC_SOS_PARAMS, "  Ss=%d, Se=%d, Ah=%d, Al=%d")
-JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")
-JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")
-JMESSAGE(JTRC_THUMB_JPEG,
-         "JFIF extension marker: JPEG-compressed thumbnail image, length %u")
-JMESSAGE(JTRC_THUMB_PALETTE,
-         "JFIF extension marker: palette thumbnail image, length %u")
-JMESSAGE(JTRC_THUMB_RGB,
-         "JFIF extension marker: RGB thumbnail image, length %u")
-JMESSAGE(JTRC_UNKNOWN_IDS,
-         "Unrecognized component IDs %d %d %d, assuming YCbCr")
-JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
-JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
-JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
-JMESSAGE(JWRN_BOGUS_PROGRESSION,
-         "Inconsistent progression sequence for component %d coefficient %d")
-JMESSAGE(JWRN_EXTRANEOUS_DATA,
-         "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")
-JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")
-JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")
-JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")
-JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")
-JMESSAGE(JWRN_MUST_RESYNC,
-         "Corrupt JPEG data: found marker 0x%02x instead of RST%d")
-JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")
-JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")
-
-#ifdef JMAKE_ENUM_LIST
-
-  JMSG_LASTMSGCODE
-} J_MESSAGE_CODE;
-
-#undef JMAKE_ENUM_LIST
-#endif /* JMAKE_ENUM_LIST */
-
-/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
-#undef JMESSAGE
-
-
-#ifndef JERROR_H
-#define JERROR_H
-
-/* Macros to simplify using the error and trace message stuff */
-/* The first parameter is either type of cinfo pointer */
-
-/* Fatal errors (print message and exit) */
-#define ERREXIT(cinfo,code)  \
-  ((cinfo)->err->msg_code = (code), \
-   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXIT1(cinfo,code,p1)  \
-  ((cinfo)->err->msg_code = (code), \
-   (cinfo)->err->msg_parm.i[0] = (p1), \
-   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXIT2(cinfo,code,p1,p2)  \
-  ((cinfo)->err->msg_code = (code), \
-   (cinfo)->err->msg_parm.i[0] = (p1), \
-   (cinfo)->err->msg_parm.i[1] = (p2), \
-   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXIT3(cinfo,code,p1,p2,p3)  \
-  ((cinfo)->err->msg_code = (code), \
-   (cinfo)->err->msg_parm.i[0] = (p1), \
-   (cinfo)->err->msg_parm.i[1] = (p2), \
-   (cinfo)->err->msg_parm.i[2] = (p3), \
-   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXIT4(cinfo,code,p1,p2,p3,p4)  \
-  ((cinfo)->err->msg_code = (code), \
-   (cinfo)->err->msg_parm.i[0] = (p1), \
-   (cinfo)->err->msg_parm.i[1] = (p2), \
-   (cinfo)->err->msg_parm.i[2] = (p3), \
-   (cinfo)->err->msg_parm.i[3] = (p4), \
-   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXITS(cinfo,code,str)  \
-  ((cinfo)->err->msg_code = (code), \
-   strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
-   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-
-#define MAKESTMT(stuff)         do { stuff } while (0)
-
-/* Nonfatal errors (we can keep going, but the data is probably corrupt) */
-#define WARNMS(cinfo,code)  \
-  ((cinfo)->err->msg_code = (code), \
-   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
-#define WARNMS1(cinfo,code,p1)  \
-  ((cinfo)->err->msg_code = (code), \
-   (cinfo)->err->msg_parm.i[0] = (p1), \
-   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
-#define WARNMS2(cinfo,code,p1,p2)  \
-  ((cinfo)->err->msg_code = (code), \
-   (cinfo)->err->msg_parm.i[0] = (p1), \
-   (cinfo)->err->msg_parm.i[1] = (p2), \
-   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
-
-/* Informational/debugging messages */
-#define TRACEMS(cinfo,lvl,code)  \
-  ((cinfo)->err->msg_code = (code), \
-   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
-#define TRACEMS1(cinfo,lvl,code,p1)  \
-  ((cinfo)->err->msg_code = (code), \
-   (cinfo)->err->msg_parm.i[0] = (p1), \
-   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
-#define TRACEMS2(cinfo,lvl,code,p1,p2)  \
-  ((cinfo)->err->msg_code = (code), \
-   (cinfo)->err->msg_parm.i[0] = (p1), \
-   (cinfo)->err->msg_parm.i[1] = (p2), \
-   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
-#define TRACEMS3(cinfo,lvl,code,p1,p2,p3)  \
-  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
-           _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \
-           (cinfo)->err->msg_code = (code); \
-           (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
-#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4)  \
-  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
-           _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
-           (cinfo)->err->msg_code = (code); \
-           (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
-#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5)  \
-  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
-           _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
-           _mp[4] = (p5); \
-           (cinfo)->err->msg_code = (code); \
-           (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
-#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8)  \
-  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
-           _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
-           _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \
-           (cinfo)->err->msg_code = (code); \
-           (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
-#define TRACEMSS(cinfo,lvl,code,str)  \
-  ((cinfo)->err->msg_code = (code), \
-   strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
-   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
-
-#endif /* JERROR_H */
--- a/src/share/native/sun/awt/image/jpeg/jfdctflt.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jfdctflt.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a floating-point implementation of the
- * forward DCT (Discrete Cosine Transform).
- *
- * This implementation should be more accurate than either of the integer
- * DCT implementations.  However, it may not give the same results on all
- * machines because of differences in roundoff behavior.  Speed will depend
- * on the hardware's floating point capacity.
- *
- * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
- * on each column.  Direct algorithms are also available, but they are
- * much more complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on Arai, Agui, and Nakajima's algorithm for
- * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
- * Japanese, but the algorithm is described in the Pennebaker & Mitchell
- * JPEG textbook (see REFERENCES section in file README).  The following code
- * is based directly on figure 4-8 in P&M.
- * While an 8-point DCT cannot be done in less than 11 multiplies, it is
- * possible to arrange the computation so that many of the multiplies are
- * simple scalings of the final outputs.  These multiplies can then be
- * folded into the multiplications or divisions by the JPEG quantization
- * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
- * to be done in the DCT itself.
- * The primary disadvantage of this method is that with a fixed-point
- * implementation, accuracy is lost due to imprecise representation of the
- * scaled quantization values.  However, that problem does not arise if
- * we use floating point arithmetic.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-#ifdef DCT_FLOAT_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
-  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/*
- * Perform the forward DCT on one block of samples.
- */
-
-GLOBAL(void)
-jpeg_fdct_float (FAST_FLOAT * data)
-{
-  FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
-  FAST_FLOAT tmp10, tmp11, tmp12, tmp13;
-  FAST_FLOAT z1, z2, z3, z4, z5, z11, z13;
-  FAST_FLOAT *dataptr;
-  int ctr;
-
-  /* Pass 1: process rows. */
-
-  dataptr = data;
-  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
-    tmp0 = dataptr[0] + dataptr[7];
-    tmp7 = dataptr[0] - dataptr[7];
-    tmp1 = dataptr[1] + dataptr[6];
-    tmp6 = dataptr[1] - dataptr[6];
-    tmp2 = dataptr[2] + dataptr[5];
-    tmp5 = dataptr[2] - dataptr[5];
-    tmp3 = dataptr[3] + dataptr[4];
-    tmp4 = dataptr[3] - dataptr[4];
-
-    /* Even part */
-
-    tmp10 = tmp0 + tmp3;        /* phase 2 */
-    tmp13 = tmp0 - tmp3;
-    tmp11 = tmp1 + tmp2;
-    tmp12 = tmp1 - tmp2;
-
-    dataptr[0] = tmp10 + tmp11; /* phase 3 */
-    dataptr[4] = tmp10 - tmp11;
-
-    z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */
-    dataptr[2] = tmp13 + z1;    /* phase 5 */
-    dataptr[6] = tmp13 - z1;
-
-    /* Odd part */
-
-    tmp10 = tmp4 + tmp5;        /* phase 2 */
-    tmp11 = tmp5 + tmp6;
-    tmp12 = tmp6 + tmp7;
-
-    /* The rotator is modified from fig 4-8 to avoid extra negations. */
-    z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */
-    z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */
-    z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */
-    z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */
-
-    z11 = tmp7 + z3;            /* phase 5 */
-    z13 = tmp7 - z3;
-
-    dataptr[5] = z13 + z2;      /* phase 6 */
-    dataptr[3] = z13 - z2;
-    dataptr[1] = z11 + z4;
-    dataptr[7] = z11 - z4;
-
-    dataptr += DCTSIZE;         /* advance pointer to next row */
-  }
-
-  /* Pass 2: process columns. */
-
-  dataptr = data;
-  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
-    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
-    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
-    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
-    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
-    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
-    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
-    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
-    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
-
-    /* Even part */
-
-    tmp10 = tmp0 + tmp3;        /* phase 2 */
-    tmp13 = tmp0 - tmp3;
-    tmp11 = tmp1 + tmp2;
-    tmp12 = tmp1 - tmp2;
-
-    dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
-    dataptr[DCTSIZE*4] = tmp10 - tmp11;
-
-    z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */
-    dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
-    dataptr[DCTSIZE*6] = tmp13 - z1;
-
-    /* Odd part */
-
-    tmp10 = tmp4 + tmp5;        /* phase 2 */
-    tmp11 = tmp5 + tmp6;
-    tmp12 = tmp6 + tmp7;
-
-    /* The rotator is modified from fig 4-8 to avoid extra negations. */
-    z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */
-    z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */
-    z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */
-    z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */
-
-    z11 = tmp7 + z3;            /* phase 5 */
-    z13 = tmp7 - z3;
-
-    dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
-    dataptr[DCTSIZE*3] = z13 - z2;
-    dataptr[DCTSIZE*1] = z11 + z4;
-    dataptr[DCTSIZE*7] = z11 - z4;
-
-    dataptr++;                  /* advance pointer to next column */
-  }
-}
-
-#endif /* DCT_FLOAT_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jfdctfst.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,228 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jfdctfst.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a fast, not so accurate integer implementation of the
- * forward DCT (Discrete Cosine Transform).
- *
- * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
- * on each column.  Direct algorithms are also available, but they are
- * much more complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on Arai, Agui, and Nakajima's algorithm for
- * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
- * Japanese, but the algorithm is described in the Pennebaker & Mitchell
- * JPEG textbook (see REFERENCES section in file README).  The following code
- * is based directly on figure 4-8 in P&M.
- * While an 8-point DCT cannot be done in less than 11 multiplies, it is
- * possible to arrange the computation so that many of the multiplies are
- * simple scalings of the final outputs.  These multiplies can then be
- * folded into the multiplications or divisions by the JPEG quantization
- * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
- * to be done in the DCT itself.
- * The primary disadvantage of this method is that with fixed-point math,
- * accuracy is lost due to imprecise representation of the scaled
- * quantization values.  The smaller the quantization table entry, the less
- * precise the scaled value, so this implementation does worse with high-
- * quality-setting files than with low-quality ones.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-#ifdef DCT_IFAST_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
-  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/* Scaling decisions are generally the same as in the LL&M algorithm;
- * see jfdctint.c for more details.  However, we choose to descale
- * (right shift) multiplication products as soon as they are formed,
- * rather than carrying additional fractional bits into subsequent additions.
- * This compromises accuracy slightly, but it lets us save a few shifts.
- * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
- * everywhere except in the multiplications proper; this saves a good deal
- * of work on 16-bit-int machines.
- *
- * Again to save a few shifts, the intermediate results between pass 1 and
- * pass 2 are not upscaled, but are represented only to integral precision.
- *
- * A final compromise is to represent the multiplicative constants to only
- * 8 fractional bits, rather than 13.  This saves some shifting work on some
- * machines, and may also reduce the cost of multiplication (since there
- * are fewer one-bits in the constants).
- */
-
-#define CONST_BITS  8
-
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 8
-#define FIX_0_382683433  ((INT32)   98)         /* FIX(0.382683433) */
-#define FIX_0_541196100  ((INT32)  139)         /* FIX(0.541196100) */
-#define FIX_0_707106781  ((INT32)  181)         /* FIX(0.707106781) */
-#define FIX_1_306562965  ((INT32)  334)         /* FIX(1.306562965) */
-#else
-#define FIX_0_382683433  FIX(0.382683433)
-#define FIX_0_541196100  FIX(0.541196100)
-#define FIX_0_707106781  FIX(0.707106781)
-#define FIX_1_306562965  FIX(1.306562965)
-#endif
-
-
-/* We can gain a little more speed, with a further compromise in accuracy,
- * by omitting the addition in a descaling shift.  This yields an incorrectly
- * rounded result half the time...
- */
-
-#ifndef USE_ACCURATE_ROUNDING
-#undef DESCALE
-#define DESCALE(x,n)  RIGHT_SHIFT(x, n)
-#endif
-
-
-/* Multiply a DCTELEM variable by an INT32 constant, and immediately
- * descale to yield a DCTELEM result.
- */
-
-#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
-
-
-/*
- * Perform the forward DCT on one block of samples.
- */
-
-GLOBAL(void)
-jpeg_fdct_ifast (DCTELEM * data)
-{
-  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
-  DCTELEM tmp10, tmp11, tmp12, tmp13;
-  DCTELEM z1, z2, z3, z4, z5, z11, z13;
-  DCTELEM *dataptr;
-  int ctr;
-  SHIFT_TEMPS
-
-  /* Pass 1: process rows. */
-
-  dataptr = data;
-  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
-    tmp0 = dataptr[0] + dataptr[7];
-    tmp7 = dataptr[0] - dataptr[7];
-    tmp1 = dataptr[1] + dataptr[6];
-    tmp6 = dataptr[1] - dataptr[6];
-    tmp2 = dataptr[2] + dataptr[5];
-    tmp5 = dataptr[2] - dataptr[5];
-    tmp3 = dataptr[3] + dataptr[4];
-    tmp4 = dataptr[3] - dataptr[4];
-
-    /* Even part */
-
-    tmp10 = tmp0 + tmp3;        /* phase 2 */
-    tmp13 = tmp0 - tmp3;
-    tmp11 = tmp1 + tmp2;
-    tmp12 = tmp1 - tmp2;
-
-    dataptr[0] = tmp10 + tmp11; /* phase 3 */
-    dataptr[4] = tmp10 - tmp11;
-
-    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
-    dataptr[2] = tmp13 + z1;    /* phase 5 */
-    dataptr[6] = tmp13 - z1;
-
-    /* Odd part */
-
-    tmp10 = tmp4 + tmp5;        /* phase 2 */
-    tmp11 = tmp5 + tmp6;
-    tmp12 = tmp6 + tmp7;
-
-    /* The rotator is modified from fig 4-8 to avoid extra negations. */
-    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
-    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
-    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
-    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
-
-    z11 = tmp7 + z3;            /* phase 5 */
-    z13 = tmp7 - z3;
-
-    dataptr[5] = z13 + z2;      /* phase 6 */
-    dataptr[3] = z13 - z2;
-    dataptr[1] = z11 + z4;
-    dataptr[7] = z11 - z4;
-
-    dataptr += DCTSIZE;         /* advance pointer to next row */
-  }
-
-  /* Pass 2: process columns. */
-
-  dataptr = data;
-  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
-    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
-    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
-    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
-    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
-    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
-    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
-    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
-    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
-
-    /* Even part */
-
-    tmp10 = tmp0 + tmp3;        /* phase 2 */
-    tmp13 = tmp0 - tmp3;
-    tmp11 = tmp1 + tmp2;
-    tmp12 = tmp1 - tmp2;
-
-    dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
-    dataptr[DCTSIZE*4] = tmp10 - tmp11;
-
-    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
-    dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
-    dataptr[DCTSIZE*6] = tmp13 - z1;
-
-    /* Odd part */
-
-    tmp10 = tmp4 + tmp5;        /* phase 2 */
-    tmp11 = tmp5 + tmp6;
-    tmp12 = tmp6 + tmp7;
-
-    /* The rotator is modified from fig 4-8 to avoid extra negations. */
-    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
-    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
-    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
-    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
-
-    z11 = tmp7 + z3;            /* phase 5 */
-    z13 = tmp7 - z3;
-
-    dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
-    dataptr[DCTSIZE*3] = z13 - z2;
-    dataptr[DCTSIZE*1] = z11 + z4;
-    dataptr[DCTSIZE*7] = z11 - z4;
-
-    dataptr++;                  /* advance pointer to next column */
-  }
-}
-
-#endif /* DCT_IFAST_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jfdctint.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,287 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jfdctint.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a slow-but-accurate integer implementation of the
- * forward DCT (Discrete Cosine Transform).
- *
- * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
- * on each column.  Direct algorithms are also available, but they are
- * much more complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on an algorithm described in
- *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
- *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
- *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
- * The primary algorithm described there uses 11 multiplies and 29 adds.
- * We use their alternate method with 12 multiplies and 32 adds.
- * The advantage of this method is that no data path contains more than one
- * multiplication; this allows a very simple and accurate implementation in
- * scaled fixed-point arithmetic, with a minimal number of shifts.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-#ifdef DCT_ISLOW_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
-  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/*
- * The poop on this scaling stuff is as follows:
- *
- * Each 1-D DCT step produces outputs which are a factor of sqrt(N)
- * larger than the true DCT outputs.  The final outputs are therefore
- * a factor of N larger than desired; since N=8 this can be cured by
- * a simple right shift at the end of the algorithm.  The advantage of
- * this arrangement is that we save two multiplications per 1-D DCT,
- * because the y0 and y4 outputs need not be divided by sqrt(N).
- * In the IJG code, this factor of 8 is removed by the quantization step
- * (in jcdctmgr.c), NOT in this module.
- *
- * We have to do addition and subtraction of the integer inputs, which
- * is no problem, and multiplication by fractional constants, which is
- * a problem to do in integer arithmetic.  We multiply all the constants
- * by CONST_SCALE and convert them to integer constants (thus retaining
- * CONST_BITS bits of precision in the constants).  After doing a
- * multiplication we have to divide the product by CONST_SCALE, with proper
- * rounding, to produce the correct output.  This division can be done
- * cheaply as a right shift of CONST_BITS bits.  We postpone shifting
- * as long as possible so that partial sums can be added together with
- * full fractional precision.
- *
- * The outputs of the first pass are scaled up by PASS1_BITS bits so that
- * they are represented to better-than-integral precision.  These outputs
- * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
- * with the recommended scaling.  (For 12-bit sample data, the intermediate
- * array is INT32 anyway.)
- *
- * To avoid overflow of the 32-bit intermediate results in pass 2, we must
- * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis
- * shows that the values given below are the most effective.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define CONST_BITS  13
-#define PASS1_BITS  2
-#else
-#define CONST_BITS  13
-#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
-#endif
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 13
-#define FIX_0_298631336  ((INT32)  2446)        /* FIX(0.298631336) */
-#define FIX_0_390180644  ((INT32)  3196)        /* FIX(0.390180644) */
-#define FIX_0_541196100  ((INT32)  4433)        /* FIX(0.541196100) */
-#define FIX_0_765366865  ((INT32)  6270)        /* FIX(0.765366865) */
-#define FIX_0_899976223  ((INT32)  7373)        /* FIX(0.899976223) */
-#define FIX_1_175875602  ((INT32)  9633)        /* FIX(1.175875602) */
-#define FIX_1_501321110  ((INT32)  12299)       /* FIX(1.501321110) */
-#define FIX_1_847759065  ((INT32)  15137)       /* FIX(1.847759065) */
-#define FIX_1_961570560  ((INT32)  16069)       /* FIX(1.961570560) */
-#define FIX_2_053119869  ((INT32)  16819)       /* FIX(2.053119869) */
-#define FIX_2_562915447  ((INT32)  20995)       /* FIX(2.562915447) */
-#define FIX_3_072711026  ((INT32)  25172)       /* FIX(3.072711026) */
-#else
-#define FIX_0_298631336  FIX(0.298631336)
-#define FIX_0_390180644  FIX(0.390180644)
-#define FIX_0_541196100  FIX(0.541196100)
-#define FIX_0_765366865  FIX(0.765366865)
-#define FIX_0_899976223  FIX(0.899976223)
-#define FIX_1_175875602  FIX(1.175875602)
-#define FIX_1_501321110  FIX(1.501321110)
-#define FIX_1_847759065  FIX(1.847759065)
-#define FIX_1_961570560  FIX(1.961570560)
-#define FIX_2_053119869  FIX(2.053119869)
-#define FIX_2_562915447  FIX(2.562915447)
-#define FIX_3_072711026  FIX(3.072711026)
-#endif
-
-
-/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
- * For 8-bit samples with the recommended scaling, all the variable
- * and constant values involved are no more than 16 bits wide, so a
- * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
- * For 12-bit samples, a full 32-bit multiplication will be needed.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
-#else
-#define MULTIPLY(var,const)  ((var) * (const))
-#endif
-
-
-/*
- * Perform the forward DCT on one block of samples.
- */
-
-GLOBAL(void)
-jpeg_fdct_islow (DCTELEM * data)
-{
-  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
-  INT32 tmp10, tmp11, tmp12, tmp13;
-  INT32 z1, z2, z3, z4, z5;
-  DCTELEM *dataptr;
-  int ctr;
-  SHIFT_TEMPS
-
-  /* Pass 1: process rows. */
-  /* Note results are scaled up by sqrt(8) compared to a true DCT; */
-  /* furthermore, we scale the results by 2**PASS1_BITS. */
-
-  dataptr = data;
-  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
-    tmp0 = dataptr[0] + dataptr[7];
-    tmp7 = dataptr[0] - dataptr[7];
-    tmp1 = dataptr[1] + dataptr[6];
-    tmp6 = dataptr[1] - dataptr[6];
-    tmp2 = dataptr[2] + dataptr[5];
-    tmp5 = dataptr[2] - dataptr[5];
-    tmp3 = dataptr[3] + dataptr[4];
-    tmp4 = dataptr[3] - dataptr[4];
-
-    /* Even part per LL&M figure 1 --- note that published figure is faulty;
-     * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
-     */
-
-    tmp10 = tmp0 + tmp3;
-    tmp13 = tmp0 - tmp3;
-    tmp11 = tmp1 + tmp2;
-    tmp12 = tmp1 - tmp2;
-
-    dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
-    dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
-
-    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
-    dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
-                                   CONST_BITS-PASS1_BITS);
-    dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
-                                   CONST_BITS-PASS1_BITS);
-
-    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
-     * cK represents cos(K*pi/16).
-     * i0..i3 in the paper are tmp4..tmp7 here.
-     */
-
-    z1 = tmp4 + tmp7;
-    z2 = tmp5 + tmp6;
-    z3 = tmp4 + tmp6;
-    z4 = tmp5 + tmp7;
-    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
-
-    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
-    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
-    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
-    tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
-    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
-    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
-    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
-    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
-
-    z3 += z5;
-    z4 += z5;
-
-    dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
-    dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
-    dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
-    dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
-
-    dataptr += DCTSIZE;         /* advance pointer to next row */
-  }
-
-  /* Pass 2: process columns.
-   * We remove the PASS1_BITS scaling, but leave the results scaled up
-   * by an overall factor of 8.
-   */
-
-  dataptr = data;
-  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
-    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
-    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
-    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
-    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
-    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
-    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
-    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
-    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
-
-    /* Even part per LL&M figure 1 --- note that published figure is faulty;
-     * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
-     */
-
-    tmp10 = tmp0 + tmp3;
-    tmp13 = tmp0 - tmp3;
-    tmp11 = tmp1 + tmp2;
-    tmp12 = tmp1 - tmp2;
-
-    dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
-    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
-
-    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
-    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
-                                           CONST_BITS+PASS1_BITS);
-    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
-                                           CONST_BITS+PASS1_BITS);
-
-    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
-     * cK represents cos(K*pi/16).
-     * i0..i3 in the paper are tmp4..tmp7 here.
-     */
-
-    z1 = tmp4 + tmp7;
-    z2 = tmp5 + tmp6;
-    z3 = tmp4 + tmp6;
-    z4 = tmp5 + tmp7;
-    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
-
-    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
-    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
-    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
-    tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
-    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
-    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
-    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
-    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
-
-    z3 += z5;
-    z4 += z5;
-
-    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
-                                           CONST_BITS+PASS1_BITS);
-    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
-                                           CONST_BITS+PASS1_BITS);
-    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
-                                           CONST_BITS+PASS1_BITS);
-    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
-                                           CONST_BITS+PASS1_BITS);
-
-    dataptr++;                  /* advance pointer to next column */
-  }
-}
-
-#endif /* DCT_ISLOW_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jidctflt.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,246 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jidctflt.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a floating-point implementation of the
- * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine
- * must also perform dequantization of the input coefficients.
- *
- * This implementation should be more accurate than either of the integer
- * IDCT implementations.  However, it may not give the same results on all
- * machines because of differences in roundoff behavior.  Speed will depend
- * on the hardware's floating point capacity.
- *
- * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
- * on each row (or vice versa, but it's more convenient to emit a row at
- * a time).  Direct algorithms are also available, but they are much more
- * complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on Arai, Agui, and Nakajima's algorithm for
- * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
- * Japanese, but the algorithm is described in the Pennebaker & Mitchell
- * JPEG textbook (see REFERENCES section in file README).  The following code
- * is based directly on figure 4-8 in P&M.
- * While an 8-point DCT cannot be done in less than 11 multiplies, it is
- * possible to arrange the computation so that many of the multiplies are
- * simple scalings of the final outputs.  These multiplies can then be
- * folded into the multiplications or divisions by the JPEG quantization
- * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
- * to be done in the DCT itself.
- * The primary disadvantage of this method is that with a fixed-point
- * implementation, accuracy is lost due to imprecise representation of the
- * scaled quantization values.  However, that problem does not arise if
- * we use floating point arithmetic.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-#ifdef DCT_FLOAT_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
-  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/* Dequantize a coefficient by multiplying it by the multiplier-table
- * entry; produce a float result.
- */
-
-#define DEQUANTIZE(coef,quantval)  (((FAST_FLOAT) (coef)) * (quantval))
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients.
- */
-
-GLOBAL(void)
-jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-                 JCOEFPTR coef_block,
-                 JSAMPARRAY output_buf, JDIMENSION output_col)
-{
-  FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
-  FAST_FLOAT tmp10, tmp11, tmp12, tmp13;
-  FAST_FLOAT z5, z10, z11, z12, z13;
-  JCOEFPTR inptr;
-  FLOAT_MULT_TYPE * quantptr;
-  FAST_FLOAT * wsptr;
-  JSAMPROW outptr;
-  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
-  int ctr;
-  FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */
-  SHIFT_TEMPS
-
-  /* Pass 1: process columns from input, store into work array. */
-
-  inptr = coef_block;
-  quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table;
-  wsptr = workspace;
-  for (ctr = DCTSIZE; ctr > 0; ctr--) {
-    /* Due to quantization, we will usually find that many of the input
-     * coefficients are zero, especially the AC terms.  We can exploit this
-     * by short-circuiting the IDCT calculation for any column in which all
-     * the AC terms are zero.  In that case each output is equal to the
-     * DC coefficient (with scale factor as needed).
-     * With typical images and quantization tables, half or more of the
-     * column DCT calculations can be simplified this way.
-     */
-
-    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
-        inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
-        inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
-        inptr[DCTSIZE*7] == 0) {
-      /* AC terms all zero */
-      FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-
-      wsptr[DCTSIZE*0] = dcval;
-      wsptr[DCTSIZE*1] = dcval;
-      wsptr[DCTSIZE*2] = dcval;
-      wsptr[DCTSIZE*3] = dcval;
-      wsptr[DCTSIZE*4] = dcval;
-      wsptr[DCTSIZE*5] = dcval;
-      wsptr[DCTSIZE*6] = dcval;
-      wsptr[DCTSIZE*7] = dcval;
-
-      inptr++;                  /* advance pointers to next column */
-      quantptr++;
-      wsptr++;
-      continue;
-    }
-
-    /* Even part */
-
-    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-    tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
-    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
-    tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
-    tmp10 = tmp0 + tmp2;        /* phase 3 */
-    tmp11 = tmp0 - tmp2;
-
-    tmp13 = tmp1 + tmp3;        /* phases 5-3 */
-    tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */
-
-    tmp0 = tmp10 + tmp13;       /* phase 2 */
-    tmp3 = tmp10 - tmp13;
-    tmp1 = tmp11 + tmp12;
-    tmp2 = tmp11 - tmp12;
-
-    /* Odd part */
-
-    tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-    tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
-    tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
-    tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
-
-    z13 = tmp6 + tmp5;          /* phase 6 */
-    z10 = tmp6 - tmp5;
-    z11 = tmp4 + tmp7;
-    z12 = tmp4 - tmp7;
-
-    tmp7 = z11 + z13;           /* phase 5 */
-    tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */
-
-    z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */
-    tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */
-    tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */
-
-    tmp6 = tmp12 - tmp7;        /* phase 2 */
-    tmp5 = tmp11 - tmp6;
-    tmp4 = tmp10 + tmp5;
-
-    wsptr[DCTSIZE*0] = tmp0 + tmp7;
-    wsptr[DCTSIZE*7] = tmp0 - tmp7;
-    wsptr[DCTSIZE*1] = tmp1 + tmp6;
-    wsptr[DCTSIZE*6] = tmp1 - tmp6;
-    wsptr[DCTSIZE*2] = tmp2 + tmp5;
-    wsptr[DCTSIZE*5] = tmp2 - tmp5;
-    wsptr[DCTSIZE*4] = tmp3 + tmp4;
-    wsptr[DCTSIZE*3] = tmp3 - tmp4;
-
-    inptr++;                    /* advance pointers to next column */
-    quantptr++;
-    wsptr++;
-  }
-
-  /* Pass 2: process rows from work array, store into output array. */
-  /* Note that we must descale the results by a factor of 8 == 2**3. */
-
-  wsptr = workspace;
-  for (ctr = 0; ctr < DCTSIZE; ctr++) {
-    outptr = output_buf[ctr] + output_col;
-    /* Rows of zeroes can be exploited in the same way as we did with columns.
-     * However, the column calculation has created many nonzero AC terms, so
-     * the simplification applies less often (typically 5% to 10% of the time).
-     * And testing floats for zero is relatively expensive, so we don't bother.
-     */
-
-    /* Even part */
-
-    tmp10 = wsptr[0] + wsptr[4];
-    tmp11 = wsptr[0] - wsptr[4];
-
-    tmp13 = wsptr[2] + wsptr[6];
-    tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13;
-
-    tmp0 = tmp10 + tmp13;
-    tmp3 = tmp10 - tmp13;
-    tmp1 = tmp11 + tmp12;
-    tmp2 = tmp11 - tmp12;
-
-    /* Odd part */
-
-    z13 = wsptr[5] + wsptr[3];
-    z10 = wsptr[5] - wsptr[3];
-    z11 = wsptr[1] + wsptr[7];
-    z12 = wsptr[1] - wsptr[7];
-
-    tmp7 = z11 + z13;
-    tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562);
-
-    z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */
-    tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */
-    tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */
-
-    tmp6 = tmp12 - tmp7;
-    tmp5 = tmp11 - tmp6;
-    tmp4 = tmp10 + tmp5;
-
-    /* Final output stage: scale down by a factor of 8 and range-limit */
-
-    outptr[0] = range_limit[(int) DESCALE((INT32) (tmp0 + tmp7), 3)
-                            & RANGE_MASK];
-    outptr[7] = range_limit[(int) DESCALE((INT32) (tmp0 - tmp7), 3)
-                            & RANGE_MASK];
-    outptr[1] = range_limit[(int) DESCALE((INT32) (tmp1 + tmp6), 3)
-                            & RANGE_MASK];
-    outptr[6] = range_limit[(int) DESCALE((INT32) (tmp1 - tmp6), 3)
-                            & RANGE_MASK];
-    outptr[2] = range_limit[(int) DESCALE((INT32) (tmp2 + tmp5), 3)
-                            & RANGE_MASK];
-    outptr[5] = range_limit[(int) DESCALE((INT32) (tmp2 - tmp5), 3)
-                            & RANGE_MASK];
-    outptr[4] = range_limit[(int) DESCALE((INT32) (tmp3 + tmp4), 3)
-                            & RANGE_MASK];
-    outptr[3] = range_limit[(int) DESCALE((INT32) (tmp3 - tmp4), 3)
-                            & RANGE_MASK];
-
-    wsptr += DCTSIZE;           /* advance pointer to next row */
-  }
-}
-
-#endif /* DCT_FLOAT_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jidctfst.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,372 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jidctfst.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a fast, not so accurate integer implementation of the
- * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine
- * must also perform dequantization of the input coefficients.
- *
- * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
- * on each row (or vice versa, but it's more convenient to emit a row at
- * a time).  Direct algorithms are also available, but they are much more
- * complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on Arai, Agui, and Nakajima's algorithm for
- * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
- * Japanese, but the algorithm is described in the Pennebaker & Mitchell
- * JPEG textbook (see REFERENCES section in file README).  The following code
- * is based directly on figure 4-8 in P&M.
- * While an 8-point DCT cannot be done in less than 11 multiplies, it is
- * possible to arrange the computation so that many of the multiplies are
- * simple scalings of the final outputs.  These multiplies can then be
- * folded into the multiplications or divisions by the JPEG quantization
- * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
- * to be done in the DCT itself.
- * The primary disadvantage of this method is that with fixed-point math,
- * accuracy is lost due to imprecise representation of the scaled
- * quantization values.  The smaller the quantization table entry, the less
- * precise the scaled value, so this implementation does worse with high-
- * quality-setting files than with low-quality ones.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-#ifdef DCT_IFAST_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
-  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/* Scaling decisions are generally the same as in the LL&M algorithm;
- * see jidctint.c for more details.  However, we choose to descale
- * (right shift) multiplication products as soon as they are formed,
- * rather than carrying additional fractional bits into subsequent additions.
- * This compromises accuracy slightly, but it lets us save a few shifts.
- * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
- * everywhere except in the multiplications proper; this saves a good deal
- * of work on 16-bit-int machines.
- *
- * The dequantized coefficients are not integers because the AA&N scaling
- * factors have been incorporated.  We represent them scaled up by PASS1_BITS,
- * so that the first and second IDCT rounds have the same input scaling.
- * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to
- * avoid a descaling shift; this compromises accuracy rather drastically
- * for small quantization table entries, but it saves a lot of shifts.
- * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway,
- * so we use a much larger scaling factor to preserve accuracy.
- *
- * A final compromise is to represent the multiplicative constants to only
- * 8 fractional bits, rather than 13.  This saves some shifting work on some
- * machines, and may also reduce the cost of multiplication (since there
- * are fewer one-bits in the constants).
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define CONST_BITS  8
-#define PASS1_BITS  2
-#else
-#define CONST_BITS  8
-#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
-#endif
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 8
-#define FIX_1_082392200  ((INT32)  277)         /* FIX(1.082392200) */
-#define FIX_1_414213562  ((INT32)  362)         /* FIX(1.414213562) */
-#define FIX_1_847759065  ((INT32)  473)         /* FIX(1.847759065) */
-#define FIX_2_613125930  ((INT32)  669)         /* FIX(2.613125930) */
-#else
-#define FIX_1_082392200  FIX(1.082392200)
-#define FIX_1_414213562  FIX(1.414213562)
-#define FIX_1_847759065  FIX(1.847759065)
-#define FIX_2_613125930  FIX(2.613125930)
-#endif
-
-
-/* We can gain a little more speed, with a further compromise in accuracy,
- * by omitting the addition in a descaling shift.  This yields an incorrectly
- * rounded result half the time...
- */
-
-#ifndef USE_ACCURATE_ROUNDING
-#undef DESCALE
-#define DESCALE(x,n)  RIGHT_SHIFT(x, n)
-#endif
-
-
-/* Multiply a DCTELEM variable by an INT32 constant, and immediately
- * descale to yield a DCTELEM result.
- */
-
-#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
-
-
-/* Dequantize a coefficient by multiplying it by the multiplier-table
- * entry; produce a DCTELEM result.  For 8-bit data a 16x16->16
- * multiplication will do.  For 12-bit data, the multiplier table is
- * declared INT32, so a 32-bit multiply will be used.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define DEQUANTIZE(coef,quantval)  (((IFAST_MULT_TYPE) (coef)) * (quantval))
-#else
-#define DEQUANTIZE(coef,quantval)  \
-        DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS)
-#endif
-
-
-/* Like DESCALE, but applies to a DCTELEM and produces an int.
- * We assume that int right shift is unsigned if INT32 right shift is.
- */
-
-#ifdef RIGHT_SHIFT_IS_UNSIGNED
-#define ISHIFT_TEMPS    DCTELEM ishift_temp;
-#if BITS_IN_JSAMPLE == 8
-#define DCTELEMBITS  16         /* DCTELEM may be 16 or 32 bits */
-#else
-#define DCTELEMBITS  32         /* DCTELEM must be 32 bits */
-#endif
-#define IRIGHT_SHIFT(x,shft)  \
-    ((ishift_temp = (x)) < 0 ? \
-     (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \
-     (ishift_temp >> (shft)))
-#else
-#define ISHIFT_TEMPS
-#define IRIGHT_SHIFT(x,shft)    ((x) >> (shft))
-#endif
-
-#ifdef USE_ACCURATE_ROUNDING
-#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))
-#else
-#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT(x, n))
-#endif
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients.
- */
-
-GLOBAL(void)
-jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-                 JCOEFPTR coef_block,
-                 JSAMPARRAY output_buf, JDIMENSION output_col)
-{
-  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
-  DCTELEM tmp10, tmp11, tmp12, tmp13;
-  DCTELEM z5, z10, z11, z12, z13;
-  JCOEFPTR inptr;
-  IFAST_MULT_TYPE * quantptr;
-  int * wsptr;
-  JSAMPROW outptr;
-  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
-  int ctr;
-  int workspace[DCTSIZE2];      /* buffers data between passes */
-  SHIFT_TEMPS                   /* for DESCALE */
-  ISHIFT_TEMPS                  /* for IDESCALE */
-
-  /* Pass 1: process columns from input, store into work array. */
-
-  inptr = coef_block;
-  quantptr = (IFAST_MULT_TYPE *) compptr->dct_table;
-  wsptr = workspace;
-  for (ctr = DCTSIZE; ctr > 0; ctr--) {
-    /* Due to quantization, we will usually find that many of the input
-     * coefficients are zero, especially the AC terms.  We can exploit this
-     * by short-circuiting the IDCT calculation for any column in which all
-     * the AC terms are zero.  In that case each output is equal to the
-     * DC coefficient (with scale factor as needed).
-     * With typical images and quantization tables, half or more of the
-     * column DCT calculations can be simplified this way.
-     */
-
-    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
-        inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
-        inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
-        inptr[DCTSIZE*7] == 0) {
-      /* AC terms all zero */
-      int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-
-      wsptr[DCTSIZE*0] = dcval;
-      wsptr[DCTSIZE*1] = dcval;
-      wsptr[DCTSIZE*2] = dcval;
-      wsptr[DCTSIZE*3] = dcval;
-      wsptr[DCTSIZE*4] = dcval;
-      wsptr[DCTSIZE*5] = dcval;
-      wsptr[DCTSIZE*6] = dcval;
-      wsptr[DCTSIZE*7] = dcval;
-
-      inptr++;                  /* advance pointers to next column */
-      quantptr++;
-      wsptr++;
-      continue;
-    }
-
-    /* Even part */
-
-    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-    tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
-    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
-    tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
-    tmp10 = tmp0 + tmp2;        /* phase 3 */
-    tmp11 = tmp0 - tmp2;
-
-    tmp13 = tmp1 + tmp3;        /* phases 5-3 */
-    tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */
-
-    tmp0 = tmp10 + tmp13;       /* phase 2 */
-    tmp3 = tmp10 - tmp13;
-    tmp1 = tmp11 + tmp12;
-    tmp2 = tmp11 - tmp12;
-
-    /* Odd part */
-
-    tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-    tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
-    tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
-    tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
-
-    z13 = tmp6 + tmp5;          /* phase 6 */
-    z10 = tmp6 - tmp5;
-    z11 = tmp4 + tmp7;
-    z12 = tmp4 - tmp7;
-
-    tmp7 = z11 + z13;           /* phase 5 */
-    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
-
-    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
-    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
-    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
-
-    tmp6 = tmp12 - tmp7;        /* phase 2 */
-    tmp5 = tmp11 - tmp6;
-    tmp4 = tmp10 + tmp5;
-
-    wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);
-    wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);
-    wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);
-    wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);
-    wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);
-    wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);
-    wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);
-    wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);
-
-    inptr++;                    /* advance pointers to next column */
-    quantptr++;
-    wsptr++;
-  }
-
-  /* Pass 2: process rows from work array, store into output array. */
-  /* Note that we must descale the results by a factor of 8 == 2**3, */
-  /* and also undo the PASS1_BITS scaling. */
-
-  wsptr = workspace;
-  for (ctr = 0; ctr < DCTSIZE; ctr++) {
-    outptr = output_buf[ctr] + output_col;
-    /* Rows of zeroes can be exploited in the same way as we did with columns.
-     * However, the column calculation has created many nonzero AC terms, so
-     * the simplification applies less often (typically 5% to 10% of the time).
-     * On machines with very fast multiplication, it's possible that the
-     * test takes more time than it's worth.  In that case this section
-     * may be commented out.
-     */
-
-#ifndef NO_ZERO_ROW_TEST
-    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
-        wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
-      /* AC terms all zero */
-      JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)
-                                  & RANGE_MASK];
-
-      outptr[0] = dcval;
-      outptr[1] = dcval;
-      outptr[2] = dcval;
-      outptr[3] = dcval;
-      outptr[4] = dcval;
-      outptr[5] = dcval;
-      outptr[6] = dcval;
-      outptr[7] = dcval;
-
-      wsptr += DCTSIZE;         /* advance pointer to next row */
-      continue;
-    }
-#endif
-
-    /* Even part */
-
-    tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
-    tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
-
-    tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
-    tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)
-            - tmp13;
-
-    tmp0 = tmp10 + tmp13;
-    tmp3 = tmp10 - tmp13;
-    tmp1 = tmp11 + tmp12;
-    tmp2 = tmp11 - tmp12;
-
-    /* Odd part */
-
-    z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];
-    z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];
-    z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];
-    z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];
-
-    tmp7 = z11 + z13;           /* phase 5 */
-    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
-
-    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
-    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
-    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
-
-    tmp6 = tmp12 - tmp7;        /* phase 2 */
-    tmp5 = tmp11 - tmp6;
-    tmp4 = tmp10 + tmp5;
-
-    /* Final output stage: scale down by a factor of 8 and range-limit */
-
-    outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
-                            & RANGE_MASK];
-
-    wsptr += DCTSIZE;           /* advance pointer to next row */
-  }
-}
-
-#endif /* DCT_IFAST_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jidctint.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,393 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jidctint.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a slow-but-accurate integer implementation of the
- * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine
- * must also perform dequantization of the input coefficients.
- *
- * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
- * on each row (or vice versa, but it's more convenient to emit a row at
- * a time).  Direct algorithms are also available, but they are much more
- * complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on an algorithm described in
- *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
- *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
- *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
- * The primary algorithm described there uses 11 multiplies and 29 adds.
- * We use their alternate method with 12 multiplies and 32 adds.
- * The advantage of this method is that no data path contains more than one
- * multiplication; this allows a very simple and accurate implementation in
- * scaled fixed-point arithmetic, with a minimal number of shifts.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-#ifdef DCT_ISLOW_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
-  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/*
- * The poop on this scaling stuff is as follows:
- *
- * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
- * larger than the true IDCT outputs.  The final outputs are therefore
- * a factor of N larger than desired; since N=8 this can be cured by
- * a simple right shift at the end of the algorithm.  The advantage of
- * this arrangement is that we save two multiplications per 1-D IDCT,
- * because the y0 and y4 inputs need not be divided by sqrt(N).
- *
- * We have to do addition and subtraction of the integer inputs, which
- * is no problem, and multiplication by fractional constants, which is
- * a problem to do in integer arithmetic.  We multiply all the constants
- * by CONST_SCALE and convert them to integer constants (thus retaining
- * CONST_BITS bits of precision in the constants).  After doing a
- * multiplication we have to divide the product by CONST_SCALE, with proper
- * rounding, to produce the correct output.  This division can be done
- * cheaply as a right shift of CONST_BITS bits.  We postpone shifting
- * as long as possible so that partial sums can be added together with
- * full fractional precision.
- *
- * The outputs of the first pass are scaled up by PASS1_BITS bits so that
- * they are represented to better-than-integral precision.  These outputs
- * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
- * with the recommended scaling.  (To scale up 12-bit sample data further, an
- * intermediate INT32 array would be needed.)
- *
- * To avoid overflow of the 32-bit intermediate results in pass 2, we must
- * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis
- * shows that the values given below are the most effective.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define CONST_BITS  13
-#define PASS1_BITS  2
-#else
-#define CONST_BITS  13
-#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
-#endif
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 13
-#define FIX_0_298631336  ((INT32)  2446)        /* FIX(0.298631336) */
-#define FIX_0_390180644  ((INT32)  3196)        /* FIX(0.390180644) */
-#define FIX_0_541196100  ((INT32)  4433)        /* FIX(0.541196100) */
-#define FIX_0_765366865  ((INT32)  6270)        /* FIX(0.765366865) */
-#define FIX_0_899976223  ((INT32)  7373)        /* FIX(0.899976223) */
-#define FIX_1_175875602  ((INT32)  9633)        /* FIX(1.175875602) */
-#define FIX_1_501321110  ((INT32)  12299)       /* FIX(1.501321110) */
-#define FIX_1_847759065  ((INT32)  15137)       /* FIX(1.847759065) */
-#define FIX_1_961570560  ((INT32)  16069)       /* FIX(1.961570560) */
-#define FIX_2_053119869  ((INT32)  16819)       /* FIX(2.053119869) */
-#define FIX_2_562915447  ((INT32)  20995)       /* FIX(2.562915447) */
-#define FIX_3_072711026  ((INT32)  25172)       /* FIX(3.072711026) */
-#else
-#define FIX_0_298631336  FIX(0.298631336)
-#define FIX_0_390180644  FIX(0.390180644)
-#define FIX_0_541196100  FIX(0.541196100)
-#define FIX_0_765366865  FIX(0.765366865)
-#define FIX_0_899976223  FIX(0.899976223)
-#define FIX_1_175875602  FIX(1.175875602)
-#define FIX_1_501321110  FIX(1.501321110)
-#define FIX_1_847759065  FIX(1.847759065)
-#define FIX_1_961570560  FIX(1.961570560)
-#define FIX_2_053119869  FIX(2.053119869)
-#define FIX_2_562915447  FIX(2.562915447)
-#define FIX_3_072711026  FIX(3.072711026)
-#endif
-
-
-/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
- * For 8-bit samples with the recommended scaling, all the variable
- * and constant values involved are no more than 16 bits wide, so a
- * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
- * For 12-bit samples, a full 32-bit multiplication will be needed.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
-#else
-#define MULTIPLY(var,const)  ((var) * (const))
-#endif
-
-
-/* Dequantize a coefficient by multiplying it by the multiplier-table
- * entry; produce an int result.  In this module, both inputs and result
- * are 16 bits or less, so either int or short multiply will work.
- */
-
-#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients.
- */
-
-GLOBAL(void)
-jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-                 JCOEFPTR coef_block,
-                 JSAMPARRAY output_buf, JDIMENSION output_col)
-{
-  INT32 tmp0, tmp1, tmp2, tmp3;
-  INT32 tmp10, tmp11, tmp12, tmp13;
-  INT32 z1, z2, z3, z4, z5;
-  JCOEFPTR inptr;
-  ISLOW_MULT_TYPE * quantptr;
-  int * wsptr;
-  JSAMPROW outptr;
-  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
-  int ctr;
-  int workspace[DCTSIZE2];      /* buffers data between passes */
-  SHIFT_TEMPS
-
-  /* Pass 1: process columns from input, store into work array. */
-  /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
-  /* furthermore, we scale the results by 2**PASS1_BITS. */
-
-  inptr = coef_block;
-  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
-  wsptr = workspace;
-  for (ctr = DCTSIZE; ctr > 0; ctr--) {
-    /* Due to quantization, we will usually find that many of the input
-     * coefficients are zero, especially the AC terms.  We can exploit this
-     * by short-circuiting the IDCT calculation for any column in which all
-     * the AC terms are zero.  In that case each output is equal to the
-     * DC coefficient (with scale factor as needed).
-     * With typical images and quantization tables, half or more of the
-     * column DCT calculations can be simplified this way.
-     */
-
-    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
-        inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
-        inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
-        inptr[DCTSIZE*7] == 0) {
-      /* AC terms all zero */
-      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
-
-      wsptr[DCTSIZE*0] = dcval;
-      wsptr[DCTSIZE*1] = dcval;
-      wsptr[DCTSIZE*2] = dcval;
-      wsptr[DCTSIZE*3] = dcval;
-      wsptr[DCTSIZE*4] = dcval;
-      wsptr[DCTSIZE*5] = dcval;
-      wsptr[DCTSIZE*6] = dcval;
-      wsptr[DCTSIZE*7] = dcval;
-
-      inptr++;                  /* advance pointers to next column */
-      quantptr++;
-      wsptr++;
-      continue;
-    }
-
-    /* Even part: reverse the even part of the forward DCT. */
-    /* The rotator is sqrt(2)*c(-6). */
-
-    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
-    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
-    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
-    tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
-    tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
-
-    z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
-
-    tmp0 = (z2 + z3) << CONST_BITS;
-    tmp1 = (z2 - z3) << CONST_BITS;
-
-    tmp10 = tmp0 + tmp3;
-    tmp13 = tmp0 - tmp3;
-    tmp11 = tmp1 + tmp2;
-    tmp12 = tmp1 - tmp2;
-
-    /* Odd part per figure 8; the matrix is unitary and hence its
-     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
-     */
-
-    tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
-    tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
-    tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
-    tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-
-    z1 = tmp0 + tmp3;
-    z2 = tmp1 + tmp2;
-    z3 = tmp0 + tmp2;
-    z4 = tmp1 + tmp3;
-    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
-
-    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
-    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
-    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
-    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
-    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
-    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
-    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
-    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
-
-    z3 += z5;
-    z4 += z5;
-
-    tmp0 += z1 + z3;
-    tmp1 += z2 + z4;
-    tmp2 += z2 + z3;
-    tmp3 += z1 + z4;
-
-    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
-
-    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
-    wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
-    wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
-    wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
-    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
-    wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
-    wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
-    wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
-
-    inptr++;                    /* advance pointers to next column */
-    quantptr++;
-    wsptr++;
-  }
-
-  /* Pass 2: process rows from work array, store into output array. */
-  /* Note that we must descale the results by a factor of 8 == 2**3, */
-  /* and also undo the PASS1_BITS scaling. */
-
-  wsptr = workspace;
-  for (ctr = 0; ctr < DCTSIZE; ctr++) {
-    outptr = output_buf[ctr] + output_col;
-    /* Rows of zeroes can be exploited in the same way as we did with columns.
-     * However, the column calculation has created many nonzero AC terms, so
-     * the simplification applies less often (typically 5% to 10% of the time).
-     * On machines with very fast multiplication, it's possible that the
-     * test takes more time than it's worth.  In that case this section
-     * may be commented out.
-     */
-
-#ifndef NO_ZERO_ROW_TEST
-    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
-        wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
-      /* AC terms all zero */
-      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
-                                  & RANGE_MASK];
-
-      outptr[0] = dcval;
-      outptr[1] = dcval;
-      outptr[2] = dcval;
-      outptr[3] = dcval;
-      outptr[4] = dcval;
-      outptr[5] = dcval;
-      outptr[6] = dcval;
-      outptr[7] = dcval;
-
-      wsptr += DCTSIZE;         /* advance pointer to next row */
-      continue;
-    }
-#endif
-
-    /* Even part: reverse the even part of the forward DCT. */
-    /* The rotator is sqrt(2)*c(-6). */
-
-    z2 = (INT32) wsptr[2];
-    z3 = (INT32) wsptr[6];
-
-    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
-    tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
-    tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
-
-    tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
-    tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
-
-    tmp10 = tmp0 + tmp3;
-    tmp13 = tmp0 - tmp3;
-    tmp11 = tmp1 + tmp2;
-    tmp12 = tmp1 - tmp2;
-
-    /* Odd part per figure 8; the matrix is unitary and hence its
-     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
-     */
-
-    tmp0 = (INT32) wsptr[7];
-    tmp1 = (INT32) wsptr[5];
-    tmp2 = (INT32) wsptr[3];
-    tmp3 = (INT32) wsptr[1];
-
-    z1 = tmp0 + tmp3;
-    z2 = tmp1 + tmp2;
-    z3 = tmp0 + tmp2;
-    z4 = tmp1 + tmp3;
-    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
-
-    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
-    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
-    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
-    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
-    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
-    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
-    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
-    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
-
-    z3 += z5;
-    z4 += z5;
-
-    tmp0 += z1 + z3;
-    tmp1 += z2 + z4;
-    tmp2 += z2 + z3;
-    tmp3 += z1 + z4;
-
-    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
-
-    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
-                                          CONST_BITS+PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
-                                          CONST_BITS+PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
-                                          CONST_BITS+PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
-                                          CONST_BITS+PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
-                                          CONST_BITS+PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
-                                          CONST_BITS+PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
-                                          CONST_BITS+PASS1_BITS+3)
-                            & RANGE_MASK];
-    outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
-                                          CONST_BITS+PASS1_BITS+3)
-                            & RANGE_MASK];
-
-    wsptr += DCTSIZE;           /* advance pointer to next row */
-  }
-}
-
-#endif /* DCT_ISLOW_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jidctred.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,402 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jidctred.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains inverse-DCT routines that produce reduced-size output:
- * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.
- *
- * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)
- * algorithm used in jidctint.c.  We simply replace each 8-to-8 1-D IDCT step
- * with an 8-to-4 step that produces the four averages of two adjacent outputs
- * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).
- * These steps were derived by computing the corresponding values at the end
- * of the normal LL&M code, then simplifying as much as possible.
- *
- * 1x1 is trivial: just take the DC coefficient divided by 8.
- *
- * See jidctint.c for additional comments.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h"               /* Private declarations for DCT subsystem */
-
-#ifdef IDCT_SCALING_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
-  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/* Scaling is the same as in jidctint.c. */
-
-#if BITS_IN_JSAMPLE == 8
-#define CONST_BITS  13
-#define PASS1_BITS  2
-#else
-#define CONST_BITS  13
-#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
-#endif
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 13
-#define FIX_0_211164243  ((INT32)  1730)        /* FIX(0.211164243) */
-#define FIX_0_509795579  ((INT32)  4176)        /* FIX(0.509795579) */
-#define FIX_0_601344887  ((INT32)  4926)        /* FIX(0.601344887) */
-#define FIX_0_720959822  ((INT32)  5906)        /* FIX(0.720959822) */
-#define FIX_0_765366865  ((INT32)  6270)        /* FIX(0.765366865) */
-#define FIX_0_850430095  ((INT32)  6967)        /* FIX(0.850430095) */
-#define FIX_0_899976223  ((INT32)  7373)        /* FIX(0.899976223) */
-#define FIX_1_061594337  ((INT32)  8697)        /* FIX(1.061594337) */
-#define FIX_1_272758580  ((INT32)  10426)       /* FIX(1.272758580) */
-#define FIX_1_451774981  ((INT32)  11893)       /* FIX(1.451774981) */
-#define FIX_1_847759065  ((INT32)  15137)       /* FIX(1.847759065) */
-#define FIX_2_172734803  ((INT32)  17799)       /* FIX(2.172734803) */
-#define FIX_2_562915447  ((INT32)  20995)       /* FIX(2.562915447) */
-#define FIX_3_624509785  ((INT32)  29692)       /* FIX(3.624509785) */
-#else
-#define FIX_0_211164243  FIX(0.211164243)
-#define FIX_0_509795579  FIX(0.509795579)
-#define FIX_0_601344887  FIX(0.601344887)
-#define FIX_0_720959822  FIX(0.720959822)
-#define FIX_0_765366865  FIX(0.765366865)
-#define FIX_0_850430095  FIX(0.850430095)
-#define FIX_0_899976223  FIX(0.899976223)
-#define FIX_1_061594337  FIX(1.061594337)
-#define FIX_1_272758580  FIX(1.272758580)
-#define FIX_1_451774981  FIX(1.451774981)
-#define FIX_1_847759065  FIX(1.847759065)
-#define FIX_2_172734803  FIX(2.172734803)
-#define FIX_2_562915447  FIX(2.562915447)
-#define FIX_3_624509785  FIX(3.624509785)
-#endif
-
-
-/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
- * For 8-bit samples with the recommended scaling, all the variable
- * and constant values involved are no more than 16 bits wide, so a
- * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
- * For 12-bit samples, a full 32-bit multiplication will be needed.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
-#else
-#define MULTIPLY(var,const)  ((var) * (const))
-#endif
-
-
-/* Dequantize a coefficient by multiplying it by the multiplier-table
- * entry; produce an int result.  In this module, both inputs and result
- * are 16 bits or less, so either int or short multiply will work.
- */
-
-#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients,
- * producing a reduced-size 4x4 output block.
- */
-
-GLOBAL(void)
-jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-               JCOEFPTR coef_block,
-               JSAMPARRAY output_buf, JDIMENSION output_col)
-{
-  INT32 tmp0, tmp2, tmp10, tmp12;
-  INT32 z1, z2, z3, z4;
-  JCOEFPTR inptr;
-  ISLOW_MULT_TYPE * quantptr;
-  int * wsptr;
-  JSAMPROW outptr;
-  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
-  int ctr;
-  int workspace[DCTSIZE*4];     /* buffers data between passes */
-  SHIFT_TEMPS
-
-  /* Pass 1: process columns from input, store into work array. */
-
-  inptr = coef_block;
-  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
-  wsptr = workspace;
-  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
-    /* Don't bother to process column 4, because second pass won't use it */
-    if (ctr == DCTSIZE-4)
-      continue;
-    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
-        inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&
-        inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {
-      /* AC terms all zero; we need not examine term 4 for 4x4 output */
-      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
-
-      wsptr[DCTSIZE*0] = dcval;
-      wsptr[DCTSIZE*1] = dcval;
-      wsptr[DCTSIZE*2] = dcval;
-      wsptr[DCTSIZE*3] = dcval;
-
-      continue;
-    }
-
-    /* Even part */
-
-    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-    tmp0 <<= (CONST_BITS+1);
-
-    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
-    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
-    tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);
-
-    tmp10 = tmp0 + tmp2;
-    tmp12 = tmp0 - tmp2;
-
-    /* Odd part */
-
-    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
-    z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
-    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
-    z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-
-    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
-         + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
-         + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
-         + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
-
-    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
-         + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
-         + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
-         + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
-
-    /* Final output stage */
-
-    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);
-    wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);
-    wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);
-    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);
-  }
-
-  /* Pass 2: process 4 rows from work array, store into output array. */
-
-  wsptr = workspace;
-  for (ctr = 0; ctr < 4; ctr++) {
-    outptr = output_buf[ctr] + output_col;
-    /* It's not clear whether a zero row test is worthwhile here ... */
-
-#ifndef NO_ZERO_ROW_TEST
-    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&
-        wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
-      /* AC terms all zero */
-      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
-                                  & RANGE_MASK];
-
-      outptr[0] = dcval;
-      outptr[1] = dcval;
-      outptr[2] = dcval;
-      outptr[3] = dcval;
-
-      wsptr += DCTSIZE;         /* advance pointer to next row */
-      continue;
-    }
-#endif
-
-    /* Even part */
-
-    tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);
-
-    tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)
-         + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);
-
-    tmp10 = tmp0 + tmp2;
-    tmp12 = tmp0 - tmp2;
-
-    /* Odd part */
-
-    z1 = (INT32) wsptr[7];
-    z2 = (INT32) wsptr[5];
-    z3 = (INT32) wsptr[3];
-    z4 = (INT32) wsptr[1];
-
-    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
-         + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
-         + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
-         + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
-
-    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
-         + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
-         + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
-         + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
-
-    /* Final output stage */
-
-    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,
-                                          CONST_BITS+PASS1_BITS+3+1)
-                            & RANGE_MASK];
-    outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,
-                                          CONST_BITS+PASS1_BITS+3+1)
-                            & RANGE_MASK];
-    outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,
-                                          CONST_BITS+PASS1_BITS+3+1)
-                            & RANGE_MASK];
-    outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,
-                                          CONST_BITS+PASS1_BITS+3+1)
-                            & RANGE_MASK];
-
-    wsptr += DCTSIZE;           /* advance pointer to next row */
-  }
-}
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients,
- * producing a reduced-size 2x2 output block.
- */
-
-GLOBAL(void)
-jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-               JCOEFPTR coef_block,
-               JSAMPARRAY output_buf, JDIMENSION output_col)
-{
-  INT32 tmp0, tmp10, z1;
-  JCOEFPTR inptr;
-  ISLOW_MULT_TYPE * quantptr;
-  int * wsptr;
-  JSAMPROW outptr;
-  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
-  int ctr;
-  int workspace[DCTSIZE*2];     /* buffers data between passes */
-  SHIFT_TEMPS
-
-  /* Pass 1: process columns from input, store into work array. */
-
-  inptr = coef_block;
-  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
-  wsptr = workspace;
-  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
-    /* Don't bother to process columns 2,4,6 */
-    if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)
-      continue;
-    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&
-        inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {
-      /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */
-      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
-
-      wsptr[DCTSIZE*0] = dcval;
-      wsptr[DCTSIZE*1] = dcval;
-
-      continue;
-    }
-
-    /* Even part */
-
-    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-    tmp10 = z1 << (CONST_BITS+2);
-
-    /* Odd part */
-
-    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
-    tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */
-    z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
-    tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */
-    z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
-    tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */
-    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-    tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
-
-    /* Final output stage */
-
-    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);
-    wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);
-  }
-
-  /* Pass 2: process 2 rows from work array, store into output array. */
-
-  wsptr = workspace;
-  for (ctr = 0; ctr < 2; ctr++) {
-    outptr = output_buf[ctr] + output_col;
-    /* It's not clear whether a zero row test is worthwhile here ... */
-
-#ifndef NO_ZERO_ROW_TEST
-    if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {
-      /* AC terms all zero */
-      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
-                                  & RANGE_MASK];
-
-      outptr[0] = dcval;
-      outptr[1] = dcval;
-
-      wsptr += DCTSIZE;         /* advance pointer to next row */
-      continue;
-    }
-#endif
-
-    /* Even part */
-
-    tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);
-
-    /* Odd part */
-
-    tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */
-         + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */
-         + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */
-         + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
-
-    /* Final output stage */
-
-    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,
-                                          CONST_BITS+PASS1_BITS+3+2)
-                            & RANGE_MASK];
-    outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,
-                                          CONST_BITS+PASS1_BITS+3+2)
-                            & RANGE_MASK];
-
-    wsptr += DCTSIZE;           /* advance pointer to next row */
-  }
-}
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients,
- * producing a reduced-size 1x1 output block.
- */
-
-GLOBAL(void)
-jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-               JCOEFPTR coef_block,
-               JSAMPARRAY output_buf, JDIMENSION output_col)
-{
-  int dcval;
-  ISLOW_MULT_TYPE * quantptr;
-  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
-  SHIFT_TEMPS
-
-  /* We hardly need an inverse DCT routine for this: just take the
-   * average pixel value, which is one-eighth of the DC coefficient.
-   */
-  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
-  dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
-  dcval = (int) DESCALE((INT32) dcval, 3);
-
-  output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];
-}
-
-#endif /* IDCT_SCALING_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jinclude.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jinclude.h
- *
- * Copyright (C) 1991-1994, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file exists to provide a single place to fix any problems with
- * including the wrong system include files.  (Common problems are taken
- * care of by the standard jconfig symbols, but on really weird systems
- * you may have to edit this file.)
- *
- * NOTE: this file is NOT intended to be included by applications using the
- * JPEG library.  Most applications need only include jpeglib.h.
- */
-
-
-/* Include auto-config file to find out which system include files we need. */
-
-#include "jconfig.h"            /* auto configuration options */
-#define JCONFIG_INCLUDED        /* so that jpeglib.h doesn't do it again */
-
-/*
- * We need the NULL macro and size_t typedef.
- * On an ANSI-conforming system it is sufficient to include <stddef.h>.
- * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to
- * pull in <sys/types.h> as well.
- * Note that the core JPEG library does not require <stdio.h>;
- * only the default error handler and data source/destination modules do.
- * But we must pull it in because of the references to FILE in jpeglib.h.
- * You can remove those references if you want to compile without <stdio.h>.
- */
-
-#ifdef HAVE_STDDEF_H
-#include <stddef.h>
-#endif
-
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
-#ifdef NEED_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-
-#include <stdio.h>
-
-/*
- * We need memory copying and zeroing functions, plus strncpy().
- * ANSI and System V implementations declare these in <string.h>.
- * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().
- * Some systems may declare memset and memcpy in <memory.h>.
- *
- * NOTE: we assume the size parameters to these functions are of type size_t.
- * Change the casts in these macros if not!
- */
-
-#ifdef NEED_BSD_STRINGS
-
-#include <strings.h>
-#define MEMZERO(target,size)    bzero((void *)(target), (size_t)(size))
-#define MEMCOPY(dest,src,size)  bcopy((const void *)(src), (void *)(dest), (size_t)(size))
-
-#else /* not BSD, assume ANSI/SysV string lib */
-
-#include <string.h>
-#define MEMZERO(target,size)    memset((void *)(target), 0, (size_t)(size))
-#define MEMCOPY(dest,src,size)  memcpy((void *)(dest), (const void *)(src), (size_t)(size))
-
-#endif
-
-/*
- * In ANSI C, and indeed any rational implementation, size_t is also the
- * type returned by sizeof().  However, it seems there are some irrational
- * implementations out there, in which sizeof() returns an int even though
- * size_t is defined as long or unsigned long.  To ensure consistent results
- * we always use this SIZEOF() macro in place of using sizeof() directly.
- */
-
-#define SIZEOF(object)  ((size_t) sizeof(object))
-
-/*
- * The modules that use fread() and fwrite() always invoke them through
- * these macros.  On some systems you may need to twiddle the argument casts.
- * CAUTION: argument order is different from underlying functions!
- */
-
-#define JFREAD(file,buf,sizeofbuf)  \
-  ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
-#define JFWRITE(file,buf,sizeofbuf)  \
-  ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
--- a/src/share/native/sun/awt/image/jpeg/jmemmgr.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1124 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jmemmgr.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the JPEG system-independent memory management
- * routines.  This code is usable across a wide variety of machines; most
- * of the system dependencies have been isolated in a separate file.
- * The major functions provided here are:
- *   * pool-based allocation and freeing of memory;
- *   * policy decisions about how to divide available memory among the
- *     virtual arrays;
- *   * control logic for swapping virtual arrays between main memory and
- *     backing storage.
- * The separate system-dependent file provides the actual backing-storage
- * access code, and it contains the policy decision about how much total
- * main memory to use.
- * This file is system-dependent in the sense that some of its functions
- * are unnecessary in some systems.  For example, if there is enough virtual
- * memory so that backing storage will never be used, much of the virtual
- * array control logic could be removed.  (Of course, if you have that much
- * memory then you shouldn't care about a little bit of unused code...)
- */
-
-#define JPEG_INTERNALS
-#define AM_MEMORY_MANAGER       /* we define jvirt_Xarray_control structs */
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jmemsys.h"            /* import the system-dependent declarations */
-
-#ifndef NO_GETENV
-#ifndef HAVE_STDLIB_H           /* <stdlib.h> should declare getenv() */
-extern char * getenv JPP((const char * name));
-#endif
-#endif
-
-
-/*
- * Some important notes:
- *   The allocation routines provided here must never return NULL.
- *   They should exit to error_exit if unsuccessful.
- *
- *   It's not a good idea to try to merge the sarray and barray routines,
- *   even though they are textually almost the same, because samples are
- *   usually stored as bytes while coefficients are shorts or ints.  Thus,
- *   in machines where byte pointers have a different representation from
- *   word pointers, the resulting machine code could not be the same.
- */
-
-
-/*
- * Many machines require storage alignment: longs must start on 4-byte
- * boundaries, doubles on 8-byte boundaries, etc.  On such machines, malloc()
- * always returns pointers that are multiples of the worst-case alignment
- * requirement, and we had better do so too.
- * There isn't any really portable way to determine the worst-case alignment
- * requirement.  This module assumes that the alignment requirement is
- * multiples of sizeof(ALIGN_TYPE).
- * By default, we define ALIGN_TYPE as double.  This is necessary on some
- * workstations (where doubles really do need 8-byte alignment) and will work
- * fine on nearly everything.  If your machine has lesser alignment needs,
- * you can save a few bytes by making ALIGN_TYPE smaller.
- * The only place I know of where this will NOT work is certain Macintosh
- * 680x0 compilers that define double as a 10-byte IEEE extended float.
- * Doing 10-byte alignment is counterproductive because longwords won't be
- * aligned well.  Put "#define ALIGN_TYPE long" in jconfig.h if you have
- * such a compiler.
- */
-
-#ifndef ALIGN_TYPE              /* so can override from jconfig.h */
-#define ALIGN_TYPE  double
-#endif
-
-
-/*
- * We allocate objects from "pools", where each pool is gotten with a single
- * request to jpeg_get_small() or jpeg_get_large().  There is no per-object
- * overhead within a pool, except for alignment padding.  Each pool has a
- * header with a link to the next pool of the same class.
- * Small and large pool headers are identical except that the latter's
- * link pointer must be FAR on 80x86 machines.
- * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE
- * field.  This forces the compiler to make SIZEOF(small_pool_hdr) a multiple
- * of the alignment requirement of ALIGN_TYPE.
- */
-
-typedef union small_pool_struct * small_pool_ptr;
-
-typedef union small_pool_struct {
-  struct {
-    small_pool_ptr next;        /* next in list of pools */
-    size_t bytes_used;          /* how many bytes already used within pool */
-    size_t bytes_left;          /* bytes still available in this pool */
-  } hdr;
-  ALIGN_TYPE dummy;             /* included in union to ensure alignment */
-} small_pool_hdr;
-
-typedef union large_pool_struct FAR * large_pool_ptr;
-
-typedef union large_pool_struct {
-  struct {
-    large_pool_ptr next;        /* next in list of pools */
-    size_t bytes_used;          /* how many bytes already used within pool */
-    size_t bytes_left;          /* bytes still available in this pool */
-  } hdr;
-  ALIGN_TYPE dummy;             /* included in union to ensure alignment */
-} large_pool_hdr;
-
-
-/*
- * Here is the full definition of a memory manager object.
- */
-
-typedef struct {
-  struct jpeg_memory_mgr pub;   /* public fields */
-
-  /* Each pool identifier (lifetime class) names a linked list of pools. */
-  small_pool_ptr small_list[JPOOL_NUMPOOLS];
-  large_pool_ptr large_list[JPOOL_NUMPOOLS];
-
-  /* Since we only have one lifetime class of virtual arrays, only one
-   * linked list is necessary (for each datatype).  Note that the virtual
-   * array control blocks being linked together are actually stored somewhere
-   * in the small-pool list.
-   */
-  jvirt_sarray_ptr virt_sarray_list;
-  jvirt_barray_ptr virt_barray_list;
-
-  /* This counts total space obtained from jpeg_get_small/large */
-  size_t total_space_allocated;
-
-  /* alloc_sarray and alloc_barray set this value for use by virtual
-   * array routines.
-   */
-  JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */
-} my_memory_mgr;
-
-typedef my_memory_mgr * my_mem_ptr;
-
-
-/*
- * The control blocks for virtual arrays.
- * Note that these blocks are allocated in the "small" pool area.
- * System-dependent info for the associated backing store (if any) is hidden
- * inside the backing_store_info struct.
- */
-
-struct jvirt_sarray_control {
-  JSAMPARRAY mem_buffer;        /* => the in-memory buffer */
-  JDIMENSION rows_in_array;     /* total virtual array height */
-  JDIMENSION samplesperrow;     /* width of array (and of memory buffer) */
-  JDIMENSION maxaccess;         /* max rows accessed by access_virt_sarray */
-  JDIMENSION rows_in_mem;       /* height of memory buffer */
-  JDIMENSION rowsperchunk;      /* allocation chunk size in mem_buffer */
-  JDIMENSION cur_start_row;     /* first logical row # in the buffer */
-  JDIMENSION first_undef_row;   /* row # of first uninitialized row */
-  boolean pre_zero;             /* pre-zero mode requested? */
-  boolean dirty;                /* do current buffer contents need written? */
-  boolean b_s_open;             /* is backing-store data valid? */
-  jvirt_sarray_ptr next;        /* link to next virtual sarray control block */
-  backing_store_info b_s_info;  /* System-dependent control info */
-};
-
-struct jvirt_barray_control {
-  JBLOCKARRAY mem_buffer;       /* => the in-memory buffer */
-  JDIMENSION rows_in_array;     /* total virtual array height */
-  JDIMENSION blocksperrow;      /* width of array (and of memory buffer) */
-  JDIMENSION maxaccess;         /* max rows accessed by access_virt_barray */
-  JDIMENSION rows_in_mem;       /* height of memory buffer */
-  JDIMENSION rowsperchunk;      /* allocation chunk size in mem_buffer */
-  JDIMENSION cur_start_row;     /* first logical row # in the buffer */
-  JDIMENSION first_undef_row;   /* row # of first uninitialized row */
-  boolean pre_zero;             /* pre-zero mode requested? */
-  boolean dirty;                /* do current buffer contents need written? */
-  boolean b_s_open;             /* is backing-store data valid? */
-  jvirt_barray_ptr next;        /* link to next virtual barray control block */
-  backing_store_info b_s_info;  /* System-dependent control info */
-};
-
-
-#ifdef MEM_STATS                /* optional extra stuff for statistics */
-
-LOCAL(void)
-print_mem_stats (j_common_ptr cinfo, int pool_id)
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  small_pool_ptr shdr_ptr;
-  large_pool_ptr lhdr_ptr;
-
-  /* Since this is only a debugging stub, we can cheat a little by using
-   * fprintf directly rather than going through the trace message code.
-   * This is helpful because message parm array can't handle longs.
-   */
-  fprintf(stderr, "Freeing pool %d, total space = %ld\n",
-          pool_id, mem->total_space_allocated);
-
-  for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
-       lhdr_ptr = lhdr_ptr->hdr.next) {
-    fprintf(stderr, "  Large chunk used %ld\n",
-            (long) lhdr_ptr->hdr.bytes_used);
-  }
-
-  for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL;
-       shdr_ptr = shdr_ptr->hdr.next) {
-    fprintf(stderr, "  Small chunk used %ld free %ld\n",
-            (long) shdr_ptr->hdr.bytes_used,
-            (long) shdr_ptr->hdr.bytes_left);
-  }
-}
-
-#endif /* MEM_STATS */
-
-
-LOCAL(void)
-out_of_memory (j_common_ptr cinfo, int which)
-/* Report an out-of-memory error and stop execution */
-/* If we compiled MEM_STATS support, report alloc requests before dying */
-{
-#ifdef MEM_STATS
-  cinfo->err->trace_level = 2;  /* force self_destruct to report stats */
-#endif
-  ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which);
-}
-
-
-/*
- * Allocation of "small" objects.
- *
- * For these, we use pooled storage.  When a new pool must be created,
- * we try to get enough space for the current request plus a "slop" factor,
- * where the slop will be the amount of leftover space in the new pool.
- * The speed vs. space tradeoff is largely determined by the slop values.
- * A different slop value is provided for each pool class (lifetime),
- * and we also distinguish the first pool of a class from later ones.
- * NOTE: the values given work fairly well on both 16- and 32-bit-int
- * machines, but may be too small if longs are 64 bits or more.
- */
-
-static const size_t first_pool_slop[JPOOL_NUMPOOLS] =
-{
-        1600,                   /* first PERMANENT pool */
-        16000                   /* first IMAGE pool */
-};
-
-static const size_t extra_pool_slop[JPOOL_NUMPOOLS] =
-{
-        0,                      /* additional PERMANENT pools */
-        5000                    /* additional IMAGE pools */
-};
-
-#define MIN_SLOP  50            /* greater than 0 to avoid futile looping */
-
-
-METHODDEF(void *)
-alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
-/* Allocate a "small" object */
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  small_pool_ptr hdr_ptr, prev_hdr_ptr;
-  char * data_ptr;
-  size_t odd_bytes, min_request, slop;
-
-  /* Check for unsatisfiable request (do now to ensure no overflow below) */
-  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))
-    out_of_memory(cinfo, 1);    /* request exceeds malloc's ability */
-
-  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
-  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
-  if (odd_bytes > 0)
-    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
-
-  /* See if space is available in any existing pool */
-  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
-    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-  prev_hdr_ptr = NULL;
-  hdr_ptr = mem->small_list[pool_id];
-  while (hdr_ptr != NULL) {
-    if (hdr_ptr->hdr.bytes_left >= sizeofobject)
-      break;                    /* found pool with enough space */
-    prev_hdr_ptr = hdr_ptr;
-    hdr_ptr = hdr_ptr->hdr.next;
-  }
-
-  /* Time to make a new pool? */
-  if (hdr_ptr == NULL) {
-    /* min_request is what we need now, slop is what will be leftover */
-    min_request = sizeofobject + SIZEOF(small_pool_hdr);
-    if (prev_hdr_ptr == NULL)   /* first pool in class? */
-      slop = first_pool_slop[pool_id];
-    else
-      slop = extra_pool_slop[pool_id];
-    /* Don't ask for more than MAX_ALLOC_CHUNK */
-    if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))
-      slop = (size_t) (MAX_ALLOC_CHUNK-min_request);
-    /* Try to get space, if fail reduce slop and try again */
-    for (;;) {
-      hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
-      if (hdr_ptr != NULL)
-        break;
-      slop /= 2;
-      if (slop < MIN_SLOP)      /* give up when it gets real small */
-        out_of_memory(cinfo, 2); /* jpeg_get_small failed */
-    }
-    mem->total_space_allocated += min_request + slop;
-    /* Success, initialize the new pool header and add to end of list */
-    hdr_ptr->hdr.next = NULL;
-    hdr_ptr->hdr.bytes_used = 0;
-    hdr_ptr->hdr.bytes_left = sizeofobject + slop;
-    if (prev_hdr_ptr == NULL)   /* first pool in class? */
-      mem->small_list[pool_id] = hdr_ptr;
-    else
-      prev_hdr_ptr->hdr.next = hdr_ptr;
-  }
-
-  /* OK, allocate the object from the current pool */
-  data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */
-  data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */
-  hdr_ptr->hdr.bytes_used += sizeofobject;
-  hdr_ptr->hdr.bytes_left -= sizeofobject;
-
-  return (void *) data_ptr;
-}
-
-
-/*
- * Allocation of "large" objects.
- *
- * The external semantics of these are the same as "small" objects,
- * except that FAR pointers are used on 80x86.  However the pool
- * management heuristics are quite different.  We assume that each
- * request is large enough that it may as well be passed directly to
- * jpeg_get_large; the pool management just links everything together
- * so that we can free it all on demand.
- * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY
- * structures.  The routines that create these structures (see below)
- * deliberately bunch rows together to ensure a large request size.
- */
-
-METHODDEF(void FAR *)
-alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
-/* Allocate a "large" object */
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  large_pool_ptr hdr_ptr;
-  size_t odd_bytes;
-
-  /* Check for unsatisfiable request (do now to ensure no overflow below) */
-  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))
-    out_of_memory(cinfo, 3);    /* request exceeds malloc's ability */
-
-  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
-  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
-  if (odd_bytes > 0)
-    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
-
-  /* Always make a new pool */
-  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
-    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-
-  hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject +
-                                            SIZEOF(large_pool_hdr));
-  if (hdr_ptr == NULL)
-    out_of_memory(cinfo, 4);    /* jpeg_get_large failed */
-  mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);
-
-  /* Success, initialize the new pool header and add to list */
-  hdr_ptr->hdr.next = mem->large_list[pool_id];
-  /* We maintain space counts in each pool header for statistical purposes,
-   * even though they are not needed for allocation.
-   */
-  hdr_ptr->hdr.bytes_used = sizeofobject;
-  hdr_ptr->hdr.bytes_left = 0;
-  mem->large_list[pool_id] = hdr_ptr;
-
-  return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */
-}
-
-
-/*
- * Creation of 2-D sample arrays.
- * The pointers are in near heap, the samples themselves in FAR heap.
- *
- * To minimize allocation overhead and to allow I/O of large contiguous
- * blocks, we allocate the sample rows in groups of as many rows as possible
- * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request.
- * NB: the virtual array control routines, later in this file, know about
- * this chunking of rows.  The rowsperchunk value is left in the mem manager
- * object so that it can be saved away if this sarray is the workspace for
- * a virtual array.
- */
-
-METHODDEF(JSAMPARRAY)
-alloc_sarray (j_common_ptr cinfo, int pool_id,
-              JDIMENSION samplesperrow, JDIMENSION numrows)
-/* Allocate a 2-D sample array */
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  JSAMPARRAY result;
-  JSAMPROW workspace;
-  JDIMENSION rowsperchunk, currow, i;
-  long ltemp;
-
-  /* Calculate max # of rows allowed in one allocation chunk */
-  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
-          ((long) samplesperrow * SIZEOF(JSAMPLE));
-  if (ltemp <= 0)
-    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
-  if (ltemp < (long) numrows)
-    rowsperchunk = (JDIMENSION) ltemp;
-  else
-    rowsperchunk = numrows;
-  mem->last_rowsperchunk = rowsperchunk;
-
-  /* Get space for row pointers (small object) */
-  result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
-                                    (size_t) (numrows * SIZEOF(JSAMPROW)));
-
-  /* Get the rows themselves (large objects) */
-  currow = 0;
-  while (currow < numrows) {
-    rowsperchunk = MIN(rowsperchunk, numrows - currow);
-    workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
-        (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow
-                  * SIZEOF(JSAMPLE)));
-    for (i = rowsperchunk; i > 0; i--) {
-      result[currow++] = workspace;
-      workspace += samplesperrow;
-    }
-  }
-
-  return result;
-}
-
-
-/*
- * Creation of 2-D coefficient-block arrays.
- * This is essentially the same as the code for sample arrays, above.
- */
-
-METHODDEF(JBLOCKARRAY)
-alloc_barray (j_common_ptr cinfo, int pool_id,
-              JDIMENSION blocksperrow, JDIMENSION numrows)
-/* Allocate a 2-D coefficient-block array */
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  JBLOCKARRAY result;
-  JBLOCKROW workspace;
-  JDIMENSION rowsperchunk, currow, i;
-  long ltemp;
-
-  /* Calculate max # of rows allowed in one allocation chunk */
-  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
-          ((long) blocksperrow * SIZEOF(JBLOCK));
-  if (ltemp <= 0)
-    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
-  if (ltemp < (long) numrows)
-    rowsperchunk = (JDIMENSION) ltemp;
-  else
-    rowsperchunk = numrows;
-  mem->last_rowsperchunk = rowsperchunk;
-
-  /* Get space for row pointers (small object) */
-  result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
-                                     (size_t) (numrows * SIZEOF(JBLOCKROW)));
-
-  /* Get the rows themselves (large objects) */
-  currow = 0;
-  while (currow < numrows) {
-    rowsperchunk = MIN(rowsperchunk, numrows - currow);
-    workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
-        (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow
-                  * SIZEOF(JBLOCK)));
-    for (i = rowsperchunk; i > 0; i--) {
-      result[currow++] = workspace;
-      workspace += blocksperrow;
-    }
-  }
-
-  return result;
-}
-
-
-/*
- * About virtual array management:
- *
- * The above "normal" array routines are only used to allocate strip buffers
- * (as wide as the image, but just a few rows high).  Full-image-sized buffers
- * are handled as "virtual" arrays.  The array is still accessed a strip at a
- * time, but the memory manager must save the whole array for repeated
- * accesses.  The intended implementation is that there is a strip buffer in
- * memory (as high as is possible given the desired memory limit), plus a
- * backing file that holds the rest of the array.
- *
- * The request_virt_array routines are told the total size of the image and
- * the maximum number of rows that will be accessed at once.  The in-memory
- * buffer must be at least as large as the maxaccess value.
- *
- * The request routines create control blocks but not the in-memory buffers.
- * That is postponed until realize_virt_arrays is called.  At that time the
- * total amount of space needed is known (approximately, anyway), so free
- * memory can be divided up fairly.
- *
- * The access_virt_array routines are responsible for making a specific strip
- * area accessible (after reading or writing the backing file, if necessary).
- * Note that the access routines are told whether the caller intends to modify
- * the accessed strip; during a read-only pass this saves having to rewrite
- * data to disk.  The access routines are also responsible for pre-zeroing
- * any newly accessed rows, if pre-zeroing was requested.
- *
- * In current usage, the access requests are usually for nonoverlapping
- * strips; that is, successive access start_row numbers differ by exactly
- * num_rows = maxaccess.  This means we can get good performance with simple
- * buffer dump/reload logic, by making the in-memory buffer be a multiple
- * of the access height; then there will never be accesses across bufferload
- * boundaries.  The code will still work with overlapping access requests,
- * but it doesn't handle bufferload overlaps very efficiently.
- */
-
-
-METHODDEF(jvirt_sarray_ptr)
-request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
-                     JDIMENSION samplesperrow, JDIMENSION numrows,
-                     JDIMENSION maxaccess)
-/* Request a virtual 2-D sample array */
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  jvirt_sarray_ptr result;
-
-  /* Only IMAGE-lifetime virtual arrays are currently supported */
-  if (pool_id != JPOOL_IMAGE)
-    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-
-  /* get control block */
-  result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,
-                                          SIZEOF(struct jvirt_sarray_control));
-
-  result->mem_buffer = NULL;    /* marks array not yet realized */
-  result->rows_in_array = numrows;
-  result->samplesperrow = samplesperrow;
-  result->maxaccess = maxaccess;
-  result->pre_zero = pre_zero;
-  result->b_s_open = FALSE;     /* no associated backing-store object */
-  result->next = mem->virt_sarray_list; /* add to list of virtual arrays */
-  mem->virt_sarray_list = result;
-
-  return result;
-}
-
-
-METHODDEF(jvirt_barray_ptr)
-request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
-                     JDIMENSION blocksperrow, JDIMENSION numrows,
-                     JDIMENSION maxaccess)
-/* Request a virtual 2-D coefficient-block array */
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  jvirt_barray_ptr result;
-
-  /* Only IMAGE-lifetime virtual arrays are currently supported */
-  if (pool_id != JPOOL_IMAGE)
-    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-
-  /* get control block */
-  result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,
-                                          SIZEOF(struct jvirt_barray_control));
-
-  result->mem_buffer = NULL;    /* marks array not yet realized */
-  result->rows_in_array = numrows;
-  result->blocksperrow = blocksperrow;
-  result->maxaccess = maxaccess;
-  result->pre_zero = pre_zero;
-  result->b_s_open = FALSE;     /* no associated backing-store object */
-  result->next = mem->virt_barray_list; /* add to list of virtual arrays */
-  mem->virt_barray_list = result;
-
-  return result;
-}
-
-
-METHODDEF(void)
-realize_virt_arrays (j_common_ptr cinfo)
-/* Allocate the in-memory buffers for any unrealized virtual arrays */
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  size_t space_per_minheight, maximum_space, avail_mem;
-  size_t minheights, max_minheights;
-  jvirt_sarray_ptr sptr;
-  jvirt_barray_ptr bptr;
-
-  /* Compute the minimum space needed (maxaccess rows in each buffer)
-   * and the maximum space needed (full image height in each buffer).
-   * These may be of use to the system-dependent jpeg_mem_available routine.
-   */
-  space_per_minheight = 0;
-  maximum_space = 0;
-  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
-    if (sptr->mem_buffer == NULL) { /* if not realized yet */
-      space_per_minheight += (long) sptr->maxaccess *
-                             (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
-      maximum_space += (long) sptr->rows_in_array *
-                       (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
-    }
-  }
-  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
-    if (bptr->mem_buffer == NULL) { /* if not realized yet */
-      space_per_minheight += (long) bptr->maxaccess *
-                             (long) bptr->blocksperrow * SIZEOF(JBLOCK);
-      maximum_space += (long) bptr->rows_in_array *
-                       (long) bptr->blocksperrow * SIZEOF(JBLOCK);
-    }
-  }
-
-  if (space_per_minheight <= 0)
-    return;                     /* no unrealized arrays, no work */
-
-  /* Determine amount of memory to actually use; this is system-dependent. */
-  avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
-                                 mem->total_space_allocated);
-
-  /* If the maximum space needed is available, make all the buffers full
-   * height; otherwise parcel it out with the same number of minheights
-   * in each buffer.
-   */
-  if (avail_mem >= maximum_space)
-    max_minheights = 1000000000L;
-  else {
-    max_minheights = avail_mem / space_per_minheight;
-    /* If there doesn't seem to be enough space, try to get the minimum
-     * anyway.  This allows a "stub" implementation of jpeg_mem_available().
-     */
-    if (max_minheights <= 0)
-      max_minheights = 1;
-  }
-
-  /* Allocate the in-memory buffers and initialize backing store as needed. */
-
-  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
-    if (sptr->mem_buffer == NULL) { /* if not realized yet */
-      minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;
-      if (minheights <= max_minheights) {
-        /* This buffer fits in memory */
-        sptr->rows_in_mem = sptr->rows_in_array;
-      } else {
-        /* It doesn't fit in memory, create backing store. */
-        sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);
-        jpeg_open_backing_store(cinfo, & sptr->b_s_info,
-                                (long) sptr->rows_in_array *
-                                (long) sptr->samplesperrow *
-                                (long) SIZEOF(JSAMPLE));
-        sptr->b_s_open = TRUE;
-      }
-      sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,
-                                      sptr->samplesperrow, sptr->rows_in_mem);
-      sptr->rowsperchunk = mem->last_rowsperchunk;
-      sptr->cur_start_row = 0;
-      sptr->first_undef_row = 0;
-      sptr->dirty = FALSE;
-    }
-  }
-
-  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
-    if (bptr->mem_buffer == NULL) { /* if not realized yet */
-      minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;
-      if (minheights <= max_minheights) {
-        /* This buffer fits in memory */
-        bptr->rows_in_mem = bptr->rows_in_array;
-      } else {
-        /* It doesn't fit in memory, create backing store. */
-        bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);
-        jpeg_open_backing_store(cinfo, & bptr->b_s_info,
-                                (long) bptr->rows_in_array *
-                                (long) bptr->blocksperrow *
-                                (long) SIZEOF(JBLOCK));
-        bptr->b_s_open = TRUE;
-      }
-      bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,
-                                      bptr->blocksperrow, bptr->rows_in_mem);
-      bptr->rowsperchunk = mem->last_rowsperchunk;
-      bptr->cur_start_row = 0;
-      bptr->first_undef_row = 0;
-      bptr->dirty = FALSE;
-    }
-  }
-}
-
-
-LOCAL(void)
-do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)
-/* Do backing store read or write of a virtual sample array */
-{
-  long bytesperrow, file_offset, byte_count, rows, thisrow, i;
-
-  bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
-  file_offset = ptr->cur_start_row * bytesperrow;
-  /* Loop to read or write each allocation chunk in mem_buffer */
-  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
-    /* One chunk, but check for short chunk at end of buffer */
-    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
-    /* Transfer no more than is currently defined */
-    thisrow = (long) ptr->cur_start_row + i;
-    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
-    /* Transfer no more than fits in file */
-    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
-    if (rows <= 0)              /* this chunk might be past end of file! */
-      break;
-    byte_count = rows * bytesperrow;
-    if (writing)
-      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
-                                            (void FAR *) ptr->mem_buffer[i],
-                                            file_offset, byte_count);
-    else
-      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
-                                           (void FAR *) ptr->mem_buffer[i],
-                                           file_offset, byte_count);
-    file_offset += byte_count;
-  }
-}
-
-
-LOCAL(void)
-do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)
-/* Do backing store read or write of a virtual coefficient-block array */
-{
-  long bytesperrow, file_offset, byte_count, rows, thisrow, i;
-
-  bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
-  file_offset = ptr->cur_start_row * bytesperrow;
-  /* Loop to read or write each allocation chunk in mem_buffer */
-  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
-    /* One chunk, but check for short chunk at end of buffer */
-    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
-    /* Transfer no more than is currently defined */
-    thisrow = (long) ptr->cur_start_row + i;
-    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
-    /* Transfer no more than fits in file */
-    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
-    if (rows <= 0)              /* this chunk might be past end of file! */
-      break;
-    byte_count = rows * bytesperrow;
-    if (writing)
-      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
-                                            (void FAR *) ptr->mem_buffer[i],
-                                            file_offset, byte_count);
-    else
-      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
-                                           (void FAR *) ptr->mem_buffer[i],
-                                           file_offset, byte_count);
-    file_offset += byte_count;
-  }
-}
-
-
-METHODDEF(JSAMPARRAY)
-access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
-                    JDIMENSION start_row, JDIMENSION num_rows,
-                    boolean writable)
-/* Access the part of a virtual sample array starting at start_row */
-/* and extending for num_rows rows.  writable is true if  */
-/* caller intends to modify the accessed area. */
-{
-  JDIMENSION end_row = start_row + num_rows;
-  JDIMENSION undef_row;
-
-  /* debugging check */
-  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
-      ptr->mem_buffer == NULL)
-    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
-
-  /* Make the desired part of the virtual array accessible */
-  if (start_row < ptr->cur_start_row ||
-      end_row > ptr->cur_start_row+ptr->rows_in_mem) {
-    if (! ptr->b_s_open)
-      ERREXIT(cinfo, JERR_VIRTUAL_BUG);
-    /* Flush old buffer contents if necessary */
-    if (ptr->dirty) {
-      do_sarray_io(cinfo, ptr, TRUE);
-      ptr->dirty = FALSE;
-    }
-    /* Decide what part of virtual array to access.
-     * Algorithm: if target address > current window, assume forward scan,
-     * load starting at target address.  If target address < current window,
-     * assume backward scan, load so that target area is top of window.
-     * Note that when switching from forward write to forward read, will have
-     * start_row = 0, so the limiting case applies and we load from 0 anyway.
-     */
-    if (start_row > ptr->cur_start_row) {
-      ptr->cur_start_row = start_row;
-    } else {
-      /* use long arithmetic here to avoid overflow & unsigned problems */
-      long ltemp;
-
-      ltemp = (long) end_row - (long) ptr->rows_in_mem;
-      if (ltemp < 0)
-        ltemp = 0;              /* don't fall off front end of file */
-      ptr->cur_start_row = (JDIMENSION) ltemp;
-    }
-    /* Read in the selected part of the array.
-     * During the initial write pass, we will do no actual read
-     * because the selected part is all undefined.
-     */
-    do_sarray_io(cinfo, ptr, FALSE);
-  }
-  /* Ensure the accessed part of the array is defined; prezero if needed.
-   * To improve locality of access, we only prezero the part of the array
-   * that the caller is about to access, not the entire in-memory array.
-   */
-  if (ptr->first_undef_row < end_row) {
-    if (ptr->first_undef_row < start_row) {
-      if (writable)             /* writer skipped over a section of array */
-        ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
-      undef_row = start_row;    /* but reader is allowed to read ahead */
-    } else {
-      undef_row = ptr->first_undef_row;
-    }
-    if (writable)
-      ptr->first_undef_row = end_row;
-    if (ptr->pre_zero) {
-      size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE);
-      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
-      end_row -= ptr->cur_start_row;
-      while (undef_row < end_row) {
-        jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
-        undef_row++;
-      }
-    } else {
-      if (! writable)           /* reader looking at undefined data */
-        ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
-    }
-  }
-  /* Flag the buffer dirty if caller will write in it */
-  if (writable)
-    ptr->dirty = TRUE;
-  /* Return address of proper part of the buffer */
-  return ptr->mem_buffer + (start_row - ptr->cur_start_row);
-}
-
-
-METHODDEF(JBLOCKARRAY)
-access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
-                    JDIMENSION start_row, JDIMENSION num_rows,
-                    boolean writable)
-/* Access the part of a virtual block array starting at start_row */
-/* and extending for num_rows rows.  writable is true if  */
-/* caller intends to modify the accessed area. */
-{
-  JDIMENSION end_row = start_row + num_rows;
-  JDIMENSION undef_row;
-
-  /* debugging check */
-  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
-      ptr->mem_buffer == NULL)
-    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
-
-  /* Make the desired part of the virtual array accessible */
-  if (start_row < ptr->cur_start_row ||
-      end_row > ptr->cur_start_row+ptr->rows_in_mem) {
-    if (! ptr->b_s_open)
-      ERREXIT(cinfo, JERR_VIRTUAL_BUG);
-    /* Flush old buffer contents if necessary */
-    if (ptr->dirty) {
-      do_barray_io(cinfo, ptr, TRUE);
-      ptr->dirty = FALSE;
-    }
-    /* Decide what part of virtual array to access.
-     * Algorithm: if target address > current window, assume forward scan,
-     * load starting at target address.  If target address < current window,
-     * assume backward scan, load so that target area is top of window.
-     * Note that when switching from forward write to forward read, will have
-     * start_row = 0, so the limiting case applies and we load from 0 anyway.
-     */
-    if (start_row > ptr->cur_start_row) {
-      ptr->cur_start_row = start_row;
-    } else {
-      /* use long arithmetic here to avoid overflow & unsigned problems */
-      long ltemp;
-
-      ltemp = (long) end_row - (long) ptr->rows_in_mem;
-      if (ltemp < 0)
-        ltemp = 0;              /* don't fall off front end of file */
-      ptr->cur_start_row = (JDIMENSION) ltemp;
-    }
-    /* Read in the selected part of the array.
-     * During the initial write pass, we will do no actual read
-     * because the selected part is all undefined.
-     */
-    do_barray_io(cinfo, ptr, FALSE);
-  }
-  /* Ensure the accessed part of the array is defined; prezero if needed.
-   * To improve locality of access, we only prezero the part of the array
-   * that the caller is about to access, not the entire in-memory array.
-   */
-  if (ptr->first_undef_row < end_row) {
-    if (ptr->first_undef_row < start_row) {
-      if (writable)             /* writer skipped over a section of array */
-        ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
-      undef_row = start_row;    /* but reader is allowed to read ahead */
-    } else {
-      undef_row = ptr->first_undef_row;
-    }
-    if (writable)
-      ptr->first_undef_row = end_row;
-    if (ptr->pre_zero) {
-      size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK);
-      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
-      end_row -= ptr->cur_start_row;
-      while (undef_row < end_row) {
-        jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
-        undef_row++;
-      }
-    } else {
-      if (! writable)           /* reader looking at undefined data */
-        ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
-    }
-  }
-  /* Flag the buffer dirty if caller will write in it */
-  if (writable)
-    ptr->dirty = TRUE;
-  /* Return address of proper part of the buffer */
-  return ptr->mem_buffer + (start_row - ptr->cur_start_row);
-}
-
-
-/*
- * Release all objects belonging to a specified pool.
- */
-
-METHODDEF(void)
-free_pool (j_common_ptr cinfo, int pool_id)
-{
-  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
-  small_pool_ptr shdr_ptr;
-  large_pool_ptr lhdr_ptr;
-  size_t space_freed;
-
-  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
-    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-
-#ifdef MEM_STATS
-  if (cinfo->err->trace_level > 1)
-    print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */
-#endif
-
-  /* If freeing IMAGE pool, close any virtual arrays first */
-  if (pool_id == JPOOL_IMAGE) {
-    jvirt_sarray_ptr sptr;
-    jvirt_barray_ptr bptr;
-
-    for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
-      if (sptr->b_s_open) {     /* there may be no backing store */
-        sptr->b_s_open = FALSE; /* prevent recursive close if error */
-        (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info);
-      }
-    }
-    mem->virt_sarray_list = NULL;
-    for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
-      if (bptr->b_s_open) {     /* there may be no backing store */
-        bptr->b_s_open = FALSE; /* prevent recursive close if error */
-        (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info);
-      }
-    }
-    mem->virt_barray_list = NULL;
-  }
-
-  /* Release large objects */
-  lhdr_ptr = mem->large_list[pool_id];
-  mem->large_list[pool_id] = NULL;
-
-  while (lhdr_ptr != NULL) {
-    large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next;
-    space_freed = lhdr_ptr->hdr.bytes_used +
-                  lhdr_ptr->hdr.bytes_left +
-                  SIZEOF(large_pool_hdr);
-    jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);
-    mem->total_space_allocated -= space_freed;
-    lhdr_ptr = next_lhdr_ptr;
-  }
-
-  /* Release small objects */
-  shdr_ptr = mem->small_list[pool_id];
-  mem->small_list[pool_id] = NULL;
-
-  while (shdr_ptr != NULL) {
-    small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next;
-    space_freed = shdr_ptr->hdr.bytes_used +
-                  shdr_ptr->hdr.bytes_left +
-                  SIZEOF(small_pool_hdr);
-    jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);
-    mem->total_space_allocated -= space_freed;
-    shdr_ptr = next_shdr_ptr;
-  }
-}
-
-
-/*
- * Close up shop entirely.
- * Note that this cannot be called unless cinfo->mem is non-NULL.
- */
-
-METHODDEF(void)
-self_destruct (j_common_ptr cinfo)
-{
-  int pool;
-
-  /* Close all backing store, release all memory.
-   * Releasing pools in reverse order might help avoid fragmentation
-   * with some (brain-damaged) malloc libraries.
-   */
-  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
-    free_pool(cinfo, pool);
-  }
-
-  /* Release the memory manager control block too. */
-  jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr));
-  cinfo->mem = NULL;            /* ensures I will be called only once */
-
-  jpeg_mem_term(cinfo);         /* system-dependent cleanup */
-}
-
-
-/*
- * Memory manager initialization.
- * When this is called, only the error manager pointer is valid in cinfo!
- */
-
-GLOBAL(void)
-jinit_memory_mgr (j_common_ptr cinfo)
-{
-  my_mem_ptr mem;
-  size_t max_to_use;
-  int pool;
-  size_t test_mac;
-
-  cinfo->mem = NULL;            /* for safety if init fails */
-
-  /* Check for configuration errors.
-   * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably
-   * doesn't reflect any real hardware alignment requirement.
-   * The test is a little tricky: for X>0, X and X-1 have no one-bits
-   * in common if and only if X is a power of 2, ie has only one one-bit.
-   * Some compilers may give an "unreachable code" warning here; ignore it.
-   */
-  if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0)
-    ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE);
-  /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be
-   * a multiple of SIZEOF(ALIGN_TYPE).
-   * Again, an "unreachable code" warning may be ignored here.
-   * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK.
-   */
-  test_mac = (size_t) MAX_ALLOC_CHUNK;
-  if ((long) test_mac != MAX_ALLOC_CHUNK ||
-      (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0)
-    ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);
-
-  max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */
-
-  /* Attempt to allocate memory manager's control block */
-  mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr));
-
-  if (mem == NULL) {
-    jpeg_mem_term(cinfo);       /* system-dependent cleanup */
-    ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0);
-  }
-
-  /* OK, fill in the method pointers */
-  mem->pub.alloc_small = alloc_small;
-  mem->pub.alloc_large = alloc_large;
-  mem->pub.alloc_sarray = alloc_sarray;
-  mem->pub.alloc_barray = alloc_barray;
-  mem->pub.request_virt_sarray = request_virt_sarray;
-  mem->pub.request_virt_barray = request_virt_barray;
-  mem->pub.realize_virt_arrays = realize_virt_arrays;
-  mem->pub.access_virt_sarray = access_virt_sarray;
-  mem->pub.access_virt_barray = access_virt_barray;
-  mem->pub.free_pool = free_pool;
-  mem->pub.self_destruct = self_destruct;
-
-  /* Make MAX_ALLOC_CHUNK accessible to other modules */
-  mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK;
-
-  /* Initialize working state */
-  mem->pub.max_memory_to_use = max_to_use;
-
-  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
-    mem->small_list[pool] = NULL;
-    mem->large_list[pool] = NULL;
-  }
-  mem->virt_sarray_list = NULL;
-  mem->virt_barray_list = NULL;
-
-  mem->total_space_allocated = SIZEOF(my_memory_mgr);
-
-  /* Declare ourselves open for business */
-  cinfo->mem = & mem->pub;
-
-  /* Check for an environment variable JPEGMEM; if found, override the
-   * default max_memory setting from jpeg_mem_init.  Note that the
-   * surrounding application may again override this value.
-   * If your system doesn't support getenv(), define NO_GETENV to disable
-   * this feature.
-   */
-#ifndef NO_GETENV
-  { char * memenv;
-
-    if ((memenv = getenv("JPEGMEM")) != NULL) {
-      char ch = 'x';
-      unsigned int mem_max = 0u;
-
-      if (sscanf(memenv, "%u%c", &mem_max, &ch) > 0) {
-        max_to_use = (size_t)mem_max;
-        if (ch == 'm' || ch == 'M')
-          max_to_use *= 1000L;
-        mem->pub.max_memory_to_use = max_to_use * 1000L;
-      }
-    }
-  }
-#endif
-
-}
--- a/src/share/native/sun/awt/image/jpeg/jmemnobs.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jmemnobs.c
- *
- * Copyright (C) 1992-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file provides a really simple implementation of the system-
- * dependent portion of the JPEG memory manager.  This implementation
- * assumes that no backing-store files are needed: all required space
- * can be obtained from malloc().
- * This is very portable in the sense that it'll compile on almost anything,
- * but you'd better have lots of main memory (or virtual memory) if you want
- * to process big images.
- * Note that the max_memory_to_use option is ignored by this implementation.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jmemsys.h"            /* import the system-dependent declarations */
-
-#ifndef HAVE_STDLIB_H           /* <stdlib.h> should declare malloc(),free() */
-extern void * malloc JPP((size_t size));
-extern void free JPP((void *ptr));
-#endif
-
-
-/*
- * Memory allocation and freeing are controlled by the regular library
- * routines malloc() and free().
- */
-
-GLOBAL(void *)
-jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)
-{
-  return (void *) malloc(sizeofobject);
-}
-
-GLOBAL(void)
-jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)
-{
-  free(object);
-}
-
-
-/*
- * "Large" objects are treated the same as "small" ones.
- * NB: although we include FAR keywords in the routine declarations,
- * this file won't actually work in 80x86 small/medium model; at least,
- * you probably won't be able to process useful-size images in only 64KB.
- */
-
-GLOBAL(void FAR *)
-jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)
-{
-  return (void FAR *) malloc(sizeofobject);
-}
-
-GLOBAL(void)
-jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
-{
-  free(object);
-}
-
-
-/*
- * This routine computes the total memory space available for allocation.
- * Here we always say, "we got all you want bud!"
- */
-
-GLOBAL(size_t)
-jpeg_mem_available (j_common_ptr cinfo, size_t min_bytes_needed,
-                    size_t max_bytes_needed, size_t already_allocated)
-{
-  return max_bytes_needed;
-}
-
-
-/*
- * Backing store (temporary file) management.
- * Since jpeg_mem_available always promised the moon,
- * this should never be called and we can just error out.
- */
-
-GLOBAL(void)
-jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,
-                         long total_bytes_needed)
-{
-  ERREXIT(cinfo, JERR_NO_BACKING_STORE);
-}
-
-
-/*
- * These routines take care of any system-dependent initialization and
- * cleanup required.  Here, there isn't any.
- */
-
-GLOBAL(size_t)
-jpeg_mem_init (j_common_ptr cinfo)
-{
-  return 0;                     /* just set max_memory_to_use to 0 */
-}
-
-GLOBAL(void)
-jpeg_mem_term (j_common_ptr cinfo)
-{
-  /* no work */
-}
--- a/src/share/native/sun/awt/image/jpeg/jmemsys.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jmemsys.h
- *
- * Copyright (C) 1992-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This include file defines the interface between the system-independent
- * and system-dependent portions of the JPEG memory manager.  No other
- * modules need include it.  (The system-independent portion is jmemmgr.c;
- * there are several different versions of the system-dependent portion.)
- *
- * This file works as-is for the system-dependent memory managers supplied
- * in the IJG distribution.  You may need to modify it if you write a
- * custom memory manager.  If system-dependent changes are needed in
- * this file, the best method is to #ifdef them based on a configuration
- * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR
- * and USE_MAC_MEMMGR.
- */
-
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_get_small          jGetSmall
-#define jpeg_free_small         jFreeSmall
-#define jpeg_get_large          jGetLarge
-#define jpeg_free_large         jFreeLarge
-#define jpeg_mem_available      jMemAvail
-#define jpeg_open_backing_store jOpenBackStore
-#define jpeg_mem_init           jMemInit
-#define jpeg_mem_term           jMemTerm
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/*
- * These two functions are used to allocate and release small chunks of
- * memory.  (Typically the total amount requested through jpeg_get_small is
- * no more than 20K or so; this will be requested in chunks of a few K each.)
- * Behavior should be the same as for the standard library functions malloc
- * and free; in particular, jpeg_get_small must return NULL on failure.
- * On most systems, these ARE malloc and free.  jpeg_free_small is passed the
- * size of the object being freed, just in case it's needed.
- * On an 80x86 machine using small-data memory model, these manage near heap.
- */
-
-EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));
-EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,
-                                  size_t sizeofobject));
-
-/*
- * These two functions are used to allocate and release large chunks of
- * memory (up to the total free space designated by jpeg_mem_available).
- * The interface is the same as above, except that on an 80x86 machine,
- * far pointers are used.  On most other machines these are identical to
- * the jpeg_get/free_small routines; but we keep them separate anyway,
- * in case a different allocation strategy is desirable for large chunks.
- */
-
-EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,
-                                       size_t sizeofobject));
-EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,
-                                  size_t sizeofobject));
-
-/*
- * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may
- * be requested in a single call to jpeg_get_large (and jpeg_get_small for that
- * matter, but that case should never come into play).  This macro is needed
- * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.
- * On those machines, we expect that jconfig.h will provide a proper value.
- * On machines with 32-bit flat address spaces, any large constant may be used.
- *
- * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type
- * size_t and will be a multiple of sizeof(align_type).
- */
-
-#ifndef MAX_ALLOC_CHUNK         /* may be overridden in jconfig.h */
-#define MAX_ALLOC_CHUNK  1000000000L
-#endif
-
-/*
- * This routine computes the total space still available for allocation by
- * jpeg_get_large.  If more space than this is needed, backing store will be
- * used.  NOTE: any memory already allocated must not be counted.
- *
- * There is a minimum space requirement, corresponding to the minimum
- * feasible buffer sizes; jmemmgr.c will request that much space even if
- * jpeg_mem_available returns zero.  The maximum space needed, enough to hold
- * all working storage in memory, is also passed in case it is useful.
- * Finally, the total space already allocated is passed.  If no better
- * method is available, cinfo->mem->max_memory_to_use - already_allocated
- * is often a suitable calculation.
- *
- * It is OK for jpeg_mem_available to underestimate the space available
- * (that'll just lead to more backing-store access than is really necessary).
- * However, an overestimate will lead to failure.  Hence it's wise to subtract
- * a slop factor from the true available space.  5% should be enough.
- *
- * On machines with lots of virtual memory, any large constant may be returned.
- * Conversely, zero may be returned to always use the minimum amount of memory.
- */
-
-EXTERN(size_t) jpeg_mem_available JPP((j_common_ptr cinfo,
-                                     size_t min_bytes_needed,
-                                     size_t max_bytes_needed,
-                                     size_t already_allocated));
-
-
-/*
- * This structure holds whatever state is needed to access a single
- * backing-store object.  The read/write/close method pointers are called
- * by jmemmgr.c to manipulate the backing-store object; all other fields
- * are private to the system-dependent backing store routines.
- */
-
-#define TEMP_NAME_LENGTH   64   /* max length of a temporary file's name */
-
-
-#ifdef USE_MSDOS_MEMMGR         /* DOS-specific junk */
-
-typedef unsigned short XMSH;    /* type of extended-memory handles */
-typedef unsigned short EMSH;    /* type of expanded-memory handles */
-
-typedef union {
-  short file_handle;            /* DOS file handle if it's a temp file */
-  XMSH xms_handle;              /* handle if it's a chunk of XMS */
-  EMSH ems_handle;              /* handle if it's a chunk of EMS */
-} handle_union;
-
-#endif /* USE_MSDOS_MEMMGR */
-
-#ifdef USE_MAC_MEMMGR           /* Mac-specific junk */
-#include <Files.h>
-#endif /* USE_MAC_MEMMGR */
-
-
-typedef struct backing_store_struct * backing_store_ptr;
-
-typedef struct backing_store_struct {
-  /* Methods for reading/writing/closing this backing-store object */
-  JMETHOD(void, read_backing_store, (j_common_ptr cinfo,
-                                     backing_store_ptr info,
-                                     void FAR * buffer_address,
-                                     long file_offset, long byte_count));
-  JMETHOD(void, write_backing_store, (j_common_ptr cinfo,
-                                      backing_store_ptr info,
-                                      void FAR * buffer_address,
-                                      long file_offset, long byte_count));
-  JMETHOD(void, close_backing_store, (j_common_ptr cinfo,
-                                      backing_store_ptr info));
-
-  /* Private fields for system-dependent backing-store management */
-#ifdef USE_MSDOS_MEMMGR
-  /* For the MS-DOS manager (jmemdos.c), we need: */
-  handle_union handle;          /* reference to backing-store storage object */
-  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
-#else
-#ifdef USE_MAC_MEMMGR
-  /* For the Mac manager (jmemmac.c), we need: */
-  short temp_file;              /* file reference number to temp file */
-  FSSpec tempSpec;              /* the FSSpec for the temp file */
-  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
-#else
-  /* For a typical implementation with temp files, we need: */
-  FILE * temp_file;             /* stdio reference to temp file */
-  char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
-#endif
-#endif
-} backing_store_info;
-
-
-/*
- * Initial opening of a backing-store object.  This must fill in the
- * read/write/close pointers in the object.  The read/write routines
- * may take an error exit if the specified maximum file size is exceeded.
- * (If jpeg_mem_available always returns a large value, this routine can
- * just take an error exit.)
- */
-
-EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,
-                                          backing_store_ptr info,
-                                          long total_bytes_needed));
-
-
-/*
- * These routines take care of any system-dependent initialization and
- * cleanup required.  jpeg_mem_init will be called before anything is
- * allocated (and, therefore, nothing in cinfo is of use except the error
- * manager pointer).  It should return a suitable default value for
- * max_memory_to_use; this may subsequently be overridden by the surrounding
- * application.  (Note that max_memory_to_use is only important if
- * jpeg_mem_available chooses to consult it ... no one else will.)
- * jpeg_mem_term may assume that all requested memory has been freed and that
- * all opened backing-store objects have been closed.
- */
-
-EXTERN(size_t) jpeg_mem_init JPP((j_common_ptr cinfo));
-EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));
--- a/src/share/native/sun/awt/image/jpeg/jmorecfg.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,378 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jmorecfg.h
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains additional configuration options that customize the
- * JPEG software for special applications or support machine-dependent
- * optimizations.  Most users will not need to touch this file.
- */
-
-
-/*
- * Define BITS_IN_JSAMPLE as either
- *   8   for 8-bit sample values (the usual setting)
- *   12  for 12-bit sample values
- * Only 8 and 12 are legal data precisions for lossy JPEG according to the
- * JPEG standard, and the IJG code does not support anything else!
- * We do not support run-time selection of data precision, sorry.
- */
-
-#define BITS_IN_JSAMPLE  8      /* use 8 or 12 */
-
-
-/*
- * Maximum number of components (color channels) allowed in JPEG image.
- * To meet the letter of the JPEG spec, set this to 255.  However, darn
- * few applications need more than 4 channels (maybe 5 for CMYK + alpha
- * mask).  We recommend 10 as a reasonable compromise; use 4 if you are
- * really short on memory.  (Each allowed component costs a hundred or so
- * bytes of storage, whether actually used in an image or not.)
- */
-
-#define MAX_COMPONENTS  10      /* maximum number of image components */
-
-
-/*
- * Basic data types.
- * You may need to change these if you have a machine with unusual data
- * type sizes; for example, "char" not 8 bits, "short" not 16 bits,
- * or "long" not 32 bits.  We don't care whether "int" is 16 or 32 bits,
- * but it had better be at least 16.
- */
-
-/* Representation of a single sample (pixel element value).
- * We frequently allocate large arrays of these, so it's important to keep
- * them small.  But if you have memory to burn and access to char or short
- * arrays is very slow on your hardware, you might want to change these.
- */
-
-#if BITS_IN_JSAMPLE == 8
-/* JSAMPLE should be the smallest type that will hold the values 0..255.
- * You can use a signed char by having GETJSAMPLE mask it with 0xFF.
- */
-
-#ifdef HAVE_UNSIGNED_CHAR
-
-typedef unsigned char JSAMPLE;
-#define GETJSAMPLE(value)  ((int) (value))
-
-#else /* not HAVE_UNSIGNED_CHAR */
-
-typedef char JSAMPLE;
-#ifdef CHAR_IS_UNSIGNED
-#define GETJSAMPLE(value)  ((int) (value))
-#else
-#define GETJSAMPLE(value)  ((int) (value) & 0xFF)
-#endif /* CHAR_IS_UNSIGNED */
-
-#endif /* HAVE_UNSIGNED_CHAR */
-
-#define MAXJSAMPLE      255
-#define CENTERJSAMPLE   128
-
-#endif /* BITS_IN_JSAMPLE == 8 */
-
-
-#if BITS_IN_JSAMPLE == 12
-/* JSAMPLE should be the smallest type that will hold the values 0..4095.
- * On nearly all machines "short" will do nicely.
- */
-
-typedef short JSAMPLE;
-#define GETJSAMPLE(value)  ((int) (value))
-
-#define MAXJSAMPLE      4095
-#define CENTERJSAMPLE   2048
-
-#endif /* BITS_IN_JSAMPLE == 12 */
-
-
-/* Representation of a DCT frequency coefficient.
- * This should be a signed value of at least 16 bits; "short" is usually OK.
- * Again, we allocate large arrays of these, but you can change to int
- * if you have memory to burn and "short" is really slow.
- */
-
-typedef short JCOEF;
-
-
-/* Compressed datastreams are represented as arrays of JOCTET.
- * These must be EXACTLY 8 bits wide, at least once they are written to
- * external storage.  Note that when using the stdio data source/destination
- * managers, this is also the data type passed to fread/fwrite.
- */
-
-#ifdef HAVE_UNSIGNED_CHAR
-
-typedef unsigned char JOCTET;
-#define GETJOCTET(value)  (value)
-
-#else /* not HAVE_UNSIGNED_CHAR */
-
-typedef char JOCTET;
-#ifdef CHAR_IS_UNSIGNED
-#define GETJOCTET(value)  (value)
-#else
-#define GETJOCTET(value)  ((value) & 0xFF)
-#endif /* CHAR_IS_UNSIGNED */
-
-#endif /* HAVE_UNSIGNED_CHAR */
-
-
-/* These typedefs are used for various table entries and so forth.
- * They must be at least as wide as specified; but making them too big
- * won't cost a huge amount of memory, so we don't provide special
- * extraction code like we did for JSAMPLE.  (In other words, these
- * typedefs live at a different point on the speed/space tradeoff curve.)
- */
-
-/* UINT8 must hold at least the values 0..255. */
-
-#ifdef HAVE_UNSIGNED_CHAR
-typedef unsigned char UINT8;
-#else /* not HAVE_UNSIGNED_CHAR */
-#ifdef CHAR_IS_UNSIGNED
-typedef char UINT8;
-#else /* not CHAR_IS_UNSIGNED */
-typedef short UINT8;
-#endif /* CHAR_IS_UNSIGNED */
-#endif /* HAVE_UNSIGNED_CHAR */
-
-/* UINT16 must hold at least the values 0..65535. */
-
-#ifdef HAVE_UNSIGNED_SHORT
-typedef unsigned short UINT16;
-#else /* not HAVE_UNSIGNED_SHORT */
-typedef unsigned int UINT16;
-#endif /* HAVE_UNSIGNED_SHORT */
-
-/* INT16 must hold at least the values -32768..32767. */
-
-#ifndef XMD_H                   /* X11/xmd.h correctly defines INT16 */
-typedef short INT16;
-#endif
-
-/* INT32 must hold at least signed 32-bit values. */
-
-#ifndef XMD_H                         /* X11/xmd.h correctly defines INT32 */
-#if defined(_LP64) || defined(_WIN32) /* _WIN32 is on all windows platfroms (x86 and x64) */
-typedef int INT32;
-#else
-typedef long INT32;
-#endif
-#endif
-
-/* Datatype used for image dimensions.  The JPEG standard only supports
- * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore
- * "unsigned int" is sufficient on all machines.  However, if you need to
- * handle larger images and you don't mind deviating from the spec, you
- * can change this datatype.
- */
-
-typedef unsigned int JDIMENSION;
-
-#ifndef _LP64
-#define JPEG_MAX_DIMENSION  65500L  /* a tad under 64K to prevent overflows */
-#else
-#define JPEG_MAX_DIMENSION  65500  /* a tad under 64K to prevent overflows */
-#endif
-
-
-/* These macros are used in all function definitions and extern declarations.
- * You could modify them if you need to change function linkage conventions;
- * in particular, you'll need to do that to make the library a Windows DLL.
- * Another application is to make all functions global for use with debuggers
- * or code profilers that require it.
- */
-
-/* a function called through method pointers: */
-#define METHODDEF(type)         static type
-/* a function used only in its module: */
-#define LOCAL(type)             static type
-/* a function referenced thru EXTERNs: */
-#define GLOBAL(type)            type
-/* a reference to a GLOBAL function: */
-#define EXTERN(type)            extern type
-
-
-/* This macro is used to declare a "method", that is, a function pointer.
- * We want to supply prototype parameters if the compiler can cope.
- * Note that the arglist parameter must be parenthesized!
- * Again, you can customize this if you need special linkage keywords.
- */
-
-#ifdef HAVE_PROTOTYPES
-#define JMETHOD(type,methodname,arglist)  type (*methodname) arglist
-#else
-#define JMETHOD(type,methodname,arglist)  type (*methodname) ()
-#endif
-
-
-/* Here is the pseudo-keyword for declaring pointers that must be "far"
- * on 80x86 machines.  Most of the specialized coding for 80x86 is handled
- * by just saying "FAR *" where such a pointer is needed.  In a few places
- * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
- */
-
-
-#ifndef FAR
-#ifdef NEED_FAR_POINTERS
-#define FAR  far
-#else
-#define FAR
-#endif
-#endif
-
-
-/*
- * On a few systems, type boolean and/or its values FALSE, TRUE may appear
- * in standard header files.  Or you may have conflicts with application-
- * specific header files that you want to include together with these files.
- * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
- */
-
-#ifndef HAVE_BOOLEAN
-typedef int boolean;
-#endif
-#ifndef FALSE                   /* in case these macros already exist */
-#define FALSE   0               /* values of boolean */
-#endif
-#ifndef TRUE
-#define TRUE    1
-#endif
-
-
-/*
- * The remaining options affect code selection within the JPEG library,
- * but they don't need to be visible to most applications using the library.
- * To minimize application namespace pollution, the symbols won't be
- * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
- */
-
-#ifdef JPEG_INTERNALS
-#define JPEG_INTERNAL_OPTIONS
-#endif
-
-#ifdef JPEG_INTERNAL_OPTIONS
-
-
-/*
- * These defines indicate whether to include various optional functions.
- * Undefining some of these symbols will produce a smaller but less capable
- * library.  Note that you can leave certain source files out of the
- * compilation/linking process if you've #undef'd the corresponding symbols.
- * (You may HAVE to do that if your compiler doesn't like null source files.)
- */
-
-/* Arithmetic coding is unsupported for legal reasons.  Complaints to IBM. */
-
-/* Capability options common to encoder and decoder: */
-
-#define DCT_ISLOW_SUPPORTED     /* slow but accurate integer algorithm */
-#define DCT_IFAST_SUPPORTED     /* faster, less accurate integer method */
-#define DCT_FLOAT_SUPPORTED     /* floating-point: accurate, fast on fast HW */
-
-/* Encoder capability options: */
-
-#undef  C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */
-#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
-#define C_PROGRESSIVE_SUPPORTED     /* Progressive JPEG? (Requires MULTISCAN)*/
-#define ENTROPY_OPT_SUPPORTED       /* Optimization of entropy coding parms? */
-/* Note: if you selected 12-bit data precision, it is dangerous to turn off
- * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit
- * precision, so jchuff.c normally uses entropy optimization to compute
- * usable tables for higher precision.  If you don't want to do optimization,
- * you'll have to supply different default Huffman tables.
- * The exact same statements apply for progressive JPEG: the default tables
- * don't work for progressive mode.  (This may get fixed, however.)
- */
-#define INPUT_SMOOTHING_SUPPORTED   /* Input image smoothing option? */
-
-/* Decoder capability options: */
-
-#undef  D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */
-#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
-#define D_PROGRESSIVE_SUPPORTED     /* Progressive JPEG? (Requires MULTISCAN)*/
-#define SAVE_MARKERS_SUPPORTED      /* jpeg_save_markers() needed? */
-#define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */
-#define IDCT_SCALING_SUPPORTED      /* Output rescaling via IDCT? */
-#undef  UPSAMPLE_SCALING_SUPPORTED  /* Output rescaling at upsample stage? */
-#define UPSAMPLE_MERGING_SUPPORTED  /* Fast path for sloppy upsampling? */
-#define QUANT_1PASS_SUPPORTED       /* 1-pass color quantization? */
-#define QUANT_2PASS_SUPPORTED       /* 2-pass color quantization? */
-
-/* more capability options later, no doubt */
-
-
-/*
- * Ordering of RGB data in scanlines passed to or from the application.
- * If your application wants to deal with data in the order B,G,R, just
- * change these macros.  You can also deal with formats such as R,G,B,X
- * (one extra byte per pixel) by changing RGB_PIXELSIZE.  Note that changing
- * the offsets will also change the order in which colormap data is organized.
- * RESTRICTIONS:
- * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
- * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
- *    useful if you are using JPEG color spaces other than YCbCr or grayscale.
- * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
- *    is not 3 (they don't understand about dummy color components!).  So you
- *    can't use color quantization if you change that value.
- */
-
-#define RGB_RED         0       /* Offset of Red in an RGB scanline element */
-#define RGB_GREEN       1       /* Offset of Green */
-#define RGB_BLUE        2       /* Offset of Blue */
-#define RGB_PIXELSIZE   3       /* JSAMPLEs per RGB scanline element */
-
-
-/* Definitions for speed-related optimizations. */
-
-
-/* If your compiler supports inline functions, define INLINE
- * as the inline keyword; otherwise define it as empty.
- */
-
-#ifndef INLINE
-#ifdef __GNUC__                 /* for instance, GNU C knows about inline */
-#define INLINE __inline__
-#endif
-#ifndef INLINE
-#define INLINE                  /* default is to define it as empty */
-#endif
-#endif
-
-
-/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
- * two 16-bit shorts is faster than multiplying two ints.  Define MULTIPLIER
- * as short on such a machine.  MULTIPLIER must be at least 16 bits wide.
- */
-
-#ifndef MULTIPLIER
-#define MULTIPLIER  int         /* type for fastest integer multiply */
-#endif
-
-
-/* FAST_FLOAT should be either float or double, whichever is done faster
- * by your compiler.  (Note that this type is only used in the floating point
- * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
- * Typically, float is faster in ANSI C compilers, while double is faster in
- * pre-ANSI compilers (because they insist on converting to double anyway).
- * The code below therefore chooses float if we have ANSI-style prototypes.
- */
-
-#ifndef FAST_FLOAT
-#ifdef HAVE_PROTOTYPES
-#define FAST_FLOAT  float
-#else
-#define FAST_FLOAT  double
-#endif
-#endif
-
-#endif /* JPEG_INTERNAL_OPTIONS */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/README	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,385 @@
+The Independent JPEG Group's JPEG software
+==========================================
+
+README for release 6b of 27-Mar-1998
+====================================
+
+This distribution contains the sixth public release of the Independent JPEG
+Group's free JPEG software.  You are welcome to redistribute this software and
+to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
+
+Serious users of this software (particularly those incorporating it into
+larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to
+our electronic mailing list.  Mailing list members are notified of updates
+and have a chance to participate in technical discussions, etc.
+
+This software is the work of Tom Lane, Philip Gladstone, Jim Boucher,
+Lee Crocker, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi,
+Guido Vollbeding, Ge' Weijers, and other members of the Independent JPEG
+Group.
+
+IJG is not affiliated with the official ISO JPEG standards committee.
+
+
+DOCUMENTATION ROADMAP
+=====================
+
+This file contains the following sections:
+
+OVERVIEW            General description of JPEG and the IJG software.
+LEGAL ISSUES        Copyright, lack of warranty, terms of distribution.
+REFERENCES          Where to learn more about JPEG.
+ARCHIVE LOCATIONS   Where to find newer versions of this software.
+RELATED SOFTWARE    Other stuff you should get.
+FILE FORMAT WARS    Software *not* to get.
+TO DO               Plans for future IJG releases.
+
+Other documentation files in the distribution are:
+
+User documentation:
+  install.doc       How to configure and install the IJG software.
+  usage.doc         Usage instructions for cjpeg, djpeg, jpegtran,
+                    rdjpgcom, and wrjpgcom.
+  *.1               Unix-style man pages for programs (same info as usage.doc).
+  wizard.doc        Advanced usage instructions for JPEG wizards only.
+  change.log        Version-to-version change highlights.
+Programmer and internal documentation:
+  libjpeg.doc       How to use the JPEG library in your own programs.
+  example.c         Sample code for calling the JPEG library.
+  structure.doc     Overview of the JPEG library's internal structure.
+  filelist.doc      Road map of IJG files.
+  coderules.doc     Coding style rules --- please read if you contribute code.
+
+Please read at least the files install.doc and usage.doc.  Useful information
+can also be found in the JPEG FAQ (Frequently Asked Questions) article.  See
+ARCHIVE LOCATIONS below to find out where to obtain the FAQ article.
+
+If you want to understand how the JPEG code works, we suggest reading one or
+more of the REFERENCES, then looking at the documentation files (in roughly
+the order listed) before diving into the code.
+
+
+OVERVIEW
+========
+
+This package contains C software to implement JPEG image compression and
+decompression.  JPEG (pronounced "jay-peg") is a standardized compression
+method for full-color and gray-scale images.  JPEG is intended for compressing
+"real-world" scenes; line drawings, cartoons and other non-realistic images
+are not its strong suit.  JPEG is lossy, meaning that the output image is not
+exactly identical to the input image.  Hence you must not use JPEG if you
+have to have identical output bits.  However, on typical photographic images,
+very good compression levels can be obtained with no visible change, and
+remarkably high compression levels are possible if you can tolerate a
+low-quality image.  For more details, see the references, or just experiment
+with various compression settings.
+
+This software implements JPEG baseline, extended-sequential, and progressive
+compression processes.  Provision is made for supporting all variants of these
+processes, although some uncommon parameter settings aren't implemented yet.
+For legal reasons, we are not distributing code for the arithmetic-coding
+variants of JPEG; see LEGAL ISSUES.  We have made no provision for supporting
+the hierarchical or lossless processes defined in the standard.
+
+We provide a set of library routines for reading and writing JPEG image files,
+plus two sample applications "cjpeg" and "djpeg", which use the library to
+perform conversion between JPEG and some other popular image file formats.
+The library is intended to be reused in other applications.
+
+In order to support file conversion and viewing software, we have included
+considerable functionality beyond the bare JPEG coding/decoding capability;
+for example, the color quantization modules are not strictly part of JPEG
+decoding, but they are essential for output to colormapped file formats or
+colormapped displays.  These extra functions can be compiled out of the
+library if not required for a particular application.  We have also included
+"jpegtran", a utility for lossless transcoding between different JPEG
+processes, and "rdjpgcom" and "wrjpgcom", two simple applications for
+inserting and extracting textual comments in JFIF files.
+
+The emphasis in designing this software has been on achieving portability and
+flexibility, while also making it fast enough to be useful.  In particular,
+the software is not intended to be read as a tutorial on JPEG.  (See the
+REFERENCES section for introductory material.)  Rather, it is intended to
+be reliable, portable, industrial-strength code.  We do not claim to have
+achieved that goal in every aspect of the software, but we strive for it.
+
+We welcome the use of this software as a component of commercial products.
+No royalty is required, but we do ask for an acknowledgement in product
+documentation, as described under LEGAL ISSUES.
+
+
+LEGAL ISSUES
+============
+
+In plain English:
+
+1. We don't promise that this software works.  (But if you find any bugs,
+   please let us know!)
+2. You can use this software for whatever you want.  You don't have to pay us.
+3. You may not pretend that you wrote this software.  If you use it in a
+   program, you must acknowledge somewhere in your documentation that
+   you've used the IJG code.
+
+In legalese:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose.  This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library.  If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it.  This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it.  (See the file
+ansi2knr.c for full details.)  However, since ansi2knr.c is not needed as part
+of any program generated from the IJG code, this does not limit you more than
+the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltconfig, ltmain.sh).  Another support script, install-sh, is copyright
+by M.I.T. but is also freely distributable.
+
+It appears that the arithmetic coding option of the JPEG spec is covered by
+patents owned by IBM, AT&T, and Mitsubishi.  Hence arithmetic coding cannot
+legally be used without obtaining one or more licenses.  For this reason,
+support for arithmetic coding has been removed from the free JPEG software.
+(Since arithmetic coding provides only a marginal gain over the unpatented
+Huffman mode, it is unlikely that very many implementations will support it.)
+So far as we are aware, there are no patent restrictions on the remaining
+code.
+
+The IJG distribution formerly included code to read and write GIF files.
+To avoid entanglement with the Unisys LZW patent, GIF reading support has
+been removed altogether, and the GIF writer has been simplified to produce
+"uncompressed GIFs".  This technique does not use the LZW algorithm; the
+resulting GIF files are larger than usual, but are readable by all standard
+GIF decoders.
+
+We are required to state that
+    "The Graphics Interchange Format(c) is the Copyright property of
+    CompuServe Incorporated.  GIF(sm) is a Service Mark property of
+    CompuServe Incorporated."
+
+
+REFERENCES
+==========
+
+We highly recommend reading one or more of these references before trying to
+understand the innards of the JPEG software.
+
+The best short technical introduction to the JPEG compression algorithm is
+	Wallace, Gregory K.  "The JPEG Still Picture Compression Standard",
+	Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
+(Adjacent articles in that issue discuss MPEG motion picture compression,
+applications of JPEG, and related topics.)  If you don't have the CACM issue
+handy, a PostScript file containing a revised version of Wallace's article is
+available at ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz.  The file (actually
+a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
+omits the sample images that appeared in CACM, but it includes corrections
+and some added material.  Note: the Wallace article is copyright ACM and IEEE,
+and it may not be used for commercial purposes.
+
+A somewhat less technical, more leisurely introduction to JPEG can be found in
+"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by
+M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1.  This book provides
+good explanations and example C code for a multitude of compression methods
+including JPEG.  It is an excellent source if you are comfortable reading C
+code but don't know much about data compression in general.  The book's JPEG
+sample code is far from industrial-strength, but when you are ready to look
+at a full implementation, you've got one here...
+
+The best full description of JPEG is the textbook "JPEG Still Image Data
+Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published
+by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.  Price US$59.95, 638 pp.
+The book includes the complete text of the ISO JPEG standards (DIS 10918-1
+and draft DIS 10918-2).  This is by far the most complete exposition of JPEG
+in existence, and we highly recommend it.
+
+The JPEG standard itself is not available electronically; you must order a
+paper copy through ISO or ITU.  (Unless you feel a need to own a certified
+official copy, we recommend buying the Pennebaker and Mitchell book instead;
+it's much cheaper and includes a great deal of useful explanatory material.)
+In the USA, copies of the standard may be ordered from ANSI Sales at (212)
+642-4900, or from Global Engineering Documents at (800) 854-7179.  (ANSI
+doesn't take credit card orders, but Global does.)  It's not cheap: as of
+1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7%
+shipping/handling.  The standard is divided into two parts, Part 1 being the
+actual specification, while Part 2 covers compliance testing methods.  Part 1
+is titled "Digital Compression and Coding of Continuous-tone Still Images,
+Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
+10918-1, ITU-T T.81.  Part 2 is titled "Digital Compression and Coding of
+Continuous-tone Still Images, Part 2: Compliance testing" and has document
+numbers ISO/IEC IS 10918-2, ITU-T T.83.
+
+Some extensions to the original JPEG standard are defined in JPEG Part 3,
+a newer ISO standard numbered ISO/IEC IS 10918-3 and ITU-T T.84.  IJG
+currently does not support any Part 3 extensions.
+
+The JPEG standard does not specify all details of an interchangeable file
+format.  For the omitted details we follow the "JFIF" conventions, revision
+1.02.  A copy of the JFIF spec is available from:
+	Literature Department
+	C-Cube Microsystems, Inc.
+	1778 McCarthy Blvd.
+	Milpitas, CA 95035
+	phone (408) 944-6300,  fax (408) 944-6314
+A PostScript version of this document is available by FTP at
+ftp://ftp.uu.net/graphics/jpeg/jfif.ps.gz.  There is also a plain text
+version at ftp://ftp.uu.net/graphics/jpeg/jfif.txt.gz, but it is missing
+the figures.
+
+The TIFF 6.0 file format specification can be obtained by FTP from
+ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz.  The JPEG incorporation scheme
+found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
+IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
+Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
+(Compression tag 7).  Copies of this Note can be obtained from ftp.sgi.com or
+from ftp://ftp.uu.net/graphics/jpeg/.  It is expected that the next revision
+of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
+Although IJG's own code does not support TIFF/JPEG, the free libtiff library
+uses our library to implement TIFF/JPEG per the Note.  libtiff is available
+from ftp://ftp.sgi.com/graphics/tiff/.
+
+
+ARCHIVE LOCATIONS
+=================
+
+The "official" archive site for this software is ftp.uu.net (Internet
+address 192.48.96.9).  The most recent released version can always be found
+there in directory graphics/jpeg.  This particular version will be archived
+as ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz.  If you don't have
+direct Internet access, UUNET's archives are also available via UUCP; contact
+help@uunet.uu.net for information on retrieving files that way.
+
+Numerous Internet sites maintain copies of the UUNET files.  However, only
+ftp.uu.net is guaranteed to have the latest official version.
+
+You can also obtain this software in DOS-compatible "zip" archive format from
+the SimTel archives (ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/), or
+on CompuServe in the Graphics Support forum (GO CIS:GRAPHSUP), library 12
+"JPEG Tools".  Again, these versions may sometimes lag behind the ftp.uu.net
+release.
+
+The JPEG FAQ (Frequently Asked Questions) article is a useful source of
+general information about JPEG.  It is updated constantly and therefore is
+not included in this distribution.  The FAQ is posted every two weeks to
+Usenet newsgroups comp.graphics.misc, news.answers, and other groups.
+It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
+and other news.answers archive sites, including the official news.answers
+archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
+If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
+with body
+	send usenet/news.answers/jpeg-faq/part1
+	send usenet/news.answers/jpeg-faq/part2
+
+
+RELATED SOFTWARE
+================
+
+Numerous viewing and image manipulation programs now support JPEG.  (Quite a
+few of them use this library to do so.)  The JPEG FAQ described above lists
+some of the more popular free and shareware viewers, and tells where to
+obtain them on Internet.
+
+If you are on a Unix machine, we highly recommend Jef Poskanzer's free
+PBMPLUS software, which provides many useful operations on PPM-format image
+files.  In particular, it can convert PPM images to and from a wide range of
+other formats, thus making cjpeg/djpeg considerably more useful.  The latest
+version is distributed by the NetPBM group, and is available from numerous
+sites, notably ftp://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/.
+Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software is;
+you are likely to have difficulty making it work on any non-Unix machine.
+
+A different free JPEG implementation, written by the PVRG group at Stanford,
+is available from ftp://havefun.stanford.edu/pub/jpeg/.  This program
+is designed for research and experimentation rather than production use;
+it is slower, harder to use, and less portable than the IJG code, but it
+is easier to read and modify.  Also, the PVRG code supports lossless JPEG,
+which we do not.  (On the other hand, it doesn't do progressive JPEG.)
+
+
+FILE FORMAT WARS
+================
+
+Some JPEG programs produce files that are not compatible with our library.
+The root of the problem is that the ISO JPEG committee failed to specify a
+concrete file format.  Some vendors "filled in the blanks" on their own,
+creating proprietary formats that no one else could read.  (For example, none
+of the early commercial JPEG implementations for the Macintosh were able to
+exchange compressed files.)
+
+The file format we have adopted is called JFIF (see REFERENCES).  This format
+has been agreed to by a number of major commercial JPEG vendors, and it has
+become the de facto standard.  JFIF is a minimal or "low end" representation.
+We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF
+Technical Note #2) for "high end" applications that need to record a lot of
+additional data about an image.  TIFF/JPEG is fairly new and not yet widely
+supported, unfortunately.
+
+The upcoming JPEG Part 3 standard defines a file format called SPIFF.
+SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should
+be able to read the most common variant of SPIFF.  SPIFF has some technical
+advantages over JFIF, but its major claim to fame is simply that it is an
+official standard rather than an informal one.  At this point it is unclear
+whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto
+standard.  IJG intends to support SPIFF once the standard is frozen, but we
+have not decided whether it should become our default output format or not.
+(In any case, our decoder will remain capable of reading JFIF indefinitely.)
+
+Various proprietary file formats incorporating JPEG compression also exist.
+We have little or no sympathy for the existence of these formats.  Indeed,
+one of the original reasons for developing this free software was to help
+force convergence on common, open format standards for JPEG files.  Don't
+use a proprietary file format!
+
+
+TO DO
+=====
+
+The major thrust for v7 will probably be improvement of visual quality.
+The current method for scaling the quantization tables is known not to be
+very good at low Q values.  We also intend to investigate block boundary
+smoothing, "poor man's variable quantization", and other means of improving
+quality-vs-file-size performance without sacrificing compatibility.
+
+In future versions, we are considering supporting some of the upcoming JPEG
+Part 3 extensions --- principally, variable quantization and the SPIFF file
+format.
+
+As always, speeding things up is of great interest.
+
+Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcapimin.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,284 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcapimin.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the compression half
+ * of the JPEG library.  These are the "minimum" API routines that may be
+ * needed in either the normal full-compression case or the transcoding-only
+ * case.
+ *
+ * Most of the routines intended to be called directly by an application
+ * are in this file or in jcapistd.c.  But also see jcparam.c for
+ * parameter-setup helper routines, jcomapi.c for routines shared by
+ * compression and decompression, and jctrans.c for the transcoding case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Initialization of a JPEG compression object.
+ * The error manager must already be set up (in case memory manager fails).
+ */
+
+GLOBAL(void)
+jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
+{
+  int i;
+
+  /* Guard against version mismatches between library and caller. */
+  cinfo->mem = NULL;            /* so jpeg_destroy knows mem mgr not called */
+  if (version != JPEG_LIB_VERSION)
+    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
+  if (structsize != SIZEOF(struct jpeg_compress_struct))
+    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
+             (int) SIZEOF(struct jpeg_compress_struct), (int) structsize);
+
+  /* For debugging purposes, we zero the whole master structure.
+   * But the application has already set the err pointer, and may have set
+   * client_data, so we have to save and restore those fields.
+   * Note: if application hasn't set client_data, tools like Purify may
+   * complain here.
+   */
+  {
+    struct jpeg_error_mgr * err = cinfo->err;
+    void * client_data = cinfo->client_data; /* ignore Purify complaint here */
+    MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));
+    cinfo->err = err;
+    cinfo->client_data = client_data;
+  }
+  cinfo->is_decompressor = FALSE;
+
+  /* Initialize a memory manager instance for this object */
+  jinit_memory_mgr((j_common_ptr) cinfo);
+
+  /* Zero out pointers to permanent structures. */
+  cinfo->progress = NULL;
+  cinfo->dest = NULL;
+
+  cinfo->comp_info = NULL;
+
+  for (i = 0; i < NUM_QUANT_TBLS; i++)
+    cinfo->quant_tbl_ptrs[i] = NULL;
+
+  for (i = 0; i < NUM_HUFF_TBLS; i++) {
+    cinfo->dc_huff_tbl_ptrs[i] = NULL;
+    cinfo->ac_huff_tbl_ptrs[i] = NULL;
+  }
+
+  cinfo->script_space = NULL;
+
+  cinfo->input_gamma = 1.0;     /* in case application forgets */
+
+  /* OK, I'm ready */
+  cinfo->global_state = CSTATE_START;
+}
+
+
+/*
+ * Destruction of a JPEG compression object
+ */
+
+GLOBAL(void)
+jpeg_destroy_compress (j_compress_ptr cinfo)
+{
+  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Abort processing of a JPEG compression operation,
+ * but don't destroy the object itself.
+ */
+
+GLOBAL(void)
+jpeg_abort_compress (j_compress_ptr cinfo)
+{
+  jpeg_abort((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Forcibly suppress or un-suppress all quantization and Huffman tables.
+ * Marks all currently defined tables as already written (if suppress)
+ * or not written (if !suppress).  This will control whether they get emitted
+ * by a subsequent jpeg_start_compress call.
+ *
+ * This routine is exported for use by applications that want to produce
+ * abbreviated JPEG datastreams.  It logically belongs in jcparam.c, but
+ * since it is called by jpeg_start_compress, we put it here --- otherwise
+ * jcparam.o would be linked whether the application used it or not.
+ */
+
+GLOBAL(void)
+jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)
+{
+  int i;
+  JQUANT_TBL * qtbl;
+  JHUFF_TBL * htbl;
+
+  for (i = 0; i < NUM_QUANT_TBLS; i++) {
+    if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)
+      qtbl->sent_table = suppress;
+  }
+
+  for (i = 0; i < NUM_HUFF_TBLS; i++) {
+    if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)
+      htbl->sent_table = suppress;
+    if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)
+      htbl->sent_table = suppress;
+  }
+}
+
+
+/*
+ * Finish JPEG compression.
+ *
+ * If a multipass operating mode was selected, this may do a great deal of
+ * work including most of the actual output.
+ */
+
+GLOBAL(void)
+jpeg_finish_compress (j_compress_ptr cinfo)
+{
+  JDIMENSION iMCU_row;
+
+  if (cinfo->global_state == CSTATE_SCANNING ||
+      cinfo->global_state == CSTATE_RAW_OK) {
+    /* Terminate first pass */
+    if (cinfo->next_scanline < cinfo->image_height)
+      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
+    (*cinfo->master->finish_pass) (cinfo);
+  } else if (cinfo->global_state != CSTATE_WRCOEFS)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  /* Perform any remaining passes */
+  while (! cinfo->master->is_last_pass) {
+    (*cinfo->master->prepare_for_pass) (cinfo);
+    for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {
+      if (cinfo->progress != NULL) {
+        cinfo->progress->pass_counter = (long) iMCU_row;
+        cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;
+        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+      }
+      /* We bypass the main controller and invoke coef controller directly;
+       * all work is being done from the coefficient buffer.
+       */
+      if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))
+        ERREXIT(cinfo, JERR_CANT_SUSPEND);
+    }
+    (*cinfo->master->finish_pass) (cinfo);
+  }
+  /* Write EOI, do final cleanup */
+  (*cinfo->marker->write_file_trailer) (cinfo);
+  (*cinfo->dest->term_destination) (cinfo);
+  /* We can use jpeg_abort to release memory and reset global_state */
+  jpeg_abort((j_common_ptr) cinfo);
+}
+
+
+/*
+ * Write a special marker.
+ * This is only recommended for writing COM or APPn markers.
+ * Must be called after jpeg_start_compress() and before
+ * first call to jpeg_write_scanlines() or jpeg_write_raw_data().
+ */
+
+GLOBAL(void)
+jpeg_write_marker (j_compress_ptr cinfo, int marker,
+                   const JOCTET *dataptr, unsigned int datalen)
+{
+  JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));
+
+  if (cinfo->next_scanline != 0 ||
+      (cinfo->global_state != CSTATE_SCANNING &&
+       cinfo->global_state != CSTATE_RAW_OK &&
+       cinfo->global_state != CSTATE_WRCOEFS))
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
+  write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */
+  while (datalen--) {
+    (*write_marker_byte) (cinfo, *dataptr);
+    dataptr++;
+  }
+}
+
+/* Same, but piecemeal. */
+
+GLOBAL(void)
+jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
+{
+  if (cinfo->next_scanline != 0 ||
+      (cinfo->global_state != CSTATE_SCANNING &&
+       cinfo->global_state != CSTATE_RAW_OK &&
+       cinfo->global_state != CSTATE_WRCOEFS))
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
+}
+
+GLOBAL(void)
+jpeg_write_m_byte (j_compress_ptr cinfo, int val)
+{
+  (*cinfo->marker->write_marker_byte) (cinfo, val);
+}
+
+
+/*
+ * Alternate compression function: just write an abbreviated table file.
+ * Before calling this, all parameters and a data destination must be set up.
+ *
+ * To produce a pair of files containing abbreviated tables and abbreviated
+ * image data, one would proceed as follows:
+ *
+ *              initialize JPEG object
+ *              set JPEG parameters
+ *              set destination to table file
+ *              jpeg_write_tables(cinfo);
+ *              set destination to image file
+ *              jpeg_start_compress(cinfo, FALSE);
+ *              write data...
+ *              jpeg_finish_compress(cinfo);
+ *
+ * jpeg_write_tables has the side effect of marking all tables written
+ * (same as jpeg_suppress_tables(..., TRUE)).  Thus a subsequent start_compress
+ * will not re-emit the tables unless it is passed write_all_tables=TRUE.
+ */
+
+GLOBAL(void)
+jpeg_write_tables (j_compress_ptr cinfo)
+{
+  if (cinfo->global_state != CSTATE_START)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  /* (Re)initialize error mgr and destination modules */
+  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+  (*cinfo->dest->init_destination) (cinfo);
+  /* Initialize the marker writer ... bit of a crock to do it here. */
+  jinit_marker_writer(cinfo);
+  /* Write them tables! */
+  (*cinfo->marker->write_tables_only) (cinfo);
+  /* And clean up. */
+  (*cinfo->dest->term_destination) (cinfo);
+  /*
+   * In library releases up through v6a, we called jpeg_abort() here to free
+   * any working memory allocated by the destination manager and marker
+   * writer.  Some applications had a problem with that: they allocated space
+   * of their own from the library memory manager, and didn't want it to go
+   * away during write_tables.  So now we do nothing.  This will cause a
+   * memory leak if an app calls write_tables repeatedly without doing a full
+   * compression cycle or otherwise resetting the JPEG object.  However, that
+   * seems less bad than unexpectedly freeing memory in the normal case.
+   * An app that prefers the old behavior can call jpeg_abort for itself after
+   * each call to jpeg_write_tables().
+   */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcapistd.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,165 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcapistd.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the compression half
+ * of the JPEG library.  These are the "standard" API routines that are
+ * used in the normal full-compression case.  They are not used by a
+ * transcoding-only application.  Note that if an application links in
+ * jpeg_start_compress, it will end up linking in the entire compressor.
+ * We thus must separate this file from jcapimin.c to avoid linking the
+ * whole compression library into a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Compression initialization.
+ * Before calling this, all parameters and a data destination must be set up.
+ *
+ * We require a write_all_tables parameter as a failsafe check when writing
+ * multiple datastreams from the same compression object.  Since prior runs
+ * will have left all the tables marked sent_table=TRUE, a subsequent run
+ * would emit an abbreviated stream (no tables) by default.  This may be what
+ * is wanted, but for safety's sake it should not be the default behavior:
+ * programmers should have to make a deliberate choice to emit abbreviated
+ * images.  Therefore the documentation and examples should encourage people
+ * to pass write_all_tables=TRUE; then it will take active thought to do the
+ * wrong thing.
+ */
+
+GLOBAL(void)
+jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)
+{
+  if (cinfo->global_state != CSTATE_START)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  if (write_all_tables)
+    jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */
+
+  /* (Re)initialize error mgr and destination modules */
+  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+  (*cinfo->dest->init_destination) (cinfo);
+  /* Perform master selection of active modules */
+  jinit_compress_master(cinfo);
+  /* Set up for the first pass */
+  (*cinfo->master->prepare_for_pass) (cinfo);
+  /* Ready for application to drive first pass through jpeg_write_scanlines
+   * or jpeg_write_raw_data.
+   */
+  cinfo->next_scanline = 0;
+  cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);
+}
+
+
+/*
+ * Write some scanlines of data to the JPEG compressor.
+ *
+ * The return value will be the number of lines actually written.
+ * This should be less than the supplied num_lines only in case that
+ * the data destination module has requested suspension of the compressor,
+ * or if more than image_height scanlines are passed in.
+ *
+ * Note: we warn about excess calls to jpeg_write_scanlines() since
+ * this likely signals an application programmer error.  However,
+ * excess scanlines passed in the last valid call are *silently* ignored,
+ * so that the application need not adjust num_lines for end-of-image
+ * when using a multiple-scanline buffer.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,
+                      JDIMENSION num_lines)
+{
+  JDIMENSION row_ctr, rows_left;
+
+  if (cinfo->global_state != CSTATE_SCANNING)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  if (cinfo->next_scanline >= cinfo->image_height)
+    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+
+  /* Call progress monitor hook if present */
+  if (cinfo->progress != NULL) {
+    cinfo->progress->pass_counter = (long) cinfo->next_scanline;
+    cinfo->progress->pass_limit = (long) cinfo->image_height;
+    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+  }
+
+  /* Give master control module another chance if this is first call to
+   * jpeg_write_scanlines.  This lets output of the frame/scan headers be
+   * delayed so that application can write COM, etc, markers between
+   * jpeg_start_compress and jpeg_write_scanlines.
+   */
+  if (cinfo->master->call_pass_startup)
+    (*cinfo->master->pass_startup) (cinfo);
+
+  /* Ignore any extra scanlines at bottom of image. */
+  rows_left = cinfo->image_height - cinfo->next_scanline;
+  if (num_lines > rows_left)
+    num_lines = rows_left;
+
+  row_ctr = 0;
+  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);
+  cinfo->next_scanline += row_ctr;
+  return row_ctr;
+}
+
+
+/*
+ * Alternate entry point to write raw data.
+ * Processes exactly one iMCU row per call, unless suspended.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
+                     JDIMENSION num_lines)
+{
+  JDIMENSION lines_per_iMCU_row;
+
+  if (cinfo->global_state != CSTATE_RAW_OK)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  if (cinfo->next_scanline >= cinfo->image_height) {
+    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+    return 0;
+  }
+
+  /* Call progress monitor hook if present */
+  if (cinfo->progress != NULL) {
+    cinfo->progress->pass_counter = (long) cinfo->next_scanline;
+    cinfo->progress->pass_limit = (long) cinfo->image_height;
+    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+  }
+
+  /* Give master control module another chance if this is first call to
+   * jpeg_write_raw_data.  This lets output of the frame/scan headers be
+   * delayed so that application can write COM, etc, markers between
+   * jpeg_start_compress and jpeg_write_raw_data.
+   */
+  if (cinfo->master->call_pass_startup)
+    (*cinfo->master->pass_startup) (cinfo);
+
+  /* Verify that at least one iMCU row has been passed. */
+  lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;
+  if (num_lines < lines_per_iMCU_row)
+    ERREXIT(cinfo, JERR_BUFFER_SIZE);
+
+  /* Directly compress the row. */
+  if (! (*cinfo->coef->compress_data) (cinfo, data)) {
+    /* If compressor did not consume the whole row, suspend processing. */
+    return 0;
+  }
+
+  /* OK, we processed one iMCU row. */
+  cinfo->next_scanline += lines_per_iMCU_row;
+  return lines_per_iMCU_row;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jccoefct.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,453 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jccoefct.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the coefficient buffer controller for compression.
+ * This controller is the top level of the JPEG compressor proper.
+ * The coefficient buffer lies between forward-DCT and entropy encoding steps.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* We use a full-image coefficient buffer when doing Huffman optimization,
+ * and also for writing multiple-scan JPEG files.  In all cases, the DCT
+ * step is run during the first pass, and subsequent passes need only read
+ * the buffered coefficients.
+ */
+#ifdef ENTROPY_OPT_SUPPORTED
+#define FULL_COEF_BUFFER_SUPPORTED
+#else
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+#define FULL_COEF_BUFFER_SUPPORTED
+#endif
+#endif
+
+
+/* Private buffer controller object */
+
+typedef struct {
+  struct jpeg_c_coef_controller pub; /* public fields */
+
+  JDIMENSION iMCU_row_num;      /* iMCU row # within image */
+  JDIMENSION mcu_ctr;           /* counts MCUs processed in current row */
+  int MCU_vert_offset;          /* counts MCU rows within iMCU row */
+  int MCU_rows_per_iMCU_row;    /* number of such rows needed */
+
+  /* For single-pass compression, it's sufficient to buffer just one MCU
+   * (although this may prove a bit slow in practice).  We allocate a
+   * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each
+   * MCU constructed and sent.  (On 80x86, the workspace is FAR even though
+   * it's not really very big; this is to keep the module interfaces unchanged
+   * when a large coefficient buffer is necessary.)
+   * In multi-pass modes, this array points to the current MCU's blocks
+   * within the virtual arrays.
+   */
+  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
+
+  /* In multi-pass modes, we need a virtual block array for each component. */
+  jvirt_barray_ptr whole_image[MAX_COMPONENTS];
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+
+/* Forward declarations */
+METHODDEF(boolean) compress_data
+    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+METHODDEF(boolean) compress_first_pass
+    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+METHODDEF(boolean) compress_output
+    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+#endif
+
+
+LOCAL(void)
+start_iMCU_row (j_compress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row */
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+  /* In an interleaved scan, an MCU row is the same as an iMCU row.
+   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+   * But at the bottom of the image, process only what's left.
+   */
+  if (cinfo->comps_in_scan > 1) {
+    coef->MCU_rows_per_iMCU_row = 1;
+  } else {
+    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+    else
+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+  }
+
+  coef->mcu_ctr = 0;
+  coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+  coef->iMCU_row_num = 0;
+  start_iMCU_row(cinfo);
+
+  switch (pass_mode) {
+  case JBUF_PASS_THRU:
+    if (coef->whole_image[0] != NULL)
+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    coef->pub.compress_data = compress_data;
+    break;
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+  case JBUF_SAVE_AND_PASS:
+    if (coef->whole_image[0] == NULL)
+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    coef->pub.compress_data = compress_first_pass;
+    break;
+  case JBUF_CRANK_DEST:
+    if (coef->whole_image[0] == NULL)
+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    coef->pub.compress_data = compress_output;
+    break;
+#endif
+  default:
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    break;
+  }
+}
+
+
+/*
+ * Process some data in the single-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the image.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf contains a plane for each component in image,
+ * which we index according to the component's SOF position.
+ */
+
+METHODDEF(boolean)
+compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  JDIMENSION MCU_col_num;       /* index of current MCU within row */
+  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+  int blkn, bi, ci, yindex, yoffset, blockcnt;
+  JDIMENSION ypos, xpos;
+  jpeg_component_info *compptr;
+
+  /* Loop to write as much as one whole iMCU row */
+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+       yoffset++) {
+    for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;
+         MCU_col_num++) {
+      /* Determine where data comes from in input_buf and do the DCT thing.
+       * Each call on forward_DCT processes a horizontal row of DCT blocks
+       * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks
+       * sequentially.  Dummy blocks at the right or bottom edge are filled in
+       * specially.  The data in them does not matter for image reconstruction,
+       * so we fill them with values that will encode to the smallest amount of
+       * data, viz: all zeroes in the AC entries, DC entries equal to previous
+       * block's DC value.  (Thanks to Thomas Kinsman for this idea.)
+       */
+      blkn = 0;
+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+        compptr = cinfo->cur_comp_info[ci];
+        blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+                                                : compptr->last_col_width;
+        xpos = MCU_col_num * compptr->MCU_sample_width;
+        ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */
+        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+          if (coef->iMCU_row_num < last_iMCU_row ||
+              yoffset+yindex < compptr->last_row_height) {
+            (*cinfo->fdct->forward_DCT) (cinfo, compptr,
+                                         input_buf[compptr->component_index],
+                                         coef->MCU_buffer[blkn],
+                                         ypos, xpos, (JDIMENSION) blockcnt);
+            if (blockcnt < compptr->MCU_width) {
+              /* Create some dummy blocks at the right edge of the image. */
+              jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],
+                        (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
+              for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
+                coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
+              }
+            }
+          } else {
+            /* Create a row of dummy blocks at the bottom of the image. */
+            jzero_far((void FAR *) coef->MCU_buffer[blkn],
+                      compptr->MCU_width * SIZEOF(JBLOCK));
+            for (bi = 0; bi < compptr->MCU_width; bi++) {
+              coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
+            }
+          }
+          blkn += compptr->MCU_width;
+          ypos += DCTSIZE;
+        }
+      }
+      /* Try to write the MCU.  In event of a suspension failure, we will
+       * re-DCT the MCU on restart (a bit inefficient, could be fixed...)
+       */
+      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
+        /* Suspension forced; update state counters and exit */
+        coef->MCU_vert_offset = yoffset;
+        coef->mcu_ctr = MCU_col_num;
+        return FALSE;
+      }
+    }
+    /* Completed an MCU row, but perhaps not an iMCU row */
+    coef->mcu_ctr = 0;
+  }
+  /* Completed the iMCU row, advance counters for next one */
+  coef->iMCU_row_num++;
+  start_iMCU_row(cinfo);
+  return TRUE;
+}
+
+
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+
+/*
+ * Process some data in the first pass of a multi-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the image.
+ * This amount of data is read from the source buffer, DCT'd and quantized,
+ * and saved into the virtual arrays.  We also generate suitable dummy blocks
+ * as needed at the right and lower edges.  (The dummy blocks are constructed
+ * in the virtual arrays, which have been padded appropriately.)  This makes
+ * it possible for subsequent passes not to worry about real vs. dummy blocks.
+ *
+ * We must also emit the data to the entropy encoder.  This is conveniently
+ * done by calling compress_output() after we've loaded the current strip
+ * of the virtual arrays.
+ *
+ * NB: input_buf contains a plane for each component in image.  All
+ * components are DCT'd and loaded into the virtual arrays in this pass.
+ * However, it may be that only a subset of the components are emitted to
+ * the entropy encoder during this first pass; be careful about looking
+ * at the scan-dependent variables (MCU dimensions, etc).
+ */
+
+METHODDEF(boolean)
+compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+  JDIMENSION blocks_across, MCUs_across, MCUindex;
+  int bi, ci, h_samp_factor, block_row, block_rows, ndummy;
+  JCOEF lastDC;
+  jpeg_component_info *compptr;
+  JBLOCKARRAY buffer;
+  JBLOCKROW thisblockrow, lastblockrow;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Align the virtual buffer for this component. */
+    buffer = (*cinfo->mem->access_virt_barray)
+      ((j_common_ptr) cinfo, coef->whole_image[ci],
+       coef->iMCU_row_num * compptr->v_samp_factor,
+       (JDIMENSION) compptr->v_samp_factor, TRUE);
+    /* Count non-dummy DCT block rows in this iMCU row. */
+    if (coef->iMCU_row_num < last_iMCU_row)
+      block_rows = compptr->v_samp_factor;
+    else {
+      /* NB: can't use last_row_height here, since may not be set! */
+      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+      if (block_rows == 0) block_rows = compptr->v_samp_factor;
+    }
+    blocks_across = compptr->width_in_blocks;
+    h_samp_factor = compptr->h_samp_factor;
+    /* Count number of dummy blocks to be added at the right margin. */
+    ndummy = (int) (blocks_across % h_samp_factor);
+    if (ndummy > 0)
+      ndummy = h_samp_factor - ndummy;
+    /* Perform DCT for all non-dummy blocks in this iMCU row.  Each call
+     * on forward_DCT processes a complete horizontal row of DCT blocks.
+     */
+    for (block_row = 0; block_row < block_rows; block_row++) {
+      thisblockrow = buffer[block_row];
+      (*cinfo->fdct->forward_DCT) (cinfo, compptr,
+                                   input_buf[ci], thisblockrow,
+                                   (JDIMENSION) (block_row * DCTSIZE),
+                                   (JDIMENSION) 0, blocks_across);
+      if (ndummy > 0) {
+        /* Create dummy blocks at the right edge of the image. */
+        thisblockrow += blocks_across; /* => first dummy block */
+        jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
+        lastDC = thisblockrow[-1][0];
+        for (bi = 0; bi < ndummy; bi++) {
+          thisblockrow[bi][0] = lastDC;
+        }
+      }
+    }
+    /* If at end of image, create dummy block rows as needed.
+     * The tricky part here is that within each MCU, we want the DC values
+     * of the dummy blocks to match the last real block's DC value.
+     * This squeezes a few more bytes out of the resulting file...
+     */
+    if (coef->iMCU_row_num == last_iMCU_row) {
+      blocks_across += ndummy;  /* include lower right corner */
+      MCUs_across = blocks_across / h_samp_factor;
+      for (block_row = block_rows; block_row < compptr->v_samp_factor;
+           block_row++) {
+        thisblockrow = buffer[block_row];
+        lastblockrow = buffer[block_row-1];
+        jzero_far((void FAR *) thisblockrow,
+                  (size_t) (blocks_across * SIZEOF(JBLOCK)));
+        for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
+          lastDC = lastblockrow[h_samp_factor-1][0];
+          for (bi = 0; bi < h_samp_factor; bi++) {
+            thisblockrow[bi][0] = lastDC;
+          }
+          thisblockrow += h_samp_factor; /* advance to next MCU in row */
+          lastblockrow += h_samp_factor;
+        }
+      }
+    }
+  }
+  /* NB: compress_output will increment iMCU_row_num if successful.
+   * A suspension return will result in redoing all the work above next time.
+   */
+
+  /* Emit data to the entropy encoder, sharing code with subsequent passes */
+  return compress_output(cinfo, input_buf);
+}
+
+
+/*
+ * Process some data in subsequent passes of a multi-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the scan.
+ * The data is obtained from the virtual arrays and fed to the entropy coder.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf is ignored; it is likely to be a NULL pointer.
+ */
+
+METHODDEF(boolean)
+compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  JDIMENSION MCU_col_num;       /* index of current MCU within row */
+  int blkn, ci, xindex, yindex, yoffset;
+  JDIMENSION start_col;
+  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+  JBLOCKROW buffer_ptr;
+  jpeg_component_info *compptr;
+
+  /* Align the virtual buffers for the components used in this scan.
+   * NB: during first pass, this is safe only because the buffers will
+   * already be aligned properly, so jmemmgr.c won't need to do any I/O.
+   */
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    buffer[ci] = (*cinfo->mem->access_virt_barray)
+      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+       coef->iMCU_row_num * compptr->v_samp_factor,
+       (JDIMENSION) compptr->v_samp_factor, FALSE);
+  }
+
+  /* Loop to process one whole iMCU row */
+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+       yoffset++) {
+    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
+         MCU_col_num++) {
+      /* Construct list of pointers to DCT blocks belonging to this MCU */
+      blkn = 0;                 /* index of current DCT block within MCU */
+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+        compptr = cinfo->cur_comp_info[ci];
+        start_col = MCU_col_num * compptr->MCU_width;
+        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+          buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
+            coef->MCU_buffer[blkn++] = buffer_ptr++;
+          }
+        }
+      }
+      /* Try to write the MCU. */
+      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
+        /* Suspension forced; update state counters and exit */
+        coef->MCU_vert_offset = yoffset;
+        coef->mcu_ctr = MCU_col_num;
+        return FALSE;
+      }
+    }
+    /* Completed an MCU row, but perhaps not an iMCU row */
+    coef->mcu_ctr = 0;
+  }
+  /* Completed the iMCU row, advance counters for next one */
+  coef->iMCU_row_num++;
+  start_iMCU_row(cinfo);
+  return TRUE;
+}
+
+#endif /* FULL_COEF_BUFFER_SUPPORTED */
+
+
+/*
+ * Initialize coefficient buffer controller.
+ */
+
+GLOBAL(void)
+jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+  my_coef_ptr coef;
+
+  coef = (my_coef_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_coef_controller));
+  cinfo->coef = (struct jpeg_c_coef_controller *) coef;
+  coef->pub.start_pass = start_pass_coef;
+
+  /* Create the coefficient buffer. */
+  if (need_full_buffer) {
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+    /* Allocate a full-image virtual array for each component, */
+    /* padded to a multiple of samp_factor DCT blocks in each direction. */
+    int ci;
+    jpeg_component_info *compptr;
+
+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+         ci++, compptr++) {
+      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
+        ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+         (JDIMENSION) jround_up((long) compptr->width_in_blocks,
+                                (long) compptr->h_samp_factor),
+         (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+                                (long) compptr->v_samp_factor),
+         (JDIMENSION) compptr->v_samp_factor);
+    }
+#else
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+  } else {
+    /* We only need a single-MCU buffer. */
+    JBLOCKROW buffer;
+    int i;
+
+    buffer = (JBLOCKROW)
+      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+    for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
+      coef->MCU_buffer[i] = buffer + i;
+    }
+    coef->whole_image[0] = NULL; /* flag for no virtual arrays */
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jccolor.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,462 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jccolor.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains input colorspace conversion routines.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private subobject */
+
+typedef struct {
+  struct jpeg_color_converter pub; /* public fields */
+
+  /* Private state for RGB->YCC conversion */
+  INT32 * rgb_ycc_tab;          /* => table for RGB to YCbCr conversion */
+} my_color_converter;
+
+typedef my_color_converter * my_cconvert_ptr;
+
+
+/**************** RGB -> YCbCr conversion: most common case **************/
+
+/*
+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * The conversion equations to be implemented are therefore
+ *      Y  =  0.29900 * R + 0.58700 * G + 0.11400 * B
+ *      Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B  + CENTERJSAMPLE
+ *      Cr =  0.50000 * R - 0.41869 * G - 0.08131 * B  + CENTERJSAMPLE
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
+ * rather than CENTERJSAMPLE, for Cb and Cr.  This gave equal positive and
+ * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
+ * were not represented exactly.  Now we sacrifice exact representation of
+ * maximum red and maximum blue in order to get exact grayscales.
+ *
+ * To avoid floating-point arithmetic, we represent the fractional constants
+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
+ * the products by 2^16, with appropriate rounding, to get the correct answer.
+ *
+ * For even more speed, we avoid doing any multiplications in the inner loop
+ * by precalculating the constants times R,G,B for all possible values.
+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
+ * for 12-bit samples it is still acceptable.  It's not very reasonable for
+ * 16-bit samples, but if you want lossless storage you shouldn't be changing
+ * colorspace anyway.
+ * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
+ * in the tables to save adding them separately in the inner loop.
+ */
+
+#define SCALEBITS       16      /* speediest right-shift on some machines */
+#define CBCR_OFFSET     ((INT32) CENTERJSAMPLE << SCALEBITS)
+#define ONE_HALF        ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x)          ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+/* We allocate one big table and divide it up into eight parts, instead of
+ * doing eight alloc_small requests.  This lets us use a single table base
+ * address, which can be held in a register in the inner loops on many
+ * machines (more than can hold all eight addresses, anyway).
+ */
+
+#define R_Y_OFF         0                       /* offset to R => Y section */
+#define G_Y_OFF         (1*(MAXJSAMPLE+1))      /* offset to G => Y section */
+#define B_Y_OFF         (2*(MAXJSAMPLE+1))      /* etc. */
+#define R_CB_OFF        (3*(MAXJSAMPLE+1))
+#define G_CB_OFF        (4*(MAXJSAMPLE+1))
+#define B_CB_OFF        (5*(MAXJSAMPLE+1))
+#define R_CR_OFF        B_CB_OFF                /* B=>Cb, R=>Cr are the same */
+#define G_CR_OFF        (6*(MAXJSAMPLE+1))
+#define B_CR_OFF        (7*(MAXJSAMPLE+1))
+#define TABLE_SIZE      (8*(MAXJSAMPLE+1))
+
+
+/*
+ * Initialize for RGB->YCC colorspace conversion.
+ */
+
+METHODDEF(void)
+rgb_ycc_start (j_compress_ptr cinfo)
+{
+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+  INT32 * rgb_ycc_tab;
+  INT32 i;
+
+  /* Allocate and fill in the conversion tables. */
+  cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (TABLE_SIZE * SIZEOF(INT32)));
+
+  for (i = 0; i <= MAXJSAMPLE; i++) {
+    rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
+    rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
+    rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i     + ONE_HALF;
+    rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
+    rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
+    /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
+     * This ensures that the maximum output will round to MAXJSAMPLE
+     * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
+     */
+    rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;
+/*  B=>Cb and R=>Cr tables are the same
+    rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;
+*/
+    rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
+    rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
+  }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ *
+ * Note that we change from the application's interleaved-pixel format
+ * to our internal noninterleaved, one-plane-per-component format.
+ * The input buffer is therefore three times as wide as the output buffer.
+ *
+ * A starting row offset is provided only for the output buffer.  The caller
+ * can easily adjust the passed input_buf value to accommodate any row
+ * offset required on that side.
+ */
+
+METHODDEF(void)
+rgb_ycc_convert (j_compress_ptr cinfo,
+                 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+                 JDIMENSION output_row, int num_rows)
+{
+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+  register int r, g, b;
+  register INT32 * ctab = cconvert->rgb_ycc_tab;
+  register JSAMPROW inptr;
+  register JSAMPROW outptr0, outptr1, outptr2;
+  register JDIMENSION col;
+  JDIMENSION num_cols = cinfo->image_width;
+
+  while (--num_rows >= 0) {
+    inptr = *input_buf++;
+    outptr0 = output_buf[0][output_row];
+    outptr1 = output_buf[1][output_row];
+    outptr2 = output_buf[2][output_row];
+    output_row++;
+    for (col = 0; col < num_cols; col++) {
+      r = GETJSAMPLE(inptr[RGB_RED]);
+      g = GETJSAMPLE(inptr[RGB_GREEN]);
+      b = GETJSAMPLE(inptr[RGB_BLUE]);
+      inptr += RGB_PIXELSIZE;
+      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+       * must be too; we do not need an explicit range-limiting operation.
+       * Hence the value being shifted is never negative, and we don't
+       * need the general RIGHT_SHIFT macro.
+       */
+      /* Y */
+      outptr0[col] = (JSAMPLE)
+                ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+                 >> SCALEBITS);
+      /* Cb */
+      outptr1[col] = (JSAMPLE)
+                ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+                 >> SCALEBITS);
+      /* Cr */
+      outptr2[col] = (JSAMPLE)
+                ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+                 >> SCALEBITS);
+    }
+  }
+}
+
+
+/**************** Cases other than RGB -> YCbCr **************/
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles RGB->grayscale conversion, which is the same
+ * as the RGB->Y portion of RGB->YCbCr.
+ * We assume rgb_ycc_start has been called (we only use the Y tables).
+ */
+
+METHODDEF(void)
+rgb_gray_convert (j_compress_ptr cinfo,
+                  JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+                  JDIMENSION output_row, int num_rows)
+{
+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+  register int r, g, b;
+  register INT32 * ctab = cconvert->rgb_ycc_tab;
+  register JSAMPROW inptr;
+  register JSAMPROW outptr;
+  register JDIMENSION col;
+  JDIMENSION num_cols = cinfo->image_width;
+
+  while (--num_rows >= 0) {
+    inptr = *input_buf++;
+    outptr = output_buf[0][output_row];
+    output_row++;
+    for (col = 0; col < num_cols; col++) {
+      r = GETJSAMPLE(inptr[RGB_RED]);
+      g = GETJSAMPLE(inptr[RGB_GREEN]);
+      b = GETJSAMPLE(inptr[RGB_BLUE]);
+      inptr += RGB_PIXELSIZE;
+      /* Y */
+      outptr[col] = (JSAMPLE)
+                ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+                 >> SCALEBITS);
+    }
+  }
+}
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles Adobe-style CMYK->YCCK conversion,
+ * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
+ * conversion as above, while passing K (black) unchanged.
+ * We assume rgb_ycc_start has been called.
+ */
+
+METHODDEF(void)
+cmyk_ycck_convert (j_compress_ptr cinfo,
+                   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+                   JDIMENSION output_row, int num_rows)
+{
+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+  register int r, g, b;
+  register INT32 * ctab = cconvert->rgb_ycc_tab;
+  register JSAMPROW inptr;
+  register JSAMPROW outptr0, outptr1, outptr2, outptr3;
+  register JDIMENSION col;
+  JDIMENSION num_cols = cinfo->image_width;
+
+  while (--num_rows >= 0) {
+    inptr = *input_buf++;
+    outptr0 = output_buf[0][output_row];
+    outptr1 = output_buf[1][output_row];
+    outptr2 = output_buf[2][output_row];
+    outptr3 = output_buf[3][output_row];
+    output_row++;
+    for (col = 0; col < num_cols; col++) {
+      r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
+      g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
+      b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
+      /* K passes through as-is */
+      outptr3[col] = inptr[3];  /* don't need GETJSAMPLE here */
+      inptr += 4;
+      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+       * must be too; we do not need an explicit range-limiting operation.
+       * Hence the value being shifted is never negative, and we don't
+       * need the general RIGHT_SHIFT macro.
+       */
+      /* Y */
+      outptr0[col] = (JSAMPLE)
+                ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+                 >> SCALEBITS);
+      /* Cb */
+      outptr1[col] = (JSAMPLE)
+                ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+                 >> SCALEBITS);
+      /* Cr */
+      outptr2[col] = (JSAMPLE)
+                ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+                 >> SCALEBITS);
+    }
+  }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles grayscale output with no conversion.
+ * The source can be either plain grayscale or YCbCr (since Y == gray).
+ */
+
+METHODDEF(void)
+grayscale_convert (j_compress_ptr cinfo,
+                   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+                   JDIMENSION output_row, int num_rows)
+{
+  register JSAMPROW inptr;
+  register JSAMPROW outptr;
+  register JDIMENSION col;
+  JDIMENSION num_cols = cinfo->image_width;
+  int instride = cinfo->input_components;
+
+  while (--num_rows >= 0) {
+    inptr = *input_buf++;
+    outptr = output_buf[0][output_row];
+    output_row++;
+    for (col = 0; col < num_cols; col++) {
+      outptr[col] = inptr[0];   /* don't need GETJSAMPLE() here */
+      inptr += instride;
+    }
+  }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles multi-component colorspaces without conversion.
+ * We assume input_components == num_components.
+ */
+
+METHODDEF(void)
+null_convert (j_compress_ptr cinfo,
+              JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+              JDIMENSION output_row, int num_rows)
+{
+  register JSAMPROW inptr;
+  register JSAMPROW outptr;
+  register JDIMENSION col;
+  register int ci;
+  int nc = cinfo->num_components;
+  JDIMENSION num_cols = cinfo->image_width;
+
+  while (--num_rows >= 0) {
+    /* It seems fastest to make a separate pass for each component. */
+    for (ci = 0; ci < nc; ci++) {
+      inptr = *input_buf;
+      outptr = output_buf[ci][output_row];
+      for (col = 0; col < num_cols; col++) {
+        outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
+        inptr += nc;
+      }
+    }
+    input_buf++;
+    output_row++;
+  }
+}
+
+
+/*
+ * Empty method for start_pass.
+ */
+
+METHODDEF(void)
+null_method (j_compress_ptr cinfo)
+{
+  /* no work needed */
+}
+
+
+/*
+ * Module initialization routine for input colorspace conversion.
+ */
+
+GLOBAL(void)
+jinit_color_converter (j_compress_ptr cinfo)
+{
+  my_cconvert_ptr cconvert;
+
+  cconvert = (my_cconvert_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_color_converter));
+  cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
+  /* set start_pass to null method until we find out differently */
+  cconvert->pub.start_pass = null_method;
+
+  /* Make sure input_components agrees with in_color_space */
+  switch (cinfo->in_color_space) {
+  case JCS_GRAYSCALE:
+    if (cinfo->input_components != 1)
+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+    break;
+
+  case JCS_RGB:
+#if RGB_PIXELSIZE != 3
+    if (cinfo->input_components != RGB_PIXELSIZE)
+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+    break;
+#endif /* else share code with YCbCr */
+
+  case JCS_YCbCr:
+    if (cinfo->input_components != 3)
+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+    break;
+
+  case JCS_CMYK:
+  case JCS_YCCK:
+    if (cinfo->input_components != 4)
+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+    break;
+
+  default:                      /* JCS_UNKNOWN can be anything */
+    if (cinfo->input_components < 1)
+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+    break;
+  }
+
+  /* Check num_components, set conversion method based on requested space */
+  switch (cinfo->jpeg_color_space) {
+  case JCS_GRAYSCALE:
+    if (cinfo->num_components != 1)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    if (cinfo->in_color_space == JCS_GRAYSCALE)
+      cconvert->pub.color_convert = grayscale_convert;
+    else if (cinfo->in_color_space == JCS_RGB) {
+      cconvert->pub.start_pass = rgb_ycc_start;
+      cconvert->pub.color_convert = rgb_gray_convert;
+    } else if (cinfo->in_color_space == JCS_YCbCr)
+      cconvert->pub.color_convert = grayscale_convert;
+    else
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+
+  case JCS_RGB:
+    if (cinfo->num_components != 3)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
+      cconvert->pub.color_convert = null_convert;
+    else
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+
+  case JCS_YCbCr:
+    if (cinfo->num_components != 3)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    if (cinfo->in_color_space == JCS_RGB) {
+      cconvert->pub.start_pass = rgb_ycc_start;
+      cconvert->pub.color_convert = rgb_ycc_convert;
+    } else if (cinfo->in_color_space == JCS_YCbCr)
+      cconvert->pub.color_convert = null_convert;
+    else
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+
+  case JCS_CMYK:
+    if (cinfo->num_components != 4)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    if (cinfo->in_color_space == JCS_CMYK)
+      cconvert->pub.color_convert = null_convert;
+    else
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+
+  case JCS_YCCK:
+    if (cinfo->num_components != 4)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    if (cinfo->in_color_space == JCS_CMYK) {
+      cconvert->pub.start_pass = rgb_ycc_start;
+      cconvert->pub.color_convert = cmyk_ycck_convert;
+    } else if (cinfo->in_color_space == JCS_YCCK)
+      cconvert->pub.color_convert = null_convert;
+    else
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+
+  default:                      /* allow null conversion of JCS_UNKNOWN */
+    if (cinfo->jpeg_color_space != cinfo->in_color_space ||
+        cinfo->num_components != cinfo->input_components)
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    cconvert->pub.color_convert = null_convert;
+    break;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcdctmgr.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,391 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcdctmgr.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the forward-DCT management logic.
+ * This code selects a particular DCT implementation to be used,
+ * and it performs related housekeeping chores including coefficient
+ * quantization.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+
+/* Private subobject for this module */
+
+typedef struct {
+  struct jpeg_forward_dct pub;  /* public fields */
+
+  /* Pointer to the DCT routine actually in use */
+  forward_DCT_method_ptr do_dct;
+
+  /* The actual post-DCT divisors --- not identical to the quant table
+   * entries, because of scaling (especially for an unnormalized DCT).
+   * Each table is given in normal array order.
+   */
+  DCTELEM * divisors[NUM_QUANT_TBLS];
+
+#ifdef DCT_FLOAT_SUPPORTED
+  /* Same as above for the floating-point case. */
+  float_DCT_method_ptr do_float_dct;
+  FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
+#endif
+} my_fdct_controller;
+
+typedef my_fdct_controller * my_fdct_ptr;
+
+
+/*
+ * Initialize for a processing pass.
+ * Verify that all referenced Q-tables are present, and set up
+ * the divisor table for each one.
+ * In the current implementation, DCT of all components is done during
+ * the first pass, even if only some components will be output in the
+ * first scan.  Hence all components should be examined here.
+ */
+
+METHODDEF(void)
+start_pass_fdctmgr (j_compress_ptr cinfo)
+{
+  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+  int ci, qtblno, i;
+  jpeg_component_info *compptr;
+  JQUANT_TBL * qtbl;
+  DCTELEM * dtbl;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    qtblno = compptr->quant_tbl_no;
+    /* Make sure specified quantization table is present */
+    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
+        cinfo->quant_tbl_ptrs[qtblno] == NULL)
+      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
+    qtbl = cinfo->quant_tbl_ptrs[qtblno];
+    /* Compute divisors for this quant table */
+    /* We may do this more than once for same table, but it's not a big deal */
+    switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+    case JDCT_ISLOW:
+      /* For LL&M IDCT method, divisors are equal to raw quantization
+       * coefficients multiplied by 8 (to counteract scaling).
+       */
+      if (fdct->divisors[qtblno] == NULL) {
+        fdct->divisors[qtblno] = (DCTELEM *)
+          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                      DCTSIZE2 * SIZEOF(DCTELEM));
+      }
+      dtbl = fdct->divisors[qtblno];
+      for (i = 0; i < DCTSIZE2; i++) {
+        dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
+      }
+      break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+    case JDCT_IFAST:
+      {
+        /* For AA&N IDCT method, divisors are equal to quantization
+         * coefficients scaled by scalefactor[row]*scalefactor[col], where
+         *   scalefactor[0] = 1
+         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
+         * We apply a further scale factor of 8.
+         */
+#define CONST_BITS 14
+        static const INT16 aanscales[DCTSIZE2] = {
+          /* precomputed values scaled up by 14 bits */
+          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
+          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
+          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
+          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
+          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
+          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
+           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
+           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
+        };
+        SHIFT_TEMPS
+
+        if (fdct->divisors[qtblno] == NULL) {
+          fdct->divisors[qtblno] = (DCTELEM *)
+            (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                        DCTSIZE2 * SIZEOF(DCTELEM));
+        }
+        dtbl = fdct->divisors[qtblno];
+        for (i = 0; i < DCTSIZE2; i++) {
+          dtbl[i] = (DCTELEM)
+            DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
+                                  (INT32) aanscales[i]),
+                    CONST_BITS-3);
+        }
+      }
+      break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+    case JDCT_FLOAT:
+      {
+        /* For float AA&N IDCT method, divisors are equal to quantization
+         * coefficients scaled by scalefactor[row]*scalefactor[col], where
+         *   scalefactor[0] = 1
+         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
+         * We apply a further scale factor of 8.
+         * What's actually stored is 1/divisor so that the inner loop can
+         * use a multiplication rather than a division.
+         */
+        FAST_FLOAT * fdtbl;
+        int row, col;
+        static const double aanscalefactor[DCTSIZE] = {
+          1.0, 1.387039845, 1.306562965, 1.175875602,
+          1.0, 0.785694958, 0.541196100, 0.275899379
+        };
+
+        if (fdct->float_divisors[qtblno] == NULL) {
+          fdct->float_divisors[qtblno] = (FAST_FLOAT *)
+            (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                        DCTSIZE2 * SIZEOF(FAST_FLOAT));
+        }
+        fdtbl = fdct->float_divisors[qtblno];
+        i = 0;
+        for (row = 0; row < DCTSIZE; row++) {
+          for (col = 0; col < DCTSIZE; col++) {
+            fdtbl[i] = (FAST_FLOAT)
+              (1.0 / (((double) qtbl->quantval[i] *
+                       aanscalefactor[row] * aanscalefactor[col] * 8.0)));
+            i++;
+          }
+        }
+      }
+      break;
+#endif
+    default:
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+      break;
+    }
+  }
+}
+
+
+/*
+ * Perform forward DCT on one or more blocks of a component.
+ *
+ * The input samples are taken from the sample_data[] array starting at
+ * position start_row/start_col, and moving to the right for any additional
+ * blocks. The quantized coefficients are returned in coef_blocks[].
+ */
+
+METHODDEF(void)
+forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
+             JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+             JDIMENSION start_row, JDIMENSION start_col,
+             JDIMENSION num_blocks)
+/* This version is used for integer DCT implementations. */
+{
+  /* This routine is heavily used, so it's worth coding it tightly. */
+  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+  forward_DCT_method_ptr do_dct = fdct->do_dct;
+  DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
+  DCTELEM workspace[DCTSIZE2];  /* work area for FDCT subroutine */
+  JDIMENSION bi;
+
+  sample_data += start_row;     /* fold in the vertical offset once */
+
+  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
+    /* Load data into workspace, applying unsigned->signed conversion */
+    { register DCTELEM *workspaceptr;
+      register JSAMPROW elemptr;
+      register int elemr;
+
+      workspaceptr = workspace;
+      for (elemr = 0; elemr < DCTSIZE; elemr++) {
+        elemptr = sample_data[elemr] + start_col;
+#if DCTSIZE == 8                /* unroll the inner loop */
+        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+#else
+        { register int elemc;
+          for (elemc = DCTSIZE; elemc > 0; elemc--) {
+            *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+          }
+        }
+#endif
+      }
+    }
+
+    /* Perform the DCT */
+    (*do_dct) (workspace);
+
+    /* Quantize/descale the coefficients, and store into coef_blocks[] */
+    { register DCTELEM temp, qval;
+      register int i;
+      register JCOEFPTR output_ptr = coef_blocks[bi];
+
+      for (i = 0; i < DCTSIZE2; i++) {
+        qval = divisors[i];
+        temp = workspace[i];
+        /* Divide the coefficient value by qval, ensuring proper rounding.
+         * Since C does not specify the direction of rounding for negative
+         * quotients, we have to force the dividend positive for portability.
+         *
+         * In most files, at least half of the output values will be zero
+         * (at default quantization settings, more like three-quarters...)
+         * so we should ensure that this case is fast.  On many machines,
+         * a comparison is enough cheaper than a divide to make a special test
+         * a win.  Since both inputs will be nonnegative, we need only test
+         * for a < b to discover whether a/b is 0.
+         * If your machine's division is fast enough, define FAST_DIVIDE.
+         */
+#ifdef FAST_DIVIDE
+#define DIVIDE_BY(a,b)  a /= b
+#else
+#define DIVIDE_BY(a,b)  if (a >= b) a /= b; else a = 0
+#endif
+        if (temp < 0) {
+          temp = -temp;
+          temp += qval>>1;      /* for rounding */
+          DIVIDE_BY(temp, qval);
+          temp = -temp;
+        } else {
+          temp += qval>>1;      /* for rounding */
+          DIVIDE_BY(temp, qval);
+        }
+        output_ptr[i] = (JCOEF) temp;
+      }
+    }
+  }
+}
+
+
+#ifdef DCT_FLOAT_SUPPORTED
+
+METHODDEF(void)
+forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
+                   JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+                   JDIMENSION start_row, JDIMENSION start_col,
+                   JDIMENSION num_blocks)
+/* This version is used for floating-point DCT implementations. */
+{
+  /* This routine is heavily used, so it's worth coding it tightly. */
+  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+  float_DCT_method_ptr do_dct = fdct->do_float_dct;
+  FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
+  FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
+  JDIMENSION bi;
+
+  sample_data += start_row;     /* fold in the vertical offset once */
+
+  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
+    /* Load data into workspace, applying unsigned->signed conversion */
+    { register FAST_FLOAT *workspaceptr;
+      register JSAMPROW elemptr;
+      register int elemr;
+
+      workspaceptr = workspace;
+      for (elemr = 0; elemr < DCTSIZE; elemr++) {
+        elemptr = sample_data[elemr] + start_col;
+#if DCTSIZE == 8                /* unroll the inner loop */
+        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+#else
+        { register int elemc;
+          for (elemc = DCTSIZE; elemc > 0; elemc--) {
+            *workspaceptr++ = (FAST_FLOAT)
+              (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+          }
+        }
+#endif
+      }
+    }
+
+    /* Perform the DCT */
+    (*do_dct) (workspace);
+
+    /* Quantize/descale the coefficients, and store into coef_blocks[] */
+    { register FAST_FLOAT temp;
+      register int i;
+      register JCOEFPTR output_ptr = coef_blocks[bi];
+
+      for (i = 0; i < DCTSIZE2; i++) {
+        /* Apply the quantization and scaling factor */
+        temp = workspace[i] * divisors[i];
+        /* Round to nearest integer.
+         * Since C does not specify the direction of rounding for negative
+         * quotients, we have to force the dividend positive for portability.
+         * The maximum coefficient size is +-16K (for 12-bit data), so this
+         * code should work for either 16-bit or 32-bit ints.
+         */
+        output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);
+      }
+    }
+  }
+}
+
+#endif /* DCT_FLOAT_SUPPORTED */
+
+
+/*
+ * Initialize FDCT manager.
+ */
+
+GLOBAL(void)
+jinit_forward_dct (j_compress_ptr cinfo)
+{
+  my_fdct_ptr fdct;
+  int i;
+
+  fdct = (my_fdct_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_fdct_controller));
+  cinfo->fdct = (struct jpeg_forward_dct *) fdct;
+  fdct->pub.start_pass = start_pass_fdctmgr;
+
+  switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+  case JDCT_ISLOW:
+    fdct->pub.forward_DCT = forward_DCT;
+    fdct->do_dct = jpeg_fdct_islow;
+    break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+  case JDCT_IFAST:
+    fdct->pub.forward_DCT = forward_DCT;
+    fdct->do_dct = jpeg_fdct_ifast;
+    break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+  case JDCT_FLOAT:
+    fdct->pub.forward_DCT = forward_DCT_float;
+    fdct->do_float_dct = jpeg_fdct_float;
+    break;
+#endif
+  default:
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+    break;
+  }
+
+  /* Mark divisor tables unallocated */
+  for (i = 0; i < NUM_QUANT_TBLS; i++) {
+    fdct->divisors[i] = NULL;
+#ifdef DCT_FLOAT_SUPPORTED
+    fdct->float_divisors[i] = NULL;
+#endif
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jchuff.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,913 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jchuff.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy encoding routines.
+ *
+ * Much of the complexity here has to do with supporting output suspension.
+ * If the data destination module demands suspension, we want to be able to
+ * back up to the start of the current MCU.  To do this, we copy state
+ * variables into local working storage, and update them back to the
+ * permanent JPEG objects only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jchuff.h"             /* Declarations shared with jcphuff.c */
+
+
+/* Expanded entropy encoder object for Huffman encoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+  INT32 put_buffer;             /* current bit-accumulation buffer */
+  int put_bits;                 /* # of bits now in it */
+  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment.  You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src)  ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src)  \
+        ((dest).put_buffer = (src).put_buffer, \
+         (dest).put_bits = (src).put_bits, \
+         (dest).last_dc_val[0] = (src).last_dc_val[0], \
+         (dest).last_dc_val[1] = (src).last_dc_val[1], \
+         (dest).last_dc_val[2] = (src).last_dc_val[2], \
+         (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+  struct jpeg_entropy_encoder pub; /* public fields */
+
+  savable_state saved;          /* Bit buffer & DC state at start of MCU */
+
+  /* These fields are NOT loaded into local working state. */
+  unsigned int restarts_to_go;  /* MCUs left in this restart interval */
+  int next_restart_num;         /* next restart number to write (0-7) */
+
+  /* Pointers to derived tables (these workspaces have image lifespan) */
+  c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
+  c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
+
+#ifdef ENTROPY_OPT_SUPPORTED    /* Statistics tables for optimization */
+  long * dc_count_ptrs[NUM_HUFF_TBLS];
+  long * ac_count_ptrs[NUM_HUFF_TBLS];
+#endif
+} huff_entropy_encoder;
+
+typedef huff_entropy_encoder * huff_entropy_ptr;
+
+/* Working state while writing an MCU.
+ * This struct contains all the fields that are needed by subroutines.
+ */
+
+typedef struct {
+  JOCTET * next_output_byte;    /* => next byte to write in buffer */
+  size_t free_in_buffer;        /* # of byte spaces remaining in buffer */
+  savable_state cur;            /* Current bit buffer & DC state */
+  j_compress_ptr cinfo;         /* dump_buffer needs access to this */
+} working_state;
+
+
+/* Forward declarations */
+METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,
+                                        JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));
+#ifdef ENTROPY_OPT_SUPPORTED
+METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,
+                                          JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));
+#endif
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ * If gather_statistics is TRUE, we do not output anything during the scan,
+ * just count the Huffman symbols used and generate Huffman code tables.
+ */
+
+METHODDEF(void)
+start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
+{
+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+  int ci, dctbl, actbl;
+  jpeg_component_info * compptr;
+
+  if (gather_statistics) {
+#ifdef ENTROPY_OPT_SUPPORTED
+    entropy->pub.encode_mcu = encode_mcu_gather;
+    entropy->pub.finish_pass = finish_pass_gather;
+#else
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+  } else {
+    entropy->pub.encode_mcu = encode_mcu_huff;
+    entropy->pub.finish_pass = finish_pass_huff;
+  }
+
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    dctbl = compptr->dc_tbl_no;
+    actbl = compptr->ac_tbl_no;
+    if (gather_statistics) {
+#ifdef ENTROPY_OPT_SUPPORTED
+      /* Check for invalid table indexes */
+      /* (make_c_derived_tbl does this in the other path) */
+      if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)
+        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);
+      if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
+        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
+      /* Allocate and zero the statistics tables */
+      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
+      if (entropy->dc_count_ptrs[dctbl] == NULL)
+        entropy->dc_count_ptrs[dctbl] = (long *)
+          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                      257 * SIZEOF(long));
+      MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));
+      if (entropy->ac_count_ptrs[actbl] == NULL)
+        entropy->ac_count_ptrs[actbl] = (long *)
+          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                      257 * SIZEOF(long));
+      MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));
+#endif
+    } else {
+      /* Compute derived values for Huffman tables */
+      /* We may do this more than once for a table, but it's not expensive */
+      jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,
+                              & entropy->dc_derived_tbls[dctbl]);
+      jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
+                              & entropy->ac_derived_tbls[actbl]);
+    }
+    /* Initialize DC predictions to 0 */
+    entropy->saved.last_dc_val[ci] = 0;
+  }
+
+  /* Initialize bit buffer to empty */
+  entropy->saved.put_buffer = 0;
+  entropy->saved.put_bits = 0;
+
+  /* Initialize restart stuff */
+  entropy->restarts_to_go = cinfo->restart_interval;
+  entropy->next_restart_num = 0;
+}
+
+
+/*
+ * Compute the derived values for a Huffman table.
+ * This routine also performs some validation checks on the table.
+ *
+ * Note this is also used by jcphuff.c.
+ */
+
+GLOBAL(void)
+jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
+                         c_derived_tbl ** pdtbl)
+{
+  JHUFF_TBL *htbl;
+  c_derived_tbl *dtbl;
+  int p, i, l, lastp, si, maxsymbol;
+  char huffsize[257];
+  unsigned int huffcode[257];
+  unsigned int code;
+
+  /* Note that huffsize[] and huffcode[] are filled in code-length order,
+   * paralleling the order of the symbols themselves in htbl->huffval[].
+   */
+
+  /* Find the input Huffman table */
+  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+  htbl =
+    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
+  if (htbl == NULL)
+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+
+  /* Allocate a workspace if we haven't already done so. */
+  if (*pdtbl == NULL)
+    *pdtbl = (c_derived_tbl *)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  SIZEOF(c_derived_tbl));
+  dtbl = *pdtbl;
+
+  /* Figure C.1: make table of Huffman code length for each symbol */
+
+  p = 0;
+  for (l = 1; l <= 16; l++) {
+    i = (int) htbl->bits[l];
+    if (i < 0 || p + i > 256)   /* protect against table overrun */
+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+    while (i--)
+      huffsize[p++] = (char) l;
+  }
+  huffsize[p] = 0;
+  lastp = p;
+
+  /* Figure C.2: generate the codes themselves */
+  /* We also validate that the counts represent a legal Huffman code tree. */
+
+  code = 0;
+  si = huffsize[0];
+  p = 0;
+  while (huffsize[p]) {
+    while (((int) huffsize[p]) == si) {
+      huffcode[p++] = code;
+      code++;
+    }
+    /* code is now 1 more than the last code used for codelength si; but
+     * it must still fit in si bits, since no code is allowed to be all ones.
+     */
+    if (((INT32) code) >= (((INT32) 1) << si))
+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+    code <<= 1;
+    si++;
+  }
+
+  /* Figure C.3: generate encoding tables */
+  /* These are code and size indexed by symbol value */
+
+  /* Set all codeless symbols to have code length 0;
+   * this lets us detect duplicate VAL entries here, and later
+   * allows emit_bits to detect any attempt to emit such symbols.
+   */
+  MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));
+
+  /* This is also a convenient place to check for out-of-range
+   * and duplicated VAL entries.  We allow 0..255 for AC symbols
+   * but only 0..15 for DC.  (We could constrain them further
+   * based on data depth and mode, but this seems enough.)
+   */
+  maxsymbol = isDC ? 15 : 255;
+
+  for (p = 0; p < lastp; p++) {
+    i = htbl->huffval[p];
+    if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])
+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+    dtbl->ehufco[i] = huffcode[p];
+    dtbl->ehufsi[i] = huffsize[p];
+  }
+}
+
+
+/* Outputting bytes to the file */
+
+/* Emit a byte, taking 'action' if must suspend. */
+#define emit_byte(state,val,action)  \
+        { *(state)->next_output_byte++ = (JOCTET) (val);  \
+          if (--(state)->free_in_buffer == 0)  \
+            if (! dump_buffer(state))  \
+              { action; } }
+
+
+LOCAL(boolean)
+dump_buffer (working_state * state)
+/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */
+{
+  struct jpeg_destination_mgr * dest = state->cinfo->dest;
+
+  if (! (*dest->empty_output_buffer) (state->cinfo))
+    return FALSE;
+  /* After a successful buffer dump, must reset buffer pointers */
+  state->next_output_byte = dest->next_output_byte;
+  state->free_in_buffer = dest->free_in_buffer;
+  return TRUE;
+}
+
+
+/* Outputting bits to the file */
+
+/* Only the right 24 bits of put_buffer are used; the valid bits are
+ * left-justified in this part.  At most 16 bits can be passed to emit_bits
+ * in one call, and we never retain more than 7 bits in put_buffer
+ * between calls, so 24 bits are sufficient.
+ */
+
+INLINE
+LOCAL(boolean)
+emit_bits (working_state * state, unsigned int code, int size)
+/* Emit some bits; return TRUE if successful, FALSE if must suspend */
+{
+  /* This routine is heavily used, so it's worth coding tightly. */
+  register INT32 put_buffer = (INT32) code;
+  register int put_bits = state->cur.put_bits;
+
+  /* if size is 0, caller used an invalid Huffman table entry */
+  if (size == 0)
+    ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
+
+  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
+
+  put_bits += size;             /* new number of bits in buffer */
+
+  put_buffer <<= 24 - put_bits; /* align incoming bits */
+
+  put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
+
+  while (put_bits >= 8) {
+    int c = (int) ((put_buffer >> 16) & 0xFF);
+
+    emit_byte(state, c, return FALSE);
+    if (c == 0xFF) {            /* need to stuff a zero byte? */
+      emit_byte(state, 0, return FALSE);
+    }
+    put_buffer <<= 8;
+    put_bits -= 8;
+  }
+
+  state->cur.put_buffer = put_buffer; /* update state variables */
+  state->cur.put_bits = put_bits;
+
+  return TRUE;
+}
+
+
+LOCAL(boolean)
+flush_bits (working_state * state)
+{
+  if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */
+    return FALSE;
+  state->cur.put_buffer = 0;    /* and reset bit-buffer to empty */
+  state->cur.put_bits = 0;
+  return TRUE;
+}
+
+
+/* Encode a single block's worth of coefficients */
+
+LOCAL(boolean)
+encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
+                  c_derived_tbl *dctbl, c_derived_tbl *actbl)
+{
+  register int temp, temp2;
+  register int nbits;
+  register int k, r, i;
+
+  /* Encode the DC coefficient difference per section F.1.2.1 */
+
+  temp = temp2 = block[0] - last_dc_val;
+
+  if (temp < 0) {
+    temp = -temp;               /* temp is abs value of input */
+    /* For a negative input, want temp2 = bitwise complement of abs(input) */
+    /* This code assumes we are on a two's complement machine */
+    temp2--;
+  }
+
+  /* Find the number of bits needed for the magnitude of the coefficient */
+  nbits = 0;
+  while (temp) {
+    nbits++;
+    temp >>= 1;
+  }
+  /* Check for out-of-range coefficient values.
+   * Since we're encoding a difference, the range limit is twice as much.
+   */
+  if (nbits > MAX_COEF_BITS+1)
+    ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
+
+  /* Emit the Huffman-coded symbol for the number of bits */
+  if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))
+    return FALSE;
+
+  /* Emit that number of bits of the value, if positive, */
+  /* or the complement of its magnitude, if negative. */
+  if (nbits)                    /* emit_bits rejects calls with size 0 */
+    if (! emit_bits(state, (unsigned int) temp2, nbits))
+      return FALSE;
+
+  /* Encode the AC coefficients per section F.1.2.2 */
+
+  r = 0;                        /* r = run length of zeros */
+
+  for (k = 1; k < DCTSIZE2; k++) {
+    if ((temp = block[jpeg_natural_order[k]]) == 0) {
+      r++;
+    } else {
+      /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+      while (r > 15) {
+        if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))
+          return FALSE;
+        r -= 16;
+      }
+
+      temp2 = temp;
+      if (temp < 0) {
+        temp = -temp;           /* temp is abs value of input */
+        /* This code assumes we are on a two's complement machine */
+        temp2--;
+      }
+
+      /* Find the number of bits needed for the magnitude of the coefficient */
+      nbits = 1;                /* there must be at least one 1 bit */
+      while ((temp >>= 1))
+        nbits++;
+      /* Check for out-of-range coefficient values */
+      if (nbits > MAX_COEF_BITS)
+        ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
+
+      /* Emit Huffman symbol for run length / number of bits */
+      i = (r << 4) + nbits;
+      if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))
+        return FALSE;
+
+      /* Emit that number of bits of the value, if positive, */
+      /* or the complement of its magnitude, if negative. */
+      if (! emit_bits(state, (unsigned int) temp2, nbits))
+        return FALSE;
+
+      r = 0;
+    }
+  }
+
+  /* If the last coef(s) were zero, emit an end-of-block code */
+  if (r > 0)
+    if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))
+      return FALSE;
+
+  return TRUE;
+}
+
+
+/*
+ * Emit a restart marker & resynchronize predictions.
+ */
+
+LOCAL(boolean)
+emit_restart (working_state * state, int restart_num)
+{
+  int ci;
+
+  if (! flush_bits(state))
+    return FALSE;
+
+  emit_byte(state, 0xFF, return FALSE);
+  emit_byte(state, JPEG_RST0 + restart_num, return FALSE);
+
+  /* Re-initialize DC predictions to 0 */
+  for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)
+    state->cur.last_dc_val[ci] = 0;
+
+  /* The restart counter is not updated until we successfully write the MCU. */
+
+  return TRUE;
+}
+
+
+/*
+ * Encode and output one MCU's worth of Huffman-compressed coefficients.
+ */
+
+METHODDEF(boolean)
+encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+  working_state state;
+  int blkn, ci;
+  jpeg_component_info * compptr;
+
+  /* Load up working state */
+  state.next_output_byte = cinfo->dest->next_output_byte;
+  state.free_in_buffer = cinfo->dest->free_in_buffer;
+  ASSIGN_STATE(state.cur, entropy->saved);
+  state.cinfo = cinfo;
+
+  /* Emit restart marker if needed */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0)
+      if (! emit_restart(&state, entropy->next_restart_num))
+        return FALSE;
+  }
+
+  /* Encode the MCU data blocks */
+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+    ci = cinfo->MCU_membership[blkn];
+    compptr = cinfo->cur_comp_info[ci];
+    if (! encode_one_block(&state,
+                           MCU_data[blkn][0], state.cur.last_dc_val[ci],
+                           entropy->dc_derived_tbls[compptr->dc_tbl_no],
+                           entropy->ac_derived_tbls[compptr->ac_tbl_no]))
+      return FALSE;
+    /* Update last_dc_val */
+    state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
+  }
+
+  /* Completed MCU, so update state */
+  cinfo->dest->next_output_byte = state.next_output_byte;
+  cinfo->dest->free_in_buffer = state.free_in_buffer;
+  ASSIGN_STATE(entropy->saved, state.cur);
+
+  /* Update restart-interval state too */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0) {
+      entropy->restarts_to_go = cinfo->restart_interval;
+      entropy->next_restart_num++;
+      entropy->next_restart_num &= 7;
+    }
+    entropy->restarts_to_go--;
+  }
+
+  return TRUE;
+}
+
+
+/*
+ * Finish up at the end of a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+finish_pass_huff (j_compress_ptr cinfo)
+{
+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+  working_state state;
+
+  /* Load up working state ... flush_bits needs it */
+  state.next_output_byte = cinfo->dest->next_output_byte;
+  state.free_in_buffer = cinfo->dest->free_in_buffer;
+  ASSIGN_STATE(state.cur, entropy->saved);
+  state.cinfo = cinfo;
+
+  /* Flush out the last data */
+  if (! flush_bits(&state))
+    ERREXIT(cinfo, JERR_CANT_SUSPEND);
+
+  /* Update state */
+  cinfo->dest->next_output_byte = state.next_output_byte;
+  cinfo->dest->free_in_buffer = state.free_in_buffer;
+  ASSIGN_STATE(entropy->saved, state.cur);
+}
+
+
+/*
+ * Huffman coding optimization.
+ *
+ * We first scan the supplied data and count the number of uses of each symbol
+ * that is to be Huffman-coded. (This process MUST agree with the code above.)
+ * Then we build a Huffman coding tree for the observed counts.
+ * Symbols which are not needed at all for the particular image are not
+ * assigned any code, which saves space in the DHT marker as well as in
+ * the compressed data.
+ */
+
+#ifdef ENTROPY_OPT_SUPPORTED
+
+
+/* Process a single block's worth of coefficients */
+
+LOCAL(void)
+htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
+                 long dc_counts[], long ac_counts[])
+{
+  register int temp;
+  register int nbits;
+  register int k, r;
+
+  /* Encode the DC coefficient difference per section F.1.2.1 */
+
+  temp = block[0] - last_dc_val;
+  if (temp < 0)
+    temp = -temp;
+
+  /* Find the number of bits needed for the magnitude of the coefficient */
+  nbits = 0;
+  while (temp) {
+    nbits++;
+    temp >>= 1;
+  }
+  /* Check for out-of-range coefficient values.
+   * Since we're encoding a difference, the range limit is twice as much.
+   */
+  if (nbits > MAX_COEF_BITS+1)
+    ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+  /* Count the Huffman symbol for the number of bits */
+  dc_counts[nbits]++;
+
+  /* Encode the AC coefficients per section F.1.2.2 */
+
+  r = 0;                        /* r = run length of zeros */
+
+  for (k = 1; k < DCTSIZE2; k++) {
+    if ((temp = block[jpeg_natural_order[k]]) == 0) {
+      r++;
+    } else {
+      /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+      while (r > 15) {
+        ac_counts[0xF0]++;
+        r -= 16;
+      }
+
+      /* Find the number of bits needed for the magnitude of the coefficient */
+      if (temp < 0)
+        temp = -temp;
+
+      /* Find the number of bits needed for the magnitude of the coefficient */
+      nbits = 1;                /* there must be at least one 1 bit */
+      while ((temp >>= 1))
+        nbits++;
+      /* Check for out-of-range coefficient values */
+      if (nbits > MAX_COEF_BITS)
+        ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+      /* Count Huffman symbol for run length / number of bits */
+      ac_counts[(r << 4) + nbits]++;
+
+      r = 0;
+    }
+  }
+
+  /* If the last coef(s) were zero, emit an end-of-block code */
+  if (r > 0)
+    ac_counts[0]++;
+}
+
+
+/*
+ * Trial-encode one MCU's worth of Huffman-compressed coefficients.
+ * No data is actually output, so no suspension return is possible.
+ */
+
+METHODDEF(boolean)
+encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+  int blkn, ci;
+  jpeg_component_info * compptr;
+
+  /* Take care of restart intervals if needed */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0) {
+      /* Re-initialize DC predictions to 0 */
+      for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+        entropy->saved.last_dc_val[ci] = 0;
+      /* Update restart state */
+      entropy->restarts_to_go = cinfo->restart_interval;
+    }
+    entropy->restarts_to_go--;
+  }
+
+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+    ci = cinfo->MCU_membership[blkn];
+    compptr = cinfo->cur_comp_info[ci];
+    htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],
+                    entropy->dc_count_ptrs[compptr->dc_tbl_no],
+                    entropy->ac_count_ptrs[compptr->ac_tbl_no]);
+    entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];
+  }
+
+  return TRUE;
+}
+
+
+/*
+ * Generate the best Huffman code table for the given counts, fill htbl.
+ * Note this is also used by jcphuff.c.
+ *
+ * The JPEG standard requires that no symbol be assigned a codeword of all
+ * one bits (so that padding bits added at the end of a compressed segment
+ * can't look like a valid code).  Because of the canonical ordering of
+ * codewords, this just means that there must be an unused slot in the
+ * longest codeword length category.  Section K.2 of the JPEG spec suggests
+ * reserving such a slot by pretending that symbol 256 is a valid symbol
+ * with count 1.  In theory that's not optimal; giving it count zero but
+ * including it in the symbol set anyway should give a better Huffman code.
+ * But the theoretically better code actually seems to come out worse in
+ * practice, because it produces more all-ones bytes (which incur stuffed
+ * zero bytes in the final file).  In any case the difference is tiny.
+ *
+ * The JPEG standard requires Huffman codes to be no more than 16 bits long.
+ * If some symbols have a very small but nonzero probability, the Huffman tree
+ * must be adjusted to meet the code length restriction.  We currently use
+ * the adjustment method suggested in JPEG section K.2.  This method is *not*
+ * optimal; it may not choose the best possible limited-length code.  But
+ * typically only very-low-frequency symbols will be given less-than-optimal
+ * lengths, so the code is almost optimal.  Experimental comparisons against
+ * an optimal limited-length-code algorithm indicate that the difference is
+ * microscopic --- usually less than a hundredth of a percent of total size.
+ * So the extra complexity of an optimal algorithm doesn't seem worthwhile.
+ */
+
+GLOBAL(void)
+jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
+{
+#define MAX_CLEN 32             /* assumed maximum initial code length */
+  UINT8 bits[MAX_CLEN+1];       /* bits[k] = # of symbols with code length k */
+  int codesize[257];            /* codesize[k] = code length of symbol k */
+  int others[257];              /* next symbol in current branch of tree */
+  int c1, c2;
+  int p, i, j;
+  long v;
+
+  /* This algorithm is explained in section K.2 of the JPEG standard */
+
+  MEMZERO(bits, SIZEOF(bits));
+  MEMZERO(codesize, SIZEOF(codesize));
+  for (i = 0; i < 257; i++)
+    others[i] = -1;             /* init links to empty */
+
+  freq[256] = 1;                /* make sure 256 has a nonzero count */
+  /* Including the pseudo-symbol 256 in the Huffman procedure guarantees
+   * that no real symbol is given code-value of all ones, because 256
+   * will be placed last in the largest codeword category.
+   */
+
+  /* Huffman's basic algorithm to assign optimal code lengths to symbols */
+
+  for (;;) {
+    /* Find the smallest nonzero frequency, set c1 = its symbol */
+    /* In case of ties, take the larger symbol number */
+    c1 = -1;
+    v = 1000000000L;
+    for (i = 0; i <= 256; i++) {
+      if (freq[i] && freq[i] <= v) {
+        v = freq[i];
+        c1 = i;
+      }
+    }
+
+    /* Find the next smallest nonzero frequency, set c2 = its symbol */
+    /* In case of ties, take the larger symbol number */
+    c2 = -1;
+    v = 1000000000L;
+    for (i = 0; i <= 256; i++) {
+      if (freq[i] && freq[i] <= v && i != c1) {
+        v = freq[i];
+        c2 = i;
+      }
+    }
+
+    /* Done if we've merged everything into one frequency */
+    if (c2 < 0)
+      break;
+
+    /* Else merge the two counts/trees */
+    freq[c1] += freq[c2];
+    freq[c2] = 0;
+
+    /* Increment the codesize of everything in c1's tree branch */
+    codesize[c1]++;
+    while (others[c1] >= 0) {
+      c1 = others[c1];
+      codesize[c1]++;
+    }
+
+    others[c1] = c2;            /* chain c2 onto c1's tree branch */
+
+    /* Increment the codesize of everything in c2's tree branch */
+    codesize[c2]++;
+    while (others[c2] >= 0) {
+      c2 = others[c2];
+      codesize[c2]++;
+    }
+  }
+
+  /* Now count the number of symbols of each code length */
+  for (i = 0; i <= 256; i++) {
+    if (codesize[i]) {
+      /* The JPEG standard seems to think that this can't happen, */
+      /* but I'm paranoid... */
+      if (codesize[i] > MAX_CLEN)
+        ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
+
+      bits[codesize[i]]++;
+    }
+  }
+
+  /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
+   * Huffman procedure assigned any such lengths, we must adjust the coding.
+   * Here is what the JPEG spec says about how this next bit works:
+   * Since symbols are paired for the longest Huffman code, the symbols are
+   * removed from this length category two at a time.  The prefix for the pair
+   * (which is one bit shorter) is allocated to one of the pair; then,
+   * skipping the BITS entry for that prefix length, a code word from the next
+   * shortest nonzero BITS entry is converted into a prefix for two code words
+   * one bit longer.
+   */
+
+  for (i = MAX_CLEN; i > 16; i--) {
+    while (bits[i] > 0) {
+      j = i - 2;                /* find length of new prefix to be used */
+      while (bits[j] == 0)
+        j--;
+
+      bits[i] -= 2;             /* remove two symbols */
+      bits[i-1]++;              /* one goes in this length */
+      bits[j+1] += 2;           /* two new symbols in this length */
+      bits[j]--;                /* symbol of this length is now a prefix */
+    }
+  }
+
+  /* Remove the count for the pseudo-symbol 256 from the largest codelength */
+  while (bits[i] == 0)          /* find largest codelength still in use */
+    i--;
+  bits[i]--;
+
+  /* Return final symbol counts (only for lengths 0..16) */
+  MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
+
+  /* Return a list of the symbols sorted by code length */
+  /* It's not real clear to me why we don't need to consider the codelength
+   * changes made above, but the JPEG spec seems to think this works.
+   */
+  p = 0;
+  for (i = 1; i <= MAX_CLEN; i++) {
+    for (j = 0; j <= 255; j++) {
+      if (codesize[j] == i) {
+        htbl->huffval[p] = (UINT8) j;
+        p++;
+      }
+    }
+  }
+
+  /* Set sent_table FALSE so updated table will be written to JPEG file. */
+  htbl->sent_table = FALSE;
+}
+
+
+/*
+ * Finish up a statistics-gathering pass and create the new Huffman tables.
+ */
+
+METHODDEF(void)
+finish_pass_gather (j_compress_ptr cinfo)
+{
+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+  int ci, dctbl, actbl;
+  jpeg_component_info * compptr;
+  JHUFF_TBL **htblptr;
+  boolean did_dc[NUM_HUFF_TBLS];
+  boolean did_ac[NUM_HUFF_TBLS];
+
+  /* It's important not to apply jpeg_gen_optimal_table more than once
+   * per table, because it clobbers the input frequency counts!
+   */
+  MEMZERO(did_dc, SIZEOF(did_dc));
+  MEMZERO(did_ac, SIZEOF(did_ac));
+
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    dctbl = compptr->dc_tbl_no;
+    actbl = compptr->ac_tbl_no;
+    if (! did_dc[dctbl]) {
+      htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];
+      if (*htblptr == NULL)
+        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);
+      did_dc[dctbl] = TRUE;
+    }
+    if (! did_ac[actbl]) {
+      htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];
+      if (*htblptr == NULL)
+        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);
+      did_ac[actbl] = TRUE;
+    }
+  }
+}
+
+
+#endif /* ENTROPY_OPT_SUPPORTED */
+
+
+/*
+ * Module initialization routine for Huffman entropy encoding.
+ */
+
+GLOBAL(void)
+jinit_huff_encoder (j_compress_ptr cinfo)
+{
+  huff_entropy_ptr entropy;
+  int i;
+
+  entropy = (huff_entropy_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(huff_entropy_encoder));
+  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+  entropy->pub.start_pass = start_pass_huff;
+
+  /* Mark tables unallocated */
+  for (i = 0; i < NUM_HUFF_TBLS; i++) {
+    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
+#ifdef ENTROPY_OPT_SUPPORTED
+    entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
+#endif
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jchuff.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,51 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jchuff.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains declarations for Huffman entropy encoding routines
+ * that are shared between the sequential encoder (jchuff.c) and the
+ * progressive encoder (jcphuff.c).  No other modules need to see these.
+ */
+
+/* The legal range of a DCT coefficient is
+ *  -1024 .. +1023  for 8-bit data;
+ * -16384 .. +16383 for 12-bit data.
+ * Hence the magnitude should always fit in 10 or 14 bits respectively.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MAX_COEF_BITS 10
+#else
+#define MAX_COEF_BITS 14
+#endif
+
+/* Derived data constructed for each Huffman table */
+
+typedef struct {
+  unsigned int ehufco[256];     /* code for each symbol */
+  char ehufsi[256];             /* length of code for each symbol */
+  /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */
+} c_derived_tbl;
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_make_c_derived_tbl jMkCDerived
+#define jpeg_gen_optimal_table  jGenOptTbl
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+/* Expand a Huffman table definition into the derived format */
+EXTERN(void) jpeg_make_c_derived_tbl
+        JPP((j_compress_ptr cinfo, boolean isDC, int tblno,
+             c_derived_tbl ** pdtbl));
+
+/* Generate an optimal table definition given the specified counts */
+EXTERN(void) jpeg_gen_optimal_table
+        JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcinit.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,76 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcinit.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains initialization logic for the JPEG compressor.
+ * This routine is in charge of selecting the modules to be executed and
+ * making an initialization call to each one.
+ *
+ * Logically, this code belongs in jcmaster.c.  It's split out because
+ * linking this routine implies linking the entire compression library.
+ * For a transcoding-only application, we want to be able to use jcmaster.c
+ * without linking in the whole library.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Master selection of compression modules.
+ * This is done once at the start of processing an image.  We determine
+ * which modules will be used and give them appropriate initialization calls.
+ */
+
+GLOBAL(void)
+jinit_compress_master (j_compress_ptr cinfo)
+{
+  /* Initialize master control (includes parameter checking/processing) */
+  jinit_c_master_control(cinfo, FALSE /* full compression */);
+
+  /* Preprocessing */
+  if (! cinfo->raw_data_in) {
+    jinit_color_converter(cinfo);
+    jinit_downsampler(cinfo);
+    jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);
+  }
+  /* Forward DCT */
+  jinit_forward_dct(cinfo);
+  /* Entropy encoding: either Huffman or arithmetic coding. */
+  if (cinfo->arith_code) {
+    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+  } else {
+    if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+      jinit_phuff_encoder(cinfo);
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+    } else
+      jinit_huff_encoder(cinfo);
+  }
+
+  /* Need a full-image coefficient buffer in any multi-pass mode. */
+  jinit_c_coef_controller(cinfo,
+                (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));
+  jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
+
+  jinit_marker_writer(cinfo);
+
+  /* We can now tell the memory manager to allocate virtual arrays. */
+  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+  /* Write the datastream header (SOI) immediately.
+   * Frame and scan headers are postponed till later.
+   * This lets application insert special markers after the SOI.
+   */
+  (*cinfo->marker->write_file_header) (cinfo);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcmainct.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,297 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcmainct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the main buffer controller for compression.
+ * The main buffer lies between the pre-processor and the JPEG
+ * compressor proper; it holds downsampled data in the JPEG colorspace.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Note: currently, there is no operating mode in which a full-image buffer
+ * is needed at this step.  If there were, that mode could not be used with
+ * "raw data" input, since this module is bypassed in that case.  However,
+ * we've left the code here for possible use in special applications.
+ */
+#undef FULL_MAIN_BUFFER_SUPPORTED
+
+
+/* Private buffer controller object */
+
+typedef struct {
+  struct jpeg_c_main_controller pub; /* public fields */
+
+  JDIMENSION cur_iMCU_row;      /* number of current iMCU row */
+  JDIMENSION rowgroup_ctr;      /* counts row groups received in iMCU row */
+  boolean suspended;            /* remember if we suspended output */
+  J_BUF_MODE pass_mode;         /* current operating mode */
+
+  /* If using just a strip buffer, this points to the entire set of buffers
+   * (we allocate one for each component).  In the full-image case, this
+   * points to the currently accessible strips of the virtual arrays.
+   */
+  JSAMPARRAY buffer[MAX_COMPONENTS];
+
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+  /* If using full-image storage, this array holds pointers to virtual-array
+   * control blocks for each component.  Unused if not full-image storage.
+   */
+  jvirt_sarray_ptr whole_image[MAX_COMPONENTS];
+#endif
+} my_main_controller;
+
+typedef my_main_controller * my_main_ptr;
+
+
+/* Forward declarations */
+METHODDEF(void) process_data_simple_main
+        JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
+             JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+METHODDEF(void) process_data_buffer_main
+        JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
+             JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
+#endif
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+
+  /* Do nothing in raw-data mode. */
+  if (cinfo->raw_data_in)
+    return;
+
+  _main->cur_iMCU_row = 0;      /* initialize counters */
+  _main->rowgroup_ctr = 0;
+  _main->suspended = FALSE;
+  _main->pass_mode = pass_mode; /* save mode for use by process_data */
+
+  switch (pass_mode) {
+  case JBUF_PASS_THRU:
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+    if (_main->whole_image[0] != NULL)
+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+    _main->pub.process_data = process_data_simple_main;
+    break;
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+  case JBUF_SAVE_SOURCE:
+  case JBUF_CRANK_DEST:
+  case JBUF_SAVE_AND_PASS:
+    if (_main->whole_image[0] == NULL)
+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    _main->pub.process_data = process_data_buffer_main;
+    break;
+#endif
+  default:
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    break;
+  }
+}
+
+
+/*
+ * Process some data.
+ * This routine handles the simple pass-through mode,
+ * where we have only a strip buffer.
+ */
+
+METHODDEF(void)
+process_data_simple_main (j_compress_ptr cinfo,
+                          JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+                          JDIMENSION in_rows_avail)
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+
+  while (_main->cur_iMCU_row < cinfo->total_iMCU_rows) {
+    /* Read input data if we haven't filled the main buffer yet */
+    if (_main->rowgroup_ctr < DCTSIZE)
+      (*cinfo->prep->pre_process_data) (cinfo,
+                                        input_buf, in_row_ctr, in_rows_avail,
+                                        _main->buffer, &_main->rowgroup_ctr,
+                                        (JDIMENSION) DCTSIZE);
+
+    /* If we don't have a full iMCU row buffered, return to application for
+     * more data.  Note that preprocessor will always pad to fill the iMCU row
+     * at the bottom of the image.
+     */
+    if (_main->rowgroup_ctr != DCTSIZE)
+      return;
+
+    /* Send the completed row to the compressor */
+    if (! (*cinfo->coef->compress_data) (cinfo, _main->buffer)) {
+      /* If compressor did not consume the whole row, then we must need to
+       * suspend processing and return to the application.  In this situation
+       * we pretend we didn't yet consume the last input row; otherwise, if
+       * it happened to be the last row of the image, the application would
+       * think we were done.
+       */
+      if (! _main->suspended) {
+        (*in_row_ctr)--;
+        _main->suspended = TRUE;
+      }
+      return;
+    }
+    /* We did finish the row.  Undo our little suspension hack if a previous
+     * call suspended; then mark the main buffer empty.
+     */
+    if (_main->suspended) {
+      (*in_row_ctr)++;
+      _main->suspended = FALSE;
+    }
+    _main->rowgroup_ctr = 0;
+    _main->cur_iMCU_row++;
+  }
+}
+
+
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+
+/*
+ * Process some data.
+ * This routine handles all of the modes that use a full-size buffer.
+ */
+
+METHODDEF(void)
+process_data_buffer_main (j_compress_ptr cinfo,
+                          JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+                          JDIMENSION in_rows_avail)
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+  int ci;
+  jpeg_component_info *compptr;
+  boolean writing = (_main->pass_mode != JBUF_CRANK_DEST);
+
+  while (_main->cur_iMCU_row < cinfo->total_iMCU_rows) {
+    /* Realign the virtual buffers if at the start of an iMCU row. */
+    if (_main->rowgroup_ctr == 0) {
+      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+           ci++, compptr++) {
+        _main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
+          ((j_common_ptr) cinfo, _main->whole_image[ci],
+           _main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
+           (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
+      }
+      /* In a read pass, pretend we just read some source data. */
+      if (! writing) {
+        *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
+        _main->rowgroup_ctr = DCTSIZE;
+      }
+    }
+
+    /* If a write pass, read input data until the current iMCU row is full. */
+    /* Note: preprocessor will pad if necessary to fill the last iMCU row. */
+    if (writing) {
+      (*cinfo->prep->pre_process_data) (cinfo,
+                                        input_buf, in_row_ctr, in_rows_avail,
+                                        _main->buffer, &_main->rowgroup_ctr,
+                                        (JDIMENSION) DCTSIZE);
+      /* Return to application if we need more data to fill the iMCU row. */
+      if (_main->rowgroup_ctr < DCTSIZE)
+        return;
+    }
+
+    /* Emit data, unless this is a sink-only pass. */
+    if (_main->pass_mode != JBUF_SAVE_SOURCE) {
+      if (! (*cinfo->coef->compress_data) (cinfo, _main->buffer)) {
+        /* If compressor did not consume the whole row, then we must need to
+         * suspend processing and return to the application.  In this situation
+         * we pretend we didn't yet consume the last input row; otherwise, if
+         * it happened to be the last row of the image, the application would
+         * think we were done.
+         */
+        if (! _main->suspended) {
+          (*in_row_ctr)--;
+          _main->suspended = TRUE;
+        }
+        return;
+      }
+      /* We did finish the row.  Undo our little suspension hack if a previous
+       * call suspended; then mark the main buffer empty.
+       */
+      if (_main->suspended) {
+        (*in_row_ctr)++;
+        _main->suspended = FALSE;
+      }
+    }
+
+    /* If get here, we are done with this iMCU row.  Mark buffer empty. */
+    _main->rowgroup_ctr = 0;
+    _main->cur_iMCU_row++;
+  }
+}
+
+#endif /* FULL_MAIN_BUFFER_SUPPORTED */
+
+
+/*
+ * Initialize main buffer controller.
+ */
+
+GLOBAL(void)
+jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+  my_main_ptr _main;
+  int ci;
+  jpeg_component_info *compptr;
+
+  _main = (my_main_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_main_controller));
+  cinfo->main = (struct jpeg_c_main_controller *) _main;
+  _main->pub.start_pass = start_pass_main;
+
+  /* We don't need to create a buffer in raw-data mode. */
+  if (cinfo->raw_data_in)
+    return;
+
+  /* Create the buffer.  It holds downsampled data, so each component
+   * may be of a different size.
+   */
+  if (need_full_buffer) {
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+    /* Allocate a full-image virtual array for each component */
+    /* Note we pad the bottom to a multiple of the iMCU height */
+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+         ci++, compptr++) {
+      _main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
+        ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+         compptr->width_in_blocks * DCTSIZE,
+         (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+                                (long) compptr->v_samp_factor) * DCTSIZE,
+         (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
+    }
+#else
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+  } else {
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+    _main->whole_image[0] = NULL; /* flag for no virtual arrays */
+#endif
+    /* Allocate a strip buffer for each component */
+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+         ci++, compptr++) {
+      _main->buffer[ci] = (*cinfo->mem->alloc_sarray)
+        ((j_common_ptr) cinfo, JPOOL_IMAGE,
+         compptr->width_in_blocks * DCTSIZE,
+         (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcmarker.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,682 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcmarker.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains routines to write JPEG datastream markers.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+typedef enum {                  /* JPEG marker codes */
+  M_SOF0  = 0xc0,
+  M_SOF1  = 0xc1,
+  M_SOF2  = 0xc2,
+  M_SOF3  = 0xc3,
+
+  M_SOF5  = 0xc5,
+  M_SOF6  = 0xc6,
+  M_SOF7  = 0xc7,
+
+  M_JPG   = 0xc8,
+  M_SOF9  = 0xc9,
+  M_SOF10 = 0xca,
+  M_SOF11 = 0xcb,
+
+  M_SOF13 = 0xcd,
+  M_SOF14 = 0xce,
+  M_SOF15 = 0xcf,
+
+  M_DHT   = 0xc4,
+
+  M_DAC   = 0xcc,
+
+  M_RST0  = 0xd0,
+  M_RST1  = 0xd1,
+  M_RST2  = 0xd2,
+  M_RST3  = 0xd3,
+  M_RST4  = 0xd4,
+  M_RST5  = 0xd5,
+  M_RST6  = 0xd6,
+  M_RST7  = 0xd7,
+
+  M_SOI   = 0xd8,
+  M_EOI   = 0xd9,
+  M_SOS   = 0xda,
+  M_DQT   = 0xdb,
+  M_DNL   = 0xdc,
+  M_DRI   = 0xdd,
+  M_DHP   = 0xde,
+  M_EXP   = 0xdf,
+
+  M_APP0  = 0xe0,
+  M_APP1  = 0xe1,
+  M_APP2  = 0xe2,
+  M_APP3  = 0xe3,
+  M_APP4  = 0xe4,
+  M_APP5  = 0xe5,
+  M_APP6  = 0xe6,
+  M_APP7  = 0xe7,
+  M_APP8  = 0xe8,
+  M_APP9  = 0xe9,
+  M_APP10 = 0xea,
+  M_APP11 = 0xeb,
+  M_APP12 = 0xec,
+  M_APP13 = 0xed,
+  M_APP14 = 0xee,
+  M_APP15 = 0xef,
+
+  M_JPG0  = 0xf0,
+  M_JPG13 = 0xfd,
+  M_COM   = 0xfe,
+
+  M_TEM   = 0x01,
+
+  M_ERROR = 0x100
+} JPEG_MARKER;
+
+
+/* Private state */
+
+typedef struct {
+  struct jpeg_marker_writer pub; /* public fields */
+
+  unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */
+} my_marker_writer;
+
+typedef my_marker_writer * my_marker_ptr;
+
+
+/*
+ * Basic output routines.
+ *
+ * Note that we do not support suspension while writing a marker.
+ * Therefore, an application using suspension must ensure that there is
+ * enough buffer space for the initial markers (typ. 600-700 bytes) before
+ * calling jpeg_start_compress, and enough space to write the trailing EOI
+ * (a few bytes) before calling jpeg_finish_compress.  Multipass compression
+ * modes are not supported at all with suspension, so those two are the only
+ * points where markers will be written.
+ */
+
+LOCAL(void)
+emit_byte (j_compress_ptr cinfo, int val)
+/* Emit a byte */
+{
+  struct jpeg_destination_mgr * dest = cinfo->dest;
+
+  *(dest->next_output_byte)++ = (JOCTET) val;
+  if (--dest->free_in_buffer == 0) {
+    if (! (*dest->empty_output_buffer) (cinfo))
+      ERREXIT(cinfo, JERR_CANT_SUSPEND);
+  }
+}
+
+
+LOCAL(void)
+emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)
+/* Emit a marker code */
+{
+  emit_byte(cinfo, 0xFF);
+  emit_byte(cinfo, (int) mark);
+}
+
+
+LOCAL(void)
+emit_2bytes (j_compress_ptr cinfo, int value)
+/* Emit a 2-byte integer; these are always MSB first in JPEG files */
+{
+  emit_byte(cinfo, (value >> 8) & 0xFF);
+  emit_byte(cinfo, value & 0xFF);
+}
+
+
+/*
+ * Routines to write specific marker types.
+ */
+
+LOCAL(int)
+emit_dqt (j_compress_ptr cinfo, int index)
+/* Emit a DQT marker */
+/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */
+{
+  JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];
+  int prec;
+  int i;
+
+  if (qtbl == NULL)
+    ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
+
+  prec = 0;
+  for (i = 0; i < DCTSIZE2; i++) {
+    if (qtbl->quantval[i] > 255)
+      prec = 1;
+  }
+
+  if (! qtbl->sent_table) {
+    emit_marker(cinfo, M_DQT);
+
+    emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);
+
+    emit_byte(cinfo, index + (prec<<4));
+
+    for (i = 0; i < DCTSIZE2; i++) {
+      /* The table entries must be emitted in zigzag order. */
+      unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];
+      if (prec)
+        emit_byte(cinfo, (int) (qval >> 8));
+      emit_byte(cinfo, (int) (qval & 0xFF));
+    }
+
+    qtbl->sent_table = TRUE;
+  }
+
+  return prec;
+}
+
+
+LOCAL(void)
+emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
+/* Emit a DHT marker */
+{
+  JHUFF_TBL * htbl;
+  int length, i;
+
+  if (is_ac) {
+    htbl = cinfo->ac_huff_tbl_ptrs[index];
+    index += 0x10;              /* output index has AC bit set */
+  } else {
+    htbl = cinfo->dc_huff_tbl_ptrs[index];
+  }
+
+  if (htbl == NULL)
+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);
+
+  if (! htbl->sent_table) {
+    emit_marker(cinfo, M_DHT);
+
+    length = 0;
+    for (i = 1; i <= 16; i++)
+      length += htbl->bits[i];
+
+    emit_2bytes(cinfo, length + 2 + 1 + 16);
+    emit_byte(cinfo, index);
+
+    for (i = 1; i <= 16; i++)
+      emit_byte(cinfo, htbl->bits[i]);
+
+    for (i = 0; i < length; i++)
+      emit_byte(cinfo, htbl->huffval[i]);
+
+    htbl->sent_table = TRUE;
+  }
+}
+
+
+LOCAL(void)
+emit_dac (j_compress_ptr cinfo)
+/* Emit a DAC marker */
+/* Since the useful info is so small, we want to emit all the tables in */
+/* one DAC marker.  Therefore this routine does its own scan of the table. */
+{
+#ifdef C_ARITH_CODING_SUPPORTED
+  char dc_in_use[NUM_ARITH_TBLS];
+  char ac_in_use[NUM_ARITH_TBLS];
+  int length, i;
+  jpeg_component_info *compptr;
+
+  for (i = 0; i < NUM_ARITH_TBLS; i++)
+    dc_in_use[i] = ac_in_use[i] = 0;
+
+  for (i = 0; i < cinfo->comps_in_scan; i++) {
+    compptr = cinfo->cur_comp_info[i];
+    dc_in_use[compptr->dc_tbl_no] = 1;
+    ac_in_use[compptr->ac_tbl_no] = 1;
+  }
+
+  length = 0;
+  for (i = 0; i < NUM_ARITH_TBLS; i++)
+    length += dc_in_use[i] + ac_in_use[i];
+
+  emit_marker(cinfo, M_DAC);
+
+  emit_2bytes(cinfo, length*2 + 2);
+
+  for (i = 0; i < NUM_ARITH_TBLS; i++) {
+    if (dc_in_use[i]) {
+      emit_byte(cinfo, i);
+      emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));
+    }
+    if (ac_in_use[i]) {
+      emit_byte(cinfo, i + 0x10);
+      emit_byte(cinfo, cinfo->arith_ac_K[i]);
+    }
+  }
+#endif /* C_ARITH_CODING_SUPPORTED */
+}
+
+
+LOCAL(void)
+emit_dri (j_compress_ptr cinfo)
+/* Emit a DRI marker */
+{
+  emit_marker(cinfo, M_DRI);
+
+  emit_2bytes(cinfo, 4);        /* fixed length */
+
+  emit_2bytes(cinfo, (int) cinfo->restart_interval);
+}
+
+
+LOCAL(void)
+emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
+/* Emit a SOF marker */
+{
+  int ci;
+  jpeg_component_info *compptr;
+
+  emit_marker(cinfo, code);
+
+  emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */
+
+  /* Make sure image isn't bigger than SOF field can handle */
+  if ((long) cinfo->image_height > 65535L ||
+      (long) cinfo->image_width > 65535L)
+    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);
+
+  emit_byte(cinfo, cinfo->data_precision);
+  emit_2bytes(cinfo, (int) cinfo->image_height);
+  emit_2bytes(cinfo, (int) cinfo->image_width);
+
+  emit_byte(cinfo, cinfo->num_components);
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    emit_byte(cinfo, compptr->component_id);
+    emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);
+    emit_byte(cinfo, compptr->quant_tbl_no);
+  }
+}
+
+
+LOCAL(void)
+emit_sos (j_compress_ptr cinfo)
+/* Emit a SOS marker */
+{
+  int i, td, ta;
+  jpeg_component_info *compptr;
+
+  emit_marker(cinfo, M_SOS);
+
+  emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */
+
+  emit_byte(cinfo, cinfo->comps_in_scan);
+
+  for (i = 0; i < cinfo->comps_in_scan; i++) {
+    compptr = cinfo->cur_comp_info[i];
+    emit_byte(cinfo, compptr->component_id);
+    td = compptr->dc_tbl_no;
+    ta = compptr->ac_tbl_no;
+    if (cinfo->progressive_mode) {
+      /* Progressive mode: only DC or only AC tables are used in one scan;
+       * furthermore, Huffman coding of DC refinement uses no table at all.
+       * We emit 0 for unused field(s); this is recommended by the P&M text
+       * but does not seem to be specified in the standard.
+       */
+      if (cinfo->Ss == 0) {
+        ta = 0;                 /* DC scan */
+        if (cinfo->Ah != 0 && !cinfo->arith_code)
+          td = 0;               /* no DC table either */
+      } else {
+        td = 0;                 /* AC scan */
+      }
+    }
+    emit_byte(cinfo, (td << 4) + ta);
+  }
+
+  emit_byte(cinfo, cinfo->Ss);
+  emit_byte(cinfo, cinfo->Se);
+  emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);
+}
+
+
+LOCAL(void)
+emit_jfif_app0 (j_compress_ptr cinfo)
+/* Emit a JFIF-compliant APP0 marker */
+{
+  /*
+   * Length of APP0 block       (2 bytes)
+   * Block ID                   (4 bytes - ASCII "JFIF")
+   * Zero byte                  (1 byte to terminate the ID string)
+   * Version Major, Minor       (2 bytes - major first)
+   * Units                      (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)
+   * Xdpu                       (2 bytes - dots per unit horizontal)
+   * Ydpu                       (2 bytes - dots per unit vertical)
+   * Thumbnail X size           (1 byte)
+   * Thumbnail Y size           (1 byte)
+   */
+
+  emit_marker(cinfo, M_APP0);
+
+  emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */
+
+  emit_byte(cinfo, 0x4A);       /* Identifier: ASCII "JFIF" */
+  emit_byte(cinfo, 0x46);
+  emit_byte(cinfo, 0x49);
+  emit_byte(cinfo, 0x46);
+  emit_byte(cinfo, 0);
+  emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */
+  emit_byte(cinfo, cinfo->JFIF_minor_version);
+  emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */
+  emit_2bytes(cinfo, (int) cinfo->X_density);
+  emit_2bytes(cinfo, (int) cinfo->Y_density);
+  emit_byte(cinfo, 0);          /* No thumbnail image */
+  emit_byte(cinfo, 0);
+}
+
+
+LOCAL(void)
+emit_adobe_app14 (j_compress_ptr cinfo)
+/* Emit an Adobe APP14 marker */
+{
+  /*
+   * Length of APP14 block      (2 bytes)
+   * Block ID                   (5 bytes - ASCII "Adobe")
+   * Version Number             (2 bytes - currently 100)
+   * Flags0                     (2 bytes - currently 0)
+   * Flags1                     (2 bytes - currently 0)
+   * Color transform            (1 byte)
+   *
+   * Although Adobe TN 5116 mentions Version = 101, all the Adobe files
+   * now in circulation seem to use Version = 100, so that's what we write.
+   *
+   * We write the color transform byte as 1 if the JPEG color space is
+   * YCbCr, 2 if it's YCCK, 0 otherwise.  Adobe's definition has to do with
+   * whether the encoder performed a transformation, which is pretty useless.
+   */
+
+  emit_marker(cinfo, M_APP14);
+
+  emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */
+
+  emit_byte(cinfo, 0x41);       /* Identifier: ASCII "Adobe" */
+  emit_byte(cinfo, 0x64);
+  emit_byte(cinfo, 0x6F);
+  emit_byte(cinfo, 0x62);
+  emit_byte(cinfo, 0x65);
+  emit_2bytes(cinfo, 100);      /* Version */
+  emit_2bytes(cinfo, 0);        /* Flags0 */
+  emit_2bytes(cinfo, 0);        /* Flags1 */
+  switch (cinfo->jpeg_color_space) {
+  case JCS_YCbCr:
+    emit_byte(cinfo, 1);        /* Color transform = 1 */
+    break;
+  case JCS_YCCK:
+    emit_byte(cinfo, 2);        /* Color transform = 2 */
+    break;
+  default:
+    emit_byte(cinfo, 0);        /* Color transform = 0 */
+    break;
+  }
+}
+
+
+/*
+ * These routines allow writing an arbitrary marker with parameters.
+ * The only intended use is to emit COM or APPn markers after calling
+ * write_file_header and before calling write_frame_header.
+ * Other uses are not guaranteed to produce desirable results.
+ * Counting the parameter bytes properly is the caller's responsibility.
+ */
+
+METHODDEF(void)
+write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
+/* Emit an arbitrary marker header */
+{
+  if (datalen > (unsigned int) 65533)           /* safety check */
+    ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+  emit_marker(cinfo, (JPEG_MARKER) marker);
+
+  emit_2bytes(cinfo, (int) (datalen + 2));      /* total length */
+}
+
+METHODDEF(void)
+write_marker_byte (j_compress_ptr cinfo, int val)
+/* Emit one byte of marker parameters following write_marker_header */
+{
+  emit_byte(cinfo, val);
+}
+
+
+/*
+ * Write datastream header.
+ * This consists of an SOI and optional APPn markers.
+ * We recommend use of the JFIF marker, but not the Adobe marker,
+ * when using YCbCr or grayscale data.  The JFIF marker should NOT
+ * be used for any other JPEG colorspace.  The Adobe marker is helpful
+ * to distinguish RGB, CMYK, and YCCK colorspaces.
+ * Note that an application can write additional header markers after
+ * jpeg_start_compress returns.
+ */
+
+METHODDEF(void)
+write_file_header (j_compress_ptr cinfo)
+{
+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+  emit_marker(cinfo, M_SOI);    /* first the SOI */
+
+  /* SOI is defined to reset restart interval to 0 */
+  marker->last_restart_interval = 0;
+
+  if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */
+    emit_jfif_app0(cinfo);
+  if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */
+    emit_adobe_app14(cinfo);
+}
+
+
+/*
+ * Write frame header.
+ * This consists of DQT and SOFn markers.
+ * Note that we do not emit the SOF until we have emitted the DQT(s).
+ * This avoids compatibility problems with incorrect implementations that
+ * try to error-check the quant table numbers as soon as they see the SOF.
+ */
+
+METHODDEF(void)
+write_frame_header (j_compress_ptr cinfo)
+{
+  int ci, prec;
+  boolean is_baseline;
+  jpeg_component_info *compptr;
+
+  /* Emit DQT for each quantization table.
+   * Note that emit_dqt() suppresses any duplicate tables.
+   */
+  prec = 0;
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    prec += emit_dqt(cinfo, compptr->quant_tbl_no);
+  }
+  /* now prec is nonzero iff there are any 16-bit quant tables. */
+
+  /* Check for a non-baseline specification.
+   * Note we assume that Huffman table numbers won't be changed later.
+   */
+  if (cinfo->arith_code || cinfo->progressive_mode ||
+      cinfo->data_precision != 8) {
+    is_baseline = FALSE;
+  } else {
+    is_baseline = TRUE;
+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+         ci++, compptr++) {
+      if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)
+        is_baseline = FALSE;
+    }
+    if (prec && is_baseline) {
+      is_baseline = FALSE;
+      /* If it's baseline except for quantizer size, warn the user */
+      TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);
+    }
+  }
+
+  /* Emit the proper SOF marker */
+  if (cinfo->arith_code) {
+    emit_sof(cinfo, M_SOF9);    /* SOF code for arithmetic coding */
+  } else {
+    if (cinfo->progressive_mode)
+      emit_sof(cinfo, M_SOF2);  /* SOF code for progressive Huffman */
+    else if (is_baseline)
+      emit_sof(cinfo, M_SOF0);  /* SOF code for baseline implementation */
+    else
+      emit_sof(cinfo, M_SOF1);  /* SOF code for non-baseline Huffman file */
+  }
+}
+
+
+/*
+ * Write scan header.
+ * This consists of DHT or DAC markers, optional DRI, and SOS.
+ * Compressed data will be written following the SOS.
+ */
+
+METHODDEF(void)
+write_scan_header (j_compress_ptr cinfo)
+{
+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+  int i;
+  jpeg_component_info *compptr;
+
+  if (cinfo->arith_code) {
+    /* Emit arith conditioning info.  We may have some duplication
+     * if the file has multiple scans, but it's so small it's hardly
+     * worth worrying about.
+     */
+    emit_dac(cinfo);
+  } else {
+    /* Emit Huffman tables.
+     * Note that emit_dht() suppresses any duplicate tables.
+     */
+    for (i = 0; i < cinfo->comps_in_scan; i++) {
+      compptr = cinfo->cur_comp_info[i];
+      if (cinfo->progressive_mode) {
+        /* Progressive mode: only DC or only AC tables are used in one scan */
+        if (cinfo->Ss == 0) {
+          if (cinfo->Ah == 0)   /* DC needs no table for refinement scan */
+            emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
+        } else {
+          emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
+        }
+      } else {
+        /* Sequential mode: need both DC and AC tables */
+        emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
+        emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
+      }
+    }
+  }
+
+  /* Emit DRI if required --- note that DRI value could change for each scan.
+   * We avoid wasting space with unnecessary DRIs, however.
+   */
+  if (cinfo->restart_interval != marker->last_restart_interval) {
+    emit_dri(cinfo);
+    marker->last_restart_interval = cinfo->restart_interval;
+  }
+
+  emit_sos(cinfo);
+}
+
+
+/*
+ * Write datastream trailer.
+ */
+
+METHODDEF(void)
+write_file_trailer (j_compress_ptr cinfo)
+{
+  emit_marker(cinfo, M_EOI);
+}
+
+
+/*
+ * Write an abbreviated table-specification datastream.
+ * This consists of SOI, DQT and DHT tables, and EOI.
+ * Any table that is defined and not marked sent_table = TRUE will be
+ * emitted.  Note that all tables will be marked sent_table = TRUE at exit.
+ */
+
+METHODDEF(void)
+write_tables_only (j_compress_ptr cinfo)
+{
+  int i;
+
+  emit_marker(cinfo, M_SOI);
+
+  /* Emit DQT for each quantization table.
+   * Only emit those tables that are actually associated with image components,
+   * if there are any image components, which will usually not be the case.
+   * Note that emit_dqt() suppresses any duplicate tables.
+   */
+  if (cinfo->num_components > 0) {
+      int ci;
+      jpeg_component_info *compptr;
+      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+           ci++, compptr++) {
+          (void) emit_dqt(cinfo, compptr->quant_tbl_no);
+      }
+  } else {
+      for (i = 0; i < NUM_QUANT_TBLS; i++) {
+          if (cinfo->quant_tbl_ptrs[i] != NULL)
+              (void) emit_dqt(cinfo, i);
+      }
+  }
+
+  if (! cinfo->arith_code) {
+    for (i = 0; i < NUM_HUFF_TBLS; i++) {
+      if (cinfo->dc_huff_tbl_ptrs[i] != NULL)
+        emit_dht(cinfo, i, FALSE);
+      if (cinfo->ac_huff_tbl_ptrs[i] != NULL)
+        emit_dht(cinfo, i, TRUE);
+    }
+  }
+
+  emit_marker(cinfo, M_EOI);
+}
+
+
+/*
+ * Initialize the marker writer module.
+ */
+
+GLOBAL(void)
+jinit_marker_writer (j_compress_ptr cinfo)
+{
+  my_marker_ptr marker;
+
+  /* Create the subobject */
+  marker = (my_marker_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_marker_writer));
+  cinfo->marker = (struct jpeg_marker_writer *) marker;
+  /* Initialize method pointers */
+  marker->pub.write_file_header = write_file_header;
+  marker->pub.write_frame_header = write_frame_header;
+  marker->pub.write_scan_header = write_scan_header;
+  marker->pub.write_file_trailer = write_file_trailer;
+  marker->pub.write_tables_only = write_tables_only;
+  marker->pub.write_marker_header = write_marker_header;
+  marker->pub.write_marker_byte = write_marker_byte;
+  /* Initialize private state */
+  marker->last_restart_interval = 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcmaster.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,594 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcmaster.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains master control logic for the JPEG compressor.
+ * These routines are concerned with parameter validation, initial setup,
+ * and inter-pass control (determining the number of passes and the work
+ * to be done in each pass).
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef enum {
+        main_pass,              /* input data, also do first output step */
+        huff_opt_pass,          /* Huffman code optimization pass */
+        output_pass             /* data output pass */
+} c_pass_type;
+
+typedef struct {
+  struct jpeg_comp_master pub;  /* public fields */
+
+  c_pass_type pass_type;        /* the type of the current pass */
+
+  int pass_number;              /* # of passes completed */
+  int total_passes;             /* total # of passes needed */
+
+  int scan_number;              /* current index in scan_info[] */
+} my_comp_master;
+
+typedef my_comp_master * my_master_ptr;
+
+
+/*
+ * Support routines that do various essential calculations.
+ */
+
+LOCAL(void)
+initial_setup (j_compress_ptr cinfo)
+/* Do computations that are needed before master selection phase */
+{
+  int ci;
+  jpeg_component_info *compptr;
+  long samplesperrow;
+  JDIMENSION jd_samplesperrow;
+
+  /* Sanity check on image dimensions */
+  if (cinfo->image_height <= 0 || cinfo->image_width <= 0
+      || cinfo->num_components <= 0 || cinfo->input_components <= 0)
+    ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
+  /* Make sure image isn't bigger than I can handle */
+  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
+      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
+    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
+
+  /* Width of an input scanline must be representable as JDIMENSION. */
+  samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
+  jd_samplesperrow = (JDIMENSION) samplesperrow;
+  if ((long) jd_samplesperrow != samplesperrow)
+    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+
+  /* For now, precision must match compiled-in value... */
+  if (cinfo->data_precision != BITS_IN_JSAMPLE)
+    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
+  /* Check that number of components won't exceed internal array sizes */
+  if (cinfo->num_components > MAX_COMPONENTS)
+    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+             MAX_COMPONENTS);
+
+  /* Compute maximum sampling factors; check factor validity */
+  cinfo->max_h_samp_factor = 1;
+  cinfo->max_v_samp_factor = 1;
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
+        compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
+      ERREXIT(cinfo, JERR_BAD_SAMPLING);
+    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
+                                   compptr->h_samp_factor);
+    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
+                                   compptr->v_samp_factor);
+  }
+
+  /* Compute dimensions of components */
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Fill in the correct component_index value; don't rely on application */
+    compptr->component_index = ci;
+    /* For compression, we never do DCT scaling. */
+    compptr->DCT_scaled_size = DCTSIZE;
+    /* Size in DCT blocks */
+    compptr->width_in_blocks = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+                    (long) (cinfo->max_h_samp_factor * DCTSIZE));
+    compptr->height_in_blocks = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+                    (long) (cinfo->max_v_samp_factor * DCTSIZE));
+    /* Size in samples */
+    compptr->downsampled_width = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+                    (long) cinfo->max_h_samp_factor);
+    compptr->downsampled_height = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+                    (long) cinfo->max_v_samp_factor);
+    /* Mark component needed (this flag isn't actually used for compression) */
+    compptr->component_needed = TRUE;
+  }
+
+  /* Compute number of fully interleaved MCU rows (number of times that
+   * main controller will call coefficient controller).
+   */
+  cinfo->total_iMCU_rows = (JDIMENSION)
+    jdiv_round_up((long) cinfo->image_height,
+                  (long) (cinfo->max_v_samp_factor*DCTSIZE));
+}
+
+
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+
+LOCAL(void)
+validate_script (j_compress_ptr cinfo)
+/* Verify that the scan script in cinfo->scan_info[] is valid; also
+ * determine whether it uses progressive JPEG, and set cinfo->progressive_mode.
+ */
+{
+  const jpeg_scan_info * scanptr;
+  int scanno, ncomps, ci, coefi, thisi;
+  int Ss, Se, Ah, Al;
+  boolean component_sent[MAX_COMPONENTS];
+#ifdef C_PROGRESSIVE_SUPPORTED
+  int * last_bitpos_ptr;
+  int last_bitpos[MAX_COMPONENTS][DCTSIZE2];
+  /* -1 until that coefficient has been seen; then last Al for it */
+#endif
+
+  if (cinfo->num_scans <= 0)
+    ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);
+
+  /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;
+   * for progressive JPEG, no scan can have this.
+   */
+  scanptr = cinfo->scan_info;
+  if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+    cinfo->progressive_mode = TRUE;
+    last_bitpos_ptr = & last_bitpos[0][0];
+    for (ci = 0; ci < cinfo->num_components; ci++)
+      for (coefi = 0; coefi < DCTSIZE2; coefi++)
+        *last_bitpos_ptr++ = -1;
+#else
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+  } else {
+    cinfo->progressive_mode = FALSE;
+    for (ci = 0; ci < cinfo->num_components; ci++)
+      component_sent[ci] = FALSE;
+  }
+
+  for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {
+    /* Validate component indexes */
+    ncomps = scanptr->comps_in_scan;
+    if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)
+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);
+    for (ci = 0; ci < ncomps; ci++) {
+      thisi = scanptr->component_index[ci];
+      if (thisi < 0 || thisi >= cinfo->num_components)
+        ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+      /* Components must appear in SOF order within each scan */
+      if (ci > 0 && thisi <= scanptr->component_index[ci-1])
+        ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+    }
+    /* Validate progression parameters */
+    Ss = scanptr->Ss;
+    Se = scanptr->Se;
+    Ah = scanptr->Ah;
+    Al = scanptr->Al;
+    if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+      /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that
+       * seems wrong: the upper bound ought to depend on data precision.
+       * Perhaps they really meant 0..N+1 for N-bit precision.
+       * Here we allow 0..10 for 8-bit data; Al larger than 10 results in
+       * out-of-range reconstructed DC values during the first DC scan,
+       * which might cause problems for some decoders.
+       */
+#if BITS_IN_JSAMPLE == 8
+#define MAX_AH_AL 10
+#else
+#define MAX_AH_AL 13
+#endif
+      if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||
+          Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)
+        ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+      if (Ss == 0) {
+        if (Se != 0)            /* DC and AC together not OK */
+          ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+      } else {
+        if (ncomps != 1)        /* AC scans must be for only one component */
+          ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+      }
+      for (ci = 0; ci < ncomps; ci++) {
+        last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];
+        if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */
+          ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+        for (coefi = Ss; coefi <= Se; coefi++) {
+          if (last_bitpos_ptr[coefi] < 0) {
+            /* first scan of this coefficient */
+            if (Ah != 0)
+              ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+          } else {
+            /* not first scan */
+            if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)
+              ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+          }
+          last_bitpos_ptr[coefi] = Al;
+        }
+      }
+#endif
+    } else {
+      /* For sequential JPEG, all progression parameters must be these: */
+      if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)
+        ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+      /* Make sure components are not sent twice */
+      for (ci = 0; ci < ncomps; ci++) {
+        thisi = scanptr->component_index[ci];
+        if (component_sent[thisi])
+          ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+        component_sent[thisi] = TRUE;
+      }
+    }
+  }
+
+  /* Now verify that everything got sent. */
+  if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+    /* For progressive mode, we only check that at least some DC data
+     * got sent for each component; the spec does not require that all bits
+     * of all coefficients be transmitted.  Would it be wiser to enforce
+     * transmission of all coefficient bits??
+     */
+    for (ci = 0; ci < cinfo->num_components; ci++) {
+      if (last_bitpos[ci][0] < 0)
+        ERREXIT(cinfo, JERR_MISSING_DATA);
+    }
+#endif
+  } else {
+    for (ci = 0; ci < cinfo->num_components; ci++) {
+      if (! component_sent[ci])
+        ERREXIT(cinfo, JERR_MISSING_DATA);
+    }
+  }
+}
+
+#endif /* C_MULTISCAN_FILES_SUPPORTED */
+
+
+LOCAL(void)
+select_scan_parameters (j_compress_ptr cinfo)
+/* Set up the scan parameters for the current scan */
+{
+  int ci;
+
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+  if (cinfo->scan_info != NULL) {
+    /* Prepare for current scan --- the script is already validated */
+    my_master_ptr master = (my_master_ptr) cinfo->master;
+    const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;
+
+    cinfo->comps_in_scan = scanptr->comps_in_scan;
+    for (ci = 0; ci < scanptr->comps_in_scan; ci++) {
+      cinfo->cur_comp_info[ci] =
+        &cinfo->comp_info[scanptr->component_index[ci]];
+    }
+    cinfo->Ss = scanptr->Ss;
+    cinfo->Se = scanptr->Se;
+    cinfo->Ah = scanptr->Ah;
+    cinfo->Al = scanptr->Al;
+  }
+  else
+#endif
+  {
+    /* Prepare for single sequential-JPEG scan containing all components */
+    if (cinfo->num_components > MAX_COMPS_IN_SCAN)
+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+               MAX_COMPS_IN_SCAN);
+    cinfo->comps_in_scan = cinfo->num_components;
+    for (ci = 0; ci < cinfo->num_components; ci++) {
+      cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];
+    }
+    cinfo->Ss = 0;
+    cinfo->Se = DCTSIZE2-1;
+    cinfo->Ah = 0;
+    cinfo->Al = 0;
+  }
+}
+
+
+LOCAL(void)
+per_scan_setup (j_compress_ptr cinfo)
+/* Do computations that are needed before processing a JPEG scan */
+/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */
+{
+  int ci, mcublks, tmp;
+  jpeg_component_info *compptr;
+
+  if (cinfo->comps_in_scan == 1) {
+
+    /* Noninterleaved (single-component) scan */
+    compptr = cinfo->cur_comp_info[0];
+
+    /* Overall image size in MCUs */
+    cinfo->MCUs_per_row = compptr->width_in_blocks;
+    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
+
+    /* For noninterleaved scan, always one block per MCU */
+    compptr->MCU_width = 1;
+    compptr->MCU_height = 1;
+    compptr->MCU_blocks = 1;
+    compptr->MCU_sample_width = DCTSIZE;
+    compptr->last_col_width = 1;
+    /* For noninterleaved scans, it is convenient to define last_row_height
+     * as the number of block rows present in the last iMCU row.
+     */
+    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+    if (tmp == 0) tmp = compptr->v_samp_factor;
+    compptr->last_row_height = tmp;
+
+    /* Prepare array describing MCU composition */
+    cinfo->blocks_in_MCU = 1;
+    cinfo->MCU_membership[0] = 0;
+
+  } else {
+
+    /* Interleaved (multi-component) scan */
+    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
+               MAX_COMPS_IN_SCAN);
+
+    /* Overall image size in MCUs */
+    cinfo->MCUs_per_row = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width,
+                    (long) (cinfo->max_h_samp_factor*DCTSIZE));
+    cinfo->MCU_rows_in_scan = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height,
+                    (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+    cinfo->blocks_in_MCU = 0;
+
+    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+      compptr = cinfo->cur_comp_info[ci];
+      /* Sampling factors give # of blocks of component in each MCU */
+      compptr->MCU_width = compptr->h_samp_factor;
+      compptr->MCU_height = compptr->v_samp_factor;
+      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
+      compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE;
+      /* Figure number of non-dummy blocks in last MCU column & row */
+      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
+      if (tmp == 0) tmp = compptr->MCU_width;
+      compptr->last_col_width = tmp;
+      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
+      if (tmp == 0) tmp = compptr->MCU_height;
+      compptr->last_row_height = tmp;
+      /* Prepare array describing MCU composition */
+      mcublks = compptr->MCU_blocks;
+      if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)
+        ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
+      while (mcublks-- > 0) {
+        cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
+      }
+    }
+
+  }
+
+  /* Convert restart specified in rows to actual MCU count. */
+  /* Note that count must fit in 16 bits, so we provide limiting. */
+  if (cinfo->restart_in_rows > 0) {
+    long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;
+    cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);
+  }
+}
+
+
+/*
+ * Per-pass setup.
+ * This is called at the beginning of each pass.  We determine which modules
+ * will be active during this pass and give them appropriate start_pass calls.
+ * We also set is_last_pass to indicate whether any more passes will be
+ * required.
+ */
+
+METHODDEF(void)
+prepare_for_pass (j_compress_ptr cinfo)
+{
+  my_master_ptr master = (my_master_ptr) cinfo->master;
+
+  switch (master->pass_type) {
+  case main_pass:
+    /* Initial pass: will collect input data, and do either Huffman
+     * optimization or data output for the first scan.
+     */
+    select_scan_parameters(cinfo);
+    per_scan_setup(cinfo);
+    if (! cinfo->raw_data_in) {
+      (*cinfo->cconvert->start_pass) (cinfo);
+      (*cinfo->downsample->start_pass) (cinfo);
+      (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);
+    }
+    (*cinfo->fdct->start_pass) (cinfo);
+    (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);
+    (*cinfo->coef->start_pass) (cinfo,
+                                (master->total_passes > 1 ?
+                                 JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
+    (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
+    if (cinfo->optimize_coding) {
+      /* No immediate data output; postpone writing frame/scan headers */
+      master->pub.call_pass_startup = FALSE;
+    } else {
+      /* Will write frame/scan headers at first jpeg_write_scanlines call */
+      master->pub.call_pass_startup = TRUE;
+    }
+    break;
+#ifdef ENTROPY_OPT_SUPPORTED
+  case huff_opt_pass:
+    /* Do Huffman optimization for a scan after the first one. */
+    select_scan_parameters(cinfo);
+    per_scan_setup(cinfo);
+    if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) {
+      (*cinfo->entropy->start_pass) (cinfo, TRUE);
+      (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
+      master->pub.call_pass_startup = FALSE;
+      break;
+    }
+    /* Special case: Huffman DC refinement scans need no Huffman table
+     * and therefore we can skip the optimization pass for them.
+     */
+    master->pass_type = output_pass;
+    master->pass_number++;
+    /*FALLTHROUGH*/
+#endif
+  case output_pass:
+    /* Do a data-output pass. */
+    /* We need not repeat per-scan setup if prior optimization pass did it. */
+    if (! cinfo->optimize_coding) {
+      select_scan_parameters(cinfo);
+      per_scan_setup(cinfo);
+    }
+    (*cinfo->entropy->start_pass) (cinfo, FALSE);
+    (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
+    /* We emit frame/scan headers now */
+    if (master->scan_number == 0)
+      (*cinfo->marker->write_frame_header) (cinfo);
+    (*cinfo->marker->write_scan_header) (cinfo);
+    master->pub.call_pass_startup = FALSE;
+    break;
+  default:
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+  }
+
+  master->pub.is_last_pass = (master->pass_number == master->total_passes-1);
+
+  /* Set up progress monitor's pass info if present */
+  if (cinfo->progress != NULL) {
+    cinfo->progress->completed_passes = master->pass_number;
+    cinfo->progress->total_passes = master->total_passes;
+  }
+}
+
+
+/*
+ * Special start-of-pass hook.
+ * This is called by jpeg_write_scanlines if call_pass_startup is TRUE.
+ * In single-pass processing, we need this hook because we don't want to
+ * write frame/scan headers during jpeg_start_compress; we want to let the
+ * application write COM markers etc. between jpeg_start_compress and the
+ * jpeg_write_scanlines loop.
+ * In multi-pass processing, this routine is not used.
+ */
+
+METHODDEF(void)
+pass_startup (j_compress_ptr cinfo)
+{
+  cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */
+
+  (*cinfo->marker->write_frame_header) (cinfo);
+  (*cinfo->marker->write_scan_header) (cinfo);
+}
+
+
+/*
+ * Finish up at end of pass.
+ */
+
+METHODDEF(void)
+finish_pass_master (j_compress_ptr cinfo)
+{
+  my_master_ptr master = (my_master_ptr) cinfo->master;
+
+  /* The entropy coder always needs an end-of-pass call,
+   * either to analyze statistics or to flush its output buffer.
+   */
+  (*cinfo->entropy->finish_pass) (cinfo);
+
+  /* Update state for next pass */
+  switch (master->pass_type) {
+  case main_pass:
+    /* next pass is either output of scan 0 (after optimization)
+     * or output of scan 1 (if no optimization).
+     */
+    master->pass_type = output_pass;
+    if (! cinfo->optimize_coding)
+      master->scan_number++;
+    break;
+  case huff_opt_pass:
+    /* next pass is always output of current scan */
+    master->pass_type = output_pass;
+    break;
+  case output_pass:
+    /* next pass is either optimization or output of next scan */
+    if (cinfo->optimize_coding)
+      master->pass_type = huff_opt_pass;
+    master->scan_number++;
+    break;
+  }
+
+  master->pass_number++;
+}
+
+
+/*
+ * Initialize master compression control.
+ */
+
+GLOBAL(void)
+jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
+{
+  my_master_ptr master;
+
+  master = (my_master_ptr)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  SIZEOF(my_comp_master));
+  cinfo->master = (struct jpeg_comp_master *) master;
+  master->pub.prepare_for_pass = prepare_for_pass;
+  master->pub.pass_startup = pass_startup;
+  master->pub.finish_pass = finish_pass_master;
+  master->pub.is_last_pass = FALSE;
+
+  /* Validate parameters, determine derived values */
+  initial_setup(cinfo);
+
+  if (cinfo->scan_info != NULL) {
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+    validate_script(cinfo);
+#else
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+  } else {
+    cinfo->progressive_mode = FALSE;
+    cinfo->num_scans = 1;
+  }
+
+  if (cinfo->progressive_mode)  /*  TEMPORARY HACK ??? */
+    cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */
+
+  /* Initialize my private state */
+  if (transcode_only) {
+    /* no main pass in transcoding */
+    if (cinfo->optimize_coding)
+      master->pass_type = huff_opt_pass;
+    else
+      master->pass_type = output_pass;
+  } else {
+    /* for normal compression, first pass is always this type: */
+    master->pass_type = main_pass;
+  }
+  master->scan_number = 0;
+  master->pass_number = 0;
+  if (cinfo->optimize_coding)
+    master->total_passes = cinfo->num_scans * 2;
+  else
+    master->total_passes = cinfo->num_scans;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcomapi.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,110 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcomapi.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface routines that are used for both
+ * compression and decompression.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Abort processing of a JPEG compression or decompression operation,
+ * but don't destroy the object itself.
+ *
+ * For this, we merely clean up all the nonpermanent memory pools.
+ * Note that temp files (virtual arrays) are not allowed to belong to
+ * the permanent pool, so we will be able to close all temp files here.
+ * Closing a data source or destination, if necessary, is the application's
+ * responsibility.
+ */
+
+GLOBAL(void)
+jpeg_abort (j_common_ptr cinfo)
+{
+  int pool;
+
+  /* Do nothing if called on a not-initialized or destroyed JPEG object. */
+  if (cinfo->mem == NULL)
+    return;
+
+  /* Releasing pools in reverse order might help avoid fragmentation
+   * with some (brain-damaged) malloc libraries.
+   */
+  for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {
+    (*cinfo->mem->free_pool) (cinfo, pool);
+  }
+
+  /* Reset overall state for possible reuse of object */
+  if (cinfo->is_decompressor) {
+    cinfo->global_state = DSTATE_START;
+    /* Try to keep application from accessing now-deleted marker list.
+     * A bit kludgy to do it here, but this is the most central place.
+     */
+    ((j_decompress_ptr) cinfo)->marker_list = NULL;
+  } else {
+    cinfo->global_state = CSTATE_START;
+  }
+}
+
+
+/*
+ * Destruction of a JPEG object.
+ *
+ * Everything gets deallocated except the master jpeg_compress_struct itself
+ * and the error manager struct.  Both of these are supplied by the application
+ * and must be freed, if necessary, by the application.  (Often they are on
+ * the stack and so don't need to be freed anyway.)
+ * Closing a data source or destination, if necessary, is the application's
+ * responsibility.
+ */
+
+GLOBAL(void)
+jpeg_destroy (j_common_ptr cinfo)
+{
+  /* We need only tell the memory manager to release everything. */
+  /* NB: mem pointer is NULL if memory mgr failed to initialize. */
+  if (cinfo->mem != NULL)
+    (*cinfo->mem->self_destruct) (cinfo);
+  cinfo->mem = NULL;            /* be safe if jpeg_destroy is called twice */
+  cinfo->global_state = 0;      /* mark it destroyed */
+}
+
+
+/*
+ * Convenience routines for allocating quantization and Huffman tables.
+ * (Would jutils.c be a more reasonable place to put these?)
+ */
+
+GLOBAL(JQUANT_TBL *)
+jpeg_alloc_quant_table (j_common_ptr cinfo)
+{
+  JQUANT_TBL *tbl;
+
+  tbl = (JQUANT_TBL *)
+    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));
+  tbl->sent_table = FALSE;      /* make sure this is false in any new table */
+  return tbl;
+}
+
+
+GLOBAL(JHUFF_TBL *)
+jpeg_alloc_huff_table (j_common_ptr cinfo)
+{
+  JHUFF_TBL *tbl;
+
+  tbl = (JHUFF_TBL *)
+    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));
+  tbl->sent_table = FALSE;      /* make sure this is false in any new table */
+  return tbl;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jconfig.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,43 @@
+/* jconfig.cfg --- source file edited by configure script */
+/* see jconfig.doc for explanations */
+
+#define HAVE_PROTOTYPES
+#define HAVE_UNSIGNED_CHAR
+#define HAVE_UNSIGNED_SHORT
+#undef void
+#undef const
+#undef CHAR_IS_UNSIGNED
+#define HAVE_STDDEF_H
+#define HAVE_STDLIB_H
+#undef NEED_BSD_STRINGS
+#undef NEED_SYS_TYPES_H
+#undef NEED_FAR_POINTERS
+#define NEED_SHORT_EXTERNAL_NAMES
+/* Define this if you get warnings about undefined structures. */
+#undef INCOMPLETE_TYPES_BROKEN
+
+#ifdef JPEG_INTERNALS
+
+#undef RIGHT_SHIFT_IS_UNSIGNED
+/* These are for configuring the JPEG memory manager. */
+#undef DEFAULT_MAX_MEM
+#undef NO_MKTEMP
+
+#endif /* JPEG_INTERNALS */
+
+#ifdef JPEG_CJPEG_DJPEG
+
+#define BMP_SUPPORTED           /* BMP image file format */
+#define GIF_SUPPORTED           /* GIF image file format */
+#define PPM_SUPPORTED           /* PBMPLUS PPM/PGM image file format */
+#undef RLE_SUPPORTED            /* Utah RLE image file format */
+#define TARGA_SUPPORTED         /* Targa image file format */
+
+#undef TWO_FILE_COMMANDLINE
+#undef NEED_SIGNAL_CATCHER
+#undef DONT_USE_B_MODE
+
+/* Define this if you want percent-done progress reports from cjpeg/djpeg. */
+#undef PROGRESS_REPORT
+
+#endif /* JPEG_CJPEG_DJPEG */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcparam.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,614 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcparam.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains optional default-setting code for the JPEG compressor.
+ * Applications do not have to use this file, but those that don't use it
+ * must know a lot more about the innards of the JPEG code.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Quantization table setup routines
+ */
+
+GLOBAL(void)
+jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
+                      const unsigned int *basic_table,
+                      int scale_factor, boolean force_baseline)
+/* Define a quantization table equal to the basic_table times
+ * a scale factor (given as a percentage).
+ * If force_baseline is TRUE, the computed quantization table entries
+ * are limited to 1..255 for JPEG baseline compatibility.
+ */
+{
+  JQUANT_TBL ** qtblptr;
+  int i;
+  long temp;
+
+  /* Safety check to ensure start_compress not called yet. */
+  if (cinfo->global_state != CSTATE_START)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)
+    ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);
+
+  qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];
+
+  if (*qtblptr == NULL)
+    *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);
+
+  for (i = 0; i < DCTSIZE2; i++) {
+    temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;
+    /* limit the values to the valid range */
+    if (temp <= 0L) temp = 1L;
+    if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */
+    if (force_baseline && temp > 255L)
+      temp = 255L;              /* limit to baseline range if requested */
+    (*qtblptr)->quantval[i] = (UINT16) temp;
+  }
+
+  /* Initialize sent_table FALSE so table will be written to JPEG file. */
+  (*qtblptr)->sent_table = FALSE;
+}
+
+
+GLOBAL(void)
+jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,
+                         boolean force_baseline)
+/* Set or change the 'quality' (quantization) setting, using default tables
+ * and a straight percentage-scaling quality scale.  In most cases it's better
+ * to use jpeg_set_quality (below); this entry point is provided for
+ * applications that insist on a linear percentage scaling.
+ */
+{
+  /* These are the sample quantization tables given in JPEG spec section K.1.
+   * The spec says that the values given produce "good" quality, and
+   * when divided by 2, "very good" quality.
+   */
+  static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
+    16,  11,  10,  16,  24,  40,  51,  61,
+    12,  12,  14,  19,  26,  58,  60,  55,
+    14,  13,  16,  24,  40,  57,  69,  56,
+    14,  17,  22,  29,  51,  87,  80,  62,
+    18,  22,  37,  56,  68, 109, 103,  77,
+    24,  35,  55,  64,  81, 104, 113,  92,
+    49,  64,  78,  87, 103, 121, 120, 101,
+    72,  92,  95,  98, 112, 100, 103,  99
+  };
+  static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
+    17,  18,  24,  47,  99,  99,  99,  99,
+    18,  21,  26,  66,  99,  99,  99,  99,
+    24,  26,  56,  99,  99,  99,  99,  99,
+    47,  66,  99,  99,  99,  99,  99,  99,
+    99,  99,  99,  99,  99,  99,  99,  99,
+    99,  99,  99,  99,  99,  99,  99,  99,
+    99,  99,  99,  99,  99,  99,  99,  99,
+    99,  99,  99,  99,  99,  99,  99,  99
+  };
+
+  /* Set up two quantization tables using the specified scaling */
+  jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
+                       scale_factor, force_baseline);
+  jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
+                       scale_factor, force_baseline);
+}
+
+
+GLOBAL(int)
+jpeg_quality_scaling (int quality)
+/* Convert a user-specified quality rating to a percentage scaling factor
+ * for an underlying quantization table, using our recommended scaling curve.
+ * The input 'quality' factor should be 0 (terrible) to 100 (very good).
+ */
+{
+  /* Safety limit on quality factor.  Convert 0 to 1 to avoid zero divide. */
+  if (quality <= 0) quality = 1;
+  if (quality > 100) quality = 100;
+
+  /* The basic table is used as-is (scaling 100) for a quality of 50.
+   * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;
+   * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table
+   * to make all the table entries 1 (hence, minimum quantization loss).
+   * Qualities 1..50 are converted to scaling percentage 5000/Q.
+   */
+  if (quality < 50)
+    quality = 5000 / quality;
+  else
+    quality = 200 - quality*2;
+
+  return quality;
+}
+
+
+GLOBAL(void)
+jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
+/* Set or change the 'quality' (quantization) setting, using default tables.
+ * This is the standard quality-adjusting entry point for typical user
+ * interfaces; only those who want detailed control over quantization tables
+ * would use the preceding three routines directly.
+ */
+{
+  /* Convert user 0-100 rating to percentage scaling */
+  quality = jpeg_quality_scaling(quality);
+
+  /* Set up standard quality tables */
+  jpeg_set_linear_quality(cinfo, quality, force_baseline);
+}
+
+
+/*
+ * Huffman table setup routines
+ */
+
+LOCAL(void)
+add_huff_table (j_compress_ptr cinfo,
+                JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
+/* Define a Huffman table */
+{
+  int nsymbols, len;
+
+  if (*htblptr == NULL)
+    *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+
+  /* Copy the number-of-symbols-of-each-code-length counts */
+  MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
+
+  /* Validate the counts.  We do this here mainly so we can copy the right
+   * number of symbols from the val[] array, without risking marching off
+   * the end of memory.  jchuff.c will do a more thorough test later.
+   */
+  nsymbols = 0;
+  for (len = 1; len <= 16; len++)
+    nsymbols += bits[len];
+  if (nsymbols < 1 || nsymbols > 256)
+    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+
+  MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
+
+  /* Initialize sent_table FALSE so table will be written to JPEG file. */
+  (*htblptr)->sent_table = FALSE;
+}
+
+
+LOCAL(void)
+std_huff_tables (j_compress_ptr cinfo)
+/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
+/* IMPORTANT: these are only valid for 8-bit data precision! */
+{
+  static const UINT8 bits_dc_luminance[17] =
+    { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
+  static const UINT8 val_dc_luminance[] =
+    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+
+  static const UINT8 bits_dc_chrominance[17] =
+    { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
+  static const UINT8 val_dc_chrominance[] =
+    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+
+  static const UINT8 bits_ac_luminance[17] =
+    { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
+  static const UINT8 val_ac_luminance[] =
+    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+      0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+      0xf9, 0xfa };
+
+  static const UINT8 bits_ac_chrominance[17] =
+    { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
+  static const UINT8 val_ac_chrominance[] =
+    { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+      0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+      0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+      0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+      0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+      0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+      0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+      0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+      0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+      0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+      0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+      0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+      0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+      0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+      0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+      0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+      0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+      0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+      0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+      0xf9, 0xfa };
+
+  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
+                 bits_dc_luminance, val_dc_luminance);
+  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
+                 bits_ac_luminance, val_ac_luminance);
+  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
+                 bits_dc_chrominance, val_dc_chrominance);
+  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
+                 bits_ac_chrominance, val_ac_chrominance);
+}
+
+
+/*
+ * Default parameter setup for compression.
+ *
+ * Applications that don't choose to use this routine must do their
+ * own setup of all these parameters.  Alternately, you can call this
+ * to establish defaults and then alter parameters selectively.  This
+ * is the recommended approach since, if we add any new parameters,
+ * your code will still work (they'll be set to reasonable defaults).
+ */
+
+GLOBAL(void)
+jpeg_set_defaults (j_compress_ptr cinfo)
+{
+  int i;
+
+  /* Safety check to ensure start_compress not called yet. */
+  if (cinfo->global_state != CSTATE_START)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  /* Allocate comp_info array large enough for maximum component count.
+   * Array is made permanent in case application wants to compress
+   * multiple images at same param settings.
+   */
+  if (cinfo->comp_info == NULL)
+    cinfo->comp_info = (jpeg_component_info *)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+                                  MAX_COMPONENTS * SIZEOF(jpeg_component_info));
+
+  /* Initialize everything not dependent on the color space */
+
+  cinfo->data_precision = BITS_IN_JSAMPLE;
+  /* Set up two quantization tables using default quality of 75 */
+  jpeg_set_quality(cinfo, 75, TRUE);
+  /* Set up two Huffman tables */
+  std_huff_tables(cinfo);
+
+  /* Initialize default arithmetic coding conditioning */
+  for (i = 0; i < NUM_ARITH_TBLS; i++) {
+    cinfo->arith_dc_L[i] = 0;
+    cinfo->arith_dc_U[i] = 1;
+    cinfo->arith_ac_K[i] = 5;
+  }
+
+  /* Default is no multiple-scan output */
+  cinfo->scan_info = NULL;
+  cinfo->num_scans = 0;
+
+  /* Expect normal source image, not raw downsampled data */
+  cinfo->raw_data_in = FALSE;
+
+  /* Use Huffman coding, not arithmetic coding, by default */
+  cinfo->arith_code = FALSE;
+
+  /* By default, don't do extra passes to optimize entropy coding */
+  cinfo->optimize_coding = FALSE;
+  /* The standard Huffman tables are only valid for 8-bit data precision.
+   * If the precision is higher, force optimization on so that usable
+   * tables will be computed.  This test can be removed if default tables
+   * are supplied that are valid for the desired precision.
+   */
+  if (cinfo->data_precision > 8)
+    cinfo->optimize_coding = TRUE;
+
+  /* By default, use the simpler non-cosited sampling alignment */
+  cinfo->CCIR601_sampling = FALSE;
+
+  /* No input smoothing */
+  cinfo->smoothing_factor = 0;
+
+  /* DCT algorithm preference */
+  cinfo->dct_method = JDCT_DEFAULT;
+
+  /* No restart markers */
+  cinfo->restart_interval = 0;
+  cinfo->restart_in_rows = 0;
+
+  /* Fill in default JFIF marker parameters.  Note that whether the marker
+   * will actually be written is determined by jpeg_set_colorspace.
+   *
+   * By default, the library emits JFIF version code 1.01.
+   * An application that wants to emit JFIF 1.02 extension markers should set
+   * JFIF_minor_version to 2.  We could probably get away with just defaulting
+   * to 1.02, but there may still be some decoders in use that will complain
+   * about that; saying 1.01 should minimize compatibility problems.
+   */
+  cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
+  cinfo->JFIF_minor_version = 1;
+  cinfo->density_unit = 0;      /* Pixel size is unknown by default */
+  cinfo->X_density = 1;         /* Pixel aspect ratio is square by default */
+  cinfo->Y_density = 1;
+
+  /* Choose JPEG colorspace based on input space, set defaults accordingly */
+
+  jpeg_default_colorspace(cinfo);
+}
+
+
+/*
+ * Select an appropriate JPEG colorspace for in_color_space.
+ */
+
+GLOBAL(void)
+jpeg_default_colorspace (j_compress_ptr cinfo)
+{
+  switch (cinfo->in_color_space) {
+  case JCS_GRAYSCALE:
+    jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
+    break;
+  case JCS_RGB:
+    jpeg_set_colorspace(cinfo, JCS_YCbCr);
+    break;
+  case JCS_YCbCr:
+    jpeg_set_colorspace(cinfo, JCS_YCbCr);
+    break;
+  case JCS_CMYK:
+    jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */
+    break;
+  case JCS_YCCK:
+    jpeg_set_colorspace(cinfo, JCS_YCCK);
+    break;
+  case JCS_UNKNOWN:
+    jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
+    break;
+  default:
+    ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+  }
+}
+
+
+/*
+ * Set the JPEG colorspace, and choose colorspace-dependent default values.
+ */
+
+GLOBAL(void)
+jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
+{
+  jpeg_component_info * compptr;
+  int ci;
+
+#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl)  \
+  (compptr = &cinfo->comp_info[index], \
+   compptr->component_id = (id), \
+   compptr->h_samp_factor = (hsamp), \
+   compptr->v_samp_factor = (vsamp), \
+   compptr->quant_tbl_no = (quant), \
+   compptr->dc_tbl_no = (dctbl), \
+   compptr->ac_tbl_no = (actbl) )
+
+  /* Safety check to ensure start_compress not called yet. */
+  if (cinfo->global_state != CSTATE_START)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  /* For all colorspaces, we use Q and Huff tables 0 for luminance components,
+   * tables 1 for chrominance components.
+   */
+
+  cinfo->jpeg_color_space = colorspace;
+
+  cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */
+  cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
+
+  switch (colorspace) {
+  case JCS_GRAYSCALE:
+    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+    cinfo->num_components = 1;
+    /* JFIF specifies component ID 1 */
+    SET_COMP(0, 1, 1,1, 0, 0,0);
+    break;
+  case JCS_RGB:
+    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
+    cinfo->num_components = 3;
+    SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
+    SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
+    SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
+    break;
+  case JCS_YCbCr:
+    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+    cinfo->num_components = 3;
+    /* JFIF specifies component IDs 1,2,3 */
+    /* We default to 2x2 subsamples of chrominance */
+    SET_COMP(0, 1, 2,2, 0, 0,0);
+    SET_COMP(1, 2, 1,1, 1, 1,1);
+    SET_COMP(2, 3, 1,1, 1, 1,1);
+    break;
+  case JCS_CMYK:
+    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
+    cinfo->num_components = 4;
+    SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);
+    SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);
+    SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);
+    SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);
+    break;
+  case JCS_YCCK:
+    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
+    cinfo->num_components = 4;
+    SET_COMP(0, 1, 2,2, 0, 0,0);
+    SET_COMP(1, 2, 1,1, 1, 1,1);
+    SET_COMP(2, 3, 1,1, 1, 1,1);
+    SET_COMP(3, 4, 2,2, 0, 0,0);
+    break;
+  case JCS_UNKNOWN:
+    cinfo->num_components = cinfo->input_components;
+    if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+               MAX_COMPONENTS);
+    for (ci = 0; ci < cinfo->num_components; ci++) {
+      SET_COMP(ci, ci, 1,1, 0, 0,0);
+    }
+    break;
+  default:
+    ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+  }
+}
+
+
+#ifdef C_PROGRESSIVE_SUPPORTED
+
+LOCAL(jpeg_scan_info *)
+fill_a_scan (jpeg_scan_info * scanptr, int ci,
+             int Ss, int Se, int Ah, int Al)
+/* Support routine: generate one scan for specified component */
+{
+  scanptr->comps_in_scan = 1;
+  scanptr->component_index[0] = ci;
+  scanptr->Ss = Ss;
+  scanptr->Se = Se;
+  scanptr->Ah = Ah;
+  scanptr->Al = Al;
+  scanptr++;
+  return scanptr;
+}
+
+LOCAL(jpeg_scan_info *)
+fill_scans (jpeg_scan_info * scanptr, int ncomps,
+            int Ss, int Se, int Ah, int Al)
+/* Support routine: generate one scan for each component */
+{
+  int ci;
+
+  for (ci = 0; ci < ncomps; ci++) {
+    scanptr->comps_in_scan = 1;
+    scanptr->component_index[0] = ci;
+    scanptr->Ss = Ss;
+    scanptr->Se = Se;
+    scanptr->Ah = Ah;
+    scanptr->Al = Al;
+    scanptr++;
+  }
+  return scanptr;
+}
+
+LOCAL(jpeg_scan_info *)
+fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)
+/* Support routine: generate interleaved DC scan if possible, else N scans */
+{
+  int ci;
+
+  if (ncomps <= MAX_COMPS_IN_SCAN) {
+    /* Single interleaved DC scan */
+    scanptr->comps_in_scan = ncomps;
+    for (ci = 0; ci < ncomps; ci++)
+      scanptr->component_index[ci] = ci;
+    scanptr->Ss = scanptr->Se = 0;
+    scanptr->Ah = Ah;
+    scanptr->Al = Al;
+    scanptr++;
+  } else {
+    /* Noninterleaved DC scan for each component */
+    scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
+  }
+  return scanptr;
+}
+
+
+/*
+ * Create a recommended progressive-JPEG script.
+ * cinfo->num_components and cinfo->jpeg_color_space must be correct.
+ */
+
+GLOBAL(void)
+jpeg_simple_progression (j_compress_ptr cinfo)
+{
+  int ncomps = cinfo->num_components;
+  int nscans;
+  jpeg_scan_info * scanptr;
+
+  /* Safety check to ensure start_compress not called yet. */
+  if (cinfo->global_state != CSTATE_START)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  /* Figure space needed for script.  Calculation must match code below! */
+  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
+    /* Custom script for YCbCr color images. */
+    nscans = 10;
+  } else {
+    /* All-purpose script for other color spaces. */
+    if (ncomps > MAX_COMPS_IN_SCAN)
+      nscans = 6 * ncomps;      /* 2 DC + 4 AC scans per component */
+    else
+      nscans = 2 + 4 * ncomps;  /* 2 DC scans; 4 AC scans per component */
+  }
+
+  /* Allocate space for script.
+   * We need to put it in the permanent pool in case the application performs
+   * multiple compressions without changing the settings.  To avoid a memory
+   * leak if jpeg_simple_progression is called repeatedly for the same JPEG
+   * object, we try to re-use previously allocated space, and we allocate
+   * enough space to handle YCbCr even if initially asked for grayscale.
+   */
+  if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
+    cinfo->script_space_size = MAX(nscans, 10);
+    cinfo->script_space = (jpeg_scan_info *)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+                        cinfo->script_space_size * SIZEOF(jpeg_scan_info));
+  }
+  scanptr = cinfo->script_space;
+  cinfo->scan_info = scanptr;
+  cinfo->num_scans = nscans;
+
+  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
+    /* Custom script for YCbCr color images. */
+    /* Initial DC scan */
+    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
+    /* Initial AC scan: get some luma data out in a hurry */
+    scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);
+    /* Chroma data is too small to be worth expending many scans on */
+    scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
+    scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);
+    /* Complete spectral selection for luma AC */
+    scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);
+    /* Refine next bit of luma AC */
+    scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);
+    /* Finish DC successive approximation */
+    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
+    /* Finish AC successive approximation */
+    scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
+    scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);
+    /* Luma bottom bit comes last since it's usually largest scan */
+    scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
+  } else {
+    /* All-purpose script for other color spaces. */
+    /* Successive approximation first pass */
+    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
+    scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
+    scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);
+    /* Successive approximation second pass */
+    scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);
+    /* Successive approximation final pass */
+    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
+    scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
+  }
+}
+
+#endif /* C_PROGRESSIVE_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcphuff.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,837 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcphuff.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy encoding routines for progressive JPEG.
+ *
+ * We do not support output suspension in this module, since the library
+ * currently does not allow multiple-scan files to be written with output
+ * suspension.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jchuff.h"             /* Declarations shared with jchuff.c */
+
+#ifdef C_PROGRESSIVE_SUPPORTED
+
+/* Expanded entropy encoder object for progressive Huffman encoding. */
+
+typedef struct {
+  struct jpeg_entropy_encoder pub; /* public fields */
+
+  /* Mode flag: TRUE for optimization, FALSE for actual data output */
+  boolean gather_statistics;
+
+  /* Bit-level coding status.
+   * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.
+   */
+  JOCTET * next_output_byte;    /* => next byte to write in buffer */
+  size_t free_in_buffer;        /* # of byte spaces remaining in buffer */
+  INT32 put_buffer;             /* current bit-accumulation buffer */
+  int put_bits;                 /* # of bits now in it */
+  j_compress_ptr cinfo;         /* link to cinfo (needed for dump_buffer) */
+
+  /* Coding status for DC components */
+  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+
+  /* Coding status for AC components */
+  int ac_tbl_no;                /* the table number of the single component */
+  unsigned int EOBRUN;          /* run length of EOBs */
+  unsigned int BE;              /* # of buffered correction bits before MCU */
+  char * bit_buffer;            /* buffer for correction bits (1 per char) */
+  /* packing correction bits tightly would save some space but cost time... */
+
+  unsigned int restarts_to_go;  /* MCUs left in this restart interval */
+  int next_restart_num;         /* next restart number to write (0-7) */
+
+  /* Pointers to derived tables (these workspaces have image lifespan).
+   * Since any one scan codes only DC or only AC, we only need one set
+   * of tables, not one for DC and one for AC.
+   */
+  c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
+
+  /* Statistics tables for optimization; again, one set is enough */
+  long * count_ptrs[NUM_HUFF_TBLS];
+} phuff_entropy_encoder;
+
+typedef phuff_entropy_encoder * phuff_entropy_ptr;
+
+/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit
+ * buffer can hold.  Larger sizes may slightly improve compression, but
+ * 1000 is already well into the realm of overkill.
+ * The minimum safe size is 64 bits.
+ */
+
+#define MAX_CORR_BITS  1000     /* Max # of correction bits I can buffer */
+
+/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
+ * We assume that int right shift is unsigned if INT32 right shift is,
+ * which should be safe.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define ISHIFT_TEMPS    int ishift_temp;
+#define IRIGHT_SHIFT(x,shft)  \
+        ((ishift_temp = (x)) < 0 ? \
+         (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
+         (ishift_temp >> (shft)))
+#else
+#define ISHIFT_TEMPS
+#define IRIGHT_SHIFT(x,shft)    ((x) >> (shft))
+#endif
+
+/* Forward declarations */
+METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,
+                                            JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,
+                                            JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,
+                                             JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,
+                                             JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));
+METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));
+
+
+/*
+ * Initialize for a Huffman-compressed scan using progressive JPEG.
+ */
+
+METHODDEF(void)
+start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  boolean is_DC_band;
+  int ci, tbl;
+  jpeg_component_info * compptr;
+
+  entropy->cinfo = cinfo;
+  entropy->gather_statistics = gather_statistics;
+
+  is_DC_band = (cinfo->Ss == 0);
+
+  /* We assume jcmaster.c already validated the scan parameters. */
+
+  /* Select execution routines */
+  if (cinfo->Ah == 0) {
+    if (is_DC_band)
+      entropy->pub.encode_mcu = encode_mcu_DC_first;
+    else
+      entropy->pub.encode_mcu = encode_mcu_AC_first;
+  } else {
+    if (is_DC_band)
+      entropy->pub.encode_mcu = encode_mcu_DC_refine;
+    else {
+      entropy->pub.encode_mcu = encode_mcu_AC_refine;
+      /* AC refinement needs a correction bit buffer */
+      if (entropy->bit_buffer == NULL)
+        entropy->bit_buffer = (char *)
+          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                      MAX_CORR_BITS * SIZEOF(char));
+    }
+  }
+  if (gather_statistics)
+    entropy->pub.finish_pass = finish_pass_gather_phuff;
+  else
+    entropy->pub.finish_pass = finish_pass_phuff;
+
+  /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
+   * for AC coefficients.
+   */
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    /* Initialize DC predictions to 0 */
+    entropy->last_dc_val[ci] = 0;
+    /* Get table index */
+    if (is_DC_band) {
+      if (cinfo->Ah != 0)       /* DC refinement needs no table */
+        continue;
+      tbl = compptr->dc_tbl_no;
+    } else {
+      entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
+    }
+    if (gather_statistics) {
+      /* Check for invalid table index */
+      /* (make_c_derived_tbl does this in the other path) */
+      if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
+        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
+      /* Allocate and zero the statistics tables */
+      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
+      if (entropy->count_ptrs[tbl] == NULL)
+        entropy->count_ptrs[tbl] = (long *)
+          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                      257 * SIZEOF(long));
+      MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
+    } else {
+      /* Compute derived values for Huffman table */
+      /* We may do this more than once for a table, but it's not expensive */
+      jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,
+                              & entropy->derived_tbls[tbl]);
+    }
+  }
+
+  /* Initialize AC stuff */
+  entropy->EOBRUN = 0;
+  entropy->BE = 0;
+
+  /* Initialize bit buffer to empty */
+  entropy->put_buffer = 0;
+  entropy->put_bits = 0;
+
+  /* Initialize restart stuff */
+  entropy->restarts_to_go = cinfo->restart_interval;
+  entropy->next_restart_num = 0;
+}
+
+
+/* Outputting bytes to the file.
+ * NB: these must be called only when actually outputting,
+ * that is, entropy->gather_statistics == FALSE.
+ */
+
+/* Emit a byte */
+#define emit_byte(entropy,val)  \
+        { *(entropy)->next_output_byte++ = (JOCTET) (val);  \
+          if (--(entropy)->free_in_buffer == 0)  \
+            dump_buffer(entropy); }
+
+
+LOCAL(void)
+dump_buffer (phuff_entropy_ptr entropy)
+/* Empty the output buffer; we do not support suspension in this module. */
+{
+  struct jpeg_destination_mgr * dest = entropy->cinfo->dest;
+
+  if (! (*dest->empty_output_buffer) (entropy->cinfo))
+    ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);
+  /* After a successful buffer dump, must reset buffer pointers */
+  entropy->next_output_byte = dest->next_output_byte;
+  entropy->free_in_buffer = dest->free_in_buffer;
+}
+
+
+/* Outputting bits to the file */
+
+/* Only the right 24 bits of put_buffer are used; the valid bits are
+ * left-justified in this part.  At most 16 bits can be passed to emit_bits
+ * in one call, and we never retain more than 7 bits in put_buffer
+ * between calls, so 24 bits are sufficient.
+ */
+
+INLINE
+LOCAL(void)
+emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)
+/* Emit some bits, unless we are in gather mode */
+{
+  /* This routine is heavily used, so it's worth coding tightly. */
+  register INT32 put_buffer = (INT32) code;
+  register int put_bits = entropy->put_bits;
+
+  /* if size is 0, caller used an invalid Huffman table entry */
+  if (size == 0)
+    ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
+
+  if (entropy->gather_statistics)
+    return;                     /* do nothing if we're only getting stats */
+
+  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
+
+  put_bits += size;             /* new number of bits in buffer */
+
+  put_buffer <<= 24 - put_bits; /* align incoming bits */
+
+  put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */
+
+  while (put_bits >= 8) {
+    int c = (int) ((put_buffer >> 16) & 0xFF);
+
+    emit_byte(entropy, c);
+    if (c == 0xFF) {            /* need to stuff a zero byte? */
+      emit_byte(entropy, 0);
+    }
+    put_buffer <<= 8;
+    put_bits -= 8;
+  }
+
+  entropy->put_buffer = put_buffer; /* update variables */
+  entropy->put_bits = put_bits;
+}
+
+
+LOCAL(void)
+flush_bits (phuff_entropy_ptr entropy)
+{
+  emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */
+  entropy->put_buffer = 0;     /* and reset bit-buffer to empty */
+  entropy->put_bits = 0;
+}
+
+
+/*
+ * Emit (or just count) a Huffman symbol.
+ */
+
+INLINE
+LOCAL(void)
+emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)
+{
+  if (entropy->gather_statistics)
+    entropy->count_ptrs[tbl_no][symbol]++;
+  else {
+    c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];
+    emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
+  }
+}
+
+
+/*
+ * Emit bits from a correction bit buffer.
+ */
+
+LOCAL(void)
+emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,
+                    unsigned int nbits)
+{
+  if (entropy->gather_statistics)
+    return;                     /* no real work */
+
+  while (nbits > 0) {
+    emit_bits(entropy, (unsigned int) (*bufstart), 1);
+    bufstart++;
+    nbits--;
+  }
+}
+
+
+/*
+ * Emit any pending EOBRUN symbol.
+ */
+
+LOCAL(void)
+emit_eobrun (phuff_entropy_ptr entropy)
+{
+  register int temp, nbits;
+
+  if (entropy->EOBRUN > 0) {    /* if there is any pending EOBRUN */
+    temp = entropy->EOBRUN;
+    nbits = 0;
+    while ((temp >>= 1))
+      nbits++;
+    /* safety check: shouldn't happen given limited correction-bit buffer */
+    if (nbits > 14)
+      ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
+
+    emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
+    if (nbits)
+      emit_bits(entropy, entropy->EOBRUN, nbits);
+
+    entropy->EOBRUN = 0;
+
+    /* Emit any buffered correction bits */
+    emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);
+    entropy->BE = 0;
+  }
+}
+
+
+/*
+ * Emit a restart marker & resynchronize predictions.
+ */
+
+LOCAL(void)
+emit_restart (phuff_entropy_ptr entropy, int restart_num)
+{
+  int ci;
+
+  emit_eobrun(entropy);
+
+  if (! entropy->gather_statistics) {
+    flush_bits(entropy);
+    emit_byte(entropy, 0xFF);
+    emit_byte(entropy, JPEG_RST0 + restart_num);
+  }
+
+  if (entropy->cinfo->Ss == 0) {
+    /* Re-initialize DC predictions to 0 */
+    for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)
+      entropy->last_dc_val[ci] = 0;
+  } else {
+    /* Re-initialize all AC-related fields to 0 */
+    entropy->EOBRUN = 0;
+    entropy->BE = 0;
+  }
+}
+
+
+/*
+ * MCU encoding for DC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  register int temp, temp2;
+  register int nbits;
+  int blkn, ci;
+  int Al = cinfo->Al;
+  JBLOCKROW block;
+  jpeg_component_info * compptr;
+  ISHIFT_TEMPS
+
+  entropy->next_output_byte = cinfo->dest->next_output_byte;
+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+  /* Emit restart marker if needed */
+  if (cinfo->restart_interval)
+    if (entropy->restarts_to_go == 0)
+      emit_restart(entropy, entropy->next_restart_num);
+
+  /* Encode the MCU data blocks */
+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+    block = MCU_data[blkn];
+    ci = cinfo->MCU_membership[blkn];
+    compptr = cinfo->cur_comp_info[ci];
+
+    /* Compute the DC value after the required point transform by Al.
+     * This is simply an arithmetic right shift.
+     */
+    temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
+
+    /* DC differences are figured on the point-transformed values. */
+    temp = temp2 - entropy->last_dc_val[ci];
+    entropy->last_dc_val[ci] = temp2;
+
+    /* Encode the DC coefficient difference per section G.1.2.1 */
+    temp2 = temp;
+    if (temp < 0) {
+      temp = -temp;             /* temp is abs value of input */
+      /* For a negative input, want temp2 = bitwise complement of abs(input) */
+      /* This code assumes we are on a two's complement machine */
+      temp2--;
+    }
+
+    /* Find the number of bits needed for the magnitude of the coefficient */
+    nbits = 0;
+    while (temp) {
+      nbits++;
+      temp >>= 1;
+    }
+    /* Check for out-of-range coefficient values.
+     * Since we're encoding a difference, the range limit is twice as much.
+     */
+    if (nbits > MAX_COEF_BITS+1)
+      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+    /* Count/emit the Huffman-coded symbol for the number of bits */
+    emit_symbol(entropy, compptr->dc_tbl_no, nbits);
+
+    /* Emit that number of bits of the value, if positive, */
+    /* or the complement of its magnitude, if negative. */
+    if (nbits)                  /* emit_bits rejects calls with size 0 */
+      emit_bits(entropy, (unsigned int) temp2, nbits);
+  }
+
+  cinfo->dest->next_output_byte = entropy->next_output_byte;
+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+  /* Update restart-interval state too */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0) {
+      entropy->restarts_to_go = cinfo->restart_interval;
+      entropy->next_restart_num++;
+      entropy->next_restart_num &= 7;
+    }
+    entropy->restarts_to_go--;
+  }
+
+  return TRUE;
+}
+
+
+/*
+ * MCU encoding for AC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  register int temp, temp2;
+  register int nbits;
+  register int r, k;
+  int Se = cinfo->Se;
+  int Al = cinfo->Al;
+  JBLOCKROW block;
+
+  entropy->next_output_byte = cinfo->dest->next_output_byte;
+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+  /* Emit restart marker if needed */
+  if (cinfo->restart_interval)
+    if (entropy->restarts_to_go == 0)
+      emit_restart(entropy, entropy->next_restart_num);
+
+  /* Encode the MCU data block */
+  block = MCU_data[0];
+
+  /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */
+
+  r = 0;                        /* r = run length of zeros */
+
+  for (k = cinfo->Ss; k <= Se; k++) {
+    if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {
+      r++;
+      continue;
+    }
+    /* We must apply the point transform by Al.  For AC coefficients this
+     * is an integer division with rounding towards 0.  To do this portably
+     * in C, we shift after obtaining the absolute value; so the code is
+     * interwoven with finding the abs value (temp) and output bits (temp2).
+     */
+    if (temp < 0) {
+      temp = -temp;             /* temp is abs value of input */
+      temp >>= Al;              /* apply the point transform */
+      /* For a negative coef, want temp2 = bitwise complement of abs(coef) */
+      temp2 = ~temp;
+    } else {
+      temp >>= Al;              /* apply the point transform */
+      temp2 = temp;
+    }
+    /* Watch out for case that nonzero coef is zero after point transform */
+    if (temp == 0) {
+      r++;
+      continue;
+    }
+
+    /* Emit any pending EOBRUN */
+    if (entropy->EOBRUN > 0)
+      emit_eobrun(entropy);
+    /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+    while (r > 15) {
+      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
+      r -= 16;
+    }
+
+    /* Find the number of bits needed for the magnitude of the coefficient */
+    nbits = 1;                  /* there must be at least one 1 bit */
+    while ((temp >>= 1))
+      nbits++;
+    /* Check for out-of-range coefficient values */
+    if (nbits > MAX_COEF_BITS)
+      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+    /* Count/emit Huffman symbol for run length / number of bits */
+    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
+
+    /* Emit that number of bits of the value, if positive, */
+    /* or the complement of its magnitude, if negative. */
+    emit_bits(entropy, (unsigned int) temp2, nbits);
+
+    r = 0;                      /* reset zero run length */
+  }
+
+  if (r > 0) {                  /* If there are trailing zeroes, */
+    entropy->EOBRUN++;          /* count an EOB */
+    if (entropy->EOBRUN == 0x7FFF)
+      emit_eobrun(entropy);     /* force it out to avoid overflow */
+  }
+
+  cinfo->dest->next_output_byte = entropy->next_output_byte;
+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+  /* Update restart-interval state too */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0) {
+      entropy->restarts_to_go = cinfo->restart_interval;
+      entropy->next_restart_num++;
+      entropy->next_restart_num &= 7;
+    }
+    entropy->restarts_to_go--;
+  }
+
+  return TRUE;
+}
+
+
+/*
+ * MCU encoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component, although the spec
+ * is not very clear on the point.
+ */
+
+METHODDEF(boolean)
+encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  register int temp;
+  int blkn;
+  int Al = cinfo->Al;
+  JBLOCKROW block;
+
+  entropy->next_output_byte = cinfo->dest->next_output_byte;
+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+  /* Emit restart marker if needed */
+  if (cinfo->restart_interval)
+    if (entropy->restarts_to_go == 0)
+      emit_restart(entropy, entropy->next_restart_num);
+
+  /* Encode the MCU data blocks */
+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+    block = MCU_data[blkn];
+
+    /* We simply emit the Al'th bit of the DC coefficient value. */
+    temp = (*block)[0];
+    emit_bits(entropy, (unsigned int) (temp >> Al), 1);
+  }
+
+  cinfo->dest->next_output_byte = entropy->next_output_byte;
+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+  /* Update restart-interval state too */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0) {
+      entropy->restarts_to_go = cinfo->restart_interval;
+      entropy->next_restart_num++;
+      entropy->next_restart_num &= 7;
+    }
+    entropy->restarts_to_go--;
+  }
+
+  return TRUE;
+}
+
+
+/*
+ * MCU encoding for AC successive approximation refinement scan.
+ */
+
+METHODDEF(boolean)
+encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  register int temp;
+  register int r, k;
+  int EOB;
+  char *BR_buffer;
+  unsigned int BR;
+  int Se = cinfo->Se;
+  int Al = cinfo->Al;
+  JBLOCKROW block;
+  int absvalues[DCTSIZE2];
+
+  entropy->next_output_byte = cinfo->dest->next_output_byte;
+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+  /* Emit restart marker if needed */
+  if (cinfo->restart_interval)
+    if (entropy->restarts_to_go == 0)
+      emit_restart(entropy, entropy->next_restart_num);
+
+  /* Encode the MCU data block */
+  block = MCU_data[0];
+
+  /* It is convenient to make a pre-pass to determine the transformed
+   * coefficients' absolute values and the EOB position.
+   */
+  EOB = 0;
+  for (k = cinfo->Ss; k <= Se; k++) {
+    temp = (*block)[jpeg_natural_order[k]];
+    /* We must apply the point transform by Al.  For AC coefficients this
+     * is an integer division with rounding towards 0.  To do this portably
+     * in C, we shift after obtaining the absolute value.
+     */
+    if (temp < 0)
+      temp = -temp;             /* temp is abs value of input */
+    temp >>= Al;                /* apply the point transform */
+    absvalues[k] = temp;        /* save abs value for main pass */
+    if (temp == 1)
+      EOB = k;                  /* EOB = index of last newly-nonzero coef */
+  }
+
+  /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */
+
+  r = 0;                        /* r = run length of zeros */
+  BR = 0;                       /* BR = count of buffered bits added now */
+  BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */
+
+  for (k = cinfo->Ss; k <= Se; k++) {
+    if ((temp = absvalues[k]) == 0) {
+      r++;
+      continue;
+    }
+
+    /* Emit any required ZRLs, but not if they can be folded into EOB */
+    while (r > 15 && k <= EOB) {
+      /* emit any pending EOBRUN and the BE correction bits */
+      emit_eobrun(entropy);
+      /* Emit ZRL */
+      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
+      r -= 16;
+      /* Emit buffered correction bits that must be associated with ZRL */
+      emit_buffered_bits(entropy, BR_buffer, BR);
+      BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
+      BR = 0;
+    }
+
+    /* If the coef was previously nonzero, it only needs a correction bit.
+     * NOTE: a straight translation of the spec's figure G.7 would suggest
+     * that we also need to test r > 15.  But if r > 15, we can only get here
+     * if k > EOB, which implies that this coefficient is not 1.
+     */
+    if (temp > 1) {
+      /* The correction bit is the next bit of the absolute value. */
+      BR_buffer[BR++] = (char) (temp & 1);
+      continue;
+    }
+
+    /* Emit any pending EOBRUN and the BE correction bits */
+    emit_eobrun(entropy);
+
+    /* Count/emit Huffman symbol for run length / number of bits */
+    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
+
+    /* Emit output bit for newly-nonzero coef */
+    temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;
+    emit_bits(entropy, (unsigned int) temp, 1);
+
+    /* Emit buffered correction bits that must be associated with this code */
+    emit_buffered_bits(entropy, BR_buffer, BR);
+    BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
+    BR = 0;
+    r = 0;                      /* reset zero run length */
+  }
+
+  if (r > 0 || BR > 0) {        /* If there are trailing zeroes, */
+    entropy->EOBRUN++;          /* count an EOB */
+    entropy->BE += BR;          /* concat my correction bits to older ones */
+    /* We force out the EOB if we risk either:
+     * 1. overflow of the EOB counter;
+     * 2. overflow of the correction bit buffer during the next MCU.
+     */
+    if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))
+      emit_eobrun(entropy);
+  }
+
+  cinfo->dest->next_output_byte = entropy->next_output_byte;
+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+  /* Update restart-interval state too */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0) {
+      entropy->restarts_to_go = cinfo->restart_interval;
+      entropy->next_restart_num++;
+      entropy->next_restart_num &= 7;
+    }
+    entropy->restarts_to_go--;
+  }
+
+  return TRUE;
+}
+
+
+/*
+ * Finish up at the end of a Huffman-compressed progressive scan.
+ */
+
+METHODDEF(void)
+finish_pass_phuff (j_compress_ptr cinfo)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+
+  entropy->next_output_byte = cinfo->dest->next_output_byte;
+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+  /* Flush out any buffered data */
+  emit_eobrun(entropy);
+  flush_bits(entropy);
+
+  cinfo->dest->next_output_byte = entropy->next_output_byte;
+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+}
+
+
+/*
+ * Finish up a statistics-gathering pass and create the new Huffman tables.
+ */
+
+METHODDEF(void)
+finish_pass_gather_phuff (j_compress_ptr cinfo)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  boolean is_DC_band;
+  int ci, tbl;
+  jpeg_component_info * compptr;
+  JHUFF_TBL **htblptr;
+  boolean did[NUM_HUFF_TBLS];
+
+  /* Flush out buffered data (all we care about is counting the EOB symbol) */
+  emit_eobrun(entropy);
+
+  is_DC_band = (cinfo->Ss == 0);
+
+  /* It's important not to apply jpeg_gen_optimal_table more than once
+   * per table, because it clobbers the input frequency counts!
+   */
+  MEMZERO(did, SIZEOF(did));
+
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    if (is_DC_band) {
+      if (cinfo->Ah != 0)       /* DC refinement needs no table */
+        continue;
+      tbl = compptr->dc_tbl_no;
+    } else {
+      tbl = compptr->ac_tbl_no;
+    }
+    if (! did[tbl]) {
+      if (is_DC_band)
+        htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
+      else
+        htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
+      if (*htblptr == NULL)
+        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
+      did[tbl] = TRUE;
+    }
+  }
+}
+
+
+/*
+ * Module initialization routine for progressive Huffman entropy encoding.
+ */
+
+GLOBAL(void)
+jinit_phuff_encoder (j_compress_ptr cinfo)
+{
+  phuff_entropy_ptr entropy;
+  int i;
+
+  entropy = (phuff_entropy_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(phuff_entropy_encoder));
+  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+  entropy->pub.start_pass = start_pass_phuff;
+
+  /* Mark tables unallocated */
+  for (i = 0; i < NUM_HUFF_TBLS; i++) {
+    entropy->derived_tbls[i] = NULL;
+    entropy->count_ptrs[i] = NULL;
+  }
+  entropy->bit_buffer = NULL;   /* needed only in AC refinement scan */
+}
+
+#endif /* C_PROGRESSIVE_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcprepct.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,358 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcprepct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the compression preprocessing controller.
+ * This controller manages the color conversion, downsampling,
+ * and edge expansion steps.
+ *
+ * Most of the complexity here is associated with buffering input rows
+ * as required by the downsampler.  See the comments at the head of
+ * jcsample.c for the downsampler's needs.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* At present, jcsample.c can request context rows only for smoothing.
+ * In the future, we might also need context rows for CCIR601 sampling
+ * or other more-complex downsampling procedures.  The code to support
+ * context rows should be compiled only if needed.
+ */
+#ifdef INPUT_SMOOTHING_SUPPORTED
+#define CONTEXT_ROWS_SUPPORTED
+#endif
+
+
+/*
+ * For the simple (no-context-row) case, we just need to buffer one
+ * row group's worth of pixels for the downsampling step.  At the bottom of
+ * the image, we pad to a full row group by replicating the last pixel row.
+ * The downsampler's last output row is then replicated if needed to pad
+ * out to a full iMCU row.
+ *
+ * When providing context rows, we must buffer three row groups' worth of
+ * pixels.  Three row groups are physically allocated, but the row pointer
+ * arrays are made five row groups high, with the extra pointers above and
+ * below "wrapping around" to point to the last and first real row groups.
+ * This allows the downsampler to access the proper context rows.
+ * At the top and bottom of the image, we create dummy context rows by
+ * copying the first or last real pixel row.  This copying could be avoided
+ * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the
+ * trouble on the compression side.
+ */
+
+
+/* Private buffer controller object */
+
+typedef struct {
+  struct jpeg_c_prep_controller pub; /* public fields */
+
+  /* Downsampling input buffer.  This buffer holds color-converted data
+   * until we have enough to do a downsample step.
+   */
+  JSAMPARRAY color_buf[MAX_COMPONENTS];
+
+  JDIMENSION rows_to_go;        /* counts rows remaining in source image */
+  int next_buf_row;             /* index of next row to store in color_buf */
+
+#ifdef CONTEXT_ROWS_SUPPORTED   /* only needed for context case */
+  int this_row_group;           /* starting row index of group to process */
+  int next_buf_stop;            /* downsample when we reach this index */
+#endif
+} my_prep_controller;
+
+typedef my_prep_controller * my_prep_ptr;
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+
+  if (pass_mode != JBUF_PASS_THRU)
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+  /* Initialize total-height counter for detecting bottom of image */
+  prep->rows_to_go = cinfo->image_height;
+  /* Mark the conversion buffer empty */
+  prep->next_buf_row = 0;
+#ifdef CONTEXT_ROWS_SUPPORTED
+  /* Preset additional state variables for context mode.
+   * These aren't used in non-context mode, so we needn't test which mode.
+   */
+  prep->this_row_group = 0;
+  /* Set next_buf_stop to stop after two row groups have been read in. */
+  prep->next_buf_stop = 2 * cinfo->max_v_samp_factor;
+#endif
+}
+
+
+/*
+ * Expand an image vertically from height input_rows to height output_rows,
+ * by duplicating the bottom row.
+ */
+
+LOCAL(void)
+expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,
+                    int input_rows, int output_rows)
+{
+  register int row;
+
+  for (row = input_rows; row < output_rows; row++) {
+    jcopy_sample_rows(image_data, input_rows-1, image_data, row,
+                      1, num_cols);
+  }
+}
+
+
+/*
+ * Process some data in the simple no-context case.
+ *
+ * Preprocessor output data is counted in "row groups".  A row group
+ * is defined to be v_samp_factor sample rows of each component.
+ * Downsampling will produce this much data from each max_v_samp_factor
+ * input rows.
+ */
+
+METHODDEF(void)
+pre_process_data (j_compress_ptr cinfo,
+                  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+                  JDIMENSION in_rows_avail,
+                  JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
+                  JDIMENSION out_row_groups_avail)
+{
+  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+  int numrows, ci;
+  JDIMENSION inrows;
+  jpeg_component_info * compptr;
+
+  while (*in_row_ctr < in_rows_avail &&
+         *out_row_group_ctr < out_row_groups_avail) {
+    /* Do color conversion to fill the conversion buffer. */
+    inrows = in_rows_avail - *in_row_ctr;
+    numrows = cinfo->max_v_samp_factor - prep->next_buf_row;
+    numrows = (int) MIN((JDIMENSION) numrows, inrows);
+    (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
+                                       prep->color_buf,
+                                       (JDIMENSION) prep->next_buf_row,
+                                       numrows);
+    *in_row_ctr += numrows;
+    prep->next_buf_row += numrows;
+    prep->rows_to_go -= numrows;
+    /* If at bottom of image, pad to fill the conversion buffer. */
+    if (prep->rows_to_go == 0 &&
+        prep->next_buf_row < cinfo->max_v_samp_factor) {
+      for (ci = 0; ci < cinfo->num_components; ci++) {
+        expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
+                           prep->next_buf_row, cinfo->max_v_samp_factor);
+      }
+      prep->next_buf_row = cinfo->max_v_samp_factor;
+    }
+    /* If we've filled the conversion buffer, empty it. */
+    if (prep->next_buf_row == cinfo->max_v_samp_factor) {
+      (*cinfo->downsample->downsample) (cinfo,
+                                        prep->color_buf, (JDIMENSION) 0,
+                                        output_buf, *out_row_group_ctr);
+      prep->next_buf_row = 0;
+      (*out_row_group_ctr)++;
+    }
+    /* If at bottom of image, pad the output to a full iMCU height.
+     * Note we assume the caller is providing a one-iMCU-height output buffer!
+     */
+    if (prep->rows_to_go == 0 &&
+        *out_row_group_ctr < out_row_groups_avail) {
+      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+           ci++, compptr++) {
+        expand_bottom_edge(output_buf[ci],
+                           compptr->width_in_blocks * DCTSIZE,
+                           (int) (*out_row_group_ctr * compptr->v_samp_factor),
+                           (int) (out_row_groups_avail * compptr->v_samp_factor));
+      }
+      *out_row_group_ctr = out_row_groups_avail;
+      break;                    /* can exit outer loop without test */
+    }
+  }
+}
+
+
+#ifdef CONTEXT_ROWS_SUPPORTED
+
+/*
+ * Process some data in the context case.
+ */
+
+METHODDEF(void)
+pre_process_context (j_compress_ptr cinfo,
+                     JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+                     JDIMENSION in_rows_avail,
+                     JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
+                     JDIMENSION out_row_groups_avail)
+{
+  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+  int numrows, ci;
+  int buf_height = cinfo->max_v_samp_factor * 3;
+  JDIMENSION inrows;
+
+  while (*out_row_group_ctr < out_row_groups_avail) {
+    if (*in_row_ctr < in_rows_avail) {
+      /* Do color conversion to fill the conversion buffer. */
+      inrows = in_rows_avail - *in_row_ctr;
+      numrows = prep->next_buf_stop - prep->next_buf_row;
+      numrows = (int) MIN((JDIMENSION) numrows, inrows);
+      (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
+                                         prep->color_buf,
+                                         (JDIMENSION) prep->next_buf_row,
+                                         numrows);
+      /* Pad at top of image, if first time through */
+      if (prep->rows_to_go == cinfo->image_height) {
+        for (ci = 0; ci < cinfo->num_components; ci++) {
+          int row;
+          for (row = 1; row <= cinfo->max_v_samp_factor; row++) {
+            jcopy_sample_rows(prep->color_buf[ci], 0,
+                              prep->color_buf[ci], -row,
+                              1, cinfo->image_width);
+          }
+        }
+      }
+      *in_row_ctr += numrows;
+      prep->next_buf_row += numrows;
+      prep->rows_to_go -= numrows;
+    } else {
+      /* Return for more data, unless we are at the bottom of the image. */
+      if (prep->rows_to_go != 0)
+        break;
+      /* When at bottom of image, pad to fill the conversion buffer. */
+      if (prep->next_buf_row < prep->next_buf_stop) {
+        for (ci = 0; ci < cinfo->num_components; ci++) {
+          expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
+                             prep->next_buf_row, prep->next_buf_stop);
+        }
+        prep->next_buf_row = prep->next_buf_stop;
+      }
+    }
+    /* If we've gotten enough data, downsample a row group. */
+    if (prep->next_buf_row == prep->next_buf_stop) {
+      (*cinfo->downsample->downsample) (cinfo,
+                                        prep->color_buf,
+                                        (JDIMENSION) prep->this_row_group,
+                                        output_buf, *out_row_group_ctr);
+      (*out_row_group_ctr)++;
+      /* Advance pointers with wraparound as necessary. */
+      prep->this_row_group += cinfo->max_v_samp_factor;
+      if (prep->this_row_group >= buf_height)
+        prep->this_row_group = 0;
+      if (prep->next_buf_row >= buf_height)
+        prep->next_buf_row = 0;
+      prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor;
+    }
+  }
+}
+
+
+/*
+ * Create the wrapped-around downsampling input buffer needed for context mode.
+ */
+
+LOCAL(void)
+create_context_buffer (j_compress_ptr cinfo)
+{
+  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+  int rgroup_height = cinfo->max_v_samp_factor;
+  int ci, i;
+  jpeg_component_info * compptr;
+  JSAMPARRAY true_buffer, fake_buffer;
+
+  /* Grab enough space for fake row pointers for all the components;
+   * we need five row groups' worth of pointers for each component.
+   */
+  fake_buffer = (JSAMPARRAY)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (cinfo->num_components * 5 * rgroup_height) *
+                                SIZEOF(JSAMPROW));
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Allocate the actual buffer space (3 row groups) for this component.
+     * We make the buffer wide enough to allow the downsampler to edge-expand
+     * horizontally within the buffer, if it so chooses.
+     */
+    true_buffer = (*cinfo->mem->alloc_sarray)
+      ((j_common_ptr) cinfo, JPOOL_IMAGE,
+       (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
+                      cinfo->max_h_samp_factor) / compptr->h_samp_factor),
+       (JDIMENSION) (3 * rgroup_height));
+    /* Copy true buffer row pointers into the middle of the fake row array */
+    MEMCOPY(fake_buffer + rgroup_height, true_buffer,
+            3 * rgroup_height * SIZEOF(JSAMPROW));
+    /* Fill in the above and below wraparound pointers */
+    for (i = 0; i < rgroup_height; i++) {
+      fake_buffer[i] = true_buffer[2 * rgroup_height + i];
+      fake_buffer[4 * rgroup_height + i] = true_buffer[i];
+    }
+    prep->color_buf[ci] = fake_buffer + rgroup_height;
+    fake_buffer += 5 * rgroup_height; /* point to space for next component */
+  }
+}
+
+#endif /* CONTEXT_ROWS_SUPPORTED */
+
+
+/*
+ * Initialize preprocessing controller.
+ */
+
+GLOBAL(void)
+jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+  my_prep_ptr prep;
+  int ci;
+  jpeg_component_info * compptr;
+
+  if (need_full_buffer)         /* safety check */
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+  prep = (my_prep_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_prep_controller));
+  cinfo->prep = (struct jpeg_c_prep_controller *) prep;
+  prep->pub.start_pass = start_pass_prep;
+
+  /* Allocate the color conversion buffer.
+   * We make the buffer wide enough to allow the downsampler to edge-expand
+   * horizontally within the buffer, if it so chooses.
+   */
+  if (cinfo->downsample->need_context_rows) {
+    /* Set up to provide context rows */
+#ifdef CONTEXT_ROWS_SUPPORTED
+    prep->pub.pre_process_data = pre_process_context;
+    create_context_buffer(cinfo);
+#else
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+  } else {
+    /* No context, just make it tall enough for one row group */
+    prep->pub.pre_process_data = pre_process_data;
+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+         ci++, compptr++) {
+      prep->color_buf[ci] = (*cinfo->mem->alloc_sarray)
+        ((j_common_ptr) cinfo, JPOOL_IMAGE,
+         (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
+                        cinfo->max_h_samp_factor) / compptr->h_samp_factor),
+         (JDIMENSION) cinfo->max_v_samp_factor);
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jcsample.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,523 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jcsample.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains downsampling routines.
+ *
+ * Downsampling input data is counted in "row groups".  A row group
+ * is defined to be max_v_samp_factor pixel rows of each component,
+ * from which the downsampler produces v_samp_factor sample rows.
+ * A single row group is processed in each call to the downsampler module.
+ *
+ * The downsampler is responsible for edge-expansion of its output data
+ * to fill an integral number of DCT blocks horizontally.  The source buffer
+ * may be modified if it is helpful for this purpose (the source buffer is
+ * allocated wide enough to correspond to the desired output width).
+ * The caller (the prep controller) is responsible for vertical padding.
+ *
+ * The downsampler may request "context rows" by setting need_context_rows
+ * during startup.  In this case, the input arrays will contain at least
+ * one row group's worth of pixels above and below the passed-in data;
+ * the caller will create dummy rows at image top and bottom by replicating
+ * the first or last real pixel row.
+ *
+ * An excellent reference for image resampling is
+ *   Digital Image Warping, George Wolberg, 1990.
+ *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
+ *
+ * The downsampling algorithm used here is a simple average of the source
+ * pixels covered by the output pixel.  The hi-falutin sampling literature
+ * refers to this as a "box filter".  In general the characteristics of a box
+ * filter are not very good, but for the specific cases we normally use (1:1
+ * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not
+ * nearly so bad.  If you intend to use other sampling ratios, you'd be well
+ * advised to improve this code.
+ *
+ * A simple input-smoothing capability is provided.  This is mainly intended
+ * for cleaning up color-dithered GIF input files (if you find it inadequate,
+ * we suggest using an external filtering program such as pnmconvol).  When
+ * enabled, each input pixel P is replaced by a weighted sum of itself and its
+ * eight neighbors.  P's weight is 1-8*SF and each neighbor's weight is SF,
+ * where SF = (smoothing_factor / 1024).
+ * Currently, smoothing is only supported for 2h2v sampling factors.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Pointer to routine to downsample a single component */
+typedef JMETHOD(void, downsample1_ptr,
+                (j_compress_ptr cinfo, jpeg_component_info * compptr,
+                 JSAMPARRAY input_data, JSAMPARRAY output_data));
+
+/* Private subobject */
+
+typedef struct {
+  struct jpeg_downsampler pub;  /* public fields */
+
+  /* Downsampling method pointers, one per component */
+  downsample1_ptr methods[MAX_COMPONENTS];
+} my_downsampler;
+
+typedef my_downsampler * my_downsample_ptr;
+
+
+/*
+ * Initialize for a downsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_downsample (j_compress_ptr cinfo)
+{
+  /* no work for now */
+}
+
+
+/*
+ * Expand a component horizontally from width input_cols to width output_cols,
+ * by duplicating the rightmost samples.
+ */
+
+LOCAL(void)
+expand_right_edge (JSAMPARRAY image_data, int num_rows,
+                   JDIMENSION input_cols, JDIMENSION output_cols)
+{
+  register JSAMPROW ptr;
+  register JSAMPLE pixval;
+  register int count;
+  int row;
+  int numcols = (int) (output_cols - input_cols);
+
+  if (numcols > 0) {
+    for (row = 0; row < num_rows; row++) {
+      ptr = image_data[row] + input_cols;
+      pixval = ptr[-1];         /* don't need GETJSAMPLE() here */
+      for (count = numcols; count > 0; count--)
+        *ptr++ = pixval;
+    }
+  }
+}
+
+
+/*
+ * Do downsampling for a whole row group (all components).
+ *
+ * In this version we simply downsample each component independently.
+ */
+
+METHODDEF(void)
+sep_downsample (j_compress_ptr cinfo,
+                JSAMPIMAGE input_buf, JDIMENSION in_row_index,
+                JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)
+{
+  my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;
+  int ci;
+  jpeg_component_info * compptr;
+  JSAMPARRAY in_ptr, out_ptr;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    in_ptr = input_buf[ci] + in_row_index;
+    out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);
+    (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);
+  }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * One row group is processed per call.
+ * This version handles arbitrary integral sampling ratios, without smoothing.
+ * Note that this version is not actually used for customary sampling ratios.
+ */
+
+METHODDEF(void)
+int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+                JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+  int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;
+  JDIMENSION outcol, outcol_h;  /* outcol_h == outcol*h_expand */
+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+  JSAMPROW inptr, outptr;
+  INT32 outvalue;
+
+  h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;
+  v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;
+  numpix = h_expand * v_expand;
+  numpix2 = numpix/2;
+
+  /* Expand input data enough to let all the output samples be generated
+   * by the standard loop.  Special-casing padded output would be more
+   * efficient.
+   */
+  expand_right_edge(input_data, cinfo->max_v_samp_factor,
+                    cinfo->image_width, output_cols * h_expand);
+
+  inrow = 0;
+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+    outptr = output_data[outrow];
+    for (outcol = 0, outcol_h = 0; outcol < output_cols;
+         outcol++, outcol_h += h_expand) {
+      outvalue = 0;
+      for (v = 0; v < v_expand; v++) {
+        inptr = input_data[inrow+v] + outcol_h;
+        for (h = 0; h < h_expand; h++) {
+          outvalue += (INT32) GETJSAMPLE(*inptr++);
+        }
+      }
+      *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);
+    }
+    inrow += v_expand;
+  }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the special case of a full-size component,
+ * without smoothing.
+ */
+
+METHODDEF(void)
+fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+                     JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+  /* Copy the data */
+  jcopy_sample_rows(input_data, 0, output_data, 0,
+                    cinfo->max_v_samp_factor, cinfo->image_width);
+  /* Edge-expand */
+  expand_right_edge(output_data, cinfo->max_v_samp_factor,
+                    cinfo->image_width, compptr->width_in_blocks * DCTSIZE);
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the common case of 2:1 horizontal and 1:1 vertical,
+ * without smoothing.
+ *
+ * A note about the "bias" calculations: when rounding fractional values to
+ * integer, we do not want to always round 0.5 up to the next integer.
+ * If we did that, we'd introduce a noticeable bias towards larger values.
+ * Instead, this code is arranged so that 0.5 will be rounded up or down at
+ * alternate pixel locations (a simple ordered dither pattern).
+ */
+
+METHODDEF(void)
+h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+                 JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+  int outrow;
+  JDIMENSION outcol;
+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+  register JSAMPROW inptr, outptr;
+  register int bias;
+
+  /* Expand input data enough to let all the output samples be generated
+   * by the standard loop.  Special-casing padded output would be more
+   * efficient.
+   */
+  expand_right_edge(input_data, cinfo->max_v_samp_factor,
+                    cinfo->image_width, output_cols * 2);
+
+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+    outptr = output_data[outrow];
+    inptr = input_data[outrow];
+    bias = 0;                   /* bias = 0,1,0,1,... for successive samples */
+    for (outcol = 0; outcol < output_cols; outcol++) {
+      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])
+                              + bias) >> 1);
+      bias ^= 1;                /* 0=>1, 1=>0 */
+      inptr += 2;
+    }
+  }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
+ * without smoothing.
+ */
+
+METHODDEF(void)
+h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+                 JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+  int inrow, outrow;
+  JDIMENSION outcol;
+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+  register JSAMPROW inptr0, inptr1, outptr;
+  register int bias;
+
+  /* Expand input data enough to let all the output samples be generated
+   * by the standard loop.  Special-casing padded output would be more
+   * efficient.
+   */
+  expand_right_edge(input_data, cinfo->max_v_samp_factor,
+                    cinfo->image_width, output_cols * 2);
+
+  inrow = 0;
+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+    outptr = output_data[outrow];
+    inptr0 = input_data[inrow];
+    inptr1 = input_data[inrow+1];
+    bias = 1;                   /* bias = 1,2,1,2,... for successive samples */
+    for (outcol = 0; outcol < output_cols; outcol++) {
+      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+                              GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])
+                              + bias) >> 2);
+      bias ^= 3;                /* 1=>2, 2=>1 */
+      inptr0 += 2; inptr1 += 2;
+    }
+    inrow += 2;
+  }
+}
+
+
+#ifdef INPUT_SMOOTHING_SUPPORTED
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
+ * with smoothing.  One row of context is required.
+ */
+
+METHODDEF(void)
+h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+                        JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+  int inrow, outrow;
+  JDIMENSION colctr;
+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+  register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;
+  INT32 membersum, neighsum, memberscale, neighscale;
+
+  /* Expand input data enough to let all the output samples be generated
+   * by the standard loop.  Special-casing padded output would be more
+   * efficient.
+   */
+  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
+                    cinfo->image_width, output_cols * 2);
+
+  /* We don't bother to form the individual "smoothed" input pixel values;
+   * we can directly compute the output which is the average of the four
+   * smoothed values.  Each of the four member pixels contributes a fraction
+   * (1-8*SF) to its own smoothed image and a fraction SF to each of the three
+   * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final
+   * output.  The four corner-adjacent neighbor pixels contribute a fraction
+   * SF to just one smoothed pixel, or SF/4 to the final output; while the
+   * eight edge-adjacent neighbors contribute SF to each of two smoothed
+   * pixels, or SF/2 overall.  In order to use integer arithmetic, these
+   * factors are scaled by 2^16 = 65536.
+   * Also recall that SF = smoothing_factor / 1024.
+   */
+
+  memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */
+  neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */
+
+  inrow = 0;
+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+    outptr = output_data[outrow];
+    inptr0 = input_data[inrow];
+    inptr1 = input_data[inrow+1];
+    above_ptr = input_data[inrow-1];
+    below_ptr = input_data[inrow+2];
+
+    /* Special case for first column: pretend column -1 is same as column 0 */
+    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+                GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+               GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+               GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +
+               GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);
+    neighsum += neighsum;
+    neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +
+                GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);
+    membersum = membersum * memberscale + neighsum * neighscale;
+    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+    inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
+
+    for (colctr = output_cols - 2; colctr > 0; colctr--) {
+      /* sum of pixels directly mapped to this output element */
+      membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+                  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+      /* sum of edge-neighbor pixels */
+      neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+                 GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+                 GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +
+                 GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);
+      /* The edge-neighbors count twice as much as corner-neighbors */
+      neighsum += neighsum;
+      /* Add in the corner-neighbors */
+      neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +
+                  GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);
+      /* form final output scaled up by 2^16 */
+      membersum = membersum * memberscale + neighsum * neighscale;
+      /* round, descale and output it */
+      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+      inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
+    }
+
+    /* Special case for last column */
+    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+                GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+               GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+               GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +
+               GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);
+    neighsum += neighsum;
+    neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +
+                GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);
+    membersum = membersum * memberscale + neighsum * neighscale;
+    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
+
+    inrow += 2;
+  }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the special case of a full-size component,
+ * with smoothing.  One row of context is required.
+ */
+
+METHODDEF(void)
+fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,
+                            JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+  int outrow;
+  JDIMENSION colctr;
+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+  register JSAMPROW inptr, above_ptr, below_ptr, outptr;
+  INT32 membersum, neighsum, memberscale, neighscale;
+  int colsum, lastcolsum, nextcolsum;
+
+  /* Expand input data enough to let all the output samples be generated
+   * by the standard loop.  Special-casing padded output would be more
+   * efficient.
+   */
+  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
+                    cinfo->image_width, output_cols);
+
+  /* Each of the eight neighbor pixels contributes a fraction SF to the
+   * smoothed pixel, while the main pixel contributes (1-8*SF).  In order
+   * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.
+   * Also recall that SF = smoothing_factor / 1024.
+   */
+
+  memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */
+  neighscale = cinfo->smoothing_factor * 64; /* scaled SF */
+
+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+    outptr = output_data[outrow];
+    inptr = input_data[outrow];
+    above_ptr = input_data[outrow-1];
+    below_ptr = input_data[outrow+1];
+
+    /* Special case for first column */
+    colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +
+             GETJSAMPLE(*inptr);
+    membersum = GETJSAMPLE(*inptr++);
+    nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
+                 GETJSAMPLE(*inptr);
+    neighsum = colsum + (colsum - membersum) + nextcolsum;
+    membersum = membersum * memberscale + neighsum * neighscale;
+    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+    lastcolsum = colsum; colsum = nextcolsum;
+
+    for (colctr = output_cols - 2; colctr > 0; colctr--) {
+      membersum = GETJSAMPLE(*inptr++);
+      above_ptr++; below_ptr++;
+      nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
+                   GETJSAMPLE(*inptr);
+      neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
+      membersum = membersum * memberscale + neighsum * neighscale;
+      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+      lastcolsum = colsum; colsum = nextcolsum;
+    }
+
+    /* Special case for last column */
+    membersum = GETJSAMPLE(*inptr);
+    neighsum = lastcolsum + (colsum - membersum) + colsum;
+    membersum = membersum * memberscale + neighsum * neighscale;
+    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
+
+  }
+}
+
+#endif /* INPUT_SMOOTHING_SUPPORTED */
+
+
+/*
+ * Module initialization routine for downsampling.
+ * Note that we must select a routine for each component.
+ */
+
+GLOBAL(void)
+jinit_downsampler (j_compress_ptr cinfo)
+{
+  my_downsample_ptr downsample;
+  int ci;
+  jpeg_component_info * compptr;
+  boolean smoothok = TRUE;
+
+  downsample = (my_downsample_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_downsampler));
+  cinfo->downsample = (struct jpeg_downsampler *) downsample;
+  downsample->pub.start_pass = start_pass_downsample;
+  downsample->pub.downsample = sep_downsample;
+  downsample->pub.need_context_rows = FALSE;
+
+  if (cinfo->CCIR601_sampling)
+    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
+
+  /* Verify we can handle the sampling factors, and set up method pointers */
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&
+        compptr->v_samp_factor == cinfo->max_v_samp_factor) {
+#ifdef INPUT_SMOOTHING_SUPPORTED
+      if (cinfo->smoothing_factor) {
+        downsample->methods[ci] = fullsize_smooth_downsample;
+        downsample->pub.need_context_rows = TRUE;
+      } else
+#endif
+        downsample->methods[ci] = fullsize_downsample;
+    } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
+               compptr->v_samp_factor == cinfo->max_v_samp_factor) {
+      smoothok = FALSE;
+      downsample->methods[ci] = h2v1_downsample;
+    } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
+               compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {
+#ifdef INPUT_SMOOTHING_SUPPORTED
+      if (cinfo->smoothing_factor) {
+        downsample->methods[ci] = h2v2_smooth_downsample;
+        downsample->pub.need_context_rows = TRUE;
+      } else
+#endif
+        downsample->methods[ci] = h2v2_downsample;
+    } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&
+               (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {
+      smoothok = FALSE;
+      downsample->methods[ci] = int_downsample;
+    } else
+      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
+  }
+
+#ifdef INPUT_SMOOTHING_SUPPORTED
+  if (cinfo->smoothing_factor && !smoothok)
+    TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jctrans.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,392 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jctrans.c
+ *
+ * Copyright (C) 1995-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains library routines for transcoding compression,
+ * that is, writing raw DCT coefficient arrays to an output JPEG file.
+ * The routines in jcapimin.c will also be needed by a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(void) transencode_master_selection
+        JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
+LOCAL(void) transencode_coef_controller
+        JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
+
+
+/*
+ * Compression initialization for writing raw-coefficient data.
+ * Before calling this, all parameters and a data destination must be set up.
+ * Call jpeg_finish_compress() to actually write the data.
+ *
+ * The number of passed virtual arrays must match cinfo->num_components.
+ * Note that the virtual arrays need not be filled or even realized at
+ * the time write_coefficients is called; indeed, if the virtual arrays
+ * were requested from this compression object's memory manager, they
+ * typically will be realized during this routine and filled afterwards.
+ */
+
+GLOBAL(void)
+jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)
+{
+  if (cinfo->global_state != CSTATE_START)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  /* Mark all tables to be written */
+  jpeg_suppress_tables(cinfo, FALSE);
+  /* (Re)initialize error mgr and destination modules */
+  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+  (*cinfo->dest->init_destination) (cinfo);
+  /* Perform master selection of active modules */
+  transencode_master_selection(cinfo, coef_arrays);
+  /* Wait for jpeg_finish_compress() call */
+  cinfo->next_scanline = 0;     /* so jpeg_write_marker works */
+  cinfo->global_state = CSTATE_WRCOEFS;
+}
+
+
+/*
+ * Initialize the compression object with default parameters,
+ * then copy from the source object all parameters needed for lossless
+ * transcoding.  Parameters that can be varied without loss (such as
+ * scan script and Huffman optimization) are left in their default states.
+ */
+
+GLOBAL(void)
+jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
+                               j_compress_ptr dstinfo)
+{
+  JQUANT_TBL ** qtblptr;
+  jpeg_component_info *incomp, *outcomp;
+  JQUANT_TBL *c_quant, *slot_quant;
+  int tblno, ci, coefi;
+
+  /* Safety check to ensure start_compress not called yet. */
+  if (dstinfo->global_state != CSTATE_START)
+    ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);
+  /* Copy fundamental image dimensions */
+  dstinfo->image_width = srcinfo->image_width;
+  dstinfo->image_height = srcinfo->image_height;
+  dstinfo->input_components = srcinfo->num_components;
+  dstinfo->in_color_space = srcinfo->jpeg_color_space;
+  /* Initialize all parameters to default values */
+  jpeg_set_defaults(dstinfo);
+  /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
+   * Fix it to get the right header markers for the image colorspace.
+   */
+  jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
+  dstinfo->data_precision = srcinfo->data_precision;
+  dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
+  /* Copy the source's quantization tables. */
+  for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {
+    if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {
+      qtblptr = & dstinfo->quant_tbl_ptrs[tblno];
+      if (*qtblptr == NULL)
+        *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);
+      MEMCOPY((*qtblptr)->quantval,
+              srcinfo->quant_tbl_ptrs[tblno]->quantval,
+              SIZEOF((*qtblptr)->quantval));
+      (*qtblptr)->sent_table = FALSE;
+    }
+  }
+  /* Copy the source's per-component info.
+   * Note we assume jpeg_set_defaults has allocated the dest comp_info array.
+   */
+  dstinfo->num_components = srcinfo->num_components;
+  if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)
+    ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,
+             MAX_COMPONENTS);
+  for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;
+       ci < dstinfo->num_components; ci++, incomp++, outcomp++) {
+    outcomp->component_id = incomp->component_id;
+    outcomp->h_samp_factor = incomp->h_samp_factor;
+    outcomp->v_samp_factor = incomp->v_samp_factor;
+    outcomp->quant_tbl_no = incomp->quant_tbl_no;
+    /* Make sure saved quantization table for component matches the qtable
+     * slot.  If not, the input file re-used this qtable slot.
+     * IJG encoder currently cannot duplicate this.
+     */
+    tblno = outcomp->quant_tbl_no;
+    if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||
+        srcinfo->quant_tbl_ptrs[tblno] == NULL)
+      ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);
+    slot_quant = srcinfo->quant_tbl_ptrs[tblno];
+    c_quant = incomp->quant_table;
+    if (c_quant != NULL) {
+      for (coefi = 0; coefi < DCTSIZE2; coefi++) {
+        if (c_quant->quantval[coefi] != slot_quant->quantval[coefi])
+          ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
+      }
+    }
+    /* Note: we do not copy the source's Huffman table assignments;
+     * instead we rely on jpeg_set_colorspace to have made a suitable choice.
+     */
+  }
+  /* Also copy JFIF version and resolution information, if available.
+   * Strictly speaking this isn't "critical" info, but it's nearly
+   * always appropriate to copy it if available.  In particular,
+   * if the application chooses to copy JFIF 1.02 extension markers from
+   * the source file, we need to copy the version to make sure we don't
+   * emit a file that has 1.02 extensions but a claimed version of 1.01.
+   * We will *not*, however, copy version info from mislabeled "2.01" files.
+   */
+  if (srcinfo->saw_JFIF_marker) {
+    if (srcinfo->JFIF_major_version == 1) {
+      dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
+      dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
+    }
+    dstinfo->density_unit = srcinfo->density_unit;
+    dstinfo->X_density = srcinfo->X_density;
+    dstinfo->Y_density = srcinfo->Y_density;
+  }
+}
+
+
+/*
+ * Master selection of compression modules for transcoding.
+ * This substitutes for jcinit.c's initialization of the full compressor.
+ */
+
+LOCAL(void)
+transencode_master_selection (j_compress_ptr cinfo,
+                              jvirt_barray_ptr * coef_arrays)
+{
+  /* Although we don't actually use input_components for transcoding,
+   * jcmaster.c's initial_setup will complain if input_components is 0.
+   */
+  cinfo->input_components = 1;
+  /* Initialize master control (includes parameter checking/processing) */
+  jinit_c_master_control(cinfo, TRUE /* transcode only */);
+
+  /* Entropy encoding: either Huffman or arithmetic coding. */
+  if (cinfo->arith_code) {
+    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+  } else {
+    if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+      jinit_phuff_encoder(cinfo);
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+    } else
+      jinit_huff_encoder(cinfo);
+  }
+
+  /* We need a special coefficient buffer controller. */
+  transencode_coef_controller(cinfo, coef_arrays);
+
+  jinit_marker_writer(cinfo);
+
+  /* We can now tell the memory manager to allocate virtual arrays. */
+  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+  /* Write the datastream header (SOI, JFIF) immediately.
+   * Frame and scan headers are postponed till later.
+   * This lets application insert special markers after the SOI.
+   */
+  (*cinfo->marker->write_file_header) (cinfo);
+}
+
+
+/*
+ * The rest of this file is a special implementation of the coefficient
+ * buffer controller.  This is similar to jccoefct.c, but it handles only
+ * output from presupplied virtual arrays.  Furthermore, we generate any
+ * dummy padding blocks on-the-fly rather than expecting them to be present
+ * in the arrays.
+ */
+
+/* Private buffer controller object */
+
+typedef struct {
+  struct jpeg_c_coef_controller pub; /* public fields */
+
+  JDIMENSION iMCU_row_num;      /* iMCU row # within image */
+  JDIMENSION mcu_ctr;           /* counts MCUs processed in current row */
+  int MCU_vert_offset;          /* counts MCU rows within iMCU row */
+  int MCU_rows_per_iMCU_row;    /* number of such rows needed */
+
+  /* Virtual block array for each component. */
+  jvirt_barray_ptr * whole_image;
+
+  /* Workspace for constructing dummy blocks at right/bottom edges. */
+  JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+
+LOCAL(void)
+start_iMCU_row (j_compress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row */
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+  /* In an interleaved scan, an MCU row is the same as an iMCU row.
+   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+   * But at the bottom of the image, process only what's left.
+   */
+  if (cinfo->comps_in_scan > 1) {
+    coef->MCU_rows_per_iMCU_row = 1;
+  } else {
+    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+    else
+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+  }
+
+  coef->mcu_ctr = 0;
+  coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+  if (pass_mode != JBUF_CRANK_DEST)
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+  coef->iMCU_row_num = 0;
+  start_iMCU_row(cinfo);
+}
+
+
+/*
+ * Process some data.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the scan.
+ * The data is obtained from the virtual arrays and fed to the entropy coder.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf is ignored; it is likely to be a NULL pointer.
+ */
+
+METHODDEF(boolean)
+compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  JDIMENSION MCU_col_num;       /* index of current MCU within row */
+  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+  int blkn, ci, xindex, yindex, yoffset, blockcnt;
+  JDIMENSION start_col;
+  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
+  JBLOCKROW buffer_ptr;
+  jpeg_component_info *compptr;
+
+  /* Align the virtual buffers for the components used in this scan. */
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    buffer[ci] = (*cinfo->mem->access_virt_barray)
+      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+       coef->iMCU_row_num * compptr->v_samp_factor,
+       (JDIMENSION) compptr->v_samp_factor, FALSE);
+  }
+
+  /* Loop to process one whole iMCU row */
+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+       yoffset++) {
+    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
+         MCU_col_num++) {
+      /* Construct list of pointers to DCT blocks belonging to this MCU */
+      blkn = 0;                 /* index of current DCT block within MCU */
+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+        compptr = cinfo->cur_comp_info[ci];
+        start_col = MCU_col_num * compptr->MCU_width;
+        blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+                                                : compptr->last_col_width;
+        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+          if (coef->iMCU_row_num < last_iMCU_row ||
+              yindex+yoffset < compptr->last_row_height) {
+            /* Fill in pointers to real blocks in this row */
+            buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+            for (xindex = 0; xindex < blockcnt; xindex++)
+              MCU_buffer[blkn++] = buffer_ptr++;
+          } else {
+            /* At bottom of image, need a whole row of dummy blocks */
+            xindex = 0;
+          }
+          /* Fill in any dummy blocks needed in this row.
+           * Dummy blocks are filled in the same way as in jccoefct.c:
+           * all zeroes in the AC entries, DC entries equal to previous
+           * block's DC value.  The init routine has already zeroed the
+           * AC entries, so we need only set the DC entries correctly.
+           */
+          for (; xindex < compptr->MCU_width; xindex++) {
+            MCU_buffer[blkn] = coef->dummy_buffer[blkn];
+            MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];
+            blkn++;
+          }
+        }
+      }
+      /* Try to write the MCU. */
+      if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
+        /* Suspension forced; update state counters and exit */
+        coef->MCU_vert_offset = yoffset;
+        coef->mcu_ctr = MCU_col_num;
+        return FALSE;
+      }
+    }
+    /* Completed an MCU row, but perhaps not an iMCU row */
+    coef->mcu_ctr = 0;
+  }
+  /* Completed the iMCU row, advance counters for next one */
+  coef->iMCU_row_num++;
+  start_iMCU_row(cinfo);
+  return TRUE;
+}
+
+
+/*
+ * Initialize coefficient buffer controller.
+ *
+ * Each passed coefficient array must be the right size for that
+ * coefficient: width_in_blocks wide and height_in_blocks high,
+ * with unitheight at least v_samp_factor.
+ */
+
+LOCAL(void)
+transencode_coef_controller (j_compress_ptr cinfo,
+                             jvirt_barray_ptr * coef_arrays)
+{
+  my_coef_ptr coef;
+  JBLOCKROW buffer;
+  int i;
+
+  coef = (my_coef_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_coef_controller));
+  cinfo->coef = (struct jpeg_c_coef_controller *) coef;
+  coef->pub.start_pass = start_pass_coef;
+  coef->pub.compress_data = compress_output;
+
+  /* Save pointer to virtual arrays */
+  coef->whole_image = coef_arrays;
+
+  /* Allocate and pre-zero space for dummy DCT blocks. */
+  buffer = (JBLOCKROW)
+    (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+  jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+  for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
+    coef->dummy_buffer[i] = buffer + i;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdapimin.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,399 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdapimin.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the decompression half
+ * of the JPEG library.  These are the "minimum" API routines that may be
+ * needed in either the normal full-decompression case or the
+ * transcoding-only case.
+ *
+ * Most of the routines intended to be called directly by an application
+ * are in this file or in jdapistd.c.  But also see jcomapi.c for routines
+ * shared by compression and decompression, and jdtrans.c for the transcoding
+ * case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Initialization of a JPEG decompression object.
+ * The error manager must already be set up (in case memory manager fails).
+ */
+
+GLOBAL(void)
+jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)
+{
+  int i;
+
+  /* Guard against version mismatches between library and caller. */
+  cinfo->mem = NULL;            /* so jpeg_destroy knows mem mgr not called */
+  if (version != JPEG_LIB_VERSION)
+    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
+  if (structsize != SIZEOF(struct jpeg_decompress_struct))
+    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
+             (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);
+
+  /* For debugging purposes, we zero the whole master structure.
+   * But the application has already set the err pointer, and may have set
+   * client_data, so we have to save and restore those fields.
+   * Note: if application hasn't set client_data, tools like Purify may
+   * complain here.
+   */
+  {
+    struct jpeg_error_mgr * err = cinfo->err;
+    void * client_data = cinfo->client_data; /* ignore Purify complaint here */
+    MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));
+    cinfo->err = err;
+    cinfo->client_data = client_data;
+  }
+  cinfo->is_decompressor = TRUE;
+
+  /* Initialize a memory manager instance for this object */
+  jinit_memory_mgr((j_common_ptr) cinfo);
+
+  /* Zero out pointers to permanent structures. */
+  cinfo->progress = NULL;
+  cinfo->src = NULL;
+
+  for (i = 0; i < NUM_QUANT_TBLS; i++)
+    cinfo->quant_tbl_ptrs[i] = NULL;
+
+  for (i = 0; i < NUM_HUFF_TBLS; i++) {
+    cinfo->dc_huff_tbl_ptrs[i] = NULL;
+    cinfo->ac_huff_tbl_ptrs[i] = NULL;
+  }
+
+  /* Initialize marker processor so application can override methods
+   * for COM, APPn markers before calling jpeg_read_header.
+   */
+  cinfo->marker_list = NULL;
+  jinit_marker_reader(cinfo);
+
+  /* And initialize the overall input controller. */
+  jinit_input_controller(cinfo);
+
+  /* OK, I'm ready */
+  cinfo->global_state = DSTATE_START;
+}
+
+
+/*
+ * Destruction of a JPEG decompression object
+ */
+
+GLOBAL(void)
+jpeg_destroy_decompress (j_decompress_ptr cinfo)
+{
+  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Abort processing of a JPEG decompression operation,
+ * but don't destroy the object itself.
+ */
+
+GLOBAL(void)
+jpeg_abort_decompress (j_decompress_ptr cinfo)
+{
+  jpeg_abort((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Set default decompression parameters.
+ */
+
+LOCAL(void)
+default_decompress_parms (j_decompress_ptr cinfo)
+{
+  /* Guess the input colorspace, and set output colorspace accordingly. */
+  /* (Wish JPEG committee had provided a real way to specify this...) */
+  /* Note application may override our guesses. */
+  switch (cinfo->num_components) {
+  case 1:
+    cinfo->jpeg_color_space = JCS_GRAYSCALE;
+    cinfo->out_color_space = JCS_GRAYSCALE;
+    break;
+
+  case 3:
+    if (cinfo->saw_JFIF_marker) {
+      cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
+    } else if (cinfo->saw_Adobe_marker) {
+      switch (cinfo->Adobe_transform) {
+      case 0:
+        cinfo->jpeg_color_space = JCS_RGB;
+        break;
+      case 1:
+        cinfo->jpeg_color_space = JCS_YCbCr;
+        break;
+      default:
+        WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
+        cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+        break;
+      }
+    } else {
+      /* Saw no special markers, try to guess from the component IDs */
+      int cid0 = cinfo->comp_info[0].component_id;
+      int cid1 = cinfo->comp_info[1].component_id;
+      int cid2 = cinfo->comp_info[2].component_id;
+
+      if (cid0 == 1 && cid1 == 2 && cid2 == 3)
+        cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
+      else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
+        cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
+      else {
+        TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
+        cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+      }
+    }
+    /* Always guess RGB is proper output colorspace. */
+    cinfo->out_color_space = JCS_RGB;
+    break;
+
+  case 4:
+    if (cinfo->saw_Adobe_marker) {
+      switch (cinfo->Adobe_transform) {
+      case 0:
+        cinfo->jpeg_color_space = JCS_CMYK;
+        break;
+      case 2:
+        cinfo->jpeg_color_space = JCS_YCCK;
+        break;
+      default:
+        WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
+        cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
+        break;
+      }
+    } else {
+      /* No special markers, assume straight CMYK. */
+      cinfo->jpeg_color_space = JCS_CMYK;
+    }
+    cinfo->out_color_space = JCS_CMYK;
+    break;
+
+  default:
+    cinfo->jpeg_color_space = JCS_UNKNOWN;
+    cinfo->out_color_space = JCS_UNKNOWN;
+    break;
+  }
+
+  /* Set defaults for other decompression parameters. */
+  cinfo->scale_num = 1;         /* 1:1 scaling */
+  cinfo->scale_denom = 1;
+  cinfo->output_gamma = 1.0;
+  cinfo->buffered_image = FALSE;
+  cinfo->raw_data_out = FALSE;
+  cinfo->dct_method = JDCT_DEFAULT;
+  cinfo->do_fancy_upsampling = TRUE;
+  cinfo->do_block_smoothing = TRUE;
+  cinfo->quantize_colors = FALSE;
+  /* We set these in case application only sets quantize_colors. */
+  cinfo->dither_mode = JDITHER_FS;
+#ifdef QUANT_2PASS_SUPPORTED
+  cinfo->two_pass_quantize = TRUE;
+#else
+  cinfo->two_pass_quantize = FALSE;
+#endif
+  cinfo->desired_number_of_colors = 256;
+  cinfo->colormap = NULL;
+  /* Initialize for no mode change in buffered-image mode. */
+  cinfo->enable_1pass_quant = FALSE;
+  cinfo->enable_external_quant = FALSE;
+  cinfo->enable_2pass_quant = FALSE;
+}
+
+
+/*
+ * Decompression startup: read start of JPEG datastream to see what's there.
+ * Need only initialize JPEG object and supply a data source before calling.
+ *
+ * This routine will read as far as the first SOS marker (ie, actual start of
+ * compressed data), and will save all tables and parameters in the JPEG
+ * object.  It will also initialize the decompression parameters to default
+ * values, and finally return JPEG_HEADER_OK.  On return, the application may
+ * adjust the decompression parameters and then call jpeg_start_decompress.
+ * (Or, if the application only wanted to determine the image parameters,
+ * the data need not be decompressed.  In that case, call jpeg_abort or
+ * jpeg_destroy to release any temporary space.)
+ * If an abbreviated (tables only) datastream is presented, the routine will
+ * return JPEG_HEADER_TABLES_ONLY upon reaching EOI.  The application may then
+ * re-use the JPEG object to read the abbreviated image datastream(s).
+ * It is unnecessary (but OK) to call jpeg_abort in this case.
+ * The JPEG_SUSPENDED return code only occurs if the data source module
+ * requests suspension of the decompressor.  In this case the application
+ * should load more source data and then re-call jpeg_read_header to resume
+ * processing.
+ * If a non-suspending data source is used and require_image is TRUE, then the
+ * return code need not be inspected since only JPEG_HEADER_OK is possible.
+ *
+ * This routine is now just a front end to jpeg_consume_input, with some
+ * extra error checking.
+ */
+
+GLOBAL(int)
+jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)
+{
+  int retcode;
+
+  if (cinfo->global_state != DSTATE_START &&
+      cinfo->global_state != DSTATE_INHEADER)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  retcode = jpeg_consume_input(cinfo);
+
+  switch (retcode) {
+  case JPEG_REACHED_SOS:
+    retcode = JPEG_HEADER_OK;
+    break;
+  case JPEG_REACHED_EOI:
+    if (require_image)          /* Complain if application wanted an image */
+      ERREXIT(cinfo, JERR_NO_IMAGE);
+    /* Reset to start state; it would be safer to require the application to
+     * call jpeg_abort, but we can't change it now for compatibility reasons.
+     * A side effect is to free any temporary memory (there shouldn't be any).
+     */
+    jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */
+    retcode = JPEG_HEADER_TABLES_ONLY;
+    break;
+  case JPEG_SUSPENDED:
+    /* no work */
+    break;
+  }
+
+  return retcode;
+}
+
+
+/*
+ * Consume data in advance of what the decompressor requires.
+ * This can be called at any time once the decompressor object has
+ * been created and a data source has been set up.
+ *
+ * This routine is essentially a state machine that handles a couple
+ * of critical state-transition actions, namely initial setup and
+ * transition from header scanning to ready-for-start_decompress.
+ * All the actual input is done via the input controller's consume_input
+ * method.
+ */
+
+GLOBAL(int)
+jpeg_consume_input (j_decompress_ptr cinfo)
+{
+  int retcode = JPEG_SUSPENDED;
+
+  /* NB: every possible DSTATE value should be listed in this switch */
+  switch (cinfo->global_state) {
+  case DSTATE_START:
+    /* Start-of-datastream actions: reset appropriate modules */
+    (*cinfo->inputctl->reset_input_controller) (cinfo);
+    /* Initialize application's data source module */
+    (*cinfo->src->init_source) (cinfo);
+    cinfo->global_state = DSTATE_INHEADER;
+    /*FALLTHROUGH*/
+  case DSTATE_INHEADER:
+    retcode = (*cinfo->inputctl->consume_input) (cinfo);
+    if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
+      /* Set up default parameters based on header data */
+      default_decompress_parms(cinfo);
+      /* Set global state: ready for start_decompress */
+      cinfo->global_state = DSTATE_READY;
+    }
+    break;
+  case DSTATE_READY:
+    /* Can't advance past first SOS until start_decompress is called */
+    retcode = JPEG_REACHED_SOS;
+    break;
+  case DSTATE_PRELOAD:
+  case DSTATE_PRESCAN:
+  case DSTATE_SCANNING:
+  case DSTATE_RAW_OK:
+  case DSTATE_BUFIMAGE:
+  case DSTATE_BUFPOST:
+  case DSTATE_STOPPING:
+    retcode = (*cinfo->inputctl->consume_input) (cinfo);
+    break;
+  default:
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  }
+  return retcode;
+}
+
+
+/*
+ * Have we finished reading the input file?
+ */
+
+GLOBAL(boolean)
+jpeg_input_complete (j_decompress_ptr cinfo)
+{
+  /* Check for valid jpeg object */
+  if (cinfo->global_state < DSTATE_START ||
+      cinfo->global_state > DSTATE_STOPPING)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  return cinfo->inputctl->eoi_reached;
+}
+
+
+/*
+ * Is there more than one scan?
+ */
+
+GLOBAL(boolean)
+jpeg_has_multiple_scans (j_decompress_ptr cinfo)
+{
+  /* Only valid after jpeg_read_header completes */
+  if (cinfo->global_state < DSTATE_READY ||
+      cinfo->global_state > DSTATE_STOPPING)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  return cinfo->inputctl->has_multiple_scans;
+}
+
+
+/*
+ * Finish JPEG decompression.
+ *
+ * This will normally just verify the file trailer and release temp storage.
+ *
+ * Returns FALSE if suspended.  The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_finish_decompress (j_decompress_ptr cinfo)
+{
+  if ((cinfo->global_state == DSTATE_SCANNING ||
+       cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {
+    /* Terminate final pass of non-buffered mode */
+    if (cinfo->output_scanline < cinfo->output_height)
+      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
+    (*cinfo->master->finish_output_pass) (cinfo);
+    cinfo->global_state = DSTATE_STOPPING;
+  } else if (cinfo->global_state == DSTATE_BUFIMAGE) {
+    /* Finishing after a buffered-image operation */
+    cinfo->global_state = DSTATE_STOPPING;
+  } else if (cinfo->global_state != DSTATE_STOPPING) {
+    /* STOPPING = repeat call after a suspension, anything else is error */
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  }
+  /* Read until EOI */
+  while (! cinfo->inputctl->eoi_reached) {
+    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
+      return FALSE;             /* Suspend, come back later */
+  }
+  /* Do final cleanup */
+  (*cinfo->src->term_source) (cinfo);
+  /* We can use jpeg_abort to release memory and reset global_state */
+  jpeg_abort((j_common_ptr) cinfo);
+  return TRUE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdapistd.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,279 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdapistd.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the decompression half
+ * of the JPEG library.  These are the "standard" API routines that are
+ * used in the normal full-decompression case.  They are not used by a
+ * transcoding-only application.  Note that if an application links in
+ * jpeg_start_decompress, it will end up linking in the entire decompressor.
+ * We thus must separate this file from jdapimin.c to avoid linking the
+ * whole decompression library into a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Decompression initialization.
+ * jpeg_read_header must be completed before calling this.
+ *
+ * If a multipass operating mode was selected, this will do all but the
+ * last pass, and thus may take a great deal of time.
+ *
+ * Returns FALSE if suspended.  The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_start_decompress (j_decompress_ptr cinfo)
+{
+  if (cinfo->global_state == DSTATE_READY) {
+    /* First call: initialize master control, select active modules */
+    jinit_master_decompress(cinfo);
+    if (cinfo->buffered_image) {
+      /* No more work here; expecting jpeg_start_output next */
+      cinfo->global_state = DSTATE_BUFIMAGE;
+      return TRUE;
+    }
+    cinfo->global_state = DSTATE_PRELOAD;
+  }
+  if (cinfo->global_state == DSTATE_PRELOAD) {
+    /* If file has multiple scans, absorb them all into the coef buffer */
+    if (cinfo->inputctl->has_multiple_scans) {
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+      for (;;) {
+        int retcode;
+        /* Call progress monitor hook if present */
+        if (cinfo->progress != NULL)
+          (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+        /* Absorb some more input */
+        retcode = (*cinfo->inputctl->consume_input) (cinfo);
+        if (retcode == JPEG_SUSPENDED)
+          return FALSE;
+        if (retcode == JPEG_REACHED_EOI)
+          break;
+        /* Advance progress counter if appropriate */
+        if (cinfo->progress != NULL &&
+            (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
+          if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
+            /* jdmaster underestimated number of scans; ratchet up one scan */
+            cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
+          }
+        }
+      }
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+    }
+    cinfo->output_scan_number = cinfo->input_scan_number;
+  } else if (cinfo->global_state != DSTATE_PRESCAN)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  /* Perform any dummy output passes, and set up for the final pass */
+  return output_pass_setup(cinfo);
+}
+
+
+/*
+ * Set up for an output pass, and perform any dummy pass(es) needed.
+ * Common subroutine for jpeg_start_decompress and jpeg_start_output.
+ * Entry: global_state = DSTATE_PRESCAN only if previously suspended.
+ * Exit: If done, returns TRUE and sets global_state for proper output mode.
+ *       If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.
+ */
+
+LOCAL(boolean)
+output_pass_setup (j_decompress_ptr cinfo)
+{
+  if (cinfo->global_state != DSTATE_PRESCAN) {
+    /* First call: do pass setup */
+    (*cinfo->master->prepare_for_output_pass) (cinfo);
+    cinfo->output_scanline = 0;
+    cinfo->global_state = DSTATE_PRESCAN;
+  }
+  /* Loop over any required dummy passes */
+  while (cinfo->master->is_dummy_pass) {
+#ifdef QUANT_2PASS_SUPPORTED
+    /* Crank through the dummy pass */
+    while (cinfo->output_scanline < cinfo->output_height) {
+      JDIMENSION last_scanline;
+      /* Call progress monitor hook if present */
+      if (cinfo->progress != NULL) {
+        cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+        cinfo->progress->pass_limit = (long) cinfo->output_height;
+        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+      }
+      /* Process some data */
+      last_scanline = cinfo->output_scanline;
+      (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
+                                    &cinfo->output_scanline, (JDIMENSION) 0);
+      if (cinfo->output_scanline == last_scanline)
+        return FALSE;           /* No progress made, must suspend */
+    }
+    /* Finish up dummy pass, and set up for another one */
+    (*cinfo->master->finish_output_pass) (cinfo);
+    (*cinfo->master->prepare_for_output_pass) (cinfo);
+    cinfo->output_scanline = 0;
+#else
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* QUANT_2PASS_SUPPORTED */
+  }
+  /* Ready for application to drive output pass through
+   * jpeg_read_scanlines or jpeg_read_raw_data.
+   */
+  cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
+  return TRUE;
+}
+
+
+/*
+ * Read some scanlines of data from the JPEG decompressor.
+ *
+ * The return value will be the number of lines actually read.
+ * This may be less than the number requested in several cases,
+ * including bottom of image, data source suspension, and operating
+ * modes that emit multiple scanlines at a time.
+ *
+ * Note: we warn about excess calls to jpeg_read_scanlines() since
+ * this likely signals an application programmer error.  However,
+ * an oversize buffer (max_lines > scanlines remaining) is not an error.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
+                     JDIMENSION max_lines)
+{
+  JDIMENSION row_ctr;
+
+  if (cinfo->global_state != DSTATE_SCANNING)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  if (cinfo->output_scanline >= cinfo->output_height) {
+    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+    return 0;
+  }
+
+  /* Call progress monitor hook if present */
+  if (cinfo->progress != NULL) {
+    cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+    cinfo->progress->pass_limit = (long) cinfo->output_height;
+    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+  }
+
+  /* Process some data */
+  row_ctr = 0;
+  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
+  cinfo->output_scanline += row_ctr;
+  return row_ctr;
+}
+
+
+/*
+ * Alternate entry point to read raw data.
+ * Processes exactly one iMCU row per call, unless suspended.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
+                    JDIMENSION max_lines)
+{
+  JDIMENSION lines_per_iMCU_row;
+
+  if (cinfo->global_state != DSTATE_RAW_OK)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  if (cinfo->output_scanline >= cinfo->output_height) {
+    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+    return 0;
+  }
+
+  /* Call progress monitor hook if present */
+  if (cinfo->progress != NULL) {
+    cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+    cinfo->progress->pass_limit = (long) cinfo->output_height;
+    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+  }
+
+  /* Verify that at least one iMCU row can be returned. */
+  lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;
+  if (max_lines < lines_per_iMCU_row)
+    ERREXIT(cinfo, JERR_BUFFER_SIZE);
+
+  /* Decompress directly into user's buffer. */
+  if (! (*cinfo->coef->decompress_data) (cinfo, data))
+    return 0;                   /* suspension forced, can do nothing more */
+
+  /* OK, we processed one iMCU row. */
+  cinfo->output_scanline += lines_per_iMCU_row;
+  return lines_per_iMCU_row;
+}
+
+
+/* Additional entry points for buffered-image mode. */
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Initialize for an output pass in buffered-image mode.
+ */
+
+GLOBAL(boolean)
+jpeg_start_output (j_decompress_ptr cinfo, int scan_number)
+{
+  if (cinfo->global_state != DSTATE_BUFIMAGE &&
+      cinfo->global_state != DSTATE_PRESCAN)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  /* Limit scan number to valid range */
+  if (scan_number <= 0)
+    scan_number = 1;
+  if (cinfo->inputctl->eoi_reached &&
+      scan_number > cinfo->input_scan_number)
+    scan_number = cinfo->input_scan_number;
+  cinfo->output_scan_number = scan_number;
+  /* Perform any dummy output passes, and set up for the real pass */
+  return output_pass_setup(cinfo);
+}
+
+
+/*
+ * Finish up after an output pass in buffered-image mode.
+ *
+ * Returns FALSE if suspended.  The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_finish_output (j_decompress_ptr cinfo)
+{
+  if ((cinfo->global_state == DSTATE_SCANNING ||
+       cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {
+    /* Terminate this pass. */
+    /* We do not require the whole pass to have been completed. */
+    (*cinfo->master->finish_output_pass) (cinfo);
+    cinfo->global_state = DSTATE_BUFPOST;
+  } else if (cinfo->global_state != DSTATE_BUFPOST) {
+    /* BUFPOST = repeat call after a suspension, anything else is error */
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  }
+  /* Read markers looking for SOS or EOI */
+  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
+         ! cinfo->inputctl->eoi_reached) {
+    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
+      return FALSE;             /* Suspend, come back later */
+  }
+  cinfo->global_state = DSTATE_BUFIMAGE;
+  return TRUE;
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdcoefct.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,740 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdcoefct.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the coefficient buffer controller for decompression.
+ * This controller is the top level of the JPEG decompressor proper.
+ * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
+ *
+ * In buffered-image mode, this controller is the interface between
+ * input-oriented processing and output-oriented processing.
+ * Also, the input side (only) is used when reading a file for transcoding.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+/* Block smoothing is only applicable for progressive JPEG, so: */
+#ifndef D_PROGRESSIVE_SUPPORTED
+#undef BLOCK_SMOOTHING_SUPPORTED
+#endif
+
+/* Private buffer controller object */
+
+typedef struct {
+  struct jpeg_d_coef_controller pub; /* public fields */
+
+  /* These variables keep track of the current location of the input side. */
+  /* cinfo->input_iMCU_row is also used for this. */
+  JDIMENSION MCU_ctr;           /* counts MCUs processed in current row */
+  int MCU_vert_offset;          /* counts MCU rows within iMCU row */
+  int MCU_rows_per_iMCU_row;    /* number of such rows needed */
+
+  /* The output side's location is represented by cinfo->output_iMCU_row. */
+
+  /* In single-pass modes, it's sufficient to buffer just one MCU.
+   * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,
+   * and let the entropy decoder write into that workspace each time.
+   * (On 80x86, the workspace is FAR even though it's not really very big;
+   * this is to keep the module interfaces unchanged when a large coefficient
+   * buffer is necessary.)
+   * In multi-pass modes, this array points to the current MCU's blocks
+   * within the virtual arrays; it is used only by the input side.
+   */
+  JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+  /* In multi-pass modes, we need a virtual block array for each component. */
+  jvirt_barray_ptr whole_image[MAX_COMPONENTS];
+#endif
+
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+  /* When doing block smoothing, we latch coefficient Al values here */
+  int * coef_bits_latch;
+#define SAVED_COEFS  6          /* we save coef_bits[0..5] */
+#endif
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+/* Forward declarations */
+METHODDEF(int) decompress_onepass
+        JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+METHODDEF(int) decompress_data
+        JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#endif
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo));
+METHODDEF(int) decompress_smooth_data
+        JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#endif
+
+
+LOCAL(void)
+start_iMCU_row (j_decompress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row (input side) */
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+  /* In an interleaved scan, an MCU row is the same as an iMCU row.
+   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+   * But at the bottom of the image, process only what's left.
+   */
+  if (cinfo->comps_in_scan > 1) {
+    coef->MCU_rows_per_iMCU_row = 1;
+  } else {
+    if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1))
+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+    else
+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+  }
+
+  coef->MCU_ctr = 0;
+  coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for an input processing pass.
+ */
+
+METHODDEF(void)
+start_input_pass (j_decompress_ptr cinfo)
+{
+  cinfo->input_iMCU_row = 0;
+  start_iMCU_row(cinfo);
+}
+
+
+/*
+ * Initialize for an output processing pass.
+ */
+
+METHODDEF(void)
+start_output_pass (j_decompress_ptr cinfo)
+{
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+  /* If multipass, check to see whether to use block smoothing on this pass */
+  if (coef->pub.coef_arrays != NULL) {
+    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
+      coef->pub.decompress_data = decompress_smooth_data;
+    else
+      coef->pub.decompress_data = decompress_data;
+  }
+#endif
+  cinfo->output_iMCU_row = 0;
+}
+
+
+/*
+ * Decompress and return some data in the single-pass case.
+ * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
+ * Input and output must run in lockstep since we have only a one-MCU buffer.
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ *
+ * NB: output_buf contains a plane for each component in image,
+ * which we index according to the component's SOF position.
+ */
+
+METHODDEF(int)
+decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  JDIMENSION MCU_col_num;       /* index of current MCU within row */
+  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+  int blkn, ci, xindex, yindex, yoffset, useful_width;
+  JSAMPARRAY output_ptr;
+  JDIMENSION start_col, output_col;
+  jpeg_component_info *compptr;
+  inverse_DCT_method_ptr inverse_DCT;
+
+  /* Loop to process as much as one whole iMCU row */
+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+       yoffset++) {
+    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
+         MCU_col_num++) {
+      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
+      jzero_far((void FAR *) coef->MCU_buffer[0],
+                (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
+      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
+        /* Suspension forced; update state counters and exit */
+        coef->MCU_vert_offset = yoffset;
+        coef->MCU_ctr = MCU_col_num;
+        return JPEG_SUSPENDED;
+      }
+      /* Determine where data should go in output_buf and do the IDCT thing.
+       * We skip dummy blocks at the right and bottom edges (but blkn gets
+       * incremented past them!).  Note the inner loop relies on having
+       * allocated the MCU_buffer[] blocks sequentially.
+       */
+      blkn = 0;                 /* index of current DCT block within MCU */
+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+        compptr = cinfo->cur_comp_info[ci];
+        /* Don't bother to IDCT an uninteresting component. */
+        if (! compptr->component_needed) {
+          blkn += compptr->MCU_blocks;
+          continue;
+        }
+        inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
+        useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+                                                    : compptr->last_col_width;
+        output_ptr = output_buf[compptr->component_index] +
+          yoffset * compptr->DCT_scaled_size;
+        start_col = MCU_col_num * compptr->MCU_sample_width;
+        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+          if (cinfo->input_iMCU_row < last_iMCU_row ||
+              yoffset+yindex < compptr->last_row_height) {
+            output_col = start_col;
+            for (xindex = 0; xindex < useful_width; xindex++) {
+              (*inverse_DCT) (cinfo, compptr,
+                              (JCOEFPTR) coef->MCU_buffer[blkn+xindex],
+                              output_ptr, output_col);
+              output_col += compptr->DCT_scaled_size;
+            }
+          }
+          blkn += compptr->MCU_width;
+          output_ptr += compptr->DCT_scaled_size;
+        }
+      }
+    }
+    /* Completed an MCU row, but perhaps not an iMCU row */
+    coef->MCU_ctr = 0;
+  }
+  /* Completed the iMCU row, advance counters for next one */
+  cinfo->output_iMCU_row++;
+  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
+    start_iMCU_row(cinfo);
+    return JPEG_ROW_COMPLETED;
+  }
+  /* Completed the scan */
+  (*cinfo->inputctl->finish_input_pass) (cinfo);
+  return JPEG_SCAN_COMPLETED;
+}
+
+
+/*
+ * Dummy consume-input routine for single-pass operation.
+ */
+
+METHODDEF(int)
+dummy_consume_data (j_decompress_ptr cinfo)
+{
+  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
+}
+
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Consume input data and store it in the full-image coefficient buffer.
+ * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
+ * ie, v_samp_factor block rows for each component in the scan.
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ */
+
+METHODDEF(int)
+consume_data (j_decompress_ptr cinfo)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  JDIMENSION MCU_col_num;       /* index of current MCU within row */
+  int blkn, ci, xindex, yindex, yoffset;
+  JDIMENSION start_col;
+  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+  JBLOCKROW buffer_ptr;
+  jpeg_component_info *compptr;
+
+  /* Align the virtual buffers for the components used in this scan. */
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    buffer[ci] = (*cinfo->mem->access_virt_barray)
+      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+       cinfo->input_iMCU_row * compptr->v_samp_factor,
+       (JDIMENSION) compptr->v_samp_factor, TRUE);
+    /* Note: entropy decoder expects buffer to be zeroed,
+     * but this is handled automatically by the memory manager
+     * because we requested a pre-zeroed array.
+     */
+  }
+
+  /* Loop to process one whole iMCU row */
+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+       yoffset++) {
+    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
+         MCU_col_num++) {
+      /* Construct list of pointers to DCT blocks belonging to this MCU */
+      blkn = 0;                 /* index of current DCT block within MCU */
+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+        compptr = cinfo->cur_comp_info[ci];
+        start_col = MCU_col_num * compptr->MCU_width;
+        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+          buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
+            coef->MCU_buffer[blkn++] = buffer_ptr++;
+          }
+        }
+      }
+      /* Try to fetch the MCU. */
+      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
+        /* Suspension forced; update state counters and exit */
+        coef->MCU_vert_offset = yoffset;
+        coef->MCU_ctr = MCU_col_num;
+        return JPEG_SUSPENDED;
+      }
+    }
+    /* Completed an MCU row, but perhaps not an iMCU row */
+    coef->MCU_ctr = 0;
+  }
+  /* Completed the iMCU row, advance counters for next one */
+  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
+    start_iMCU_row(cinfo);
+    return JPEG_ROW_COMPLETED;
+  }
+  /* Completed the scan */
+  (*cinfo->inputctl->finish_input_pass) (cinfo);
+  return JPEG_SCAN_COMPLETED;
+}
+
+
+/*
+ * Decompress and return some data in the multi-pass case.
+ * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ *
+ * NB: output_buf contains a plane for each component in image.
+ */
+
+METHODDEF(int)
+decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+  JDIMENSION block_num;
+  int ci, block_row, block_rows;
+  JBLOCKARRAY buffer;
+  JBLOCKROW buffer_ptr;
+  JSAMPARRAY output_ptr;
+  JDIMENSION output_col;
+  jpeg_component_info *compptr;
+  inverse_DCT_method_ptr inverse_DCT;
+
+  /* Force some input to be done if we are getting ahead of the input. */
+  while (cinfo->input_scan_number < cinfo->output_scan_number ||
+         (cinfo->input_scan_number == cinfo->output_scan_number &&
+          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
+    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
+      return JPEG_SUSPENDED;
+  }
+
+  /* OK, output from the virtual arrays. */
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Don't bother to IDCT an uninteresting component. */
+    if (! compptr->component_needed)
+      continue;
+    /* Align the virtual buffer for this component. */
+    buffer = (*cinfo->mem->access_virt_barray)
+      ((j_common_ptr) cinfo, coef->whole_image[ci],
+       cinfo->output_iMCU_row * compptr->v_samp_factor,
+       (JDIMENSION) compptr->v_samp_factor, FALSE);
+    /* Count non-dummy DCT block rows in this iMCU row. */
+    if (cinfo->output_iMCU_row < last_iMCU_row)
+      block_rows = compptr->v_samp_factor;
+    else {
+      /* NB: can't use last_row_height here; it is input-side-dependent! */
+      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+      if (block_rows == 0) block_rows = compptr->v_samp_factor;
+    }
+    inverse_DCT = cinfo->idct->inverse_DCT[ci];
+    output_ptr = output_buf[ci];
+    /* Loop over all DCT blocks to be processed. */
+    for (block_row = 0; block_row < block_rows; block_row++) {
+      buffer_ptr = buffer[block_row];
+      output_col = 0;
+      for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) {
+        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr,
+                        output_ptr, output_col);
+        buffer_ptr++;
+        output_col += compptr->DCT_scaled_size;
+      }
+      output_ptr += compptr->DCT_scaled_size;
+    }
+  }
+
+  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
+    return JPEG_ROW_COMPLETED;
+  return JPEG_SCAN_COMPLETED;
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+
+
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+
+/*
+ * This code applies interblock smoothing as described by section K.8
+ * of the JPEG standard: the first 5 AC coefficients are estimated from
+ * the DC values of a DCT block and its 8 neighboring blocks.
+ * We apply smoothing only for progressive JPEG decoding, and only if
+ * the coefficients it can estimate are not yet known to full precision.
+ */
+
+/* Natural-order array positions of the first 5 zigzag-order coefficients */
+#define Q01_POS  1
+#define Q10_POS  8
+#define Q20_POS  16
+#define Q11_POS  9
+#define Q02_POS  2
+
+/*
+ * Determine whether block smoothing is applicable and safe.
+ * We also latch the current states of the coef_bits[] entries for the
+ * AC coefficients; otherwise, if the input side of the decompressor
+ * advances into a new scan, we might think the coefficients are known
+ * more accurately than they really are.
+ */
+
+LOCAL(boolean)
+smoothing_ok (j_decompress_ptr cinfo)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  boolean smoothing_useful = FALSE;
+  int ci, coefi;
+  jpeg_component_info *compptr;
+  JQUANT_TBL * qtable;
+  int * coef_bits;
+  int * coef_bits_latch;
+
+  if (! cinfo->progressive_mode || cinfo->coef_bits == NULL)
+    return FALSE;
+
+  /* Allocate latch area if not already done */
+  if (coef->coef_bits_latch == NULL)
+    coef->coef_bits_latch = (int *)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  cinfo->num_components *
+                                  (SAVED_COEFS * SIZEOF(int)));
+  coef_bits_latch = coef->coef_bits_latch;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* All components' quantization values must already be latched. */
+    if ((qtable = compptr->quant_table) == NULL)
+      return FALSE;
+    /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */
+    if (qtable->quantval[0] == 0 ||
+        qtable->quantval[Q01_POS] == 0 ||
+        qtable->quantval[Q10_POS] == 0 ||
+        qtable->quantval[Q20_POS] == 0 ||
+        qtable->quantval[Q11_POS] == 0 ||
+        qtable->quantval[Q02_POS] == 0)
+      return FALSE;
+    /* DC values must be at least partly known for all components. */
+    coef_bits = cinfo->coef_bits[ci];
+    if (coef_bits[0] < 0)
+      return FALSE;
+    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
+    for (coefi = 1; coefi <= 5; coefi++) {
+      coef_bits_latch[coefi] = coef_bits[coefi];
+      if (coef_bits[coefi] != 0)
+        smoothing_useful = TRUE;
+    }
+    coef_bits_latch += SAVED_COEFS;
+  }
+
+  return smoothing_useful;
+}
+
+
+/*
+ * Variant of decompress_data for use when doing block smoothing.
+ */
+
+METHODDEF(int)
+decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+  JDIMENSION block_num, last_block_column;
+  int ci, block_row, block_rows, access_rows;
+  JBLOCKARRAY buffer;
+  JBLOCKROW buffer_ptr, prev_block_row, next_block_row;
+  JSAMPARRAY output_ptr;
+  JDIMENSION output_col;
+  jpeg_component_info *compptr;
+  inverse_DCT_method_ptr inverse_DCT;
+  boolean first_row, last_row;
+  JBLOCK workspace;
+  int *coef_bits;
+  JQUANT_TBL *quanttbl;
+  INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;
+  int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;
+  int Al, pred;
+
+  /* Force some input to be done if we are getting ahead of the input. */
+  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
+         ! cinfo->inputctl->eoi_reached) {
+    if (cinfo->input_scan_number == cinfo->output_scan_number) {
+      /* If input is working on current scan, we ordinarily want it to
+       * have completed the current row.  But if input scan is DC,
+       * we want it to keep one row ahead so that next block row's DC
+       * values are up to date.
+       */
+      JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;
+      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)
+        break;
+    }
+    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
+      return JPEG_SUSPENDED;
+  }
+
+  /* OK, output from the virtual arrays. */
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Don't bother to IDCT an uninteresting component. */
+    if (! compptr->component_needed)
+      continue;
+    /* Count non-dummy DCT block rows in this iMCU row. */
+    if (cinfo->output_iMCU_row < last_iMCU_row) {
+      block_rows = compptr->v_samp_factor;
+      access_rows = block_rows * 2; /* this and next iMCU row */
+      last_row = FALSE;
+    } else {
+      /* NB: can't use last_row_height here; it is input-side-dependent! */
+      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+      if (block_rows == 0) block_rows = compptr->v_samp_factor;
+      access_rows = block_rows; /* this iMCU row only */
+      last_row = TRUE;
+    }
+    /* Align the virtual buffer for this component. */
+    if (cinfo->output_iMCU_row > 0) {
+      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
+      buffer = (*cinfo->mem->access_virt_barray)
+        ((j_common_ptr) cinfo, coef->whole_image[ci],
+         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
+         (JDIMENSION) access_rows, FALSE);
+      buffer += compptr->v_samp_factor; /* point to current iMCU row */
+      first_row = FALSE;
+    } else {
+      buffer = (*cinfo->mem->access_virt_barray)
+        ((j_common_ptr) cinfo, coef->whole_image[ci],
+         (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);
+      first_row = TRUE;
+    }
+    /* Fetch component-dependent info */
+    coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
+    quanttbl = compptr->quant_table;
+    Q00 = quanttbl->quantval[0];
+    Q01 = quanttbl->quantval[Q01_POS];
+    Q10 = quanttbl->quantval[Q10_POS];
+    Q20 = quanttbl->quantval[Q20_POS];
+    Q11 = quanttbl->quantval[Q11_POS];
+    Q02 = quanttbl->quantval[Q02_POS];
+    inverse_DCT = cinfo->idct->inverse_DCT[ci];
+    output_ptr = output_buf[ci];
+    /* Loop over all DCT blocks to be processed. */
+    for (block_row = 0; block_row < block_rows; block_row++) {
+      buffer_ptr = buffer[block_row];
+      if (first_row && block_row == 0)
+        prev_block_row = buffer_ptr;
+      else
+        prev_block_row = buffer[block_row-1];
+      if (last_row && block_row == block_rows-1)
+        next_block_row = buffer_ptr;
+      else
+        next_block_row = buffer[block_row+1];
+      /* We fetch the surrounding DC values using a sliding-register approach.
+       * Initialize all nine here so as to do the right thing on narrow pics.
+       */
+      DC1 = DC2 = DC3 = (int) prev_block_row[0][0];
+      DC4 = DC5 = DC6 = (int) buffer_ptr[0][0];
+      DC7 = DC8 = DC9 = (int) next_block_row[0][0];
+      output_col = 0;
+      last_block_column = compptr->width_in_blocks - 1;
+      for (block_num = 0; block_num <= last_block_column; block_num++) {
+        /* Fetch current DCT block into workspace so we can modify it. */
+        jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1);
+        /* Update DC values */
+        if (block_num < last_block_column) {
+          DC3 = (int) prev_block_row[1][0];
+          DC6 = (int) buffer_ptr[1][0];
+          DC9 = (int) next_block_row[1][0];
+        }
+        /* Compute coefficient estimates per K.8.
+         * An estimate is applied only if coefficient is still zero,
+         * and is not known to be fully accurate.
+         */
+        /* AC01 */
+        if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) {
+          num = 36 * Q00 * (DC4 - DC6);
+          if (num >= 0) {
+            pred = (int) (((Q01<<7) + num) / (Q01<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+          } else {
+            pred = (int) (((Q01<<7) - num) / (Q01<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+            pred = -pred;
+          }
+          workspace[1] = (JCOEF) pred;
+        }
+        /* AC10 */
+        if ((Al=coef_bits[2]) != 0 && workspace[8] == 0) {
+          num = 36 * Q00 * (DC2 - DC8);
+          if (num >= 0) {
+            pred = (int) (((Q10<<7) + num) / (Q10<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+          } else {
+            pred = (int) (((Q10<<7) - num) / (Q10<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+            pred = -pred;
+          }
+          workspace[8] = (JCOEF) pred;
+        }
+        /* AC20 */
+        if ((Al=coef_bits[3]) != 0 && workspace[16] == 0) {
+          num = 9 * Q00 * (DC2 + DC8 - 2*DC5);
+          if (num >= 0) {
+            pred = (int) (((Q20<<7) + num) / (Q20<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+          } else {
+            pred = (int) (((Q20<<7) - num) / (Q20<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+            pred = -pred;
+          }
+          workspace[16] = (JCOEF) pred;
+        }
+        /* AC11 */
+        if ((Al=coef_bits[4]) != 0 && workspace[9] == 0) {
+          num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);
+          if (num >= 0) {
+            pred = (int) (((Q11<<7) + num) / (Q11<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+          } else {
+            pred = (int) (((Q11<<7) - num) / (Q11<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+            pred = -pred;
+          }
+          workspace[9] = (JCOEF) pred;
+        }
+        /* AC02 */
+        if ((Al=coef_bits[5]) != 0 && workspace[2] == 0) {
+          num = 9 * Q00 * (DC4 + DC6 - 2*DC5);
+          if (num >= 0) {
+            pred = (int) (((Q02<<7) + num) / (Q02<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+          } else {
+            pred = (int) (((Q02<<7) - num) / (Q02<<8));
+            if (Al > 0 && pred >= (1<<Al))
+              pred = (1<<Al)-1;
+            pred = -pred;
+          }
+          workspace[2] = (JCOEF) pred;
+        }
+        /* OK, do the IDCT */
+        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace,
+                        output_ptr, output_col);
+        /* Advance for next column */
+        DC1 = DC2; DC2 = DC3;
+        DC4 = DC5; DC5 = DC6;
+        DC7 = DC8; DC8 = DC9;
+        buffer_ptr++, prev_block_row++, next_block_row++;
+        output_col += compptr->DCT_scaled_size;
+      }
+      output_ptr += compptr->DCT_scaled_size;
+    }
+  }
+
+  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
+    return JPEG_ROW_COMPLETED;
+  return JPEG_SCAN_COMPLETED;
+}
+
+#endif /* BLOCK_SMOOTHING_SUPPORTED */
+
+
+/*
+ * Initialize coefficient buffer controller.
+ */
+
+GLOBAL(void)
+jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+  my_coef_ptr coef;
+
+  coef = (my_coef_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_coef_controller));
+  cinfo->coef = (struct jpeg_d_coef_controller *) coef;
+  coef->pub.start_input_pass = start_input_pass;
+  coef->pub.start_output_pass = start_output_pass;
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+  coef->coef_bits_latch = NULL;
+#endif
+
+  /* Create the coefficient buffer. */
+  if (need_full_buffer) {
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+    /* Allocate a full-image virtual array for each component, */
+    /* padded to a multiple of samp_factor DCT blocks in each direction. */
+    /* Note we ask for a pre-zeroed array. */
+    int ci, access_rows;
+    jpeg_component_info *compptr;
+
+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+         ci++, compptr++) {
+      access_rows = compptr->v_samp_factor;
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+      /* If block smoothing could be used, need a bigger window */
+      if (cinfo->progressive_mode)
+        access_rows *= 3;
+#endif
+      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
+        ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE,
+         (JDIMENSION) jround_up((long) compptr->width_in_blocks,
+                                (long) compptr->h_samp_factor),
+         (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+                                (long) compptr->v_samp_factor),
+         (JDIMENSION) access_rows);
+    }
+    coef->pub.consume_data = consume_data;
+    coef->pub.decompress_data = decompress_data;
+    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
+#else
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+  } else {
+    /* We only need a single-MCU buffer. */
+    JBLOCKROW buffer;
+    int i;
+
+    buffer = (JBLOCKROW)
+      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
+      coef->MCU_buffer[i] = buffer + i;
+    }
+    coef->pub.consume_data = dummy_consume_data;
+    coef->pub.decompress_data = decompress_onepass;
+    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdcolor.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,398 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdcolor.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains output colorspace conversion routines.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private subobject */
+
+typedef struct {
+  struct jpeg_color_deconverter pub; /* public fields */
+
+  /* Private state for YCC->RGB conversion */
+  int * Cr_r_tab;               /* => table for Cr to R conversion */
+  int * Cb_b_tab;               /* => table for Cb to B conversion */
+  INT32 * Cr_g_tab;             /* => table for Cr to G conversion */
+  INT32 * Cb_g_tab;             /* => table for Cb to G conversion */
+} my_color_deconverter;
+
+typedef my_color_deconverter * my_cconvert_ptr;
+
+
+/**************** YCbCr -> RGB conversion: most common case **************/
+
+/*
+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * The conversion equations to be implemented are therefore
+ *      R = Y                + 1.40200 * Cr
+ *      G = Y - 0.34414 * Cb - 0.71414 * Cr
+ *      B = Y + 1.77200 * Cb
+ * where Cb and Cr represent the incoming values less CENTERJSAMPLE.
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ *
+ * To avoid floating-point arithmetic, we represent the fractional constants
+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
+ * the products by 2^16, with appropriate rounding, to get the correct answer.
+ * Notice that Y, being an integral input, does not contribute any fraction
+ * so it need not participate in the rounding.
+ *
+ * For even more speed, we avoid doing any multiplications in the inner loop
+ * by precalculating the constants times Cb and Cr for all possible values.
+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
+ * for 12-bit samples it is still acceptable.  It's not very reasonable for
+ * 16-bit samples, but if you want lossless storage you shouldn't be changing
+ * colorspace anyway.
+ * The Cr=>R and Cb=>B values can be rounded to integers in advance; the
+ * values for the G calculation are left scaled up, since we must add them
+ * together before rounding.
+ */
+
+#define SCALEBITS       16      /* speediest right-shift on some machines */
+#define ONE_HALF        ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x)          ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+
+/*
+ * Initialize tables for YCC->RGB colorspace conversion.
+ */
+
+LOCAL(void)
+build_ycc_rgb_table (j_decompress_ptr cinfo)
+{
+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+  int i;
+  INT32 x;
+  SHIFT_TEMPS
+
+  cconvert->Cr_r_tab = (int *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (MAXJSAMPLE+1) * SIZEOF(int));
+  cconvert->Cb_b_tab = (int *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (MAXJSAMPLE+1) * SIZEOF(int));
+  cconvert->Cr_g_tab = (INT32 *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (MAXJSAMPLE+1) * SIZEOF(INT32));
+  cconvert->Cb_g_tab = (INT32 *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+    /* Cr=>R value is nearest int to 1.40200 * x */
+    cconvert->Cr_r_tab[i] = (int)
+                    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
+    /* Cb=>B value is nearest int to 1.77200 * x */
+    cconvert->Cb_b_tab[i] = (int)
+                    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
+    /* Cr=>G value is scaled-up -0.71414 * x */
+    cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
+    /* Cb=>G value is scaled-up -0.34414 * x */
+    /* We also add in ONE_HALF so that need not do it in inner loop */
+    cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+  }
+}
+
+
+/*
+ * Convert some rows of samples to the output colorspace.
+ *
+ * Note that we change from noninterleaved, one-plane-per-component format
+ * to interleaved-pixel format.  The output buffer is therefore three times
+ * as wide as the input buffer.
+ * A starting row offset is provided only for the input buffer.  The caller
+ * can easily adjust the passed output_buf value to accommodate any row
+ * offset required on that side.
+ */
+
+METHODDEF(void)
+ycc_rgb_convert (j_decompress_ptr cinfo,
+                 JSAMPIMAGE input_buf, JDIMENSION input_row,
+                 JSAMPARRAY output_buf, int num_rows)
+{
+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+  register int y, cb, cr;
+  register JSAMPROW outptr;
+  register JSAMPROW inptr0, inptr1, inptr2;
+  register JDIMENSION col;
+  JDIMENSION num_cols = cinfo->output_width;
+  /* copy these pointers into registers if possible */
+  register JSAMPLE * range_limit = cinfo->sample_range_limit;
+  register int * Crrtab = cconvert->Cr_r_tab;
+  register int * Cbbtab = cconvert->Cb_b_tab;
+  register INT32 * Crgtab = cconvert->Cr_g_tab;
+  register INT32 * Cbgtab = cconvert->Cb_g_tab;
+  SHIFT_TEMPS
+
+  while (--num_rows >= 0) {
+    inptr0 = input_buf[0][input_row];
+    inptr1 = input_buf[1][input_row];
+    inptr2 = input_buf[2][input_row];
+    input_row++;
+    outptr = *output_buf++;
+    for (col = 0; col < num_cols; col++) {
+      y  = GETJSAMPLE(inptr0[col]);
+      cb = GETJSAMPLE(inptr1[col]);
+      cr = GETJSAMPLE(inptr2[col]);
+      /* Range-limiting is essential due to noise introduced by DCT losses. */
+      outptr[RGB_RED] =   range_limit[y + Crrtab[cr]];
+      outptr[RGB_GREEN] = range_limit[y +
+                              ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
+                                                 SCALEBITS))];
+      outptr[RGB_BLUE] =  range_limit[y + Cbbtab[cb]];
+      outptr += RGB_PIXELSIZE;
+    }
+  }
+}
+
+
+/**************** Cases other than YCbCr -> RGB **************/
+
+
+/*
+ * Color conversion for no colorspace change: just copy the data,
+ * converting from separate-planes to interleaved representation.
+ */
+
+METHODDEF(void)
+null_convert (j_decompress_ptr cinfo,
+              JSAMPIMAGE input_buf, JDIMENSION input_row,
+              JSAMPARRAY output_buf, int num_rows)
+{
+  register JSAMPROW inptr, outptr;
+  register JDIMENSION count;
+  register int num_components = cinfo->num_components;
+  JDIMENSION num_cols = cinfo->output_width;
+  int ci;
+
+  while (--num_rows >= 0) {
+    for (ci = 0; ci < num_components; ci++) {
+      inptr = input_buf[ci][input_row];
+      outptr = output_buf[0] + ci;
+      for (count = num_cols; count > 0; count--) {
+        *outptr = *inptr++;     /* needn't bother with GETJSAMPLE() here */
+        outptr += num_components;
+      }
+    }
+    input_row++;
+    output_buf++;
+  }
+}
+
+
+/*
+ * Color conversion for grayscale: just copy the data.
+ * This also works for YCbCr -> grayscale conversion, in which
+ * we just copy the Y (luminance) component and ignore chrominance.
+ */
+
+METHODDEF(void)
+grayscale_convert (j_decompress_ptr cinfo,
+                   JSAMPIMAGE input_buf, JDIMENSION input_row,
+                   JSAMPARRAY output_buf, int num_rows)
+{
+  jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,
+                    num_rows, cinfo->output_width);
+}
+
+/*
+ * Convert grayscale to RGB: just duplicate the graylevel three times.
+ * This is provided to support applications that don't want to cope
+ * with grayscale as a separate case.
+ */
+
+METHODDEF(void)
+gray_rgb_convert (j_decompress_ptr cinfo,
+                  JSAMPIMAGE input_buf, JDIMENSION input_row,
+                  JSAMPARRAY output_buf, int num_rows)
+{
+  register JSAMPROW inptr, outptr;
+  register JDIMENSION col;
+  JDIMENSION num_cols = cinfo->output_width;
+
+  while (--num_rows >= 0) {
+    inptr = input_buf[0][input_row++];
+    outptr = *output_buf++;
+    for (col = 0; col < num_cols; col++) {
+      /* We can dispense with GETJSAMPLE() here */
+      outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
+      outptr += RGB_PIXELSIZE;
+    }
+  }
+}
+
+
+/*
+ * Adobe-style YCCK->CMYK conversion.
+ * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
+ * conversion as above, while passing K (black) unchanged.
+ * We assume build_ycc_rgb_table has been called.
+ */
+
+METHODDEF(void)
+ycck_cmyk_convert (j_decompress_ptr cinfo,
+                   JSAMPIMAGE input_buf, JDIMENSION input_row,
+                   JSAMPARRAY output_buf, int num_rows)
+{
+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+  register int y, cb, cr;
+  register JSAMPROW outptr;
+  register JSAMPROW inptr0, inptr1, inptr2, inptr3;
+  register JDIMENSION col;
+  JDIMENSION num_cols = cinfo->output_width;
+  /* copy these pointers into registers if possible */
+  register JSAMPLE * range_limit = cinfo->sample_range_limit;
+  register int * Crrtab = cconvert->Cr_r_tab;
+  register int * Cbbtab = cconvert->Cb_b_tab;
+  register INT32 * Crgtab = cconvert->Cr_g_tab;
+  register INT32 * Cbgtab = cconvert->Cb_g_tab;
+  SHIFT_TEMPS
+
+  while (--num_rows >= 0) {
+    inptr0 = input_buf[0][input_row];
+    inptr1 = input_buf[1][input_row];
+    inptr2 = input_buf[2][input_row];
+    inptr3 = input_buf[3][input_row];
+    input_row++;
+    outptr = *output_buf++;
+    for (col = 0; col < num_cols; col++) {
+      y  = GETJSAMPLE(inptr0[col]);
+      cb = GETJSAMPLE(inptr1[col]);
+      cr = GETJSAMPLE(inptr2[col]);
+      /* Range-limiting is essential due to noise introduced by DCT losses. */
+      outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])];   /* red */
+      outptr[1] = range_limit[MAXJSAMPLE - (y +                 /* green */
+                              ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
+                                                 SCALEBITS)))];
+      outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])];   /* blue */
+      /* K passes through unchanged */
+      outptr[3] = inptr3[col];  /* don't need GETJSAMPLE here */
+      outptr += 4;
+    }
+  }
+}
+
+
+/*
+ * Empty method for start_pass.
+ */
+
+METHODDEF(void)
+start_pass_dcolor (j_decompress_ptr cinfo)
+{
+  /* no work needed */
+}
+
+
+/*
+ * Module initialization routine for output colorspace conversion.
+ */
+
+GLOBAL(void)
+jinit_color_deconverter (j_decompress_ptr cinfo)
+{
+  my_cconvert_ptr cconvert;
+  int ci;
+
+  cconvert = (my_cconvert_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_color_deconverter));
+  cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
+  cconvert->pub.start_pass = start_pass_dcolor;
+
+  /* Make sure num_components agrees with jpeg_color_space */
+  switch (cinfo->jpeg_color_space) {
+  case JCS_GRAYSCALE:
+    if (cinfo->num_components != 1)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    break;
+  case JCS_RGB:
+  case JCS_YCbCr:
+    if (cinfo->num_components != 3)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    break;
+
+  case JCS_CMYK:
+  case JCS_YCCK:
+    if (cinfo->num_components != 4)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    break;
+
+  default:                      /* JCS_UNKNOWN can be anything */
+    if (cinfo->num_components < 1)
+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+    break;
+  }
+
+  /* Set out_color_components and conversion method based on requested space.
+   * Also clear the component_needed flags for any unused components,
+   * so that earlier pipeline stages can avoid useless computation.
+   */
+
+  switch (cinfo->out_color_space) {
+  case JCS_GRAYSCALE:
+    cinfo->out_color_components = 1;
+    if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
+        cinfo->jpeg_color_space == JCS_YCbCr) {
+      cconvert->pub.color_convert = grayscale_convert;
+      /* For color->grayscale conversion, only the Y (0) component is needed */
+      for (ci = 1; ci < cinfo->num_components; ci++)
+        cinfo->comp_info[ci].component_needed = FALSE;
+    } else
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+
+  case JCS_RGB:
+    cinfo->out_color_components = RGB_PIXELSIZE;
+    if (cinfo->jpeg_color_space == JCS_YCbCr) {
+      cconvert->pub.color_convert = ycc_rgb_convert;
+      build_ycc_rgb_table(cinfo);
+    } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
+      cconvert->pub.color_convert = gray_rgb_convert;
+    } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {
+      cconvert->pub.color_convert = null_convert;
+    } else
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+
+  case JCS_CMYK:
+    cinfo->out_color_components = 4;
+    if (cinfo->jpeg_color_space == JCS_YCCK) {
+      cconvert->pub.color_convert = ycck_cmyk_convert;
+      build_ycc_rgb_table(cinfo);
+    } else if (cinfo->jpeg_color_space == JCS_CMYK) {
+      cconvert->pub.color_convert = null_convert;
+    } else
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+
+  default:
+    /* Permit null conversion to same output space */
+    if (cinfo->out_color_space == cinfo->jpeg_color_space) {
+      cinfo->out_color_components = cinfo->num_components;
+      cconvert->pub.color_convert = null_convert;
+    } else                      /* unsupported non-null conversion */
+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+    break;
+  }
+
+  if (cinfo->quantize_colors)
+    cinfo->output_components = 1; /* single colormapped output component */
+  else
+    cinfo->output_components = cinfo->out_color_components;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdct.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,180 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdct.h
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This include file contains common declarations for the forward and
+ * inverse DCT modules.  These declarations are private to the DCT managers
+ * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms.
+ * The individual DCT algorithms are kept in separate files to ease
+ * machine-dependent tuning (e.g., assembly coding).
+ */
+
+
+/*
+ * A forward DCT routine is given a pointer to a work area of type DCTELEM[];
+ * the DCT is to be performed in-place in that buffer.  Type DCTELEM is int
+ * for 8-bit samples, INT32 for 12-bit samples.  (NOTE: Floating-point DCT
+ * implementations use an array of type FAST_FLOAT, instead.)
+ * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE).
+ * The DCT outputs are returned scaled up by a factor of 8; they therefore
+ * have a range of +-8K for 8-bit data, +-128K for 12-bit data.  This
+ * convention improves accuracy in integer implementations and saves some
+ * work in floating-point ones.
+ * Quantization of the output coefficients is done by jcdctmgr.c.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+typedef int DCTELEM;            /* 16 or 32 bits is fine */
+#else
+typedef INT32 DCTELEM;          /* must have 32 bits */
+#endif
+
+typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data));
+typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data));
+
+
+/*
+ * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer
+ * to an output sample array.  The routine must dequantize the input data as
+ * well as perform the IDCT; for dequantization, it uses the multiplier table
+ * pointed to by compptr->dct_table.  The output data is to be placed into the
+ * sample array starting at a specified column.  (Any row offset needed will
+ * be applied to the array pointer before it is passed to the IDCT code.)
+ * Note that the number of samples emitted by the IDCT routine is
+ * DCT_scaled_size * DCT_scaled_size.
+ */
+
+/* typedef inverse_DCT_method_ptr is declared in jpegint.h */
+
+/*
+ * Each IDCT routine has its own ideas about the best dct_table element type.
+ */
+
+typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */
+#if BITS_IN_JSAMPLE == 8
+typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */
+#define IFAST_SCALE_BITS  2     /* fractional bits in scale factors */
+#else
+typedef INT32 IFAST_MULT_TYPE;  /* need 32 bits for scaled quantizers */
+#define IFAST_SCALE_BITS  13    /* fractional bits in scale factors */
+#endif
+typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */
+
+
+/*
+ * Each IDCT routine is responsible for range-limiting its results and
+ * converting them to unsigned form (0..MAXJSAMPLE).  The raw outputs could
+ * be quite far out of range if the input data is corrupt, so a bulletproof
+ * range-limiting step is required.  We use a mask-and-table-lookup method
+ * to do the combined operations quickly.  See the comments with
+ * prepare_range_limit_table (in jdmaster.c) for more info.
+ */
+
+#define IDCT_range_limit(cinfo)  ((cinfo)->sample_range_limit + CENTERJSAMPLE)
+
+#define RANGE_MASK  (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_fdct_islow         jFDislow
+#define jpeg_fdct_ifast         jFDifast
+#define jpeg_fdct_float         jFDfloat
+#define jpeg_idct_islow         jRDislow
+#define jpeg_idct_ifast         jRDifast
+#define jpeg_idct_float         jRDfloat
+#define jpeg_idct_4x4           jRD4x4
+#define jpeg_idct_2x2           jRD2x2
+#define jpeg_idct_1x1           jRD1x1
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+/* Extern declarations for the forward and inverse DCT routines. */
+
+EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data));
+EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data));
+EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data));
+
+EXTERN(void) jpeg_idct_islow
+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_ifast
+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_float
+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_4x4
+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_2x2
+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_1x1
+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+         JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+
+
+/*
+ * Macros for handling fixed-point arithmetic; these are used by many
+ * but not all of the DCT/IDCT modules.
+ *
+ * All values are expected to be of type INT32.
+ * Fractional constants are scaled left by CONST_BITS bits.
+ * CONST_BITS is defined within each module using these macros,
+ * and may differ from one module to the next.
+ */
+
+#define ONE     ((INT32) 1)
+#define CONST_SCALE (ONE << CONST_BITS)
+
+/* Convert a positive real constant to an integer scaled by CONST_SCALE.
+ * Caution: some C compilers fail to reduce "FIX(constant)" at compile time,
+ * thus causing a lot of useless floating-point operations at run time.
+ */
+
+#define FIX(x)  ((INT32) ((x) * CONST_SCALE + 0.5))
+
+/* Descale and correctly round an INT32 value that's scaled by N bits.
+ * We assume RIGHT_SHIFT rounds towards minus infinity, so adding
+ * the fudge factor is correct for either sign of X.
+ */
+
+#define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * This macro is used only when the two inputs will actually be no more than
+ * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
+ * full 32x32 multiply.  This provides a useful speedup on many machines.
+ * Unfortunately there is no way to specify a 16x16->32 multiply portably
+ * in C, but some C compilers will do the right thing if you provide the
+ * correct combination of casts.
+ */
+
+#ifdef SHORTxSHORT_32           /* may work if 'int' is 32 bits */
+#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT16) (const)))
+#endif
+#ifdef SHORTxLCONST_32          /* known to work with Microsoft C 6.0 */
+#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT32) (const)))
+#endif
+
+#ifndef MULTIPLY16C16           /* default definition */
+#define MULTIPLY16C16(var,const)  ((var) * (const))
+#endif
+
+/* Same except both inputs are variables. */
+
+#ifdef SHORTxSHORT_32           /* may work if 'int' is 32 bits */
+#define MULTIPLY16V16(var1,var2)  (((INT16) (var1)) * ((INT16) (var2)))
+#endif
+
+#ifndef MULTIPLY16V16           /* default definition */
+#define MULTIPLY16V16(var1,var2)  ((var1) * (var2))
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jddctmgr.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,273 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jddctmgr.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the inverse-DCT management logic.
+ * This code selects a particular IDCT implementation to be used,
+ * and it performs related housekeeping chores.  No code in this file
+ * is executed per IDCT step, only during output pass setup.
+ *
+ * Note that the IDCT routines are responsible for performing coefficient
+ * dequantization as well as the IDCT proper.  This module sets up the
+ * dequantization multiplier table needed by the IDCT routine.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+
+/*
+ * The decompressor input side (jdinput.c) saves away the appropriate
+ * quantization table for each component at the start of the first scan
+ * involving that component.  (This is necessary in order to correctly
+ * decode files that reuse Q-table slots.)
+ * When we are ready to make an output pass, the saved Q-table is converted
+ * to a multiplier table that will actually be used by the IDCT routine.
+ * The multiplier table contents are IDCT-method-dependent.  To support
+ * application changes in IDCT method between scans, we can remake the
+ * multiplier tables if necessary.
+ * In buffered-image mode, the first output pass may occur before any data
+ * has been seen for some components, and thus before their Q-tables have
+ * been saved away.  To handle this case, multiplier tables are preset
+ * to zeroes; the result of the IDCT will be a neutral gray level.
+ */
+
+
+/* Private subobject for this module */
+
+typedef struct {
+  struct jpeg_inverse_dct pub;  /* public fields */
+
+  /* This array contains the IDCT method code that each multiplier table
+   * is currently set up for, or -1 if it's not yet set up.
+   * The actual multiplier tables are pointed to by dct_table in the
+   * per-component comp_info structures.
+   */
+  int cur_method[MAX_COMPONENTS];
+} my_idct_controller;
+
+typedef my_idct_controller * my_idct_ptr;
+
+
+/* Allocated multiplier tables: big enough for any supported variant */
+
+typedef union {
+  ISLOW_MULT_TYPE islow_array[DCTSIZE2];
+#ifdef DCT_IFAST_SUPPORTED
+  IFAST_MULT_TYPE ifast_array[DCTSIZE2];
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+  FLOAT_MULT_TYPE float_array[DCTSIZE2];
+#endif
+} multiplier_table;
+
+
+/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
+ * so be sure to compile that code if either ISLOW or SCALING is requested.
+ */
+#ifdef DCT_ISLOW_SUPPORTED
+#define PROVIDE_ISLOW_TABLES
+#else
+#ifdef IDCT_SCALING_SUPPORTED
+#define PROVIDE_ISLOW_TABLES
+#endif
+#endif
+
+
+/*
+ * Prepare for an output pass.
+ * Here we select the proper IDCT routine for each component and build
+ * a matching multiplier table.
+ */
+
+METHODDEF(void)
+start_pass (j_decompress_ptr cinfo)
+{
+  my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
+  int ci, i;
+  jpeg_component_info *compptr;
+  int method = 0;
+  inverse_DCT_method_ptr method_ptr = NULL;
+  JQUANT_TBL * qtbl;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Select the proper IDCT routine for this component's scaling */
+    switch (compptr->DCT_scaled_size) {
+#ifdef IDCT_SCALING_SUPPORTED
+    case 1:
+      method_ptr = jpeg_idct_1x1;
+      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
+      break;
+    case 2:
+      method_ptr = jpeg_idct_2x2;
+      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
+      break;
+    case 4:
+      method_ptr = jpeg_idct_4x4;
+      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
+      break;
+#endif
+    case DCTSIZE:
+      switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+      case JDCT_ISLOW:
+        method_ptr = jpeg_idct_islow;
+        method = JDCT_ISLOW;
+        break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+      case JDCT_IFAST:
+        method_ptr = jpeg_idct_ifast;
+        method = JDCT_IFAST;
+        break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+      case JDCT_FLOAT:
+        method_ptr = jpeg_idct_float;
+        method = JDCT_FLOAT;
+        break;
+#endif
+      default:
+        ERREXIT(cinfo, JERR_NOT_COMPILED);
+        break;
+      }
+      break;
+    default:
+      ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);
+      break;
+    }
+    idct->pub.inverse_DCT[ci] = method_ptr;
+    /* Create multiplier table from quant table.
+     * However, we can skip this if the component is uninteresting
+     * or if we already built the table.  Also, if no quant table
+     * has yet been saved for the component, we leave the
+     * multiplier table all-zero; we'll be reading zeroes from the
+     * coefficient controller's buffer anyway.
+     */
+    if (! compptr->component_needed || idct->cur_method[ci] == method)
+      continue;
+    qtbl = compptr->quant_table;
+    if (qtbl == NULL)           /* happens if no data yet for component */
+      continue;
+    idct->cur_method[ci] = method;
+    switch (method) {
+#ifdef PROVIDE_ISLOW_TABLES
+    case JDCT_ISLOW:
+      {
+        /* For LL&M IDCT method, multipliers are equal to raw quantization
+         * coefficients, but are stored as ints to ensure access efficiency.
+         */
+        ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
+        for (i = 0; i < DCTSIZE2; i++) {
+          ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
+        }
+      }
+      break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+    case JDCT_IFAST:
+      {
+        /* For AA&N IDCT method, multipliers are equal to quantization
+         * coefficients scaled by scalefactor[row]*scalefactor[col], where
+         *   scalefactor[0] = 1
+         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
+         * For integer operation, the multiplier table is to be scaled by
+         * IFAST_SCALE_BITS.
+         */
+        IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
+#define CONST_BITS 14
+        static const INT16 aanscales[DCTSIZE2] = {
+          /* precomputed values scaled up by 14 bits */
+          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
+          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
+          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
+          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
+          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
+          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
+           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
+           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
+        };
+        SHIFT_TEMPS
+
+        for (i = 0; i < DCTSIZE2; i++) {
+          ifmtbl[i] = (IFAST_MULT_TYPE)
+            DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
+                                  (INT32) aanscales[i]),
+                    CONST_BITS-IFAST_SCALE_BITS);
+        }
+      }
+      break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+    case JDCT_FLOAT:
+      {
+        /* For float AA&N IDCT method, multipliers are equal to quantization
+         * coefficients scaled by scalefactor[row]*scalefactor[col], where
+         *   scalefactor[0] = 1
+         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
+         */
+        FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
+        int row, col;
+        static const double aanscalefactor[DCTSIZE] = {
+          1.0, 1.387039845, 1.306562965, 1.175875602,
+          1.0, 0.785694958, 0.541196100, 0.275899379
+        };
+
+        i = 0;
+        for (row = 0; row < DCTSIZE; row++) {
+          for (col = 0; col < DCTSIZE; col++) {
+            fmtbl[i] = (FLOAT_MULT_TYPE)
+              ((double) qtbl->quantval[i] *
+               aanscalefactor[row] * aanscalefactor[col]);
+            i++;
+          }
+        }
+      }
+      break;
+#endif
+    default:
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+      break;
+    }
+  }
+}
+
+
+/*
+ * Initialize IDCT manager.
+ */
+
+GLOBAL(void)
+jinit_inverse_dct (j_decompress_ptr cinfo)
+{
+  my_idct_ptr idct;
+  int ci;
+  jpeg_component_info *compptr;
+
+  idct = (my_idct_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_idct_controller));
+  cinfo->idct = (struct jpeg_inverse_dct *) idct;
+  idct->pub.start_pass = start_pass;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Allocate and pre-zero a multiplier table for each component */
+    compptr->dct_table =
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  SIZEOF(multiplier_table));
+    MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));
+    /* Mark multiplier table not yet set up for any method */
+    idct->cur_method[ci] = -1;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdhuff.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,655 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdhuff.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy decoding routines.
+ *
+ * Much of the complexity here has to do with supporting input suspension.
+ * If the data source module demands suspension, we want to be able to back
+ * up to the start of the current MCU.  To do this, we copy state variables
+ * into local working storage, and update them back to the permanent
+ * storage only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdhuff.h"             /* Declarations shared with jdphuff.c */
+
+
+/*
+ * Expanded entropy decoder object for Huffman decoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment.  You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src)  ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src)  \
+        ((dest).last_dc_val[0] = (src).last_dc_val[0], \
+         (dest).last_dc_val[1] = (src).last_dc_val[1], \
+         (dest).last_dc_val[2] = (src).last_dc_val[2], \
+         (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+  struct jpeg_entropy_decoder pub; /* public fields */
+
+  /* These fields are loaded into local variables at start of each MCU.
+   * In case of suspension, we exit WITHOUT updating them.
+   */
+  bitread_perm_state bitstate;  /* Bit buffer at start of MCU */
+  savable_state saved;          /* Other state at start of MCU */
+
+  /* These fields are NOT loaded into local working state. */
+  unsigned int restarts_to_go;  /* MCUs left in this restart interval */
+
+  /* Pointers to derived tables (these workspaces have image lifespan) */
+  d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
+  d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
+
+  /* Precalculated info set up by start_pass for use in decode_mcu: */
+
+  /* Pointers to derived tables to be used for each block within an MCU */
+  d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];
+  d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];
+  /* Whether we care about the DC and AC coefficient values for each block */
+  boolean dc_needed[D_MAX_BLOCKS_IN_MCU];
+  boolean ac_needed[D_MAX_BLOCKS_IN_MCU];
+} huff_entropy_decoder;
+
+typedef huff_entropy_decoder * huff_entropy_ptr;
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+start_pass_huff_decoder (j_decompress_ptr cinfo)
+{
+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+  int ci, blkn, dctbl, actbl;
+  jpeg_component_info * compptr;
+
+  /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
+   * This ought to be an error condition, but we make it a warning because
+   * there are some baseline files out there with all zeroes in these bytes.
+   */
+  if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
+      cinfo->Ah != 0 || cinfo->Al != 0)
+    WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
+
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    dctbl = compptr->dc_tbl_no;
+    actbl = compptr->ac_tbl_no;
+    /* Compute derived values for Huffman tables */
+    /* We may do this more than once for a table, but it's not expensive */
+    jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,
+                            & entropy->dc_derived_tbls[dctbl]);
+    jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,
+                            & entropy->ac_derived_tbls[actbl]);
+    /* Initialize DC predictions to 0 */
+    entropy->saved.last_dc_val[ci] = 0;
+  }
+
+  /* Precalculate decoding info for each block in an MCU of this scan */
+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+    ci = cinfo->MCU_membership[blkn];
+    compptr = cinfo->cur_comp_info[ci];
+    /* Precalculate which table to use for each block */
+    entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
+    entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
+    /* Decide whether we really care about the coefficient values */
+    if (compptr->component_needed) {
+      entropy->dc_needed[blkn] = TRUE;
+      /* we don't need the ACs if producing a 1/8th-size image */
+      entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);
+    } else {
+      entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;
+    }
+  }
+
+  /* Initialize bitread state variables */
+  entropy->bitstate.bits_left = 0;
+  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
+  entropy->pub.insufficient_data = FALSE;
+
+  /* Initialize restart counter */
+  entropy->restarts_to_go = cinfo->restart_interval;
+}
+
+
+/*
+ * Compute the derived values for a Huffman table.
+ * This routine also performs some validation checks on the table.
+ *
+ * Note this is also used by jdphuff.c.
+ */
+
+GLOBAL(void)
+jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
+                         d_derived_tbl ** pdtbl)
+{
+  JHUFF_TBL *htbl;
+  d_derived_tbl *dtbl;
+  int p, i, l, si, numsymbols;
+  int lookbits, ctr;
+  char huffsize[257];
+  unsigned int huffcode[257];
+  unsigned int code;
+
+  /* Note that huffsize[] and huffcode[] are filled in code-length order,
+   * paralleling the order of the symbols themselves in htbl->huffval[].
+   */
+
+  /* Find the input Huffman table */
+  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+  htbl =
+    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
+  if (htbl == NULL)
+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+
+  /* Allocate a workspace if we haven't already done so. */
+  if (*pdtbl == NULL)
+    *pdtbl = (d_derived_tbl *)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  SIZEOF(d_derived_tbl));
+  dtbl = *pdtbl;
+  dtbl->pub = htbl;             /* fill in back link */
+
+  /* Figure C.1: make table of Huffman code length for each symbol */
+
+  p = 0;
+  for (l = 1; l <= 16; l++) {
+    i = (int) htbl->bits[l];
+    if (i < 0 || p + i > 256)   /* protect against table overrun */
+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+    while (i--)
+      huffsize[p++] = (char) l;
+  }
+  huffsize[p] = 0;
+  numsymbols = p;
+
+  /* Figure C.2: generate the codes themselves */
+  /* We also validate that the counts represent a legal Huffman code tree. */
+
+  code = 0;
+  si = huffsize[0];
+  p = 0;
+  while (huffsize[p]) {
+    while (((int) huffsize[p]) == si) {
+      huffcode[p++] = code;
+      code++;
+    }
+    /* code is now 1 more than the last code used for codelength si; but
+     * it must still fit in si bits, since no code is allowed to be all ones.
+     */
+    if (((INT32) code) >= (((INT32) 1) << si))
+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+    code <<= 1;
+    si++;
+  }
+
+  /* Figure F.15: generate decoding tables for bit-sequential decoding */
+
+  p = 0;
+  for (l = 1; l <= 16; l++) {
+    if (htbl->bits[l]) {
+      /* valoffset[l] = huffval[] index of 1st symbol of code length l,
+       * minus the minimum code of length l
+       */
+      dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];
+      p += htbl->bits[l];
+      dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
+    } else {
+      dtbl->maxcode[l] = -1;    /* -1 if no codes of this length */
+    }
+  }
+  dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */
+
+  /* Compute lookahead tables to speed up decoding.
+   * First we set all the table entries to 0, indicating "too long";
+   * then we iterate through the Huffman codes that are short enough and
+   * fill in all the entries that correspond to bit sequences starting
+   * with that code.
+   */
+
+  MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));
+
+  p = 0;
+  for (l = 1; l <= HUFF_LOOKAHEAD; l++) {
+    for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {
+      /* l = current code's length, p = its index in huffcode[] & huffval[]. */
+      /* Generate left-justified code followed by all possible bit sequences */
+      lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
+      for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {
+        dtbl->look_nbits[lookbits] = l;
+        dtbl->look_sym[lookbits] = htbl->huffval[p];
+        lookbits++;
+      }
+    }
+  }
+
+  /* Validate symbols as being reasonable.
+   * For AC tables, we make no check, but accept all byte values 0..255.
+   * For DC tables, we require the symbols to be in range 0..15.
+   * (Tighter bounds could be applied depending on the data depth and mode,
+   * but this is sufficient to ensure safe decoding.)
+   */
+  if (isDC) {
+    for (i = 0; i < numsymbols; i++) {
+      int sym = htbl->huffval[i];
+      if (sym < 0 || sym > 15)
+        ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+    }
+  }
+}
+
+
+/*
+ * Out-of-line code for bit fetching (shared with jdphuff.c).
+ * See jdhuff.h for info about usage.
+ * Note: current values of get_buffer and bits_left are passed as parameters,
+ * but are returned in the corresponding fields of the state struct.
+ *
+ * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width
+ * of get_buffer to be used.  (On machines with wider words, an even larger
+ * buffer could be used.)  However, on some machines 32-bit shifts are
+ * quite slow and take time proportional to the number of places shifted.
+ * (This is true with most PC compilers, for instance.)  In this case it may
+ * be a win to set MIN_GET_BITS to the minimum value of 15.  This reduces the
+ * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.
+ */
+
+#ifdef SLOW_SHIFT_32
+#define MIN_GET_BITS  15        /* minimum allowable value */
+#else
+#define MIN_GET_BITS  (BIT_BUF_SIZE-7)
+#endif
+
+
+GLOBAL(boolean)
+jpeg_fill_bit_buffer (bitread_working_state * state,
+                      register bit_buf_type get_buffer, register int bits_left,
+                      int nbits)
+/* Load up the bit buffer to a depth of at least nbits */
+{
+  /* Copy heavily used state fields into locals (hopefully registers) */
+  register const JOCTET * next_input_byte = state->next_input_byte;
+  register size_t bytes_in_buffer = state->bytes_in_buffer;
+  j_decompress_ptr cinfo = state->cinfo;
+
+  /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */
+  /* (It is assumed that no request will be for more than that many bits.) */
+  /* We fail to do so only if we hit a marker or are forced to suspend. */
+
+  if (cinfo->unread_marker == 0) {      /* cannot advance past a marker */
+    while (bits_left < MIN_GET_BITS) {
+      register int c;
+
+      /* Attempt to read a byte */
+      if (bytes_in_buffer == 0) {
+        if (! (*cinfo->src->fill_input_buffer) (cinfo))
+          return FALSE;
+        next_input_byte = cinfo->src->next_input_byte;
+        bytes_in_buffer = cinfo->src->bytes_in_buffer;
+      }
+      bytes_in_buffer--;
+      c = GETJOCTET(*next_input_byte++);
+
+      /* If it's 0xFF, check and discard stuffed zero byte */
+      if (c == 0xFF) {
+        /* Loop here to discard any padding FF's on terminating marker,
+         * so that we can save a valid unread_marker value.  NOTE: we will
+         * accept multiple FF's followed by a 0 as meaning a single FF data
+         * byte.  This data pattern is not valid according to the standard.
+         */
+        do {
+          if (bytes_in_buffer == 0) {
+            if (! (*cinfo->src->fill_input_buffer) (cinfo))
+              return FALSE;
+            next_input_byte = cinfo->src->next_input_byte;
+            bytes_in_buffer = cinfo->src->bytes_in_buffer;
+          }
+          bytes_in_buffer--;
+          c = GETJOCTET(*next_input_byte++);
+        } while (c == 0xFF);
+
+        if (c == 0) {
+          /* Found FF/00, which represents an FF data byte */
+          c = 0xFF;
+        } else {
+          /* Oops, it's actually a marker indicating end of compressed data.
+           * Save the marker code for later use.
+           * Fine point: it might appear that we should save the marker into
+           * bitread working state, not straight into permanent state.  But
+           * once we have hit a marker, we cannot need to suspend within the
+           * current MCU, because we will read no more bytes from the data
+           * source.  So it is OK to update permanent state right away.
+           */
+          cinfo->unread_marker = c;
+          /* See if we need to insert some fake zero bits. */
+          goto no_more_bytes;
+        }
+      }
+
+      /* OK, load c into get_buffer */
+      get_buffer = (get_buffer << 8) | c;
+      bits_left += 8;
+    } /* end while */
+  } else {
+  no_more_bytes:
+    /* We get here if we've read the marker that terminates the compressed
+     * data segment.  There should be enough bits in the buffer register
+     * to satisfy the request; if so, no problem.
+     */
+    if (nbits > bits_left) {
+      /* Uh-oh.  Report corrupted data to user and stuff zeroes into
+       * the data stream, so that we can produce some kind of image.
+       * We use a nonvolatile flag to ensure that only one warning message
+       * appears per data segment.
+       */
+      if (! cinfo->entropy->insufficient_data) {
+        WARNMS(cinfo, JWRN_HIT_MARKER);
+        cinfo->entropy->insufficient_data = TRUE;
+      }
+      /* Fill the buffer with zero bits */
+      get_buffer <<= MIN_GET_BITS - bits_left;
+      bits_left = MIN_GET_BITS;
+    }
+  }
+
+  /* Unload the local registers */
+  state->next_input_byte = next_input_byte;
+  state->bytes_in_buffer = bytes_in_buffer;
+  state->get_buffer = get_buffer;
+  state->bits_left = bits_left;
+
+  return TRUE;
+}
+
+
+/*
+ * Out-of-line code for Huffman code decoding.
+ * See jdhuff.h for info about usage.
+ */
+
+GLOBAL(int)
+jpeg_huff_decode (bitread_working_state * state,
+                  register bit_buf_type get_buffer, register int bits_left,
+                  d_derived_tbl * htbl, int min_bits)
+{
+  register int l = min_bits;
+  register INT32 code;
+
+  /* HUFF_DECODE has determined that the code is at least min_bits */
+  /* bits long, so fetch that many bits in one swoop. */
+
+  CHECK_BIT_BUFFER(*state, l, return -1);
+  code = GET_BITS(l);
+
+  /* Collect the rest of the Huffman code one bit at a time. */
+  /* This is per Figure F.16 in the JPEG spec. */
+
+  while (code > htbl->maxcode[l]) {
+    code <<= 1;
+    CHECK_BIT_BUFFER(*state, 1, return -1);
+    code |= GET_BITS(1);
+    l++;
+  }
+
+  /* Unload the local registers */
+  state->get_buffer = get_buffer;
+  state->bits_left = bits_left;
+
+  /* With garbage input we may reach the sentinel value l = 17. */
+
+  if (l > 16) {
+    WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);
+    return 0;                   /* fake a zero as the safest result */
+  }
+
+  return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];
+}
+
+
+/*
+ * Figure F.12: extend sign bit.
+ * On some machines, a shift and add will be faster than a table lookup.
+ */
+
+#ifdef AVOID_TABLES
+
+#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
+
+#else
+
+#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
+
+static const int extend_test[16] =   /* entry n is 2**(n-1) */
+  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
+    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
+
+static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
+  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
+    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
+    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
+    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
+
+#endif /* AVOID_TABLES */
+
+
+/*
+ * Check for a restart marker & resynchronize decoder.
+ * Returns FALSE if must suspend.
+ */
+
+LOCAL(boolean)
+process_restart (j_decompress_ptr cinfo)
+{
+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+  int ci;
+
+  /* Throw away any unused bits remaining in bit buffer; */
+  /* include any full bytes in next_marker's count of discarded bytes */
+  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
+  entropy->bitstate.bits_left = 0;
+
+  /* Advance past the RSTn marker */
+  if (! (*cinfo->marker->read_restart_marker) (cinfo))
+    return FALSE;
+
+  /* Re-initialize DC predictions to 0 */
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+    entropy->saved.last_dc_val[ci] = 0;
+
+  /* Reset restart counter */
+  entropy->restarts_to_go = cinfo->restart_interval;
+
+  /* Reset out-of-data flag, unless read_restart_marker left us smack up
+   * against a marker.  In that case we will end up treating the next data
+   * segment as empty, and we can avoid producing bogus output pixels by
+   * leaving the flag set.
+   */
+  if (cinfo->unread_marker == 0)
+    entropy->pub.insufficient_data = FALSE;
+
+  return TRUE;
+}
+
+
+/*
+ * Decode and return one MCU's worth of Huffman-compressed coefficients.
+ * The coefficients are reordered from zigzag order into natural array order,
+ * but are not dequantized.
+ *
+ * The i'th block of the MCU is stored into the block pointed to by
+ * MCU_data[i].  WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER.
+ * (Wholesale zeroing is usually a little faster than retail...)
+ *
+ * Returns FALSE if data source requested suspension.  In that case no
+ * changes have been made to permanent state.  (Exception: some output
+ * coefficients may already have been assigned.  This is harmless for
+ * this module, since we'll just re-assign them on the next call.)
+ */
+
+METHODDEF(boolean)
+decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+  int blkn;
+  BITREAD_STATE_VARS;
+  savable_state state;
+
+  /* Process restart marker if needed; may have to suspend */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0)
+      if (! process_restart(cinfo))
+        return FALSE;
+  }
+
+  /* If we've run out of data, just leave the MCU set to zeroes.
+   * This way, we return uniform gray for the remainder of the segment.
+   */
+  if (! entropy->pub.insufficient_data) {
+
+    /* Load up working state */
+    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+    ASSIGN_STATE(state, entropy->saved);
+
+    /* Outer loop handles each block in the MCU */
+
+    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+      JBLOCKROW block = MCU_data[blkn];
+      d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];
+      d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];
+      register int s, k, r;
+
+      /* Decode a single block's worth of coefficients */
+
+      /* Section F.2.2.1: decode the DC coefficient difference */
+      HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);
+      if (s) {
+        CHECK_BIT_BUFFER(br_state, s, return FALSE);
+        r = GET_BITS(s);
+        s = HUFF_EXTEND(r, s);
+      }
+
+      if (entropy->dc_needed[blkn]) {
+        /* Convert DC difference to actual value, update last_dc_val */
+        int ci = cinfo->MCU_membership[blkn];
+        s += state.last_dc_val[ci];
+        state.last_dc_val[ci] = s;
+        /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
+        (*block)[0] = (JCOEF) s;
+      }
+
+      if (entropy->ac_needed[blkn]) {
+
+        /* Section F.2.2.2: decode the AC coefficients */
+        /* Since zeroes are skipped, output area must be cleared beforehand */
+        for (k = 1; k < DCTSIZE2; k++) {
+          HUFF_DECODE(s, br_state, actbl, return FALSE, label2);
+
+          r = s >> 4;
+          s &= 15;
+
+          if (s) {
+            k += r;
+            CHECK_BIT_BUFFER(br_state, s, return FALSE);
+            r = GET_BITS(s);
+            s = HUFF_EXTEND(r, s);
+            /* Output coefficient in natural (dezigzagged) order.
+             * Note: the extra entries in jpeg_natural_order[] will save us
+             * if k >= DCTSIZE2, which could happen if the data is corrupted.
+             */
+            (*block)[jpeg_natural_order[k]] = (JCOEF) s;
+          } else {
+            if (r != 15)
+              break;
+            k += 15;
+          }
+        }
+
+      } else {
+
+        /* Section F.2.2.2: decode the AC coefficients */
+        /* In this path we just discard the values */
+        for (k = 1; k < DCTSIZE2; k++) {
+          HUFF_DECODE(s, br_state, actbl, return FALSE, label3);
+
+          r = s >> 4;
+          s &= 15;
+
+          if (s) {
+            k += r;
+            CHECK_BIT_BUFFER(br_state, s, return FALSE);
+            DROP_BITS(s);
+          } else {
+            if (r != 15)
+              break;
+            k += 15;
+          }
+        }
+
+      }
+    }
+
+    /* Completed MCU, so update state */
+    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+    ASSIGN_STATE(entropy->saved, state);
+  }
+
+  /* Account for restart interval (no-op if not using restarts) */
+  entropy->restarts_to_go--;
+
+  return TRUE;
+}
+
+
+/*
+ * Module initialization routine for Huffman entropy decoding.
+ */
+
+GLOBAL(void)
+jinit_huff_decoder (j_decompress_ptr cinfo)
+{
+  huff_entropy_ptr entropy;
+  int i;
+
+  entropy = (huff_entropy_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(huff_entropy_decoder));
+  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+  entropy->pub.start_pass = start_pass_huff_decoder;
+  entropy->pub.decode_mcu = decode_mcu;
+
+  /* Mark tables unallocated */
+  for (i = 0; i < NUM_HUFF_TBLS; i++) {
+    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdhuff.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,205 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdhuff.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains declarations for Huffman entropy decoding routines
+ * that are shared between the sequential decoder (jdhuff.c) and the
+ * progressive decoder (jdphuff.c).  No other modules need to see these.
+ */
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_make_d_derived_tbl jMkDDerived
+#define jpeg_fill_bit_buffer    jFilBitBuf
+#define jpeg_huff_decode        jHufDecode
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Derived data constructed for each Huffman table */
+
+#define HUFF_LOOKAHEAD  8       /* # of bits of lookahead */
+
+typedef struct {
+  /* Basic tables: (element [0] of each array is unused) */
+  INT32 maxcode[18];            /* largest code of length k (-1 if none) */
+  /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */
+  INT32 valoffset[17];          /* huffval[] offset for codes of length k */
+  /* valoffset[k] = huffval[] index of 1st symbol of code length k, less
+   * the smallest code of length k; so given a code of length k, the
+   * corresponding symbol is huffval[code + valoffset[k]]
+   */
+
+  /* Link to public Huffman table (needed only in jpeg_huff_decode) */
+  JHUFF_TBL *pub;
+
+  /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of
+   * the input data stream.  If the next Huffman code is no more
+   * than HUFF_LOOKAHEAD bits long, we can obtain its length and
+   * the corresponding symbol directly from these tables.
+   */
+  int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */
+  UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */
+} d_derived_tbl;
+
+/* Expand a Huffman table definition into the derived format */
+EXTERN(void) jpeg_make_d_derived_tbl
+        JPP((j_decompress_ptr cinfo, boolean isDC, int tblno,
+             d_derived_tbl ** pdtbl));
+
+
+/*
+ * Fetching the next N bits from the input stream is a time-critical operation
+ * for the Huffman decoders.  We implement it with a combination of inline
+ * macros and out-of-line subroutines.  Note that N (the number of bits
+ * demanded at one time) never exceeds 15 for JPEG use.
+ *
+ * We read source bytes into get_buffer and dole out bits as needed.
+ * If get_buffer already contains enough bits, they are fetched in-line
+ * by the macros CHECK_BIT_BUFFER and GET_BITS.  When there aren't enough
+ * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer
+ * as full as possible (not just to the number of bits needed; this
+ * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).
+ * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.
+ * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains
+ * at least the requested number of bits --- dummy zeroes are inserted if
+ * necessary.
+ */
+
+typedef INT32 bit_buf_type;     /* type of bit-extraction buffer */
+#define BIT_BUF_SIZE  32        /* size of buffer in bits */
+
+/* If long is > 32 bits on your machine, and shifting/masking longs is
+ * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE
+ * appropriately should be a win.  Unfortunately we can't define the size
+ * with something like  #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)
+ * because not all machines measure sizeof in 8-bit bytes.
+ */
+
+typedef struct {                /* Bitreading state saved across MCUs */
+  bit_buf_type get_buffer;      /* current bit-extraction buffer */
+  int bits_left;                /* # of unused bits in it */
+} bitread_perm_state;
+
+typedef struct {                /* Bitreading working state within an MCU */
+  /* Current data source location */
+  /* We need a copy, rather than munging the original, in case of suspension */
+  const JOCTET * next_input_byte; /* => next byte to read from source */
+  size_t bytes_in_buffer;       /* # of bytes remaining in source buffer */
+  /* Bit input buffer --- note these values are kept in register variables,
+   * not in this struct, inside the inner loops.
+   */
+  bit_buf_type get_buffer;      /* current bit-extraction buffer */
+  int bits_left;                /* # of unused bits in it */
+  /* Pointer needed by jpeg_fill_bit_buffer. */
+  j_decompress_ptr cinfo;       /* back link to decompress master record */
+} bitread_working_state;
+
+/* Macros to declare and load/save bitread local variables. */
+#define BITREAD_STATE_VARS  \
+        register bit_buf_type get_buffer;  \
+        register int bits_left;  \
+        bitread_working_state br_state
+
+#define BITREAD_LOAD_STATE(cinfop,permstate)  \
+        br_state.cinfo = cinfop; \
+        br_state.next_input_byte = cinfop->src->next_input_byte; \
+        br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \
+        get_buffer = permstate.get_buffer; \
+        bits_left = permstate.bits_left;
+
+#define BITREAD_SAVE_STATE(cinfop,permstate)  \
+        cinfop->src->next_input_byte = br_state.next_input_byte; \
+        cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \
+        permstate.get_buffer = get_buffer; \
+        permstate.bits_left = bits_left
+
+/*
+ * These macros provide the in-line portion of bit fetching.
+ * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer
+ * before using GET_BITS, PEEK_BITS, or DROP_BITS.
+ * The variables get_buffer and bits_left are assumed to be locals,
+ * but the state struct might not be (jpeg_huff_decode needs this).
+ *      CHECK_BIT_BUFFER(state,n,action);
+ *              Ensure there are N bits in get_buffer; if suspend, take action.
+ *      val = GET_BITS(n);
+ *              Fetch next N bits.
+ *      val = PEEK_BITS(n);
+ *              Fetch next N bits without removing them from the buffer.
+ *      DROP_BITS(n);
+ *              Discard next N bits.
+ * The value N should be a simple variable, not an expression, because it
+ * is evaluated multiple times.
+ */
+
+#define CHECK_BIT_BUFFER(state,nbits,action) \
+        { if (bits_left < (nbits)) {  \
+            if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits))  \
+              { action; }  \
+            get_buffer = (state).get_buffer; bits_left = (state).bits_left; } }
+
+#define GET_BITS(nbits) \
+        (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1))
+
+#define PEEK_BITS(nbits) \
+        (((int) (get_buffer >> (bits_left -  (nbits)))) & ((1<<(nbits))-1))
+
+#define DROP_BITS(nbits) \
+        (bits_left -= (nbits))
+
+/* Load up the bit buffer to a depth of at least nbits */
+EXTERN(boolean) jpeg_fill_bit_buffer
+        JPP((bitread_working_state * state, register bit_buf_type get_buffer,
+             register int bits_left, int nbits));
+
+
+/*
+ * Code for extracting next Huffman-coded symbol from input bit stream.
+ * Again, this is time-critical and we make the main paths be macros.
+ *
+ * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits
+ * without looping.  Usually, more than 95% of the Huffman codes will be 8
+ * or fewer bits long.  The few overlength codes are handled with a loop,
+ * which need not be inline code.
+ *
+ * Notes about the HUFF_DECODE macro:
+ * 1. Near the end of the data segment, we may fail to get enough bits
+ *    for a lookahead.  In that case, we do it the hard way.
+ * 2. If the lookahead table contains no entry, the next code must be
+ *    more than HUFF_LOOKAHEAD bits long.
+ * 3. jpeg_huff_decode returns -1 if forced to suspend.
+ */
+
+#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \
+{ register int nb, look; \
+  if (bits_left < HUFF_LOOKAHEAD) { \
+    if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \
+    get_buffer = state.get_buffer; bits_left = state.bits_left; \
+    if (bits_left < HUFF_LOOKAHEAD) { \
+      nb = 1; goto slowlabel; \
+    } \
+  } \
+  look = PEEK_BITS(HUFF_LOOKAHEAD); \
+  if ((nb = htbl->look_nbits[look]) != 0) { \
+    DROP_BITS(nb); \
+    result = htbl->look_sym[look]; \
+  } else { \
+    nb = HUFF_LOOKAHEAD+1; \
+slowlabel: \
+    if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \
+        { failaction; } \
+    get_buffer = state.get_buffer; bits_left = state.bits_left; \
+  } \
+}
+
+/* Out-of-line case for Huffman code fetching */
+EXTERN(int) jpeg_huff_decode
+        JPP((bitread_working_state * state, register bit_buf_type get_buffer,
+             register int bits_left, d_derived_tbl * htbl, int min_bits));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdinput.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,385 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdinput.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains input control logic for the JPEG decompressor.
+ * These routines are concerned with controlling the decompressor's input
+ * processing (marker reading and coefficient decoding).  The actual input
+ * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef struct {
+  struct jpeg_input_controller pub; /* public fields */
+
+  boolean inheaders;            /* TRUE until first SOS is reached */
+} my_input_controller;
+
+typedef my_input_controller * my_inputctl_ptr;
+
+
+/* Forward declarations */
+METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Routines to calculate various quantities related to the size of the image.
+ */
+
+LOCAL(void)
+initial_setup (j_decompress_ptr cinfo)
+/* Called once, when first SOS marker is reached */
+{
+  int ci;
+  jpeg_component_info *compptr;
+
+  /* Make sure image isn't bigger than I can handle */
+  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
+      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
+    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
+
+  /* For now, precision must match compiled-in value... */
+  if (cinfo->data_precision != BITS_IN_JSAMPLE)
+    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
+  /* Check that number of components won't exceed internal array sizes */
+  if (cinfo->num_components > MAX_COMPONENTS)
+    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+             MAX_COMPONENTS);
+
+  /* Compute maximum sampling factors; check factor validity */
+  cinfo->max_h_samp_factor = 1;
+  cinfo->max_v_samp_factor = 1;
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
+        compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
+      ERREXIT(cinfo, JERR_BAD_SAMPLING);
+    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
+                                   compptr->h_samp_factor);
+    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
+                                   compptr->v_samp_factor);
+  }
+
+  /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE.
+   * In the full decompressor, this will be overridden by jdmaster.c;
+   * but in the transcoder, jdmaster.c is not used, so we must do it here.
+   */
+  cinfo->min_DCT_scaled_size = DCTSIZE;
+
+  /* Compute dimensions of components */
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    compptr->DCT_scaled_size = DCTSIZE;
+    /* Size in DCT blocks */
+    compptr->width_in_blocks = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+                    (long) (cinfo->max_h_samp_factor * DCTSIZE));
+    compptr->height_in_blocks = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+                    (long) (cinfo->max_v_samp_factor * DCTSIZE));
+    /* downsampled_width and downsampled_height will also be overridden by
+     * jdmaster.c if we are doing full decompression.  The transcoder library
+     * doesn't use these values, but the calling application might.
+     */
+    /* Size in samples */
+    compptr->downsampled_width = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+                    (long) cinfo->max_h_samp_factor);
+    compptr->downsampled_height = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+                    (long) cinfo->max_v_samp_factor);
+    /* Mark component needed, until color conversion says otherwise */
+    compptr->component_needed = TRUE;
+    /* Mark no quantization table yet saved for component */
+    compptr->quant_table = NULL;
+  }
+
+  /* Compute number of fully interleaved MCU rows. */
+  cinfo->total_iMCU_rows = (JDIMENSION)
+    jdiv_round_up((long) cinfo->image_height,
+                  (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+  /* Decide whether file contains multiple scans */
+  if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)
+    cinfo->inputctl->has_multiple_scans = TRUE;
+  else
+    cinfo->inputctl->has_multiple_scans = FALSE;
+}
+
+
+LOCAL(void)
+per_scan_setup (j_decompress_ptr cinfo)
+/* Do computations that are needed before processing a JPEG scan */
+/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */
+{
+  int ci, mcublks, tmp;
+  jpeg_component_info *compptr;
+
+  if (cinfo->comps_in_scan == 1) {
+
+    /* Noninterleaved (single-component) scan */
+    compptr = cinfo->cur_comp_info[0];
+
+    /* Overall image size in MCUs */
+    cinfo->MCUs_per_row = compptr->width_in_blocks;
+    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
+
+    /* For noninterleaved scan, always one block per MCU */
+    compptr->MCU_width = 1;
+    compptr->MCU_height = 1;
+    compptr->MCU_blocks = 1;
+    compptr->MCU_sample_width = compptr->DCT_scaled_size;
+    compptr->last_col_width = 1;
+    /* For noninterleaved scans, it is convenient to define last_row_height
+     * as the number of block rows present in the last iMCU row.
+     */
+    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+    if (tmp == 0) tmp = compptr->v_samp_factor;
+    compptr->last_row_height = tmp;
+
+    /* Prepare array describing MCU composition */
+    cinfo->blocks_in_MCU = 1;
+    cinfo->MCU_membership[0] = 0;
+
+  } else {
+
+    /* Interleaved (multi-component) scan */
+    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
+               MAX_COMPS_IN_SCAN);
+
+    /* Overall image size in MCUs */
+    cinfo->MCUs_per_row = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width,
+                    (long) (cinfo->max_h_samp_factor*DCTSIZE));
+    cinfo->MCU_rows_in_scan = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height,
+                    (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+    cinfo->blocks_in_MCU = 0;
+
+    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+      compptr = cinfo->cur_comp_info[ci];
+      /* Sampling factors give # of blocks of component in each MCU */
+      compptr->MCU_width = compptr->h_samp_factor;
+      compptr->MCU_height = compptr->v_samp_factor;
+      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
+      compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size;
+      /* Figure number of non-dummy blocks in last MCU column & row */
+      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
+      if (tmp == 0) tmp = compptr->MCU_width;
+      compptr->last_col_width = tmp;
+      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
+      if (tmp == 0) tmp = compptr->MCU_height;
+      compptr->last_row_height = tmp;
+      /* Prepare array describing MCU composition */
+      mcublks = compptr->MCU_blocks;
+      if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)
+        ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
+      while (mcublks-- > 0) {
+        cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
+      }
+    }
+
+  }
+}
+
+
+/*
+ * Save away a copy of the Q-table referenced by each component present
+ * in the current scan, unless already saved during a prior scan.
+ *
+ * In a multiple-scan JPEG file, the encoder could assign different components
+ * the same Q-table slot number, but change table definitions between scans
+ * so that each component uses a different Q-table.  (The IJG encoder is not
+ * currently capable of doing this, but other encoders might.)  Since we want
+ * to be able to dequantize all the components at the end of the file, this
+ * means that we have to save away the table actually used for each component.
+ * We do this by copying the table at the start of the first scan containing
+ * the component.
+ * The JPEG spec prohibits the encoder from changing the contents of a Q-table
+ * slot between scans of a component using that slot.  If the encoder does so
+ * anyway, this decoder will simply use the Q-table values that were current
+ * at the start of the first scan for the component.
+ *
+ * The decompressor output side looks only at the saved quant tables,
+ * not at the current Q-table slots.
+ */
+
+LOCAL(void)
+latch_quant_tables (j_decompress_ptr cinfo)
+{
+  int ci, qtblno;
+  jpeg_component_info *compptr;
+  JQUANT_TBL * qtbl;
+
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    /* No work if we already saved Q-table for this component */
+    if (compptr->quant_table != NULL)
+      continue;
+    /* Make sure specified quantization table is present */
+    qtblno = compptr->quant_tbl_no;
+    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
+        cinfo->quant_tbl_ptrs[qtblno] == NULL)
+      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
+    /* OK, save away the quantization table */
+    qtbl = (JQUANT_TBL *)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  SIZEOF(JQUANT_TBL));
+    MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
+    compptr->quant_table = qtbl;
+  }
+}
+
+
+/*
+ * Initialize the input modules to read a scan of compressed data.
+ * The first call to this is done by jdmaster.c after initializing
+ * the entire decompressor (during jpeg_start_decompress).
+ * Subsequent calls come from consume_markers, below.
+ */
+
+METHODDEF(void)
+start_input_pass (j_decompress_ptr cinfo)
+{
+  per_scan_setup(cinfo);
+  latch_quant_tables(cinfo);
+  (*cinfo->entropy->start_pass) (cinfo);
+  (*cinfo->coef->start_input_pass) (cinfo);
+  cinfo->inputctl->consume_input = cinfo->coef->consume_data;
+}
+
+
+/*
+ * Finish up after inputting a compressed-data scan.
+ * This is called by the coefficient controller after it's read all
+ * the expected data of the scan.
+ */
+
+METHODDEF(void)
+finish_input_pass (j_decompress_ptr cinfo)
+{
+  cinfo->inputctl->consume_input = consume_markers;
+}
+
+
+/*
+ * Read JPEG markers before, between, or after compressed-data scans.
+ * Change state as necessary when a new scan is reached.
+ * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ *
+ * The consume_input method pointer points either here or to the
+ * coefficient controller's consume_data routine, depending on whether
+ * we are reading a compressed data segment or inter-segment markers.
+ */
+
+METHODDEF(int)
+consume_markers (j_decompress_ptr cinfo)
+{
+  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
+  int val;
+
+  if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */
+    return JPEG_REACHED_EOI;
+
+  val = (*cinfo->marker->read_markers) (cinfo);
+
+  switch (val) {
+  case JPEG_REACHED_SOS:        /* Found SOS */
+    if (inputctl->inheaders) {  /* 1st SOS */
+      initial_setup(cinfo);
+      inputctl->inheaders = FALSE;
+      /* Note: start_input_pass must be called by jdmaster.c
+       * before any more input can be consumed.  jdapimin.c is
+       * responsible for enforcing this sequencing.
+       */
+    } else {                    /* 2nd or later SOS marker */
+      if (! inputctl->pub.has_multiple_scans)
+        ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */
+      start_input_pass(cinfo);
+    }
+    break;
+  case JPEG_REACHED_EOI:        /* Found EOI */
+    inputctl->pub.eoi_reached = TRUE;
+    if (inputctl->inheaders) {  /* Tables-only datastream, apparently */
+      if (cinfo->marker->saw_SOF)
+        ERREXIT(cinfo, JERR_SOF_NO_SOS);
+    } else {
+      /* Prevent infinite loop in coef ctlr's decompress_data routine
+       * if user set output_scan_number larger than number of scans.
+       */
+      if (cinfo->output_scan_number > cinfo->input_scan_number)
+        cinfo->output_scan_number = cinfo->input_scan_number;
+    }
+    break;
+  case JPEG_SUSPENDED:
+    break;
+  }
+
+  return val;
+}
+
+
+/*
+ * Reset state to begin a fresh datastream.
+ */
+
+METHODDEF(void)
+reset_input_controller (j_decompress_ptr cinfo)
+{
+  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
+
+  inputctl->pub.consume_input = consume_markers;
+  inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
+  inputctl->pub.eoi_reached = FALSE;
+  inputctl->inheaders = TRUE;
+  /* Reset other modules */
+  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+  (*cinfo->marker->reset_marker_reader) (cinfo);
+  /* Reset progression state -- would be cleaner if entropy decoder did this */
+  cinfo->coef_bits = NULL;
+}
+
+
+/*
+ * Initialize the input controller module.
+ * This is called only once, when the decompression object is created.
+ */
+
+GLOBAL(void)
+jinit_input_controller (j_decompress_ptr cinfo)
+{
+  my_inputctl_ptr inputctl;
+
+  /* Create subobject in permanent pool */
+  inputctl = (my_inputctl_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+                                SIZEOF(my_input_controller));
+  cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
+  /* Initialize method pointers */
+  inputctl->pub.consume_input = consume_markers;
+  inputctl->pub.reset_input_controller = reset_input_controller;
+  inputctl->pub.start_input_pass = start_input_pass;
+  inputctl->pub.finish_input_pass = finish_input_pass;
+  /* Initialize state: can't use reset_input_controller since we don't
+   * want to try to reset other modules yet.
+   */
+  inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
+  inputctl->pub.eoi_reached = FALSE;
+  inputctl->inheaders = TRUE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdmainct.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,516 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdmainct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the main buffer controller for decompression.
+ * The main buffer lies between the JPEG decompressor proper and the
+ * post-processor; it holds downsampled data in the JPEG colorspace.
+ *
+ * Note that this code is bypassed in raw-data mode, since the application
+ * supplies the equivalent of the main buffer in that case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * In the current system design, the main buffer need never be a full-image
+ * buffer; any full-height buffers will be found inside the coefficient or
+ * postprocessing controllers.  Nonetheless, the main controller is not
+ * trivial.  Its responsibility is to provide context rows for upsampling/
+ * rescaling, and doing this in an efficient fashion is a bit tricky.
+ *
+ * Postprocessor input data is counted in "row groups".  A row group
+ * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
+ * sample rows of each component.  (We require DCT_scaled_size values to be
+ * chosen such that these numbers are integers.  In practice DCT_scaled_size
+ * values will likely be powers of two, so we actually have the stronger
+ * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)
+ * Upsampling will typically produce max_v_samp_factor pixel rows from each
+ * row group (times any additional scale factor that the upsampler is
+ * applying).
+ *
+ * The coefficient controller will deliver data to us one iMCU row at a time;
+ * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or
+ * exactly min_DCT_scaled_size row groups.  (This amount of data corresponds
+ * to one row of MCUs when the image is fully interleaved.)  Note that the
+ * number of sample rows varies across components, but the number of row
+ * groups does not.  Some garbage sample rows may be included in the last iMCU
+ * row at the bottom of the image.
+ *
+ * Depending on the vertical scaling algorithm used, the upsampler may need
+ * access to the sample row(s) above and below its current input row group.
+ * The upsampler is required to set need_context_rows TRUE at global selection
+ * time if so.  When need_context_rows is FALSE, this controller can simply
+ * obtain one iMCU row at a time from the coefficient controller and dole it
+ * out as row groups to the postprocessor.
+ *
+ * When need_context_rows is TRUE, this controller guarantees that the buffer
+ * passed to postprocessing contains at least one row group's worth of samples
+ * above and below the row group(s) being processed.  Note that the context
+ * rows "above" the first passed row group appear at negative row offsets in
+ * the passed buffer.  At the top and bottom of the image, the required
+ * context rows are manufactured by duplicating the first or last real sample
+ * row; this avoids having special cases in the upsampling inner loops.
+ *
+ * The amount of context is fixed at one row group just because that's a
+ * convenient number for this controller to work with.  The existing
+ * upsamplers really only need one sample row of context.  An upsampler
+ * supporting arbitrary output rescaling might wish for more than one row
+ * group of context when shrinking the image; tough, we don't handle that.
+ * (This is justified by the assumption that downsizing will be handled mostly
+ * by adjusting the DCT_scaled_size values, so that the actual scale factor at
+ * the upsample step needn't be much less than one.)
+ *
+ * To provide the desired context, we have to retain the last two row groups
+ * of one iMCU row while reading in the next iMCU row.  (The last row group
+ * can't be processed until we have another row group for its below-context,
+ * and so we have to save the next-to-last group too for its above-context.)
+ * We could do this most simply by copying data around in our buffer, but
+ * that'd be very slow.  We can avoid copying any data by creating a rather
+ * strange pointer structure.  Here's how it works.  We allocate a workspace
+ * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number
+ * of row groups per iMCU row).  We create two sets of redundant pointers to
+ * the workspace.  Labeling the physical row groups 0 to M+1, the synthesized
+ * pointer lists look like this:
+ *                   M+1                          M-1
+ * master pointer --> 0         master pointer --> 0
+ *                    1                            1
+ *                   ...                          ...
+ *                   M-3                          M-3
+ *                   M-2                           M
+ *                   M-1                          M+1
+ *                    M                           M-2
+ *                   M+1                          M-1
+ *                    0                            0
+ * We read alternate iMCU rows using each master pointer; thus the last two
+ * row groups of the previous iMCU row remain un-overwritten in the workspace.
+ * The pointer lists are set up so that the required context rows appear to
+ * be adjacent to the proper places when we pass the pointer lists to the
+ * upsampler.
+ *
+ * The above pictures describe the normal state of the pointer lists.
+ * At top and bottom of the image, we diddle the pointer lists to duplicate
+ * the first or last sample row as necessary (this is cheaper than copying
+ * sample rows around).
+ *
+ * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1.  In that
+ * situation each iMCU row provides only one row group so the buffering logic
+ * must be different (eg, we must read two iMCU rows before we can emit the
+ * first row group).  For now, we simply do not support providing context
+ * rows when min_DCT_scaled_size is 1.  That combination seems unlikely to
+ * be worth providing --- if someone wants a 1/8th-size preview, they probably
+ * want it quick and dirty, so a context-free upsampler is sufficient.
+ */
+
+
+/* Private buffer controller object */
+
+typedef struct {
+  struct jpeg_d_main_controller pub; /* public fields */
+
+  /* Pointer to allocated workspace (M or M+2 row groups). */
+  JSAMPARRAY buffer[MAX_COMPONENTS];
+
+  boolean buffer_full;          /* Have we gotten an iMCU row from decoder? */
+  JDIMENSION rowgroup_ctr;      /* counts row groups output to postprocessor */
+
+  /* Remaining fields are only used in the context case. */
+
+  /* These are the master pointers to the funny-order pointer lists. */
+  JSAMPIMAGE xbuffer[2];        /* pointers to weird pointer lists */
+
+  int whichptr;                 /* indicates which pointer set is now in use */
+  int context_state;            /* process_data state machine status */
+  JDIMENSION rowgroups_avail;   /* row groups available to postprocessor */
+  JDIMENSION iMCU_row_ctr;      /* counts iMCU rows to detect image top/bot */
+} my_main_controller;
+
+typedef my_main_controller * my_main_ptr;
+
+/* context_state values: */
+#define CTX_PREPARE_FOR_IMCU    0       /* need to prepare for MCU row */
+#define CTX_PROCESS_IMCU        1       /* feeding iMCU to postprocessor */
+#define CTX_POSTPONED_ROW       2       /* feeding postponed row group */
+
+
+/* Forward declarations */
+METHODDEF(void) process_data_simple_main
+        JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+             JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+METHODDEF(void) process_data_context_main
+        JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+             JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+#ifdef QUANT_2PASS_SUPPORTED
+METHODDEF(void) process_data_crank_post
+        JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+             JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+#endif
+
+
+LOCAL(void)
+alloc_funny_pointers (j_decompress_ptr cinfo)
+/* Allocate space for the funny pointer lists.
+ * This is done only once, not once per pass.
+ */
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+  int ci, rgroup;
+  int M = cinfo->min_DCT_scaled_size;
+  jpeg_component_info *compptr;
+  JSAMPARRAY xbuf;
+
+  /* Get top-level space for component array pointers.
+   * We alloc both arrays with one call to save a few cycles.
+   */
+  _main->xbuffer[0] = (JSAMPIMAGE)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
+  _main->xbuffer[1] = _main->xbuffer[0] + cinfo->num_components;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+      cinfo->min_DCT_scaled_size; /* height of a row group of component */
+    /* Get space for pointer lists --- M+4 row groups in each list.
+     * We alloc both pointer lists with one call to save a few cycles.
+     */
+    xbuf = (JSAMPARRAY)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
+    xbuf += rgroup;             /* want one row group at negative offsets */
+    _main->xbuffer[0][ci] = xbuf;
+    xbuf += rgroup * (M + 4);
+    _main->xbuffer[1][ci] = xbuf;
+  }
+}
+
+
+LOCAL(void)
+make_funny_pointers (j_decompress_ptr cinfo)
+/* Create the funny pointer lists discussed in the comments above.
+ * The actual workspace is already allocated (in main->buffer),
+ * and the space for the pointer lists is allocated too.
+ * This routine just fills in the curiously ordered lists.
+ * This will be repeated at the beginning of each pass.
+ */
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+  int ci, i, rgroup;
+  int M = cinfo->min_DCT_scaled_size;
+  jpeg_component_info *compptr;
+  JSAMPARRAY buf, xbuf0, xbuf1;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+      cinfo->min_DCT_scaled_size; /* height of a row group of component */
+    xbuf0 = _main->xbuffer[0][ci];
+    xbuf1 = _main->xbuffer[1][ci];
+    /* First copy the workspace pointers as-is */
+    buf = _main->buffer[ci];
+    for (i = 0; i < rgroup * (M + 2); i++) {
+      xbuf0[i] = xbuf1[i] = buf[i];
+    }
+    /* In the second list, put the last four row groups in swapped order */
+    for (i = 0; i < rgroup * 2; i++) {
+      xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];
+      xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];
+    }
+    /* The wraparound pointers at top and bottom will be filled later
+     * (see set_wraparound_pointers, below).  Initially we want the "above"
+     * pointers to duplicate the first actual data line.  This only needs
+     * to happen in xbuffer[0].
+     */
+    for (i = 0; i < rgroup; i++) {
+      xbuf0[i - rgroup] = xbuf0[0];
+    }
+  }
+}
+
+
+LOCAL(void)
+set_wraparound_pointers (j_decompress_ptr cinfo)
+/* Set up the "wraparound" pointers at top and bottom of the pointer lists.
+ * This changes the pointer list state from top-of-image to the normal state.
+ */
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+  int ci, i, rgroup;
+  int M = cinfo->min_DCT_scaled_size;
+  jpeg_component_info *compptr;
+  JSAMPARRAY xbuf0, xbuf1;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+      cinfo->min_DCT_scaled_size; /* height of a row group of component */
+    xbuf0 = _main->xbuffer[0][ci];
+    xbuf1 = _main->xbuffer[1][ci];
+    for (i = 0; i < rgroup; i++) {
+      xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
+      xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
+      xbuf0[rgroup*(M+2) + i] = xbuf0[i];
+      xbuf1[rgroup*(M+2) + i] = xbuf1[i];
+    }
+  }
+}
+
+
+LOCAL(void)
+set_bottom_pointers (j_decompress_ptr cinfo)
+/* Change the pointer lists to duplicate the last sample row at the bottom
+ * of the image.  whichptr indicates which xbuffer holds the final iMCU row.
+ * Also sets rowgroups_avail to indicate number of nondummy row groups in row.
+ */
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+  int ci, i, rgroup, iMCUheight, rows_left;
+  jpeg_component_info *compptr;
+  JSAMPARRAY xbuf;
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Count sample rows in one iMCU row and in one row group */
+    iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size;
+    rgroup = iMCUheight / cinfo->min_DCT_scaled_size;
+    /* Count nondummy sample rows remaining for this component */
+    rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);
+    if (rows_left == 0) rows_left = iMCUheight;
+    /* Count nondummy row groups.  Should get same answer for each component,
+     * so we need only do it once.
+     */
+    if (ci == 0) {
+      _main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
+    }
+    /* Duplicate the last real sample row rgroup*2 times; this pads out the
+     * last partial rowgroup and ensures at least one full rowgroup of context.
+     */
+    xbuf = _main->xbuffer[_main->whichptr][ci];
+    for (i = 0; i < rgroup * 2; i++) {
+      xbuf[rows_left + i] = xbuf[rows_left-1];
+    }
+  }
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+
+  switch (pass_mode) {
+  case JBUF_PASS_THRU:
+    if (cinfo->upsample->need_context_rows) {
+      _main->pub.process_data = process_data_context_main;
+      make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
+      _main->whichptr = 0;      /* Read first iMCU row into xbuffer[0] */
+      _main->context_state = CTX_PREPARE_FOR_IMCU;
+      _main->iMCU_row_ctr = 0;
+    } else {
+      /* Simple case with no context needed */
+      _main->pub.process_data = process_data_simple_main;
+    }
+    _main->buffer_full = FALSE; /* Mark buffer empty */
+    _main->rowgroup_ctr = 0;
+    break;
+#ifdef QUANT_2PASS_SUPPORTED
+  case JBUF_CRANK_DEST:
+    /* For last pass of 2-pass quantization, just crank the postprocessor */
+    _main->pub.process_data = process_data_crank_post;
+    break;
+#endif
+  default:
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    break;
+  }
+}
+
+
+/*
+ * Process some data.
+ * This handles the simple case where no context is required.
+ */
+
+METHODDEF(void)
+process_data_simple_main (j_decompress_ptr cinfo,
+                          JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                          JDIMENSION out_rows_avail)
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+  JDIMENSION rowgroups_avail;
+
+  /* Read input data if we haven't filled the main buffer yet */
+  if (! _main->buffer_full) {
+    if (! (*cinfo->coef->decompress_data) (cinfo, _main->buffer))
+      return;                   /* suspension forced, can do nothing more */
+    _main->buffer_full = TRUE;  /* OK, we have an iMCU row to work with */
+  }
+
+  /* There are always min_DCT_scaled_size row groups in an iMCU row. */
+  rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;
+  /* Note: at the bottom of the image, we may pass extra garbage row groups
+   * to the postprocessor.  The postprocessor has to check for bottom
+   * of image anyway (at row resolution), so no point in us doing it too.
+   */
+
+  /* Feed the postprocessor */
+  (*cinfo->post->post_process_data) (cinfo, _main->buffer,
+                                     &_main->rowgroup_ctr, rowgroups_avail,
+                                     output_buf, out_row_ctr, out_rows_avail);
+
+  /* Has postprocessor consumed all the data yet? If so, mark buffer empty */
+  if (_main->rowgroup_ctr >= rowgroups_avail) {
+    _main->buffer_full = FALSE;
+    _main->rowgroup_ctr = 0;
+  }
+}
+
+
+/*
+ * Process some data.
+ * This handles the case where context rows must be provided.
+ */
+
+METHODDEF(void)
+process_data_context_main (j_decompress_ptr cinfo,
+                           JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                           JDIMENSION out_rows_avail)
+{
+  my_main_ptr _main = (my_main_ptr) cinfo->main;
+
+  /* Read input data if we haven't filled the _main buffer yet */
+  if (! _main->buffer_full) {
+    if (! (*cinfo->coef->decompress_data) (cinfo,
+                                           _main->xbuffer[_main->whichptr]))
+      return;                   /* suspension forced, can do nothing more */
+    _main->buffer_full = TRUE;  /* OK, we have an iMCU row to work with */
+    _main->iMCU_row_ctr++;      /* count rows received */
+  }
+
+  /* Postprocessor typically will not swallow all the input data it is handed
+   * in one call (due to filling the output buffer first).  Must be prepared
+   * to exit and restart.  This switch lets us keep track of how far we got.
+   * Note that each case falls through to the next on successful completion.
+   */
+  switch (_main->context_state) {
+  case CTX_POSTPONED_ROW:
+    /* Call postprocessor using previously set pointers for postponed row */
+    (*cinfo->post->post_process_data) (cinfo, _main->xbuffer[_main->whichptr],
+                        &_main->rowgroup_ctr, _main->rowgroups_avail,
+                        output_buf, out_row_ctr, out_rows_avail);
+    if (_main->rowgroup_ctr < _main->rowgroups_avail)
+      return;                   /* Need to suspend */
+    _main->context_state = CTX_PREPARE_FOR_IMCU;
+    if (*out_row_ctr >= out_rows_avail)
+      return;                   /* Postprocessor exactly filled output buf */
+    /*FALLTHROUGH*/
+  case CTX_PREPARE_FOR_IMCU:
+    /* Prepare to process first M-1 row groups of this iMCU row */
+    _main->rowgroup_ctr = 0;
+    _main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);
+    /* Check for bottom of image: if so, tweak pointers to "duplicate"
+     * the last sample row, and adjust rowgroups_avail to ignore padding rows.
+     */
+    if (_main->iMCU_row_ctr == cinfo->total_iMCU_rows)
+      set_bottom_pointers(cinfo);
+    _main->context_state = CTX_PROCESS_IMCU;
+    /*FALLTHROUGH*/
+  case CTX_PROCESS_IMCU:
+    /* Call postprocessor using previously set pointers */
+    (*cinfo->post->post_process_data) (cinfo, _main->xbuffer[_main->whichptr],
+                        &_main->rowgroup_ctr, _main->rowgroups_avail,
+                        output_buf, out_row_ctr, out_rows_avail);
+    if (_main->rowgroup_ctr < _main->rowgroups_avail)
+      return;                   /* Need to suspend */
+    /* After the first iMCU, change wraparound pointers to normal state */
+    if (_main->iMCU_row_ctr == 1)
+      set_wraparound_pointers(cinfo);
+    /* Prepare to load new iMCU row using other xbuffer list */
+    _main->whichptr ^= 1;       /* 0=>1 or 1=>0 */
+    _main->buffer_full = FALSE;
+    /* Still need to process last row group of this iMCU row, */
+    /* which is saved at index M+1 of the other xbuffer */
+    _main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);
+    _main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);
+    _main->context_state = CTX_POSTPONED_ROW;
+  }
+}
+
+
+/*
+ * Process some data.
+ * Final pass of two-pass quantization: just call the postprocessor.
+ * Source data will be the postprocessor controller's internal buffer.
+ */
+
+#ifdef QUANT_2PASS_SUPPORTED
+
+METHODDEF(void)
+process_data_crank_post (j_decompress_ptr cinfo,
+                         JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                         JDIMENSION out_rows_avail)
+{
+  (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
+                                     (JDIMENSION *) NULL, (JDIMENSION) 0,
+                                     output_buf, out_row_ctr, out_rows_avail);
+}
+
+#endif /* QUANT_2PASS_SUPPORTED */
+
+
+/*
+ * Initialize main buffer controller.
+ */
+
+GLOBAL(void)
+jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+  my_main_ptr _main;
+  int ci, rgroup, ngroups;
+  jpeg_component_info *compptr;
+
+  _main = (my_main_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_main_controller));
+  cinfo->main = (struct jpeg_d_main_controller *) _main;
+  _main->pub.start_pass = start_pass_main;
+
+  if (need_full_buffer)         /* shouldn't happen */
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+  /* Allocate the workspace.
+   * ngroups is the number of row groups we need.
+   */
+  if (cinfo->upsample->need_context_rows) {
+    if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */
+      ERREXIT(cinfo, JERR_NOTIMPL);
+    alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */
+    ngroups = cinfo->min_DCT_scaled_size + 2;
+  } else {
+    ngroups = cinfo->min_DCT_scaled_size;
+  }
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+      cinfo->min_DCT_scaled_size; /* height of a row group of component */
+    _main->buffer[ci] = (*cinfo->mem->alloc_sarray)
+                        ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                         compptr->width_in_blocks * compptr->DCT_scaled_size,
+                         (JDIMENSION) (rgroup * ngroups));
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdmarker.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,1390 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdmarker.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains routines to decode JPEG datastream markers.
+ * Most of the complexity arises from our desire to support input
+ * suspension: if not all of the data for a marker is available,
+ * we must exit back to the application.  On resumption, we reprocess
+ * the marker.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+typedef enum {                  /* JPEG marker codes */
+  M_SOF0  = 0xc0,
+  M_SOF1  = 0xc1,
+  M_SOF2  = 0xc2,
+  M_SOF3  = 0xc3,
+
+  M_SOF5  = 0xc5,
+  M_SOF6  = 0xc6,
+  M_SOF7  = 0xc7,
+
+  M_JPG   = 0xc8,
+  M_SOF9  = 0xc9,
+  M_SOF10 = 0xca,
+  M_SOF11 = 0xcb,
+
+  M_SOF13 = 0xcd,
+  M_SOF14 = 0xce,
+  M_SOF15 = 0xcf,
+
+  M_DHT   = 0xc4,
+
+  M_DAC   = 0xcc,
+
+  M_RST0  = 0xd0,
+  M_RST1  = 0xd1,
+  M_RST2  = 0xd2,
+  M_RST3  = 0xd3,
+  M_RST4  = 0xd4,
+  M_RST5  = 0xd5,
+  M_RST6  = 0xd6,
+  M_RST7  = 0xd7,
+
+  M_SOI   = 0xd8,
+  M_EOI   = 0xd9,
+  M_SOS   = 0xda,
+  M_DQT   = 0xdb,
+  M_DNL   = 0xdc,
+  M_DRI   = 0xdd,
+  M_DHP   = 0xde,
+  M_EXP   = 0xdf,
+
+  M_APP0  = 0xe0,
+  M_APP1  = 0xe1,
+  M_APP2  = 0xe2,
+  M_APP3  = 0xe3,
+  M_APP4  = 0xe4,
+  M_APP5  = 0xe5,
+  M_APP6  = 0xe6,
+  M_APP7  = 0xe7,
+  M_APP8  = 0xe8,
+  M_APP9  = 0xe9,
+  M_APP10 = 0xea,
+  M_APP11 = 0xeb,
+  M_APP12 = 0xec,
+  M_APP13 = 0xed,
+  M_APP14 = 0xee,
+  M_APP15 = 0xef,
+
+  M_JPG0  = 0xf0,
+  M_JPG13 = 0xfd,
+  M_COM   = 0xfe,
+
+  M_TEM   = 0x01,
+
+  M_ERROR = 0x100
+} JPEG_MARKER;
+
+
+/* Private state */
+
+typedef struct {
+  struct jpeg_marker_reader pub; /* public fields */
+
+  /* Application-overridable marker processing methods */
+  jpeg_marker_parser_method process_COM;
+  jpeg_marker_parser_method process_APPn[16];
+
+  /* Limit on marker data length to save for each marker type */
+  unsigned int length_limit_COM;
+  unsigned int length_limit_APPn[16];
+
+  /* Status of COM/APPn marker saving */
+  jpeg_saved_marker_ptr cur_marker;     /* NULL if not processing a marker */
+  unsigned int bytes_read;              /* data bytes read so far in marker */
+  /* Note: cur_marker is not linked into marker_list until it's all read. */
+} my_marker_reader;
+
+typedef my_marker_reader * my_marker_ptr;
+
+
+/*
+ * Macros for fetching data from the data source module.
+ *
+ * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect
+ * the current restart point; we update them only when we have reached a
+ * suitable place to restart if a suspension occurs.
+ */
+
+/* Declare and initialize local copies of input pointer/count */
+#define INPUT_VARS(cinfo)  \
+        struct jpeg_source_mgr * datasrc = (cinfo)->src;  \
+        const JOCTET * next_input_byte = datasrc->next_input_byte;  \
+        size_t bytes_in_buffer = datasrc->bytes_in_buffer
+
+/* Unload the local copies --- do this only at a restart boundary */
+#define INPUT_SYNC(cinfo)  \
+        ( datasrc->next_input_byte = next_input_byte,  \
+          datasrc->bytes_in_buffer = bytes_in_buffer )
+
+/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */
+#define INPUT_RELOAD(cinfo)  \
+        ( next_input_byte = datasrc->next_input_byte,  \
+          bytes_in_buffer = datasrc->bytes_in_buffer )
+
+/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.
+ * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,
+ * but we must reload the local copies after a successful fill.
+ */
+#define MAKE_BYTE_AVAIL(cinfo,action)  \
+        if (bytes_in_buffer == 0) {  \
+          if (! (*datasrc->fill_input_buffer) (cinfo))  \
+            { action; }  \
+          INPUT_RELOAD(cinfo);  \
+        }
+
+/* Read a byte into variable V.
+ * If must suspend, take the specified action (typically "return FALSE").
+ */
+#define INPUT_BYTE(cinfo,V,action)  \
+        MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
+                  bytes_in_buffer--; \
+                  V = GETJOCTET(*next_input_byte++); )
+
+/* As above, but read two bytes interpreted as an unsigned 16-bit integer.
+ * V should be declared unsigned int or perhaps INT32.
+ */
+#define INPUT_2BYTES(cinfo,V,action)  \
+        MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
+                  bytes_in_buffer--; \
+                  V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
+                  MAKE_BYTE_AVAIL(cinfo,action); \
+                  bytes_in_buffer--; \
+                  V += GETJOCTET(*next_input_byte++); )
+
+
+/*
+ * Routines to process JPEG markers.
+ *
+ * Entry condition: JPEG marker itself has been read and its code saved
+ *   in cinfo->unread_marker; input restart point is just after the marker.
+ *
+ * Exit: if return TRUE, have read and processed any parameters, and have
+ *   updated the restart point to point after the parameters.
+ *   If return FALSE, was forced to suspend before reaching end of
+ *   marker parameters; restart point has not been moved.  Same routine
+ *   will be called again after application supplies more input data.
+ *
+ * This approach to suspension assumes that all of a marker's parameters
+ * can fit into a single input bufferload.  This should hold for "normal"
+ * markers.  Some COM/APPn markers might have large parameter segments
+ * that might not fit.  If we are simply dropping such a marker, we use
+ * skip_input_data to get past it, and thereby put the problem on the
+ * source manager's shoulders.  If we are saving the marker's contents
+ * into memory, we use a slightly different convention: when forced to
+ * suspend, the marker processor updates the restart point to the end of
+ * what it's consumed (ie, the end of the buffer) before returning FALSE.
+ * On resumption, cinfo->unread_marker still contains the marker code,
+ * but the data source will point to the next chunk of marker data.
+ * The marker processor must retain internal state to deal with this.
+ *
+ * Note that we don't bother to avoid duplicate trace messages if a
+ * suspension occurs within marker parameters.  Other side effects
+ * require more care.
+ */
+
+
+LOCAL(boolean)
+get_soi (j_decompress_ptr cinfo)
+/* Process an SOI marker */
+{
+  int i;
+
+  TRACEMS(cinfo, 1, JTRC_SOI);
+
+  if (cinfo->marker->saw_SOI)
+    ERREXIT(cinfo, JERR_SOI_DUPLICATE);
+
+  /* Reset all parameters that are defined to be reset by SOI */
+
+  for (i = 0; i < NUM_ARITH_TBLS; i++) {
+    cinfo->arith_dc_L[i] = 0;
+    cinfo->arith_dc_U[i] = 1;
+    cinfo->arith_ac_K[i] = 5;
+  }
+  cinfo->restart_interval = 0;
+
+  /* Set initial assumptions for colorspace etc */
+
+  cinfo->jpeg_color_space = JCS_UNKNOWN;
+  cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
+
+  cinfo->saw_JFIF_marker = FALSE;
+  cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */
+  cinfo->JFIF_minor_version = 1;
+  cinfo->density_unit = 0;
+  cinfo->X_density = 1;
+  cinfo->Y_density = 1;
+  cinfo->saw_Adobe_marker = FALSE;
+  cinfo->Adobe_transform = 0;
+
+  cinfo->marker->saw_SOI = TRUE;
+
+  return TRUE;
+}
+
+
+LOCAL(boolean)
+get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
+/* Process a SOFn marker */
+{
+  INT32 length;
+  int c, ci;
+  jpeg_component_info * compptr;
+  INPUT_VARS(cinfo);
+
+  cinfo->progressive_mode = is_prog;
+  cinfo->arith_code = is_arith;
+
+  INPUT_2BYTES(cinfo, length, return FALSE);
+
+  INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);
+  INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE);
+  INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE);
+  INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);
+
+  length -= 8;
+
+  TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
+           (int) cinfo->image_width, (int) cinfo->image_height,
+           cinfo->num_components);
+
+  if (cinfo->marker->saw_SOF)
+    ERREXIT(cinfo, JERR_SOF_DUPLICATE);
+
+  /* We don't support files in which the image height is initially specified */
+  /* as 0 and is later redefined by DNL.  As long as we have to check that,  */
+  /* might as well have a general sanity check. */
+  if (cinfo->image_height <= 0 || cinfo->image_width <= 0
+      || cinfo->num_components <= 0)
+    ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
+  if (length != (cinfo->num_components * 3))
+    ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+  if (cinfo->comp_info == NULL) { /* do only once, even if suspend */
+    cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
+                        ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                         cinfo->num_components * SIZEOF(jpeg_component_info));
+    MEMZERO(cinfo->comp_info,
+            cinfo->num_components * SIZEOF(jpeg_component_info));
+  }
+
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    compptr->component_index = ci;
+    INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
+    INPUT_BYTE(cinfo, c, return FALSE);
+    compptr->h_samp_factor = (c >> 4) & 15;
+    compptr->v_samp_factor = (c     ) & 15;
+    INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);
+
+    TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
+             compptr->component_id, compptr->h_samp_factor,
+             compptr->v_samp_factor, compptr->quant_tbl_no);
+  }
+
+  cinfo->marker->saw_SOF = TRUE;
+
+  INPUT_SYNC(cinfo);
+  return TRUE;
+}
+
+
+LOCAL(boolean)
+get_sos (j_decompress_ptr cinfo)
+/* Process a SOS marker */
+{
+  INT32 length;
+  int i, ci, n, c, cc;
+  jpeg_component_info * compptr;
+  INPUT_VARS(cinfo);
+
+  if (! cinfo->marker->saw_SOF)
+    ERREXIT(cinfo, JERR_SOS_NO_SOF);
+
+  INPUT_2BYTES(cinfo, length, return FALSE);
+
+  INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */
+
+  TRACEMS1(cinfo, 1, JTRC_SOS, n);
+
+  if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)
+    ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+  cinfo->comps_in_scan = n;
+
+  /* Collect the component-spec parameters */
+
+  for (i = 0; i < n; i++) {
+    INPUT_BYTE(cinfo, cc, return FALSE);
+    INPUT_BYTE(cinfo, c, return FALSE);
+
+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+         ci++, compptr++) {
+      if (cc == compptr->component_id)
+        goto id_found;
+    }
+
+    ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+
+  id_found:
+
+    cinfo->cur_comp_info[i] = compptr;
+    compptr->dc_tbl_no = (c >> 4) & 15;
+    compptr->ac_tbl_no = (c     ) & 15;
+
+    TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
+             compptr->dc_tbl_no, compptr->ac_tbl_no);
+
+    /* This CSi (cc) should differ from the previous CSi */
+    for (ci = 0; ci < i; ci++) {
+      if (cinfo->cur_comp_info[ci] == compptr)
+        ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+    }
+  }
+
+  /* Collect the additional scan parameters Ss, Se, Ah/Al. */
+  INPUT_BYTE(cinfo, c, return FALSE);
+  cinfo->Ss = c;
+  INPUT_BYTE(cinfo, c, return FALSE);
+  cinfo->Se = c;
+  INPUT_BYTE(cinfo, c, return FALSE);
+  cinfo->Ah = (c >> 4) & 15;
+  cinfo->Al = (c     ) & 15;
+
+  TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
+           cinfo->Ah, cinfo->Al);
+
+  /* Prepare to scan data & restart markers */
+  cinfo->marker->next_restart_num = 0;
+
+  /* Count another SOS marker */
+  cinfo->input_scan_number++;
+
+  INPUT_SYNC(cinfo);
+  return TRUE;
+}
+
+
+#ifdef D_ARITH_CODING_SUPPORTED
+
+LOCAL(boolean)
+get_dac (j_decompress_ptr cinfo)
+/* Process a DAC marker */
+{
+  INT32 length;
+  int index, val;
+  INPUT_VARS(cinfo);
+
+  INPUT_2BYTES(cinfo, length, return FALSE);
+  length -= 2;
+
+  while (length > 0) {
+    INPUT_BYTE(cinfo, index, return FALSE);
+    INPUT_BYTE(cinfo, val, return FALSE);
+
+    length -= 2;
+
+    TRACEMS2(cinfo, 1, JTRC_DAC, index, val);
+
+    if (index < 0 || index >= (2*NUM_ARITH_TBLS))
+      ERREXIT1(cinfo, JERR_DAC_INDEX, index);
+
+    if (index >= NUM_ARITH_TBLS) { /* define AC table */
+      cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;
+    } else {                    /* define DC table */
+      cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);
+      cinfo->arith_dc_U[index] = (UINT8) (val >> 4);
+      if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])
+        ERREXIT1(cinfo, JERR_DAC_VALUE, val);
+    }
+  }
+
+  if (length != 0)
+    ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+  INPUT_SYNC(cinfo);
+  return TRUE;
+}
+
+#else /* ! D_ARITH_CODING_SUPPORTED */
+
+#define get_dac(cinfo)  skip_variable(cinfo)
+
+#endif /* D_ARITH_CODING_SUPPORTED */
+
+
+LOCAL(boolean)
+get_dht (j_decompress_ptr cinfo)
+/* Process a DHT marker */
+{
+  INT32 length;
+  UINT8 bits[17];
+  UINT8 huffval[256];
+  int i, index, count;
+  JHUFF_TBL **htblptr;
+  INPUT_VARS(cinfo);
+
+  INPUT_2BYTES(cinfo, length, return FALSE);
+  length -= 2;
+
+  while (length > 16) {
+    INPUT_BYTE(cinfo, index, return FALSE);
+
+    TRACEMS1(cinfo, 1, JTRC_DHT, index);
+
+    bits[0] = 0;
+    count = 0;
+    for (i = 1; i <= 16; i++) {
+      INPUT_BYTE(cinfo, bits[i], return FALSE);
+      count += bits[i];
+    }
+
+    length -= 1 + 16;
+
+    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
+             bits[1], bits[2], bits[3], bits[4],
+             bits[5], bits[6], bits[7], bits[8]);
+    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
+             bits[9], bits[10], bits[11], bits[12],
+             bits[13], bits[14], bits[15], bits[16]);
+
+    /* Here we just do minimal validation of the counts to avoid walking
+     * off the end of our table space.  jdhuff.c will check more carefully.
+     */
+    if (count > 256 || ((INT32) count) > length)
+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+
+    for (i = 0; i < count; i++)
+      INPUT_BYTE(cinfo, huffval[i], return FALSE);
+
+    length -= count;
+
+    if (index & 0x10) {         /* AC table definition */
+      index -= 0x10;
+      htblptr = &cinfo->ac_huff_tbl_ptrs[index];
+    } else {                    /* DC table definition */
+      htblptr = &cinfo->dc_huff_tbl_ptrs[index];
+    }
+
+    if (index < 0 || index >= NUM_HUFF_TBLS)
+      ERREXIT1(cinfo, JERR_DHT_INDEX, index);
+
+    if (*htblptr == NULL)
+      *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+
+    MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
+    MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
+  }
+
+  if (length != 0)
+    ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+  INPUT_SYNC(cinfo);
+  return TRUE;
+}
+
+
+LOCAL(boolean)
+get_dqt (j_decompress_ptr cinfo)
+/* Process a DQT marker */
+{
+  INT32 length;
+  int n, i, prec;
+  unsigned int tmp;
+  JQUANT_TBL *quant_ptr;
+  INPUT_VARS(cinfo);
+
+  INPUT_2BYTES(cinfo, length, return FALSE);
+  length -= 2;
+
+  while (length > 0) {
+    INPUT_BYTE(cinfo, n, return FALSE);
+    prec = n >> 4;
+    n &= 0x0F;
+
+    TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);
+
+    if (n >= NUM_QUANT_TBLS)
+      ERREXIT1(cinfo, JERR_DQT_INDEX, n);
+
+    if (cinfo->quant_tbl_ptrs[n] == NULL)
+      cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);
+    quant_ptr = cinfo->quant_tbl_ptrs[n];
+
+    for (i = 0; i < DCTSIZE2; i++) {
+      if (prec)
+        INPUT_2BYTES(cinfo, tmp, return FALSE);
+      else
+        INPUT_BYTE(cinfo, tmp, return FALSE);
+      /* We convert the zigzag-order table to natural array order. */
+      quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp;
+    }
+
+    if (cinfo->err->trace_level >= 2) {
+      for (i = 0; i < DCTSIZE2; i += 8) {
+        TRACEMS8(cinfo, 2, JTRC_QUANTVALS,
+                 quant_ptr->quantval[i],   quant_ptr->quantval[i+1],
+                 quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],
+                 quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],
+                 quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);
+      }
+    }
+
+    length -= DCTSIZE2+1;
+    if (prec) length -= DCTSIZE2;
+  }
+
+  if (length != 0)
+    ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+  INPUT_SYNC(cinfo);
+  return TRUE;
+}
+
+
+LOCAL(boolean)
+get_dri (j_decompress_ptr cinfo)
+/* Process a DRI marker */
+{
+  INT32 length;
+  unsigned int tmp;
+  INPUT_VARS(cinfo);
+
+  INPUT_2BYTES(cinfo, length, return FALSE);
+
+  if (length != 4)
+    ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+  INPUT_2BYTES(cinfo, tmp, return FALSE);
+
+  TRACEMS1(cinfo, 1, JTRC_DRI, tmp);
+
+  cinfo->restart_interval = tmp;
+
+  INPUT_SYNC(cinfo);
+  return TRUE;
+}
+
+
+/*
+ * Routines for processing APPn and COM markers.
+ * These are either saved in memory or discarded, per application request.
+ * APP0 and APP14 are specially checked to see if they are
+ * JFIF and Adobe markers, respectively.
+ */
+
+#define APP0_DATA_LEN   14      /* Length of interesting data in APP0 */
+#define APP14_DATA_LEN  12      /* Length of interesting data in APP14 */
+#define APPN_DATA_LEN   14      /* Must be the largest of the above!! */
+
+
+LOCAL(void)
+examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
+              unsigned int datalen, INT32 remaining)
+/* Examine first few bytes from an APP0.
+ * Take appropriate action if it is a JFIF marker.
+ * datalen is # of bytes at data[], remaining is length of rest of marker data.
+ */
+{
+  INT32 totallen = (INT32) datalen + remaining;
+
+  if (datalen >= APP0_DATA_LEN &&
+      GETJOCTET(data[0]) == 0x4A &&
+      GETJOCTET(data[1]) == 0x46 &&
+      GETJOCTET(data[2]) == 0x49 &&
+      GETJOCTET(data[3]) == 0x46 &&
+      GETJOCTET(data[4]) == 0) {
+    /* Found JFIF APP0 marker: save info */
+    cinfo->saw_JFIF_marker = TRUE;
+    cinfo->JFIF_major_version = GETJOCTET(data[5]);
+    cinfo->JFIF_minor_version = GETJOCTET(data[6]);
+    cinfo->density_unit = GETJOCTET(data[7]);
+    cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
+    cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
+    /* Check version.
+     * Major version must be 1, anything else signals an incompatible change.
+     * (We used to treat this as an error, but now it's a nonfatal warning,
+     * because some bozo at Hijaak couldn't read the spec.)
+     * Minor version should be 0..2, but process anyway if newer.
+     */
+    if (cinfo->JFIF_major_version != 1)
+      WARNMS2(cinfo, JWRN_JFIF_MAJOR,
+              cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
+    /* Generate trace messages */
+    TRACEMS5(cinfo, 1, JTRC_JFIF,
+             cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
+             cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
+    /* Validate thumbnail dimensions and issue appropriate messages */
+    if (GETJOCTET(data[12]) | GETJOCTET(data[13]))
+      TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,
+               GETJOCTET(data[12]), GETJOCTET(data[13]));
+    totallen -= APP0_DATA_LEN;
+    if (totallen !=
+        ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))
+      TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);
+  } else if (datalen >= 6 &&
+      GETJOCTET(data[0]) == 0x4A &&
+      GETJOCTET(data[1]) == 0x46 &&
+      GETJOCTET(data[2]) == 0x58 &&
+      GETJOCTET(data[3]) == 0x58 &&
+      GETJOCTET(data[4]) == 0) {
+    /* Found JFIF "JFXX" extension APP0 marker */
+    /* The library doesn't actually do anything with these,
+     * but we try to produce a helpful trace message.
+     */
+    switch (GETJOCTET(data[5])) {
+    case 0x10:
+      TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);
+      break;
+    case 0x11:
+      TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);
+      break;
+    case 0x13:
+      TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);
+      break;
+    default:
+      TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
+               GETJOCTET(data[5]), (int) totallen);
+      break;
+    }
+  } else {
+    /* Start of APP0 does not match "JFIF" or "JFXX", or too short */
+    TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);
+
+    /*
+     * In this case we have seen the APP0 marker but the remaining
+     * APP0 section may be corrupt.  Regardless, we will set the
+     * saw_JFIF_marker flag as it is important for making the
+     * correct choice of JPEG color space later (we will assume
+     * YCbCr in this case).  The version and density fields will
+     * contain default values, which should be sufficient for our needs.
+     */
+    cinfo->saw_JFIF_marker = TRUE;
+  }
+}
+
+
+LOCAL(void)
+examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,
+               unsigned int datalen, INT32 remaining)
+/* Examine first few bytes from an APP14.
+ * Take appropriate action if it is an Adobe marker.
+ * datalen is # of bytes at data[], remaining is length of rest of marker data.
+ */
+{
+  unsigned int version, flags0, flags1, transform;
+
+  if (datalen >= APP14_DATA_LEN &&
+      GETJOCTET(data[0]) == 0x41 &&
+      GETJOCTET(data[1]) == 0x64 &&
+      GETJOCTET(data[2]) == 0x6F &&
+      GETJOCTET(data[3]) == 0x62 &&
+      GETJOCTET(data[4]) == 0x65) {
+    /* Found Adobe APP14 marker */
+    version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);
+    flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);
+    flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);
+    transform = GETJOCTET(data[11]);
+    TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);
+    cinfo->saw_Adobe_marker = TRUE;
+    cinfo->Adobe_transform = (UINT8) transform;
+  } else {
+    /* Start of APP14 does not match "Adobe", or too short */
+    TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));
+  }
+}
+
+
+METHODDEF(boolean)
+get_interesting_appn (j_decompress_ptr cinfo)
+/* Process an APP0 or APP14 marker without saving it */
+{
+  INT32 length;
+  JOCTET b[APPN_DATA_LEN];
+  unsigned int i, numtoread;
+  INPUT_VARS(cinfo);
+
+  INPUT_2BYTES(cinfo, length, return FALSE);
+  length -= 2;
+
+  /* get the interesting part of the marker data */
+  if (length >= APPN_DATA_LEN)
+    numtoread = APPN_DATA_LEN;
+  else if (length > 0)
+    numtoread = (unsigned int) length;
+  else
+    numtoread = 0;
+  for (i = 0; i < numtoread; i++)
+    INPUT_BYTE(cinfo, b[i], return FALSE);
+  length -= numtoread;
+
+  /* process it */
+  switch (cinfo->unread_marker) {
+  case M_APP0:
+    examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);
+    break;
+  case M_APP14:
+    examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);
+    break;
+  default:
+    /* can't get here unless jpeg_save_markers chooses wrong processor */
+    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
+    break;
+  }
+
+  /* skip any remaining data -- could be lots */
+  INPUT_SYNC(cinfo);
+  if (length > 0)
+    (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+  return TRUE;
+}
+
+
+#ifdef SAVE_MARKERS_SUPPORTED
+
+METHODDEF(boolean)
+save_marker (j_decompress_ptr cinfo)
+/* Save an APPn or COM marker into the marker list */
+{
+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+  jpeg_saved_marker_ptr cur_marker = marker->cur_marker;
+  unsigned int bytes_read, data_length;
+  JOCTET FAR * data;
+  INT32 length = 0;
+  INPUT_VARS(cinfo);
+
+  if (cur_marker == NULL) {
+    /* begin reading a marker */
+    INPUT_2BYTES(cinfo, length, return FALSE);
+    length -= 2;
+    if (length >= 0) {          /* watch out for bogus length word */
+      /* figure out how much we want to save */
+      unsigned int limit;
+      if (cinfo->unread_marker == (int) M_COM)
+        limit = marker->length_limit_COM;
+      else
+        limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];
+      if ((unsigned int) length < limit)
+        limit = (unsigned int) length;
+      /* allocate and initialize the marker item */
+      cur_marker = (jpeg_saved_marker_ptr)
+        (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                    SIZEOF(struct jpeg_marker_struct) + limit);
+      cur_marker->next = NULL;
+      cur_marker->marker = (UINT8) cinfo->unread_marker;
+      cur_marker->original_length = (unsigned int) length;
+      cur_marker->data_length = limit;
+      /* data area is just beyond the jpeg_marker_struct */
+      data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);
+      marker->cur_marker = cur_marker;
+      marker->bytes_read = 0;
+      bytes_read = 0;
+      data_length = limit;
+    } else {
+      /* deal with bogus length word */
+      bytes_read = data_length = 0;
+      data = NULL;
+    }
+  } else {
+    /* resume reading a marker */
+    bytes_read = marker->bytes_read;
+    data_length = cur_marker->data_length;
+    data = cur_marker->data + bytes_read;
+  }
+
+  while (bytes_read < data_length) {
+    INPUT_SYNC(cinfo);          /* move the restart point to here */
+    marker->bytes_read = bytes_read;
+    /* If there's not at least one byte in buffer, suspend */
+    MAKE_BYTE_AVAIL(cinfo, return FALSE);
+    /* Copy bytes with reasonable rapidity */
+    while (bytes_read < data_length && bytes_in_buffer > 0) {
+      *data++ = *next_input_byte++;
+      bytes_in_buffer--;
+      bytes_read++;
+    }
+  }
+
+  /* Done reading what we want to read */
+  if (cur_marker != NULL) {     /* will be NULL if bogus length word */
+    /* Add new marker to end of list */
+    if (cinfo->marker_list == NULL) {
+      cinfo->marker_list = cur_marker;
+    } else {
+      jpeg_saved_marker_ptr prev = cinfo->marker_list;
+      while (prev->next != NULL)
+        prev = prev->next;
+      prev->next = cur_marker;
+    }
+    /* Reset pointer & calc remaining data length */
+    data = cur_marker->data;
+    length = cur_marker->original_length - data_length;
+  }
+  /* Reset to initial state for next marker */
+  marker->cur_marker = NULL;
+
+  /* Process the marker if interesting; else just make a generic trace msg */
+  switch (cinfo->unread_marker) {
+  case M_APP0:
+    examine_app0(cinfo, data, data_length, length);
+    break;
+  case M_APP14:
+    examine_app14(cinfo, data, data_length, length);
+    break;
+  default:
+    TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
+             (int) (data_length + length));
+    break;
+  }
+
+  /* skip any remaining data -- could be lots */
+  INPUT_SYNC(cinfo);            /* do before skip_input_data */
+  if (length > 0)
+    (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+  return TRUE;
+}
+
+#endif /* SAVE_MARKERS_SUPPORTED */
+
+
+METHODDEF(boolean)
+skip_variable (j_decompress_ptr cinfo)
+/* Skip over an unknown or uninteresting variable-length marker */
+{
+  INT32 length;
+  INPUT_VARS(cinfo);
+
+  INPUT_2BYTES(cinfo, length, return FALSE);
+  length -= 2;
+
+  TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);
+
+  INPUT_SYNC(cinfo);            /* do before skip_input_data */
+  if (length > 0)
+    (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+  return TRUE;
+}
+
+
+/*
+ * Find the next JPEG marker, save it in cinfo->unread_marker.
+ * Returns FALSE if had to suspend before reaching a marker;
+ * in that case cinfo->unread_marker is unchanged.
+ *
+ * Note that the result might not be a valid marker code,
+ * but it will never be 0 or FF.
+ */
+
+LOCAL(boolean)
+next_marker (j_decompress_ptr cinfo)
+{
+  int c;
+  INPUT_VARS(cinfo);
+
+  for (;;) {
+    INPUT_BYTE(cinfo, c, return FALSE);
+    /* Skip any non-FF bytes.
+     * This may look a bit inefficient, but it will not occur in a valid file.
+     * We sync after each discarded byte so that a suspending data source
+     * can discard the byte from its buffer.
+     */
+    while (c != 0xFF) {
+      cinfo->marker->discarded_bytes++;
+      INPUT_SYNC(cinfo);
+      INPUT_BYTE(cinfo, c, return FALSE);
+    }
+    /* This loop swallows any duplicate FF bytes.  Extra FFs are legal as
+     * pad bytes, so don't count them in discarded_bytes.  We assume there
+     * will not be so many consecutive FF bytes as to overflow a suspending
+     * data source's input buffer.
+     */
+    do {
+      INPUT_BYTE(cinfo, c, return FALSE);
+    } while (c == 0xFF);
+    if (c != 0)
+      break;                    /* found a valid marker, exit loop */
+    /* Reach here if we found a stuffed-zero data sequence (FF/00).
+     * Discard it and loop back to try again.
+     */
+    cinfo->marker->discarded_bytes += 2;
+    INPUT_SYNC(cinfo);
+  }
+
+  if (cinfo->marker->discarded_bytes != 0) {
+    WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
+    cinfo->marker->discarded_bytes = 0;
+  }
+
+  cinfo->unread_marker = c;
+
+  INPUT_SYNC(cinfo);
+  return TRUE;
+}
+
+
+LOCAL(boolean)
+first_marker (j_decompress_ptr cinfo)
+/* Like next_marker, but used to obtain the initial SOI marker. */
+/* For this marker, we do not allow preceding garbage or fill; otherwise,
+ * we might well scan an entire input file before realizing it ain't JPEG.
+ * If an application wants to process non-JFIF files, it must seek to the
+ * SOI before calling the JPEG library.
+ */
+{
+  int c, c2;
+  INPUT_VARS(cinfo);
+
+  INPUT_BYTE(cinfo, c, return FALSE);
+  INPUT_BYTE(cinfo, c2, return FALSE);
+  if (c != 0xFF || c2 != (int) M_SOI)
+    ERREXIT2(cinfo, JERR_NO_SOI, c, c2);
+
+  cinfo->unread_marker = c2;
+
+  INPUT_SYNC(cinfo);
+  return TRUE;
+}
+
+
+/*
+ * Read markers until SOS or EOI.
+ *
+ * Returns same codes as are defined for jpeg_consume_input:
+ * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ */
+
+METHODDEF(int)
+read_markers (j_decompress_ptr cinfo)
+{
+  /* Outer loop repeats once for each marker. */
+  for (;;) {
+    /* Collect the marker proper, unless we already did. */
+    /* NB: first_marker() enforces the requirement that SOI appear first. */
+    if (cinfo->unread_marker == 0) {
+      if (! cinfo->marker->saw_SOI) {
+        if (! first_marker(cinfo))
+          return JPEG_SUSPENDED;
+      } else {
+        if (! next_marker(cinfo))
+          return JPEG_SUSPENDED;
+      }
+    }
+    /* At this point cinfo->unread_marker contains the marker code and the
+     * input point is just past the marker proper, but before any parameters.
+     * A suspension will cause us to return with this state still true.
+     */
+    switch (cinfo->unread_marker) {
+    case M_SOI:
+      if (! get_soi(cinfo))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_SOF0:                /* Baseline */
+    case M_SOF1:                /* Extended sequential, Huffman */
+      if (! get_sof(cinfo, FALSE, FALSE))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_SOF2:                /* Progressive, Huffman */
+      if (! get_sof(cinfo, TRUE, FALSE))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_SOF9:                /* Extended sequential, arithmetic */
+      if (! get_sof(cinfo, FALSE, TRUE))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_SOF10:               /* Progressive, arithmetic */
+      if (! get_sof(cinfo, TRUE, TRUE))
+        return JPEG_SUSPENDED;
+      break;
+
+    /* Currently unsupported SOFn types */
+    case M_SOF3:                /* Lossless, Huffman */
+    case M_SOF5:                /* Differential sequential, Huffman */
+    case M_SOF6:                /* Differential progressive, Huffman */
+    case M_SOF7:                /* Differential lossless, Huffman */
+    case M_JPG:                 /* Reserved for JPEG extensions */
+    case M_SOF11:               /* Lossless, arithmetic */
+    case M_SOF13:               /* Differential sequential, arithmetic */
+    case M_SOF14:               /* Differential progressive, arithmetic */
+    case M_SOF15:               /* Differential lossless, arithmetic */
+      ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);
+      break;
+
+    case M_SOS:
+      if (! get_sos(cinfo))
+        return JPEG_SUSPENDED;
+      cinfo->unread_marker = 0; /* processed the marker */
+      return JPEG_REACHED_SOS;
+
+    case M_EOI:
+      TRACEMS(cinfo, 1, JTRC_EOI);
+      cinfo->unread_marker = 0; /* processed the marker */
+      return JPEG_REACHED_EOI;
+
+    case M_DAC:
+      if (! get_dac(cinfo))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_DHT:
+      if (! get_dht(cinfo))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_DQT:
+      if (! get_dqt(cinfo))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_DRI:
+      if (! get_dri(cinfo))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_APP0:
+    case M_APP1:
+    case M_APP2:
+    case M_APP3:
+    case M_APP4:
+    case M_APP5:
+    case M_APP6:
+    case M_APP7:
+    case M_APP8:
+    case M_APP9:
+    case M_APP10:
+    case M_APP11:
+    case M_APP12:
+    case M_APP13:
+    case M_APP14:
+    case M_APP15:
+      if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[
+                cinfo->unread_marker - (int) M_APP0]) (cinfo))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_COM:
+      if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
+        return JPEG_SUSPENDED;
+      break;
+
+    case M_RST0:                /* these are all parameterless */
+    case M_RST1:
+    case M_RST2:
+    case M_RST3:
+    case M_RST4:
+    case M_RST5:
+    case M_RST6:
+    case M_RST7:
+    case M_TEM:
+      TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
+      break;
+
+    case M_DNL:                 /* Ignore DNL ... perhaps the wrong thing */
+      if (! skip_variable(cinfo))
+        return JPEG_SUSPENDED;
+      break;
+
+    default:                    /* must be DHP, EXP, JPGn, or RESn */
+      /* For now, we treat the reserved markers as fatal errors since they are
+       * likely to be used to signal incompatible JPEG Part 3 extensions.
+       * Once the JPEG 3 version-number marker is well defined, this code
+       * ought to change!
+       * [To be behaviorally compatible with other popular image display
+       * applications, we are now treating these unknown markers as warnings,
+       * rather than errors.  This allows processing to continue, although
+       * any portions of the image after the bad marker may be corrupted
+       * and/or rendered gray.  See 4511441.]
+       */
+      WARNMS1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
+      break;
+    }
+    /* Successfully processed marker, so reset state variable */
+    cinfo->unread_marker = 0;
+  } /* end loop */
+}
+
+
+/*
+ * Read a restart marker, which is expected to appear next in the datastream;
+ * if the marker is not there, take appropriate recovery action.
+ * Returns FALSE if suspension is required.
+ *
+ * This is called by the entropy decoder after it has read an appropriate
+ * number of MCUs.  cinfo->unread_marker may be nonzero if the entropy decoder
+ * has already read a marker from the data source.  Under normal conditions
+ * cinfo->unread_marker will be reset to 0 before returning; if not reset,
+ * it holds a marker which the decoder will be unable to read past.
+ */
+
+METHODDEF(boolean)
+read_restart_marker (j_decompress_ptr cinfo)
+{
+  /* Obtain a marker unless we already did. */
+  /* Note that next_marker will complain if it skips any data. */
+  if (cinfo->unread_marker == 0) {
+    if (! next_marker(cinfo))
+      return FALSE;
+  }
+
+  if (cinfo->unread_marker ==
+      ((int) M_RST0 + cinfo->marker->next_restart_num)) {
+    /* Normal case --- swallow the marker and let entropy decoder continue */
+    TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);
+    cinfo->unread_marker = 0;
+  } else {
+    /* Uh-oh, the restart markers have been messed up. */
+    /* Let the data source manager determine how to resync. */
+    if (! (*cinfo->src->resync_to_restart) (cinfo,
+                                            cinfo->marker->next_restart_num))
+      return FALSE;
+  }
+
+  /* Update next-restart state */
+  cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
+
+  return TRUE;
+}
+
+
+/*
+ * This is the default resync_to_restart method for data source managers
+ * to use if they don't have any better approach.  Some data source managers
+ * may be able to back up, or may have additional knowledge about the data
+ * which permits a more intelligent recovery strategy; such managers would
+ * presumably supply their own resync method.
+ *
+ * read_restart_marker calls resync_to_restart if it finds a marker other than
+ * the restart marker it was expecting.  (This code is *not* used unless
+ * a nonzero restart interval has been declared.)  cinfo->unread_marker is
+ * the marker code actually found (might be anything, except 0 or FF).
+ * The desired restart marker number (0..7) is passed as a parameter.
+ * This routine is supposed to apply whatever error recovery strategy seems
+ * appropriate in order to position the input stream to the next data segment.
+ * Note that cinfo->unread_marker is treated as a marker appearing before
+ * the current data-source input point; usually it should be reset to zero
+ * before returning.
+ * Returns FALSE if suspension is required.
+ *
+ * This implementation is substantially constrained by wanting to treat the
+ * input as a data stream; this means we can't back up.  Therefore, we have
+ * only the following actions to work with:
+ *   1. Simply discard the marker and let the entropy decoder resume at next
+ *      byte of file.
+ *   2. Read forward until we find another marker, discarding intervening
+ *      data.  (In theory we could look ahead within the current bufferload,
+ *      without having to discard data if we don't find the desired marker.
+ *      This idea is not implemented here, in part because it makes behavior
+ *      dependent on buffer size and chance buffer-boundary positions.)
+ *   3. Leave the marker unread (by failing to zero cinfo->unread_marker).
+ *      This will cause the entropy decoder to process an empty data segment,
+ *      inserting dummy zeroes, and then we will reprocess the marker.
+ *
+ * #2 is appropriate if we think the desired marker lies ahead, while #3 is
+ * appropriate if the found marker is a future restart marker (indicating
+ * that we have missed the desired restart marker, probably because it got
+ * corrupted).
+ * We apply #2 or #3 if the found marker is a restart marker no more than
+ * two counts behind or ahead of the expected one.  We also apply #2 if the
+ * found marker is not a legal JPEG marker code (it's certainly bogus data).
+ * If the found marker is a restart marker more than 2 counts away, we do #1
+ * (too much risk that the marker is erroneous; with luck we will be able to
+ * resync at some future point).
+ * For any valid non-restart JPEG marker, we apply #3.  This keeps us from
+ * overrunning the end of a scan.  An implementation limited to single-scan
+ * files might find it better to apply #2 for markers other than EOI, since
+ * any other marker would have to be bogus data in that case.
+ */
+
+GLOBAL(boolean)
+jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)
+{
+  int marker = cinfo->unread_marker;
+  int action = 1;
+
+  /* Always put up a warning. */
+  WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);
+
+  /* Outer loop handles repeated decision after scanning forward. */
+  for (;;) {
+    if (marker < (int) M_SOF0)
+      action = 2;               /* invalid marker */
+    else if (marker < (int) M_RST0 || marker > (int) M_RST7)
+      action = 3;               /* valid non-restart marker */
+    else {
+      if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||
+          marker == ((int) M_RST0 + ((desired+2) & 7)))
+        action = 3;             /* one of the next two expected restarts */
+      else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||
+               marker == ((int) M_RST0 + ((desired-2) & 7)))
+        action = 2;             /* a prior restart, so advance */
+      else
+        action = 1;             /* desired restart or too far away */
+    }
+    TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);
+    switch (action) {
+    case 1:
+      /* Discard marker and let entropy decoder resume processing. */
+      cinfo->unread_marker = 0;
+      return TRUE;
+    case 2:
+      /* Scan to the next marker, and repeat the decision loop. */
+      if (! next_marker(cinfo))
+        return FALSE;
+      marker = cinfo->unread_marker;
+      break;
+    case 3:
+      /* Return without advancing past this marker. */
+      /* Entropy decoder will be forced to process an empty segment. */
+      return TRUE;
+    }
+  } /* end loop */
+}
+
+
+/*
+ * Reset marker processing state to begin a fresh datastream.
+ */
+
+METHODDEF(void)
+reset_marker_reader (j_decompress_ptr cinfo)
+{
+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+  cinfo->comp_info = NULL;              /* until allocated by get_sof */
+  cinfo->input_scan_number = 0;         /* no SOS seen yet */
+  cinfo->unread_marker = 0;             /* no pending marker */
+  marker->pub.saw_SOI = FALSE;          /* set internal state too */
+  marker->pub.saw_SOF = FALSE;
+  marker->pub.discarded_bytes = 0;
+  marker->cur_marker = NULL;
+}
+
+
+/*
+ * Initialize the marker reader module.
+ * This is called only once, when the decompression object is created.
+ */
+
+GLOBAL(void)
+jinit_marker_reader (j_decompress_ptr cinfo)
+{
+  my_marker_ptr marker;
+  int i;
+
+  /* Create subobject in permanent pool */
+  marker = (my_marker_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+                                SIZEOF(my_marker_reader));
+  cinfo->marker = (struct jpeg_marker_reader *) marker;
+  /* Initialize public method pointers */
+  marker->pub.reset_marker_reader = reset_marker_reader;
+  marker->pub.read_markers = read_markers;
+  marker->pub.read_restart_marker = read_restart_marker;
+  /* Initialize COM/APPn processing.
+   * By default, we examine and then discard APP0 and APP14.
+   * We also may need to save APP1 to detect the case of EXIF images (see 4881314).
+   * COM and all other APPn are simply discarded.
+   */
+  marker->process_COM = skip_variable;
+  marker->length_limit_COM = 0;
+  for (i = 0; i < 16; i++) {
+    marker->process_APPn[i] = skip_variable;
+    marker->length_limit_APPn[i] = 0;
+  }
+  marker->process_APPn[0] = get_interesting_appn;
+  marker->process_APPn[1] = save_marker;
+  marker->process_APPn[14] = get_interesting_appn;
+  /* Reset marker processing state */
+  reset_marker_reader(cinfo);
+}
+
+
+/*
+ * Control saving of COM and APPn markers into marker_list.
+ */
+
+#ifdef SAVE_MARKERS_SUPPORTED
+
+GLOBAL(void)
+jpeg_save_markers (j_decompress_ptr cinfo, int marker_code,
+                   unsigned int length_limit)
+{
+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+  size_t maxlength;
+  jpeg_marker_parser_method processor;
+
+  /* Length limit mustn't be larger than what we can allocate
+   * (should only be a concern in a 16-bit environment).
+   */
+  maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);
+  if (length_limit > maxlength)
+    length_limit = (unsigned int) maxlength;
+
+  /* Choose processor routine to use.
+   * APP0/APP14 have special requirements.
+   */
+  if (length_limit) {
+    processor = save_marker;
+    /* If saving APP0/APP14, save at least enough for our internal use. */
+    if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)
+      length_limit = APP0_DATA_LEN;
+    else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)
+      length_limit = APP14_DATA_LEN;
+  } else {
+    processor = skip_variable;
+    /* If discarding APP0/APP14, use our regular on-the-fly processor. */
+    if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)
+      processor = get_interesting_appn;
+  }
+
+  if (marker_code == (int) M_COM) {
+    marker->process_COM = processor;
+    marker->length_limit_COM = length_limit;
+  } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {
+    marker->process_APPn[marker_code - (int) M_APP0] = processor;
+    marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;
+  } else
+    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
+}
+
+#endif /* SAVE_MARKERS_SUPPORTED */
+
+
+/*
+ * Install a special processing method for COM or APPn markers.
+ */
+
+GLOBAL(void)
+jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
+                           jpeg_marker_parser_method routine)
+{
+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+  if (marker_code == (int) M_COM)
+    marker->process_COM = routine;
+  else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)
+    marker->process_APPn[marker_code - (int) M_APP0] = routine;
+  else
+    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdmaster.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,561 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdmaster.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains master control logic for the JPEG decompressor.
+ * These routines are concerned with selecting the modules to be executed
+ * and with determining the number of passes and the work to be done in each
+ * pass.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef struct {
+  struct jpeg_decomp_master pub; /* public fields */
+
+  int pass_number;              /* # of passes completed */
+
+  boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */
+
+  /* Saved references to initialized quantizer modules,
+   * in case we need to switch modes.
+   */
+  struct jpeg_color_quantizer * quantizer_1pass;
+  struct jpeg_color_quantizer * quantizer_2pass;
+} my_decomp_master;
+
+typedef my_decomp_master * my_master_ptr;
+
+
+/*
+ * Determine whether merged upsample/color conversion should be used.
+ * CRUCIAL: this must match the actual capabilities of jdmerge.c!
+ */
+
+LOCAL(boolean)
+use_merged_upsample (j_decompress_ptr cinfo)
+{
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+  /* Merging is the equivalent of plain box-filter upsampling */
+  if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
+    return FALSE;
+  /* jdmerge.c only supports YCC=>RGB color conversion */
+  if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
+      cinfo->out_color_space != JCS_RGB ||
+      cinfo->out_color_components != RGB_PIXELSIZE)
+    return FALSE;
+  /* and it only handles 2h1v or 2h2v sampling ratios */
+  if (cinfo->comp_info[0].h_samp_factor != 2 ||
+      cinfo->comp_info[1].h_samp_factor != 1 ||
+      cinfo->comp_info[2].h_samp_factor != 1 ||
+      cinfo->comp_info[0].v_samp_factor >  2 ||
+      cinfo->comp_info[1].v_samp_factor != 1 ||
+      cinfo->comp_info[2].v_samp_factor != 1)
+    return FALSE;
+  /* furthermore, it doesn't work if we've scaled the IDCTs differently */
+  if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
+      cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
+      cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)
+    return FALSE;
+  /* ??? also need to test for upsample-time rescaling, when & if supported */
+  return TRUE;                  /* by golly, it'll work... */
+#else
+  return FALSE;
+#endif
+}
+
+
+/*
+ * Compute output image dimensions and related values.
+ * NOTE: this is exported for possible use by application.
+ * Hence it mustn't do anything that can't be done twice.
+ * Also note that it may be called before the master module is initialized!
+ */
+
+GLOBAL(void)
+jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
+/* Do computations that are needed before master selection phase */
+{
+#ifdef IDCT_SCALING_SUPPORTED
+  int ci;
+  jpeg_component_info *compptr;
+#endif
+
+  /* Prevent application from calling me at wrong times */
+  if (cinfo->global_state != DSTATE_READY)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+#ifdef IDCT_SCALING_SUPPORTED
+
+  /* Compute actual output image dimensions and DCT scaling choices. */
+  if (cinfo->scale_num * 8 <= cinfo->scale_denom) {
+    /* Provide 1/8 scaling */
+    cinfo->output_width = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width, 8L);
+    cinfo->output_height = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height, 8L);
+    cinfo->min_DCT_scaled_size = 1;
+  } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {
+    /* Provide 1/4 scaling */
+    cinfo->output_width = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width, 4L);
+    cinfo->output_height = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height, 4L);
+    cinfo->min_DCT_scaled_size = 2;
+  } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {
+    /* Provide 1/2 scaling */
+    cinfo->output_width = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width, 2L);
+    cinfo->output_height = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height, 2L);
+    cinfo->min_DCT_scaled_size = 4;
+  } else {
+    /* Provide 1/1 scaling */
+    cinfo->output_width = cinfo->image_width;
+    cinfo->output_height = cinfo->image_height;
+    cinfo->min_DCT_scaled_size = DCTSIZE;
+  }
+  /* In selecting the actual DCT scaling for each component, we try to
+   * scale up the chroma components via IDCT scaling rather than upsampling.
+   * This saves time if the upsampler gets to use 1:1 scaling.
+   * Note this code assumes that the supported DCT scalings are powers of 2.
+   */
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    int ssize = cinfo->min_DCT_scaled_size;
+    while (ssize < DCTSIZE &&
+           (compptr->h_samp_factor * ssize * 2 <=
+            cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&
+           (compptr->v_samp_factor * ssize * 2 <=
+            cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {
+      ssize = ssize * 2;
+    }
+    compptr->DCT_scaled_size = ssize;
+  }
+
+  /* Recompute downsampled dimensions of components;
+   * application needs to know these if using raw downsampled data.
+   */
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Size in samples, after IDCT scaling */
+    compptr->downsampled_width = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_width *
+                    (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),
+                    (long) (cinfo->max_h_samp_factor * DCTSIZE));
+    compptr->downsampled_height = (JDIMENSION)
+      jdiv_round_up((long) cinfo->image_height *
+                    (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),
+                    (long) (cinfo->max_v_samp_factor * DCTSIZE));
+  }
+
+#else /* !IDCT_SCALING_SUPPORTED */
+
+  /* Hardwire it to "no scaling" */
+  cinfo->output_width = cinfo->image_width;
+  cinfo->output_height = cinfo->image_height;
+  /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,
+   * and has computed unscaled downsampled_width and downsampled_height.
+   */
+
+#endif /* IDCT_SCALING_SUPPORTED */
+
+  /* Report number of components in selected colorspace. */
+  /* Probably this should be in the color conversion module... */
+  switch (cinfo->out_color_space) {
+  case JCS_GRAYSCALE:
+    cinfo->out_color_components = 1;
+    break;
+  case JCS_RGB:
+#if RGB_PIXELSIZE != 3
+    cinfo->out_color_components = RGB_PIXELSIZE;
+    break;
+#endif /* else share code with YCbCr */
+  case JCS_YCbCr:
+    cinfo->out_color_components = 3;
+    break;
+  case JCS_CMYK:
+  case JCS_YCCK:
+    cinfo->out_color_components = 4;
+    break;
+  default:                      /* else must be same colorspace as in file */
+    cinfo->out_color_components = cinfo->num_components;
+    break;
+  }
+  cinfo->output_components = (cinfo->quantize_colors ? 1 :
+                              cinfo->out_color_components);
+
+  /* See if upsampler will want to emit more than one row at a time */
+  if (use_merged_upsample(cinfo))
+    cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
+  else
+    cinfo->rec_outbuf_height = 1;
+}
+
+
+/*
+ * Several decompression processes need to range-limit values to the range
+ * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
+ * due to noise introduced by quantization, roundoff error, etc.  These
+ * processes are inner loops and need to be as fast as possible.  On most
+ * machines, particularly CPUs with pipelines or instruction prefetch,
+ * a (subscript-check-less) C table lookup
+ *              x = sample_range_limit[x];
+ * is faster than explicit tests
+ *              if (x < 0)  x = 0;
+ *              else if (x > MAXJSAMPLE)  x = MAXJSAMPLE;
+ * These processes all use a common table prepared by the routine below.
+ *
+ * For most steps we can mathematically guarantee that the initial value
+ * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
+ * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial
+ * limiting step (just after the IDCT), a wildly out-of-range value is
+ * possible if the input data is corrupt.  To avoid any chance of indexing
+ * off the end of memory and getting a bad-pointer trap, we perform the
+ * post-IDCT limiting thus:
+ *              x = range_limit[x & MASK];
+ * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
+ * samples.  Under normal circumstances this is more than enough range and
+ * a correct output will be generated; with bogus input data the mask will
+ * cause wraparound, and we will safely generate a bogus-but-in-range output.
+ * For the post-IDCT step, we want to convert the data from signed to unsigned
+ * representation by adding CENTERJSAMPLE at the same time that we limit it.
+ * So the post-IDCT limiting table ends up looking like this:
+ *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
+ *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
+ *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
+ *   0,1,...,CENTERJSAMPLE-1
+ * Negative inputs select values from the upper half of the table after
+ * masking.
+ *
+ * We can save some space by overlapping the start of the post-IDCT table
+ * with the simpler range limiting table.  The post-IDCT table begins at
+ * sample_range_limit + CENTERJSAMPLE.
+ *
+ * Note that the table is allocated in near data space on PCs; it's small
+ * enough and used often enough to justify this.
+ */
+
+LOCAL(void)
+prepare_range_limit_table (j_decompress_ptr cinfo)
+/* Allocate and fill in the sample_range_limit table */
+{
+  JSAMPLE * table;
+  int i;
+
+  table = (JSAMPLE *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
+  table += (MAXJSAMPLE+1);      /* allow negative subscripts of simple table */
+  cinfo->sample_range_limit = table;
+  /* First segment of "simple" table: limit[x] = 0 for x < 0 */
+  MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
+  /* Main part of "simple" table: limit[x] = x */
+  for (i = 0; i <= MAXJSAMPLE; i++)
+    table[i] = (JSAMPLE) i;
+  table += CENTERJSAMPLE;       /* Point to where post-IDCT table starts */
+  /* End of simple table, rest of first half of post-IDCT table */
+  for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
+    table[i] = MAXJSAMPLE;
+  /* Second half of post-IDCT table */
+  MEMZERO(table + (2 * (MAXJSAMPLE+1)),
+          (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
+  MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
+          cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
+}
+
+
+/*
+ * Master selection of decompression modules.
+ * This is done once at jpeg_start_decompress time.  We determine
+ * which modules will be used and give them appropriate initialization calls.
+ * We also initialize the decompressor input side to begin consuming data.
+ *
+ * Since jpeg_read_header has finished, we know what is in the SOF
+ * and (first) SOS markers.  We also have all the application parameter
+ * settings.
+ */
+
+LOCAL(void)
+master_selection (j_decompress_ptr cinfo)
+{
+  my_master_ptr master = (my_master_ptr) cinfo->master;
+  boolean use_c_buffer;
+  long samplesperrow;
+  JDIMENSION jd_samplesperrow;
+
+  /* Initialize dimensions and other stuff */
+  jpeg_calc_output_dimensions(cinfo);
+  prepare_range_limit_table(cinfo);
+
+  /* Width of an output scanline must be representable as JDIMENSION. */
+  samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
+  jd_samplesperrow = (JDIMENSION) samplesperrow;
+  if ((long) jd_samplesperrow != samplesperrow)
+    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+
+  /* Initialize my private state */
+  master->pass_number = 0;
+  master->using_merged_upsample = use_merged_upsample(cinfo);
+
+  /* Color quantizer selection */
+  master->quantizer_1pass = NULL;
+  master->quantizer_2pass = NULL;
+  /* No mode changes if not using buffered-image mode. */
+  if (! cinfo->quantize_colors || ! cinfo->buffered_image) {
+    cinfo->enable_1pass_quant = FALSE;
+    cinfo->enable_external_quant = FALSE;
+    cinfo->enable_2pass_quant = FALSE;
+  }
+  if (cinfo->quantize_colors) {
+    if (cinfo->raw_data_out)
+      ERREXIT(cinfo, JERR_NOTIMPL);
+    /* 2-pass quantizer only works in 3-component color space. */
+    if (cinfo->out_color_components != 3) {
+      cinfo->enable_1pass_quant = TRUE;
+      cinfo->enable_external_quant = FALSE;
+      cinfo->enable_2pass_quant = FALSE;
+      cinfo->colormap = NULL;
+    } else if (cinfo->colormap != NULL) {
+      cinfo->enable_external_quant = TRUE;
+    } else if (cinfo->two_pass_quantize) {
+      cinfo->enable_2pass_quant = TRUE;
+    } else {
+      cinfo->enable_1pass_quant = TRUE;
+    }
+
+    if (cinfo->enable_1pass_quant) {
+#ifdef QUANT_1PASS_SUPPORTED
+      jinit_1pass_quantizer(cinfo);
+      master->quantizer_1pass = cinfo->cquantize;
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+    }
+
+    /* We use the 2-pass code to map to external colormaps. */
+    if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {
+#ifdef QUANT_2PASS_SUPPORTED
+      jinit_2pass_quantizer(cinfo);
+      master->quantizer_2pass = cinfo->cquantize;
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+    }
+    /* If both quantizers are initialized, the 2-pass one is left active;
+     * this is necessary for starting with quantization to an external map.
+     */
+  }
+
+  /* Post-processing: in particular, color conversion first */
+  if (! cinfo->raw_data_out) {
+    if (master->using_merged_upsample) {
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+      jinit_merged_upsampler(cinfo); /* does color conversion too */
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+    } else {
+      jinit_color_deconverter(cinfo);
+      jinit_upsampler(cinfo);
+    }
+    jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);
+  }
+  /* Inverse DCT */
+  jinit_inverse_dct(cinfo);
+  /* Entropy decoding: either Huffman or arithmetic coding. */
+  if (cinfo->arith_code) {
+    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+  } else {
+    if (cinfo->progressive_mode) {
+#ifdef D_PROGRESSIVE_SUPPORTED
+      jinit_phuff_decoder(cinfo);
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+    } else
+      jinit_huff_decoder(cinfo);
+  }
+
+  /* Initialize principal buffer controllers. */
+  use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;
+  jinit_d_coef_controller(cinfo, use_c_buffer);
+
+  if (! cinfo->raw_data_out)
+    jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
+
+  /* We can now tell the memory manager to allocate virtual arrays. */
+  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+  /* Initialize input side of decompressor to consume first scan. */
+  (*cinfo->inputctl->start_input_pass) (cinfo);
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+  /* If jpeg_start_decompress will read the whole file, initialize
+   * progress monitoring appropriately.  The input step is counted
+   * as one pass.
+   */
+  if (cinfo->progress != NULL && ! cinfo->buffered_image &&
+      cinfo->inputctl->has_multiple_scans) {
+    int nscans;
+    /* Estimate number of scans to set pass_limit. */
+    if (cinfo->progressive_mode) {
+      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
+      nscans = 2 + 3 * cinfo->num_components;
+    } else {
+      /* For a nonprogressive multiscan file, estimate 1 scan per component. */
+      nscans = cinfo->num_components;
+    }
+    cinfo->progress->pass_counter = 0L;
+    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
+    cinfo->progress->completed_passes = 0;
+    cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);
+    /* Count the input pass as done */
+    master->pass_number++;
+  }
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+}
+
+
+/*
+ * Per-pass setup.
+ * This is called at the beginning of each output pass.  We determine which
+ * modules will be active during this pass and give them appropriate
+ * start_pass calls.  We also set is_dummy_pass to indicate whether this
+ * is a "real" output pass or a dummy pass for color quantization.
+ * (In the latter case, jdapistd.c will crank the pass to completion.)
+ */
+
+METHODDEF(void)
+prepare_for_output_pass (j_decompress_ptr cinfo)
+{
+  my_master_ptr master = (my_master_ptr) cinfo->master;
+
+  if (master->pub.is_dummy_pass) {
+#ifdef QUANT_2PASS_SUPPORTED
+    /* Final pass of 2-pass quantization */
+    master->pub.is_dummy_pass = FALSE;
+    (*cinfo->cquantize->start_pass) (cinfo, FALSE);
+    (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
+    (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
+#else
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* QUANT_2PASS_SUPPORTED */
+  } else {
+    if (cinfo->quantize_colors && cinfo->colormap == NULL) {
+      /* Select new quantization method */
+      if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {
+        cinfo->cquantize = master->quantizer_2pass;
+        master->pub.is_dummy_pass = TRUE;
+      } else if (cinfo->enable_1pass_quant) {
+        cinfo->cquantize = master->quantizer_1pass;
+      } else {
+        ERREXIT(cinfo, JERR_MODE_CHANGE);
+      }
+    }
+    (*cinfo->idct->start_pass) (cinfo);
+    (*cinfo->coef->start_output_pass) (cinfo);
+    if (! cinfo->raw_data_out) {
+      if (! master->using_merged_upsample)
+        (*cinfo->cconvert->start_pass) (cinfo);
+      (*cinfo->upsample->start_pass) (cinfo);
+      if (cinfo->quantize_colors)
+        (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);
+      (*cinfo->post->start_pass) (cinfo,
+            (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
+      (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
+    }
+  }
+
+  /* Set up progress monitor's pass info if present */
+  if (cinfo->progress != NULL) {
+    cinfo->progress->completed_passes = master->pass_number;
+    cinfo->progress->total_passes = master->pass_number +
+                                    (master->pub.is_dummy_pass ? 2 : 1);
+    /* In buffered-image mode, we assume one more output pass if EOI not
+     * yet reached, but no more passes if EOI has been reached.
+     */
+    if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {
+      cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);
+    }
+  }
+}
+
+
+/*
+ * Finish up at end of an output pass.
+ */
+
+METHODDEF(void)
+finish_output_pass (j_decompress_ptr cinfo)
+{
+  my_master_ptr master = (my_master_ptr) cinfo->master;
+
+  if (cinfo->quantize_colors)
+    (*cinfo->cquantize->finish_pass) (cinfo);
+  master->pass_number++;
+}
+
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Switch to a new external colormap between output passes.
+ */
+
+GLOBAL(void)
+jpeg_new_colormap (j_decompress_ptr cinfo)
+{
+  my_master_ptr master = (my_master_ptr) cinfo->master;
+
+  /* Prevent application from calling me at wrong times */
+  if (cinfo->global_state != DSTATE_BUFIMAGE)
+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+  if (cinfo->quantize_colors && cinfo->enable_external_quant &&
+      cinfo->colormap != NULL) {
+    /* Select 2-pass quantizer for external colormap use */
+    cinfo->cquantize = master->quantizer_2pass;
+    /* Notify quantizer of colormap change */
+    (*cinfo->cquantize->new_color_map) (cinfo);
+    master->pub.is_dummy_pass = FALSE; /* just in case */
+  } else
+    ERREXIT(cinfo, JERR_MODE_CHANGE);
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+
+
+/*
+ * Initialize master decompression control and select active modules.
+ * This is performed at the start of jpeg_start_decompress.
+ */
+
+GLOBAL(void)
+jinit_master_decompress (j_decompress_ptr cinfo)
+{
+  my_master_ptr master;
+
+  master = (my_master_ptr)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                  SIZEOF(my_decomp_master));
+  cinfo->master = (struct jpeg_decomp_master *) master;
+  master->pub.prepare_for_output_pass = prepare_for_output_pass;
+  master->pub.finish_output_pass = finish_output_pass;
+
+  master->pub.is_dummy_pass = FALSE;
+
+  master_selection(cinfo);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdmerge.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,404 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdmerge.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains code for merged upsampling/color conversion.
+ *
+ * This file combines functions from jdsample.c and jdcolor.c;
+ * read those files first to understand what's going on.
+ *
+ * When the chroma components are to be upsampled by simple replication
+ * (ie, box filtering), we can save some work in color conversion by
+ * calculating all the output pixels corresponding to a pair of chroma
+ * samples at one time.  In the conversion equations
+ *      R = Y           + K1 * Cr
+ *      G = Y + K2 * Cb + K3 * Cr
+ *      B = Y + K4 * Cb
+ * only the Y term varies among the group of pixels corresponding to a pair
+ * of chroma samples, so the rest of the terms can be calculated just once.
+ * At typical sampling ratios, this eliminates half or three-quarters of the
+ * multiplications needed for color conversion.
+ *
+ * This file currently provides implementations for the following cases:
+ *      YCbCr => RGB color conversion only.
+ *      Sampling ratios of 2h1v or 2h2v.
+ *      No scaling needed at upsample time.
+ *      Corner-aligned (non-CCIR601) sampling alignment.
+ * Other special cases could be added, but in most applications these are
+ * the only common cases.  (For uncommon cases we fall back on the more
+ * general code in jdsample.c and jdcolor.c.)
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+
+
+/* Private subobject */
+
+typedef struct {
+  struct jpeg_upsampler pub;    /* public fields */
+
+  /* Pointer to routine to do actual upsampling/conversion of one row group */
+  JMETHOD(void, upmethod, (j_decompress_ptr cinfo,
+                           JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+                           JSAMPARRAY output_buf));
+
+  /* Private state for YCC->RGB conversion */
+  int * Cr_r_tab;               /* => table for Cr to R conversion */
+  int * Cb_b_tab;               /* => table for Cb to B conversion */
+  INT32 * Cr_g_tab;             /* => table for Cr to G conversion */
+  INT32 * Cb_g_tab;             /* => table for Cb to G conversion */
+
+  /* For 2:1 vertical sampling, we produce two output rows at a time.
+   * We need a "spare" row buffer to hold the second output row if the
+   * application provides just a one-row buffer; we also use the spare
+   * to discard the dummy last row if the image height is odd.
+   */
+  JSAMPROW spare_row;
+  boolean spare_full;           /* T if spare buffer is occupied */
+
+  JDIMENSION out_row_width;     /* samples per output row */
+  JDIMENSION rows_to_go;        /* counts rows remaining in image */
+} my_upsampler;
+
+typedef my_upsampler * my_upsample_ptr;
+
+#define SCALEBITS       16      /* speediest right-shift on some machines */
+#define ONE_HALF        ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x)          ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+
+/*
+ * Initialize tables for YCC->RGB colorspace conversion.
+ * This is taken directly from jdcolor.c; see that file for more info.
+ */
+
+LOCAL(void)
+build_ycc_rgb_table (j_decompress_ptr cinfo)
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+  int i;
+  INT32 x;
+  SHIFT_TEMPS
+
+  upsample->Cr_r_tab = (int *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (MAXJSAMPLE+1) * SIZEOF(int));
+  upsample->Cb_b_tab = (int *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (MAXJSAMPLE+1) * SIZEOF(int));
+  upsample->Cr_g_tab = (INT32 *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (MAXJSAMPLE+1) * SIZEOF(INT32));
+  upsample->Cb_g_tab = (INT32 *)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+    /* Cr=>R value is nearest int to 1.40200 * x */
+    upsample->Cr_r_tab[i] = (int)
+                    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
+    /* Cb=>B value is nearest int to 1.77200 * x */
+    upsample->Cb_b_tab[i] = (int)
+                    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
+    /* Cr=>G value is scaled-up -0.71414 * x */
+    upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
+    /* Cb=>G value is scaled-up -0.34414 * x */
+    /* We also add in ONE_HALF so that need not do it in inner loop */
+    upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+  }
+}
+
+
+/*
+ * Initialize for an upsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_merged_upsample (j_decompress_ptr cinfo)
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+  /* Mark the spare buffer empty */
+  upsample->spare_full = FALSE;
+  /* Initialize total-height counter for detecting bottom of image */
+  upsample->rows_to_go = cinfo->output_height;
+}
+
+
+/*
+ * Control routine to do upsampling (and color conversion).
+ *
+ * The control routine just handles the row buffering considerations.
+ */
+
+METHODDEF(void)
+merged_2v_upsample (j_decompress_ptr cinfo,
+                    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+                    JDIMENSION in_row_groups_avail,
+                    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                    JDIMENSION out_rows_avail)
+/* 2:1 vertical sampling case: may need a spare row. */
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+  JSAMPROW work_ptrs[2];
+  JDIMENSION num_rows;          /* number of rows returned to caller */
+
+  if (upsample->spare_full) {
+    /* If we have a spare row saved from a previous cycle, just return it. */
+    jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,
+                      1, upsample->out_row_width);
+    num_rows = 1;
+    upsample->spare_full = FALSE;
+  } else {
+    /* Figure number of rows to return to caller. */
+    num_rows = 2;
+    /* Not more than the distance to the end of the image. */
+    if (num_rows > upsample->rows_to_go)
+      num_rows = upsample->rows_to_go;
+    /* And not more than what the client can accept: */
+    out_rows_avail -= *out_row_ctr;
+    if (num_rows > out_rows_avail)
+      num_rows = out_rows_avail;
+    /* Create output pointer array for upsampler. */
+    work_ptrs[0] = output_buf[*out_row_ctr];
+    if (num_rows > 1) {
+      work_ptrs[1] = output_buf[*out_row_ctr + 1];
+    } else {
+      work_ptrs[1] = upsample->spare_row;
+      upsample->spare_full = TRUE;
+    }
+    /* Now do the upsampling. */
+    (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);
+  }
+
+  /* Adjust counts */
+  *out_row_ctr += num_rows;
+  upsample->rows_to_go -= num_rows;
+  /* When the buffer is emptied, declare this input row group consumed */
+  if (! upsample->spare_full)
+    (*in_row_group_ctr)++;
+}
+
+
+METHODDEF(void)
+merged_1v_upsample (j_decompress_ptr cinfo,
+                    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+                    JDIMENSION in_row_groups_avail,
+                    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                    JDIMENSION out_rows_avail)
+/* 1:1 vertical sampling case: much easier, never need a spare row. */
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+  /* Just do the upsampling. */
+  (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
+                         output_buf + *out_row_ctr);
+  /* Adjust counts */
+  (*out_row_ctr)++;
+  (*in_row_group_ctr)++;
+}
+
+
+/*
+ * These are the routines invoked by the control routines to do
+ * the actual upsampling/conversion.  One row group is processed per call.
+ *
+ * Note: since we may be writing directly into application-supplied buffers,
+ * we have to be honest about the output width; we can't assume the buffer
+ * has been rounded up to an even width.
+ */
+
+
+/*
+ * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.
+ */
+
+METHODDEF(void)
+h2v1_merged_upsample (j_decompress_ptr cinfo,
+                      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+                      JSAMPARRAY output_buf)
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+  register int y, cred, cgreen, cblue;
+  int cb, cr;
+  register JSAMPROW outptr;
+  JSAMPROW inptr0, inptr1, inptr2;
+  JDIMENSION col;
+  /* copy these pointers into registers if possible */
+  register JSAMPLE * range_limit = cinfo->sample_range_limit;
+  int * Crrtab = upsample->Cr_r_tab;
+  int * Cbbtab = upsample->Cb_b_tab;
+  INT32 * Crgtab = upsample->Cr_g_tab;
+  INT32 * Cbgtab = upsample->Cb_g_tab;
+  SHIFT_TEMPS
+
+  inptr0 = input_buf[0][in_row_group_ctr];
+  inptr1 = input_buf[1][in_row_group_ctr];
+  inptr2 = input_buf[2][in_row_group_ctr];
+  outptr = output_buf[0];
+  /* Loop for each pair of output pixels */
+  for (col = cinfo->output_width >> 1; col > 0; col--) {
+    /* Do the chroma part of the calculation */
+    cb = GETJSAMPLE(*inptr1++);
+    cr = GETJSAMPLE(*inptr2++);
+    cred = Crrtab[cr];
+    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+    cblue = Cbbtab[cb];
+    /* Fetch 2 Y values and emit 2 pixels */
+    y  = GETJSAMPLE(*inptr0++);
+    outptr[RGB_RED] =   range_limit[y + cred];
+    outptr[RGB_GREEN] = range_limit[y + cgreen];
+    outptr[RGB_BLUE] =  range_limit[y + cblue];
+    outptr += RGB_PIXELSIZE;
+    y  = GETJSAMPLE(*inptr0++);
+    outptr[RGB_RED] =   range_limit[y + cred];
+    outptr[RGB_GREEN] = range_limit[y + cgreen];
+    outptr[RGB_BLUE] =  range_limit[y + cblue];
+    outptr += RGB_PIXELSIZE;
+  }
+  /* If image width is odd, do the last output column separately */
+  if (cinfo->output_width & 1) {
+    cb = GETJSAMPLE(*inptr1);
+    cr = GETJSAMPLE(*inptr2);
+    cred = Crrtab[cr];
+    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+    cblue = Cbbtab[cb];
+    y  = GETJSAMPLE(*inptr0);
+    outptr[RGB_RED] =   range_limit[y + cred];
+    outptr[RGB_GREEN] = range_limit[y + cgreen];
+    outptr[RGB_BLUE] =  range_limit[y + cblue];
+  }
+}
+
+
+/*
+ * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.
+ */
+
+METHODDEF(void)
+h2v2_merged_upsample (j_decompress_ptr cinfo,
+                      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+                      JSAMPARRAY output_buf)
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+  register int y, cred, cgreen, cblue;
+  int cb, cr;
+  register JSAMPROW outptr0, outptr1;
+  JSAMPROW inptr00, inptr01, inptr1, inptr2;
+  JDIMENSION col;
+  /* copy these pointers into registers if possible */
+  register JSAMPLE * range_limit = cinfo->sample_range_limit;
+  int * Crrtab = upsample->Cr_r_tab;
+  int * Cbbtab = upsample->Cb_b_tab;
+  INT32 * Crgtab = upsample->Cr_g_tab;
+  INT32 * Cbgtab = upsample->Cb_g_tab;
+  SHIFT_TEMPS
+
+  inptr00 = input_buf[0][in_row_group_ctr*2];
+  inptr01 = input_buf[0][in_row_group_ctr*2 + 1];
+  inptr1 = input_buf[1][in_row_group_ctr];
+  inptr2 = input_buf[2][in_row_group_ctr];
+  outptr0 = output_buf[0];
+  outptr1 = output_buf[1];
+  /* Loop for each group of output pixels */
+  for (col = cinfo->output_width >> 1; col > 0; col--) {
+    /* Do the chroma part of the calculation */
+    cb = GETJSAMPLE(*inptr1++);
+    cr = GETJSAMPLE(*inptr2++);
+    cred = Crrtab[cr];
+    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+    cblue = Cbbtab[cb];
+    /* Fetch 4 Y values and emit 4 pixels */
+    y  = GETJSAMPLE(*inptr00++);
+    outptr0[RGB_RED] =   range_limit[y + cred];
+    outptr0[RGB_GREEN] = range_limit[y + cgreen];
+    outptr0[RGB_BLUE] =  range_limit[y + cblue];
+    outptr0 += RGB_PIXELSIZE;
+    y  = GETJSAMPLE(*inptr00++);
+    outptr0[RGB_RED] =   range_limit[y + cred];
+    outptr0[RGB_GREEN] = range_limit[y + cgreen];
+    outptr0[RGB_BLUE] =  range_limit[y + cblue];
+    outptr0 += RGB_PIXELSIZE;
+    y  = GETJSAMPLE(*inptr01++);
+    outptr1[RGB_RED] =   range_limit[y + cred];
+    outptr1[RGB_GREEN] = range_limit[y + cgreen];
+    outptr1[RGB_BLUE] =  range_limit[y + cblue];
+    outptr1 += RGB_PIXELSIZE;
+    y  = GETJSAMPLE(*inptr01++);
+    outptr1[RGB_RED] =   range_limit[y + cred];
+    outptr1[RGB_GREEN] = range_limit[y + cgreen];
+    outptr1[RGB_BLUE] =  range_limit[y + cblue];
+    outptr1 += RGB_PIXELSIZE;
+  }
+  /* If image width is odd, do the last output column separately */
+  if (cinfo->output_width & 1) {
+    cb = GETJSAMPLE(*inptr1);
+    cr = GETJSAMPLE(*inptr2);
+    cred = Crrtab[cr];
+    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+    cblue = Cbbtab[cb];
+    y  = GETJSAMPLE(*inptr00);
+    outptr0[RGB_RED] =   range_limit[y + cred];
+    outptr0[RGB_GREEN] = range_limit[y + cgreen];
+    outptr0[RGB_BLUE] =  range_limit[y + cblue];
+    y  = GETJSAMPLE(*inptr01);
+    outptr1[RGB_RED] =   range_limit[y + cred];
+    outptr1[RGB_GREEN] = range_limit[y + cgreen];
+    outptr1[RGB_BLUE] =  range_limit[y + cblue];
+  }
+}
+
+
+/*
+ * Module initialization routine for merged upsampling/color conversion.
+ *
+ * NB: this is called under the conditions determined by use_merged_upsample()
+ * in jdmaster.c.  That routine MUST correspond to the actual capabilities
+ * of this module; no safety checks are made here.
+ */
+
+GLOBAL(void)
+jinit_merged_upsampler (j_decompress_ptr cinfo)
+{
+  my_upsample_ptr upsample;
+
+  upsample = (my_upsample_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_upsampler));
+  cinfo->upsample = (struct jpeg_upsampler *) upsample;
+  upsample->pub.start_pass = start_pass_merged_upsample;
+  upsample->pub.need_context_rows = FALSE;
+
+  upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;
+
+  if (cinfo->max_v_samp_factor == 2) {
+    upsample->pub.upsample = merged_2v_upsample;
+    upsample->upmethod = h2v2_merged_upsample;
+    /* Allocate a spare row buffer */
+    upsample->spare_row = (JSAMPROW)
+      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
+  } else {
+    upsample->pub.upsample = merged_1v_upsample;
+    upsample->upmethod = h2v1_merged_upsample;
+    /* No spare row needed */
+    upsample->spare_row = NULL;
+  }
+
+  build_ycc_rgb_table(cinfo);
+}
+
+#endif /* UPSAMPLE_MERGING_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdphuff.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,672 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdphuff.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy decoding routines for progressive JPEG.
+ *
+ * Much of the complexity here has to do with supporting input suspension.
+ * If the data source module demands suspension, we want to be able to back
+ * up to the start of the current MCU.  To do this, we copy state variables
+ * into local working storage, and update them back to the permanent
+ * storage only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdhuff.h"             /* Declarations shared with jdhuff.c */
+
+
+#ifdef D_PROGRESSIVE_SUPPORTED
+
+/*
+ * Expanded entropy decoder object for progressive Huffman decoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+  unsigned int EOBRUN;                  /* remaining EOBs in EOBRUN */
+  int last_dc_val[MAX_COMPS_IN_SCAN];   /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment.  You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src)  ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src)  \
+        ((dest).EOBRUN = (src).EOBRUN, \
+         (dest).last_dc_val[0] = (src).last_dc_val[0], \
+         (dest).last_dc_val[1] = (src).last_dc_val[1], \
+         (dest).last_dc_val[2] = (src).last_dc_val[2], \
+         (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+  struct jpeg_entropy_decoder pub; /* public fields */
+
+  /* These fields are loaded into local variables at start of each MCU.
+   * In case of suspension, we exit WITHOUT updating them.
+   */
+  bitread_perm_state bitstate;  /* Bit buffer at start of MCU */
+  savable_state saved;          /* Other state at start of MCU */
+
+  /* These fields are NOT loaded into local working state. */
+  unsigned int restarts_to_go;  /* MCUs left in this restart interval */
+
+  /* Pointers to derived tables (these workspaces have image lifespan) */
+  d_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
+
+  d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */
+} phuff_entropy_decoder;
+
+typedef phuff_entropy_decoder * phuff_entropy_ptr;
+
+/* Forward declarations */
+METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo,
+                                            JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo,
+                                            JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo,
+                                             JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo,
+                                             JBLOCKROW *MCU_data));
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+start_pass_phuff_decoder (j_decompress_ptr cinfo)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  boolean is_DC_band, bad;
+  int ci, coefi, tbl;
+  int *coef_bit_ptr;
+  jpeg_component_info * compptr;
+
+  is_DC_band = (cinfo->Ss == 0);
+
+  /* Validate scan parameters */
+  bad = FALSE;
+  if (is_DC_band) {
+    if (cinfo->Se != 0)
+      bad = TRUE;
+  } else {
+    /* need not check Ss/Se < 0 since they came from unsigned bytes */
+    if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)
+      bad = TRUE;
+    /* AC scans may have only one component */
+    if (cinfo->comps_in_scan != 1)
+      bad = TRUE;
+  }
+  if (cinfo->Ah != 0) {
+    /* Successive approximation refinement scan: must have Al = Ah-1. */
+    if (cinfo->Al != cinfo->Ah-1)
+      bad = TRUE;
+  }
+  if (cinfo->Al > 13)           /* need not check for < 0 */
+    bad = TRUE;
+  /* Arguably the maximum Al value should be less than 13 for 8-bit precision,
+   * but the spec doesn't say so, and we try to be liberal about what we
+   * accept.  Note: large Al values could result in out-of-range DC
+   * coefficients during early scans, leading to bizarre displays due to
+   * overflows in the IDCT math.  But we won't crash.
+   */
+  if (bad)
+    ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
+             cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
+  /* Update progression status, and verify that scan order is legal.
+   * Note that inter-scan inconsistencies are treated as warnings
+   * not fatal errors ... not clear if this is right way to behave.
+   */
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    int cindex = cinfo->cur_comp_info[ci]->component_index;
+    coef_bit_ptr = & cinfo->coef_bits[cindex][0];
+    if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
+      WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
+    for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
+      int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
+      if (cinfo->Ah != expected)
+        WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
+      coef_bit_ptr[coefi] = cinfo->Al;
+    }
+  }
+
+  /* Select MCU decoding routine */
+  if (cinfo->Ah == 0) {
+    if (is_DC_band)
+      entropy->pub.decode_mcu = decode_mcu_DC_first;
+    else
+      entropy->pub.decode_mcu = decode_mcu_AC_first;
+  } else {
+    if (is_DC_band)
+      entropy->pub.decode_mcu = decode_mcu_DC_refine;
+    else
+      entropy->pub.decode_mcu = decode_mcu_AC_refine;
+  }
+
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+    compptr = cinfo->cur_comp_info[ci];
+    /* Make sure requested tables are present, and compute derived tables.
+     * We may build same derived table more than once, but it's not expensive.
+     */
+    if (is_DC_band) {
+      if (cinfo->Ah == 0) {     /* DC refinement needs no table */
+        tbl = compptr->dc_tbl_no;
+        jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,
+                                & entropy->derived_tbls[tbl]);
+      }
+    } else {
+      tbl = compptr->ac_tbl_no;
+      jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,
+                              & entropy->derived_tbls[tbl]);
+      /* remember the single active table */
+      entropy->ac_derived_tbl = entropy->derived_tbls[tbl];
+    }
+    /* Initialize DC predictions to 0 */
+    entropy->saved.last_dc_val[ci] = 0;
+  }
+
+  /* Initialize bitread state variables */
+  entropy->bitstate.bits_left = 0;
+  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
+  entropy->pub.insufficient_data = FALSE;
+
+  /* Initialize private state variables */
+  entropy->saved.EOBRUN = 0;
+
+  /* Initialize restart counter */
+  entropy->restarts_to_go = cinfo->restart_interval;
+}
+
+
+/*
+ * Figure F.12: extend sign bit.
+ * On some machines, a shift and add will be faster than a table lookup.
+ */
+
+#ifdef AVOID_TABLES
+
+#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
+
+#else
+
+#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
+
+static const int extend_test[16] =   /* entry n is 2**(n-1) */
+  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
+    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
+
+static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
+  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
+    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
+    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
+    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
+
+#endif /* AVOID_TABLES */
+
+
+/*
+ * Check for a restart marker & resynchronize decoder.
+ * Returns FALSE if must suspend.
+ */
+
+LOCAL(boolean)
+process_restart (j_decompress_ptr cinfo)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  int ci;
+
+  /* Throw away any unused bits remaining in bit buffer; */
+  /* include any full bytes in next_marker's count of discarded bytes */
+  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
+  entropy->bitstate.bits_left = 0;
+
+  /* Advance past the RSTn marker */
+  if (! (*cinfo->marker->read_restart_marker) (cinfo))
+    return FALSE;
+
+  /* Re-initialize DC predictions to 0 */
+  for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+    entropy->saved.last_dc_val[ci] = 0;
+  /* Re-init EOB run count, too */
+  entropy->saved.EOBRUN = 0;
+
+  /* Reset restart counter */
+  entropy->restarts_to_go = cinfo->restart_interval;
+
+  /* Reset out-of-data flag, unless read_restart_marker left us smack up
+   * against a marker.  In that case we will end up treating the next data
+   * segment as empty, and we can avoid producing bogus output pixels by
+   * leaving the flag set.
+   */
+  if (cinfo->unread_marker == 0)
+    entropy->pub.insufficient_data = FALSE;
+
+  return TRUE;
+}
+
+
+/*
+ * Huffman MCU decoding.
+ * Each of these routines decodes and returns one MCU's worth of
+ * Huffman-compressed coefficients.
+ * The coefficients are reordered from zigzag order into natural array order,
+ * but are not dequantized.
+ *
+ * The i'th block of the MCU is stored into the block pointed to by
+ * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
+ *
+ * We return FALSE if data source requested suspension.  In that case no
+ * changes have been made to permanent state.  (Exception: some output
+ * coefficients may already have been assigned.  This is harmless for
+ * spectral selection, since we'll just re-assign them on the next call.
+ * Successive approximation AC refinement has to be more careful, however.)
+ */
+
+/*
+ * MCU decoding for DC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  int Al = cinfo->Al;
+  register int s, r;
+  int blkn, ci;
+  JBLOCKROW block;
+  BITREAD_STATE_VARS;
+  savable_state state;
+  d_derived_tbl * tbl;
+  jpeg_component_info * compptr;
+
+  /* Process restart marker if needed; may have to suspend */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0)
+      if (! process_restart(cinfo))
+        return FALSE;
+  }
+
+  /* If we've run out of data, just leave the MCU set to zeroes.
+   * This way, we return uniform gray for the remainder of the segment.
+   */
+  if (! entropy->pub.insufficient_data) {
+
+    /* Load up working state */
+    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+    ASSIGN_STATE(state, entropy->saved);
+
+    /* Outer loop handles each block in the MCU */
+
+    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+      block = MCU_data[blkn];
+      ci = cinfo->MCU_membership[blkn];
+      compptr = cinfo->cur_comp_info[ci];
+      tbl = entropy->derived_tbls[compptr->dc_tbl_no];
+
+      /* Decode a single block's worth of coefficients */
+
+      /* Section F.2.2.1: decode the DC coefficient difference */
+      HUFF_DECODE(s, br_state, tbl, return FALSE, label1);
+      if (s) {
+        CHECK_BIT_BUFFER(br_state, s, return FALSE);
+        r = GET_BITS(s);
+        s = HUFF_EXTEND(r, s);
+      }
+
+      /* Convert DC difference to actual value, update last_dc_val */
+      s += state.last_dc_val[ci];
+      state.last_dc_val[ci] = s;
+      /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */
+      (*block)[0] = (JCOEF) (s << Al);
+    }
+
+    /* Completed MCU, so update state */
+    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+    ASSIGN_STATE(entropy->saved, state);
+  }
+
+  /* Account for restart interval (no-op if not using restarts) */
+  entropy->restarts_to_go--;
+
+  return TRUE;
+}
+
+
+/*
+ * MCU decoding for AC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  int Se = cinfo->Se;
+  int Al = cinfo->Al;
+  register int s, k, r;
+  unsigned int EOBRUN;
+  JBLOCKROW block;
+  BITREAD_STATE_VARS;
+  d_derived_tbl * tbl;
+
+  /* Process restart marker if needed; may have to suspend */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0)
+      if (! process_restart(cinfo))
+        return FALSE;
+  }
+
+  /* If we've run out of data, just leave the MCU set to zeroes.
+   * This way, we return uniform gray for the remainder of the segment.
+   */
+  if (! entropy->pub.insufficient_data) {
+
+    /* Load up working state.
+     * We can avoid loading/saving bitread state if in an EOB run.
+     */
+    EOBRUN = entropy->saved.EOBRUN;     /* only part of saved state we need */
+
+    /* There is always only one block per MCU */
+
+    if (EOBRUN > 0)             /* if it's a band of zeroes... */
+      EOBRUN--;                 /* ...process it now (we do nothing) */
+    else {
+      BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+      block = MCU_data[0];
+      tbl = entropy->ac_derived_tbl;
+
+      for (k = cinfo->Ss; k <= Se; k++) {
+        HUFF_DECODE(s, br_state, tbl, return FALSE, label2);
+        r = s >> 4;
+        s &= 15;
+        if (s) {
+          k += r;
+          CHECK_BIT_BUFFER(br_state, s, return FALSE);
+          r = GET_BITS(s);
+          s = HUFF_EXTEND(r, s);
+          /* Scale and output coefficient in natural (dezigzagged) order */
+          (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al);
+        } else {
+          if (r == 15) {        /* ZRL */
+            k += 15;            /* skip 15 zeroes in band */
+          } else {              /* EOBr, run length is 2^r + appended bits */
+            EOBRUN = 1 << r;
+            if (r) {            /* EOBr, r > 0 */
+              CHECK_BIT_BUFFER(br_state, r, return FALSE);
+              r = GET_BITS(r);
+              EOBRUN += r;
+            }
+            EOBRUN--;           /* this band is processed at this moment */
+            break;              /* force end-of-band */
+          }
+        }
+      }
+
+      BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+    }
+
+    /* Completed MCU, so update state */
+    entropy->saved.EOBRUN = EOBRUN;     /* only part of saved state we need */
+  }
+
+  /* Account for restart interval (no-op if not using restarts) */
+  entropy->restarts_to_go--;
+
+  return TRUE;
+}
+
+
+/*
+ * MCU decoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component, although the spec
+ * is not very clear on the point.
+ */
+
+METHODDEF(boolean)
+decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  int p1 = 1 << cinfo->Al;      /* 1 in the bit position being coded */
+  int blkn;
+  JBLOCKROW block;
+  BITREAD_STATE_VARS;
+
+  /* Process restart marker if needed; may have to suspend */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0)
+      if (! process_restart(cinfo))
+        return FALSE;
+  }
+
+  /* Not worth the cycles to check insufficient_data here,
+   * since we will not change the data anyway if we read zeroes.
+   */
+
+  /* Load up working state */
+  BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+
+  /* Outer loop handles each block in the MCU */
+
+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+    block = MCU_data[blkn];
+
+    /* Encoded data is simply the next bit of the two's-complement DC value */
+    CHECK_BIT_BUFFER(br_state, 1, return FALSE);
+    if (GET_BITS(1))
+      (*block)[0] |= p1;
+    /* Note: since we use |=, repeating the assignment later is safe */
+  }
+
+  /* Completed MCU, so update state */
+  BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+
+  /* Account for restart interval (no-op if not using restarts) */
+  entropy->restarts_to_go--;
+
+  return TRUE;
+}
+
+
+/*
+ * MCU decoding for AC successive approximation refinement scan.
+ */
+
+METHODDEF(boolean)
+decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+  int Se = cinfo->Se;
+  int p1 = 1 << cinfo->Al;      /* 1 in the bit position being coded */
+  int m1 = (-1) << cinfo->Al;   /* -1 in the bit position being coded */
+  register int s, k, r;
+  unsigned int EOBRUN;
+  JBLOCKROW block;
+  JCOEFPTR thiscoef;
+  BITREAD_STATE_VARS;
+  d_derived_tbl * tbl;
+  int num_newnz;
+  int newnz_pos[DCTSIZE2];
+
+  /* Process restart marker if needed; may have to suspend */
+  if (cinfo->restart_interval) {
+    if (entropy->restarts_to_go == 0)
+      if (! process_restart(cinfo))
+        return FALSE;
+  }
+
+  /* If we've run out of data, don't modify the MCU.
+   */
+  if (! entropy->pub.insufficient_data) {
+
+    /* Load up working state */
+    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+    EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
+
+    /* There is always only one block per MCU */
+    block = MCU_data[0];
+    tbl = entropy->ac_derived_tbl;
+
+    /* If we are forced to suspend, we must undo the assignments to any newly
+     * nonzero coefficients in the block, because otherwise we'd get confused
+     * next time about which coefficients were already nonzero.
+     * But we need not undo addition of bits to already-nonzero coefficients;
+     * instead, we can test the current bit to see if we already did it.
+     */
+    num_newnz = 0;
+
+    /* initialize coefficient loop counter to start of band */
+    k = cinfo->Ss;
+
+    if (EOBRUN == 0) {
+      for (; k <= Se; k++) {
+        HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
+        r = s >> 4;
+        s &= 15;
+        if (s) {
+          if (s != 1)           /* size of new coef should always be 1 */
+            WARNMS(cinfo, JWRN_HUFF_BAD_CODE);
+          CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+          if (GET_BITS(1))
+            s = p1;             /* newly nonzero coef is positive */
+          else
+            s = m1;             /* newly nonzero coef is negative */
+        } else {
+          if (r != 15) {
+            EOBRUN = 1 << r;    /* EOBr, run length is 2^r + appended bits */
+            if (r) {
+              CHECK_BIT_BUFFER(br_state, r, goto undoit);
+              r = GET_BITS(r);
+              EOBRUN += r;
+            }
+            break;              /* rest of block is handled by EOB logic */
+          }
+          /* note s = 0 for processing ZRL */
+        }
+        /* Advance over already-nonzero coefs and r still-zero coefs,
+         * appending correction bits to the nonzeroes.  A correction bit is 1
+         * if the absolute value of the coefficient must be increased.
+         */
+        do {
+          thiscoef = *block + jpeg_natural_order[k];
+          if (*thiscoef != 0) {
+            CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+            if (GET_BITS(1)) {
+              if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
+                if (*thiscoef >= 0)
+                  *thiscoef += p1;
+                else
+                  *thiscoef += m1;
+              }
+            }
+          } else {
+            if (--r < 0)
+              break;            /* reached target zero coefficient */
+          }
+          k++;
+        } while (k <= Se);
+        if (s) {
+          int pos = jpeg_natural_order[k];
+          /* Output newly nonzero coefficient */
+          (*block)[pos] = (JCOEF) s;
+          /* Remember its position in case we have to suspend */
+          newnz_pos[num_newnz++] = pos;
+        }
+      }
+    }
+
+    if (EOBRUN > 0) {
+      /* Scan any remaining coefficient positions after the end-of-band
+       * (the last newly nonzero coefficient, if any).  Append a correction
+       * bit to each already-nonzero coefficient.  A correction bit is 1
+       * if the absolute value of the coefficient must be increased.
+       */
+      for (; k <= Se; k++) {
+        thiscoef = *block + jpeg_natural_order[k];
+        if (*thiscoef != 0) {
+          CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+          if (GET_BITS(1)) {
+            if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
+              if (*thiscoef >= 0)
+                *thiscoef += p1;
+              else
+                *thiscoef += m1;
+            }
+          }
+        }
+      }
+      /* Count one block completed in EOB run */
+      EOBRUN--;
+    }
+
+    /* Completed MCU, so update state */
+    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+    entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
+  }
+
+  /* Account for restart interval (no-op if not using restarts) */
+  entropy->restarts_to_go--;
+
+  return TRUE;
+
+undoit:
+  /* Re-zero any output coefficients that we made newly nonzero */
+  while (num_newnz > 0)
+    (*block)[newnz_pos[--num_newnz]] = 0;
+
+  return FALSE;
+}
+
+
+/*
+ * Module initialization routine for progressive Huffman entropy decoding.
+ */
+
+GLOBAL(void)
+jinit_phuff_decoder (j_decompress_ptr cinfo)
+{
+  phuff_entropy_ptr entropy;
+  int *coef_bit_ptr;
+  int ci, i;
+
+  entropy = (phuff_entropy_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(phuff_entropy_decoder));
+  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+  entropy->pub.start_pass = start_pass_phuff_decoder;
+
+  /* Mark derived tables unallocated */
+  for (i = 0; i < NUM_HUFF_TBLS; i++) {
+    entropy->derived_tbls[i] = NULL;
+  }
+
+  /* Create progression status table */
+  cinfo->coef_bits = (int (*)[DCTSIZE2])
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                cinfo->num_components*DCTSIZE2*SIZEOF(int));
+  coef_bit_ptr = & cinfo->coef_bits[0][0];
+  for (ci = 0; ci < cinfo->num_components; ci++)
+    for (i = 0; i < DCTSIZE2; i++)
+      *coef_bit_ptr++ = -1;
+}
+
+#endif /* D_PROGRESSIVE_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdpostct.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,294 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdpostct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the decompression postprocessing controller.
+ * This controller manages the upsampling, color conversion, and color
+ * quantization/reduction steps; specifically, it controls the buffering
+ * between upsample/color conversion and color quantization/reduction.
+ *
+ * If no color quantization/reduction is required, then this module has no
+ * work to do, and it just hands off to the upsample/color conversion code.
+ * An integrated upsample/convert/quantize process would replace this module
+ * entirely.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private buffer controller object */
+
+typedef struct {
+  struct jpeg_d_post_controller pub; /* public fields */
+
+  /* Color quantization source buffer: this holds output data from
+   * the upsample/color conversion step to be passed to the quantizer.
+   * For two-pass color quantization, we need a full-image buffer;
+   * for one-pass operation, a strip buffer is sufficient.
+   */
+  jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */
+  JSAMPARRAY buffer;            /* strip buffer, or current strip of virtual */
+  JDIMENSION strip_height;      /* buffer size in rows */
+  /* for two-pass mode only: */
+  JDIMENSION starting_row;      /* row # of first row in current strip */
+  JDIMENSION next_row;          /* index of next row to fill/empty in strip */
+} my_post_controller;
+
+typedef my_post_controller * my_post_ptr;
+
+
+/* Forward declarations */
+METHODDEF(void) post_process_1pass
+        JPP((j_decompress_ptr cinfo,
+             JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+             JDIMENSION in_row_groups_avail,
+             JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+             JDIMENSION out_rows_avail));
+#ifdef QUANT_2PASS_SUPPORTED
+METHODDEF(void) post_process_prepass
+        JPP((j_decompress_ptr cinfo,
+             JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+             JDIMENSION in_row_groups_avail,
+             JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+             JDIMENSION out_rows_avail));
+METHODDEF(void) post_process_2pass
+        JPP((j_decompress_ptr cinfo,
+             JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+             JDIMENSION in_row_groups_avail,
+             JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+             JDIMENSION out_rows_avail));
+#endif
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+  my_post_ptr post = (my_post_ptr) cinfo->post;
+
+  switch (pass_mode) {
+  case JBUF_PASS_THRU:
+    if (cinfo->quantize_colors) {
+      /* Single-pass processing with color quantization. */
+      post->pub.post_process_data = post_process_1pass;
+      /* We could be doing buffered-image output before starting a 2-pass
+       * color quantization; in that case, jinit_d_post_controller did not
+       * allocate a strip buffer.  Use the virtual-array buffer as workspace.
+       */
+      if (post->buffer == NULL) {
+        post->buffer = (*cinfo->mem->access_virt_sarray)
+          ((j_common_ptr) cinfo, post->whole_image,
+           (JDIMENSION) 0, post->strip_height, TRUE);
+      }
+    } else {
+      /* For single-pass processing without color quantization,
+       * I have no work to do; just call the upsampler directly.
+       */
+      post->pub.post_process_data = cinfo->upsample->upsample;
+    }
+    break;
+#ifdef QUANT_2PASS_SUPPORTED
+  case JBUF_SAVE_AND_PASS:
+    /* First pass of 2-pass quantization */
+    if (post->whole_image == NULL)
+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    post->pub.post_process_data = post_process_prepass;
+    break;
+  case JBUF_CRANK_DEST:
+    /* Second pass of 2-pass quantization */
+    if (post->whole_image == NULL)
+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    post->pub.post_process_data = post_process_2pass;
+    break;
+#endif /* QUANT_2PASS_SUPPORTED */
+  default:
+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+    break;
+  }
+  post->starting_row = post->next_row = 0;
+}
+
+
+/*
+ * Process some data in the one-pass (strip buffer) case.
+ * This is used for color precision reduction as well as one-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_1pass (j_decompress_ptr cinfo,
+                    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+                    JDIMENSION in_row_groups_avail,
+                    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                    JDIMENSION out_rows_avail)
+{
+  my_post_ptr post = (my_post_ptr) cinfo->post;
+  JDIMENSION num_rows, max_rows;
+
+  /* Fill the buffer, but not more than what we can dump out in one go. */
+  /* Note we rely on the upsampler to detect bottom of image. */
+  max_rows = out_rows_avail - *out_row_ctr;
+  if (max_rows > post->strip_height)
+    max_rows = post->strip_height;
+  num_rows = 0;
+  (*cinfo->upsample->upsample) (cinfo,
+                input_buf, in_row_group_ctr, in_row_groups_avail,
+                post->buffer, &num_rows, max_rows);
+  /* Quantize and emit data. */
+  (*cinfo->cquantize->color_quantize) (cinfo,
+                post->buffer, output_buf + *out_row_ctr, (int) num_rows);
+  *out_row_ctr += num_rows;
+}
+
+
+#ifdef QUANT_2PASS_SUPPORTED
+
+/*
+ * Process some data in the first pass of 2-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_prepass (j_decompress_ptr cinfo,
+                      JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+                      JDIMENSION in_row_groups_avail,
+                      JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                      JDIMENSION out_rows_avail)
+{
+  my_post_ptr post = (my_post_ptr) cinfo->post;
+  JDIMENSION old_next_row, num_rows;
+
+  /* Reposition virtual buffer if at start of strip. */
+  if (post->next_row == 0) {
+    post->buffer = (*cinfo->mem->access_virt_sarray)
+        ((j_common_ptr) cinfo, post->whole_image,
+         post->starting_row, post->strip_height, TRUE);
+  }
+
+  /* Upsample some data (up to a strip height's worth). */
+  old_next_row = post->next_row;
+  (*cinfo->upsample->upsample) (cinfo,
+                input_buf, in_row_group_ctr, in_row_groups_avail,
+                post->buffer, &post->next_row, post->strip_height);
+
+  /* Allow quantizer to scan new data.  No data is emitted, */
+  /* but we advance out_row_ctr so outer loop can tell when we're done. */
+  if (post->next_row > old_next_row) {
+    num_rows = post->next_row - old_next_row;
+    (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,
+                                         (JSAMPARRAY) NULL, (int) num_rows);
+    *out_row_ctr += num_rows;
+  }
+
+  /* Advance if we filled the strip. */
+  if (post->next_row >= post->strip_height) {
+    post->starting_row += post->strip_height;
+    post->next_row = 0;
+  }
+}
+
+
+/*
+ * Process some data in the second pass of 2-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_2pass (j_decompress_ptr cinfo,
+                    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+                    JDIMENSION in_row_groups_avail,
+                    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                    JDIMENSION out_rows_avail)
+{
+  my_post_ptr post = (my_post_ptr) cinfo->post;
+  JDIMENSION num_rows, max_rows;
+
+  /* Reposition virtual buffer if at start of strip. */
+  if (post->next_row == 0) {
+    post->buffer = (*cinfo->mem->access_virt_sarray)
+        ((j_common_ptr) cinfo, post->whole_image,
+         post->starting_row, post->strip_height, FALSE);
+  }
+
+  /* Determine number of rows to emit. */
+  num_rows = post->strip_height - post->next_row; /* available in strip */
+  max_rows = out_rows_avail - *out_row_ctr; /* available in output area */
+  if (num_rows > max_rows)
+    num_rows = max_rows;
+  /* We have to check bottom of image here, can't depend on upsampler. */
+  max_rows = cinfo->output_height - post->starting_row;
+  if (num_rows > max_rows)
+    num_rows = max_rows;
+
+  /* Quantize and emit data. */
+  (*cinfo->cquantize->color_quantize) (cinfo,
+                post->buffer + post->next_row, output_buf + *out_row_ctr,
+                (int) num_rows);
+  *out_row_ctr += num_rows;
+
+  /* Advance if we filled the strip. */
+  post->next_row += num_rows;
+  if (post->next_row >= post->strip_height) {
+    post->starting_row += post->strip_height;
+    post->next_row = 0;
+  }
+}
+
+#endif /* QUANT_2PASS_SUPPORTED */
+
+
+/*
+ * Initialize postprocessing controller.
+ */
+
+GLOBAL(void)
+jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+  my_post_ptr post;
+
+  post = (my_post_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_post_controller));
+  cinfo->post = (struct jpeg_d_post_controller *) post;
+  post->pub.start_pass = start_pass_dpost;
+  post->whole_image = NULL;     /* flag for no virtual arrays */
+  post->buffer = NULL;          /* flag for no strip buffer */
+
+  /* Create the quantization buffer, if needed */
+  if (cinfo->quantize_colors) {
+    /* The buffer strip height is max_v_samp_factor, which is typically
+     * an efficient number of rows for upsampling to return.
+     * (In the presence of output rescaling, we might want to be smarter?)
+     */
+    post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;
+    if (need_full_buffer) {
+      /* Two-pass color quantization: need full-image storage. */
+      /* We round up the number of rows to a multiple of the strip height. */
+#ifdef QUANT_2PASS_SUPPORTED
+      post->whole_image = (*cinfo->mem->request_virt_sarray)
+        ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+         cinfo->output_width * cinfo->out_color_components,
+         (JDIMENSION) jround_up((long) cinfo->output_height,
+                                (long) post->strip_height),
+         post->strip_height);
+#else
+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif /* QUANT_2PASS_SUPPORTED */
+    } else {
+      /* One-pass color quantization: just make a strip buffer. */
+      post->buffer = (*cinfo->mem->alloc_sarray)
+        ((j_common_ptr) cinfo, JPOOL_IMAGE,
+         cinfo->output_width * cinfo->out_color_components,
+         post->strip_height);
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdsample.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,482 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdsample.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains upsampling routines.
+ *
+ * Upsampling input data is counted in "row groups".  A row group
+ * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
+ * sample rows of each component.  Upsampling will normally produce
+ * max_v_samp_factor pixel rows from each row group (but this could vary
+ * if the upsampler is applying a scale factor of its own).
+ *
+ * An excellent reference for image resampling is
+ *   Digital Image Warping, George Wolberg, 1990.
+ *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Pointer to routine to upsample a single component */
+typedef JMETHOD(void, upsample1_ptr,
+                (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+                 JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));
+
+/* Private subobject */
+
+typedef struct {
+  struct jpeg_upsampler pub;    /* public fields */
+
+  /* Color conversion buffer.  When using separate upsampling and color
+   * conversion steps, this buffer holds one upsampled row group until it
+   * has been color converted and output.
+   * Note: we do not allocate any storage for component(s) which are full-size,
+   * ie do not need rescaling.  The corresponding entry of color_buf[] is
+   * simply set to point to the input data array, thereby avoiding copying.
+   */
+  JSAMPARRAY color_buf[MAX_COMPONENTS];
+
+  /* Per-component upsampling method pointers */
+  upsample1_ptr methods[MAX_COMPONENTS];
+
+  int next_row_out;             /* counts rows emitted from color_buf */
+  JDIMENSION rows_to_go;        /* counts rows remaining in image */
+
+  /* Height of an input row group for each component. */
+  int rowgroup_height[MAX_COMPONENTS];
+
+  /* These arrays save pixel expansion factors so that int_expand need not
+   * recompute them each time.  They are unused for other upsampling methods.
+   */
+  UINT8 h_expand[MAX_COMPONENTS];
+  UINT8 v_expand[MAX_COMPONENTS];
+} my_upsampler;
+
+typedef my_upsampler * my_upsample_ptr;
+
+
+/*
+ * Initialize for an upsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_upsample (j_decompress_ptr cinfo)
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+  /* Mark the conversion buffer empty */
+  upsample->next_row_out = cinfo->max_v_samp_factor;
+  /* Initialize total-height counter for detecting bottom of image */
+  upsample->rows_to_go = cinfo->output_height;
+}
+
+
+/*
+ * Control routine to do upsampling (and color conversion).
+ *
+ * In this version we upsample each component independently.
+ * We upsample one row group into the conversion buffer, then apply
+ * color conversion a row at a time.
+ */
+
+METHODDEF(void)
+sep_upsample (j_decompress_ptr cinfo,
+              JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+              JDIMENSION in_row_groups_avail,
+              JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+              JDIMENSION out_rows_avail)
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+  int ci;
+  jpeg_component_info * compptr;
+  JDIMENSION num_rows;
+
+  /* Fill the conversion buffer, if it's empty */
+  if (upsample->next_row_out >= cinfo->max_v_samp_factor) {
+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+         ci++, compptr++) {
+      /* Invoke per-component upsample method.  Notice we pass a POINTER
+       * to color_buf[ci], so that fullsize_upsample can change it.
+       */
+      (*upsample->methods[ci]) (cinfo, compptr,
+        input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]),
+        upsample->color_buf + ci);
+    }
+    upsample->next_row_out = 0;
+  }
+
+  /* Color-convert and emit rows */
+
+  /* How many we have in the buffer: */
+  num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out);
+  /* Not more than the distance to the end of the image.  Need this test
+   * in case the image height is not a multiple of max_v_samp_factor:
+   */
+  if (num_rows > upsample->rows_to_go)
+    num_rows = upsample->rows_to_go;
+  /* And not more than what the client can accept: */
+  out_rows_avail -= *out_row_ctr;
+  if (num_rows > out_rows_avail)
+    num_rows = out_rows_avail;
+
+  (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf,
+                                     (JDIMENSION) upsample->next_row_out,
+                                     output_buf + *out_row_ctr,
+                                     (int) num_rows);
+
+  /* Adjust counts */
+  *out_row_ctr += num_rows;
+  upsample->rows_to_go -= num_rows;
+  upsample->next_row_out += num_rows;
+  /* When the buffer is emptied, declare this input row group consumed */
+  if (upsample->next_row_out >= cinfo->max_v_samp_factor)
+    (*in_row_group_ctr)++;
+}
+
+
+/*
+ * These are the routines invoked by sep_upsample to upsample pixel values
+ * of a single component.  One row group is processed per call.
+ */
+
+
+/*
+ * For full-size components, we just make color_buf[ci] point at the
+ * input buffer, and thus avoid copying any data.  Note that this is
+ * safe only because sep_upsample doesn't declare the input row group
+ * "consumed" until we are done color converting and emitting it.
+ */
+
+METHODDEF(void)
+fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+                   JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+  *output_data_ptr = input_data;
+}
+
+
+/*
+ * This is a no-op version used for "uninteresting" components.
+ * These components will not be referenced by color conversion.
+ */
+
+METHODDEF(void)
+noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+               JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+  *output_data_ptr = NULL;      /* safety check */
+}
+
+
+/*
+ * This version handles any integral sampling ratios.
+ * This is not used for typical JPEG files, so it need not be fast.
+ * Nor, for that matter, is it particularly accurate: the algorithm is
+ * simple replication of the input pixel onto the corresponding output
+ * pixels.  The hi-falutin sampling literature refers to this as a
+ * "box filter".  A box filter tends to introduce visible artifacts,
+ * so if you are actually going to use 3:1 or 4:1 sampling ratios
+ * you would be well advised to improve this code.
+ */
+
+METHODDEF(void)
+int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+              JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+  JSAMPARRAY output_data = *output_data_ptr;
+  register JSAMPROW inptr, outptr;
+  register JSAMPLE invalue;
+  register int h;
+  JSAMPROW outend;
+  int h_expand, v_expand;
+  int inrow, outrow;
+
+  h_expand = upsample->h_expand[compptr->component_index];
+  v_expand = upsample->v_expand[compptr->component_index];
+
+  inrow = outrow = 0;
+  while (outrow < cinfo->max_v_samp_factor) {
+    /* Generate one output row with proper horizontal expansion */
+    inptr = input_data[inrow];
+    outptr = output_data[outrow];
+    outend = outptr + cinfo->output_width;
+    while (outptr < outend) {
+      invalue = *inptr++;       /* don't need GETJSAMPLE() here */
+      for (h = h_expand; h > 0; h--) {
+        *outptr++ = invalue;
+      }
+    }
+    /* Generate any additional output rows by duplicating the first one */
+    if (v_expand > 1) {
+      jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
+                        v_expand-1, cinfo->output_width);
+    }
+    inrow++;
+    outrow += v_expand;
+  }
+}
+
+
+/*
+ * Fast processing for the common case of 2:1 horizontal and 1:1 vertical.
+ * It's still a box filter.
+ */
+
+METHODDEF(void)
+h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+               JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+  JSAMPARRAY output_data = *output_data_ptr;
+  register JSAMPROW inptr, outptr;
+  register JSAMPLE invalue;
+  JSAMPROW outend;
+  int inrow;
+
+  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
+    inptr = input_data[inrow];
+    outptr = output_data[inrow];
+    outend = outptr + cinfo->output_width;
+    while (outptr < outend) {
+      invalue = *inptr++;       /* don't need GETJSAMPLE() here */
+      *outptr++ = invalue;
+      *outptr++ = invalue;
+    }
+  }
+}
+
+
+/*
+ * Fast processing for the common case of 2:1 horizontal and 2:1 vertical.
+ * It's still a box filter.
+ */
+
+METHODDEF(void)
+h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+               JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+  JSAMPARRAY output_data = *output_data_ptr;
+  register JSAMPROW inptr, outptr;
+  register JSAMPLE invalue;
+  JSAMPROW outend;
+  int inrow, outrow;
+
+  inrow = outrow = 0;
+  while (outrow < cinfo->max_v_samp_factor) {
+    inptr = input_data[inrow];
+    outptr = output_data[outrow];
+    outend = outptr + cinfo->output_width;
+    while (outptr < outend) {
+      invalue = *inptr++;       /* don't need GETJSAMPLE() here */
+      *outptr++ = invalue;
+      *outptr++ = invalue;
+    }
+    jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
+                      1, cinfo->output_width);
+    inrow++;
+    outrow += 2;
+  }
+}
+
+
+/*
+ * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical.
+ *
+ * The upsampling algorithm is linear interpolation between pixel centers,
+ * also known as a "triangle filter".  This is a good compromise between
+ * speed and visual quality.  The centers of the output pixels are 1/4 and 3/4
+ * of the way between input pixel centers.
+ *
+ * A note about the "bias" calculations: when rounding fractional values to
+ * integer, we do not want to always round 0.5 up to the next integer.
+ * If we did that, we'd introduce a noticeable bias towards larger values.
+ * Instead, this code is arranged so that 0.5 will be rounded up or down at
+ * alternate pixel locations (a simple ordered dither pattern).
+ */
+
+METHODDEF(void)
+h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+                     JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+  JSAMPARRAY output_data = *output_data_ptr;
+  register JSAMPROW inptr, outptr;
+  register int invalue;
+  register JDIMENSION colctr;
+  int inrow;
+
+  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
+    inptr = input_data[inrow];
+    outptr = output_data[inrow];
+    /* Special case for first column */
+    invalue = GETJSAMPLE(*inptr++);
+    *outptr++ = (JSAMPLE) invalue;
+    *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2);
+
+    for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
+      /* General case: 3/4 * nearer pixel + 1/4 * further pixel */
+      invalue = GETJSAMPLE(*inptr++) * 3;
+      *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2);
+      *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2);
+    }
+
+    /* Special case for last column */
+    invalue = GETJSAMPLE(*inptr);
+    *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2);
+    *outptr++ = (JSAMPLE) invalue;
+  }
+}
+
+
+/*
+ * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical.
+ * Again a triangle filter; see comments for h2v1 case, above.
+ *
+ * It is OK for us to reference the adjacent input rows because we demanded
+ * context from the main buffer controller (see initialization code).
+ */
+
+METHODDEF(void)
+h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+                     JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+  JSAMPARRAY output_data = *output_data_ptr;
+  register JSAMPROW inptr0, inptr1, outptr;
+#if BITS_IN_JSAMPLE == 8
+  register int thiscolsum, lastcolsum, nextcolsum;
+#else
+  register INT32 thiscolsum, lastcolsum, nextcolsum;
+#endif
+  register JDIMENSION colctr;
+  int inrow, outrow, v;
+
+  inrow = outrow = 0;
+  while (outrow < cinfo->max_v_samp_factor) {
+    for (v = 0; v < 2; v++) {
+      /* inptr0 points to nearest input row, inptr1 points to next nearest */
+      inptr0 = input_data[inrow];
+      if (v == 0)               /* next nearest is row above */
+        inptr1 = input_data[inrow-1];
+      else                      /* next nearest is row below */
+        inptr1 = input_data[inrow+1];
+      outptr = output_data[outrow++];
+
+      /* Special case for first column */
+      thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+      nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+      *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4);
+      *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
+      lastcolsum = thiscolsum; thiscolsum = nextcolsum;
+
+      for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
+        /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */
+        /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */
+        nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+        *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
+        *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
+        lastcolsum = thiscolsum; thiscolsum = nextcolsum;
+      }
+
+      /* Special case for last column */
+      *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
+      *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4);
+    }
+    inrow++;
+  }
+}
+
+
+/*
+ * Module initialization routine for upsampling.
+ */
+
+GLOBAL(void)
+jinit_upsampler (j_decompress_ptr cinfo)
+{
+  my_upsample_ptr upsample;
+  int ci;
+  jpeg_component_info * compptr;
+  boolean need_buffer, do_fancy;
+  int h_in_group, v_in_group, h_out_group, v_out_group;
+
+  upsample = (my_upsample_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_upsampler));
+  cinfo->upsample = (struct jpeg_upsampler *) upsample;
+  upsample->pub.start_pass = start_pass_upsample;
+  upsample->pub.upsample = sep_upsample;
+  upsample->pub.need_context_rows = FALSE; /* until we find out differently */
+
+  if (cinfo->CCIR601_sampling)  /* this isn't supported */
+    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
+
+  /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1,
+   * so don't ask for it.
+   */
+  do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1;
+
+  /* Verify we can handle the sampling factors, select per-component methods,
+   * and create storage as needed.
+   */
+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+       ci++, compptr++) {
+    /* Compute size of an "input group" after IDCT scaling.  This many samples
+     * are to be converted to max_h_samp_factor * max_v_samp_factor pixels.
+     */
+    h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) /
+                 cinfo->min_DCT_scaled_size;
+    v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+                 cinfo->min_DCT_scaled_size;
+    h_out_group = cinfo->max_h_samp_factor;
+    v_out_group = cinfo->max_v_samp_factor;
+    upsample->rowgroup_height[ci] = v_in_group; /* save for use later */
+    need_buffer = TRUE;
+    if (! compptr->component_needed) {
+      /* Don't bother to upsample an uninteresting component. */
+      upsample->methods[ci] = noop_upsample;
+      need_buffer = FALSE;
+    } else if (h_in_group == h_out_group && v_in_group == v_out_group) {
+      /* Fullsize components can be processed without any work. */
+      upsample->methods[ci] = fullsize_upsample;
+      need_buffer = FALSE;
+    } else if (h_in_group * 2 == h_out_group &&
+               v_in_group == v_out_group) {
+      /* Special cases for 2h1v upsampling */
+      if (do_fancy && compptr->downsampled_width > 2)
+        upsample->methods[ci] = h2v1_fancy_upsample;
+      else
+        upsample->methods[ci] = h2v1_upsample;
+    } else if (h_in_group * 2 == h_out_group &&
+               v_in_group * 2 == v_out_group) {
+      /* Special cases for 2h2v upsampling */
+      if (do_fancy && compptr->downsampled_width > 2) {
+        upsample->methods[ci] = h2v2_fancy_upsample;
+        upsample->pub.need_context_rows = TRUE;
+      } else
+        upsample->methods[ci] = h2v2_upsample;
+    } else if ((h_out_group % h_in_group) == 0 &&
+               (v_out_group % v_in_group) == 0) {
+      /* Generic integral-factors upsampling method */
+      upsample->methods[ci] = int_upsample;
+      upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group);
+      upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);
+    } else
+      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
+    if (need_buffer) {
+      upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)
+        ((j_common_ptr) cinfo, JPOOL_IMAGE,
+         (JDIMENSION) jround_up((long) cinfo->output_width,
+                                (long) cinfo->max_h_samp_factor),
+         (JDIMENSION) cinfo->max_v_samp_factor);
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jdtrans.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,147 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jdtrans.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains library routines for transcoding decompression,
+ * that is, reading raw DCT coefficient arrays from an input JPEG file.
+ * The routines in jdapimin.c will also be needed by a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Read the coefficient arrays from a JPEG file.
+ * jpeg_read_header must be completed before calling this.
+ *
+ * The entire image is read into a set of virtual coefficient-block arrays,
+ * one per component.  The return value is a pointer to the array of
+ * virtual-array descriptors.  These can be manipulated directly via the
+ * JPEG memory manager, or handed off to jpeg_write_coefficients().
+ * To release the memory occupied by the virtual arrays, call
+ * jpeg_finish_decompress() when done with the data.
+ *
+ * An alternative usage is to simply obtain access to the coefficient arrays
+ * during a buffered-image-mode decompression operation.  This is allowed
+ * after any jpeg_finish_output() call.  The arrays can be accessed until
+ * jpeg_finish_decompress() is called.  (Note that any call to the library
+ * may reposition the arrays, so don't rely on access_virt_barray() results
+ * to stay valid across library calls.)
+ *
+ * Returns NULL if suspended.  This case need be checked only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(jvirt_barray_ptr *)
+jpeg_read_coefficients (j_decompress_ptr cinfo)
+{
+  if (cinfo->global_state == DSTATE_READY) {
+    /* First call: initialize active modules */
+    transdecode_master_selection(cinfo);
+    cinfo->global_state = DSTATE_RDCOEFS;
+  }
+  if (cinfo->global_state == DSTATE_RDCOEFS) {
+    /* Absorb whole file into the coef buffer */
+    for (;;) {
+      int retcode;
+      /* Call progress monitor hook if present */
+      if (cinfo->progress != NULL)
+        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+      /* Absorb some more input */
+      retcode = (*cinfo->inputctl->consume_input) (cinfo);
+      if (retcode == JPEG_SUSPENDED)
+        return NULL;
+      if (retcode == JPEG_REACHED_EOI)
+        break;
+      /* Advance progress counter if appropriate */
+      if (cinfo->progress != NULL &&
+          (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
+        if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
+          /* startup underestimated number of scans; ratchet up one scan */
+          cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
+        }
+      }
+    }
+    /* Set state so that jpeg_finish_decompress does the right thing */
+    cinfo->global_state = DSTATE_STOPPING;
+  }
+  /* At this point we should be in state DSTATE_STOPPING if being used
+   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
+   * to the coefficients during a full buffered-image-mode decompression.
+   */
+  if ((cinfo->global_state == DSTATE_STOPPING ||
+       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
+    return cinfo->coef->coef_arrays;
+  }
+  /* Oops, improper usage */
+  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+  return NULL;                  /* keep compiler happy */
+}
+
+
+/*
+ * Master selection of decompression modules for transcoding.
+ * This substitutes for jdmaster.c's initialization of the full decompressor.
+ */
+
+LOCAL(void)
+transdecode_master_selection (j_decompress_ptr cinfo)
+{
+  /* This is effectively a buffered-image operation. */
+  cinfo->buffered_image = TRUE;
+
+  /* Entropy decoding: either Huffman or arithmetic coding. */
+  if (cinfo->arith_code) {
+    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+  } else {
+    if (cinfo->progressive_mode) {
+#ifdef D_PROGRESSIVE_SUPPORTED
+      jinit_phuff_decoder(cinfo);
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+    } else
+      jinit_huff_decoder(cinfo);
+  }
+
+  /* Always get a full-image coefficient buffer. */
+  jinit_d_coef_controller(cinfo, TRUE);
+
+  /* We can now tell the memory manager to allocate virtual arrays. */
+  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+  /* Initialize input side of decompressor to consume first scan. */
+  (*cinfo->inputctl->start_input_pass) (cinfo);
+
+  /* Initialize progress monitoring. */
+  if (cinfo->progress != NULL) {
+    int nscans;
+    /* Estimate number of scans to set pass_limit. */
+    if (cinfo->progressive_mode) {
+      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
+      nscans = 2 + 3 * cinfo->num_components;
+    } else if (cinfo->inputctl->has_multiple_scans) {
+      /* For a nonprogressive multiscan file, estimate 1 scan per component. */
+      nscans = cinfo->num_components;
+    } else {
+      nscans = 1;
+    }
+    cinfo->progress->pass_counter = 0L;
+    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
+    cinfo->progress->completed_passes = 0;
+    cinfo->progress->total_passes = 1;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jerror.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,272 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jerror.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains simple error-reporting and trace-message routines.
+ * These are suitable for Unix-like systems and others where writing to
+ * stderr is the right thing to do.  Many applications will want to replace
+ * some or all of these routines.
+ *
+ * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,
+ * you get a Windows-specific hack to display error messages in a dialog box.
+ * It ain't much, but it beats dropping error messages into the bit bucket,
+ * which is what happens to output to stderr under most Windows C compilers.
+ *
+ * These routines are used by both the compression and decompression code.
+ */
+
+/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jversion.h"
+#include "jerror.h"
+
+#ifdef USE_WINDOWS_MESSAGEBOX
+#include <windows.h>
+#endif
+
+#ifndef EXIT_FAILURE            /* define exit() codes if not provided */
+#define EXIT_FAILURE  1
+#endif
+
+
+/*
+ * Create the message string table.
+ * We do this from the master message list in jerror.h by re-reading
+ * jerror.h with a suitable definition for macro JMESSAGE.
+ * The message table is made an external symbol just in case any applications
+ * want to refer to it directly.
+ */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_std_message_table  jMsgTable
+#endif
+
+#define JMESSAGE(code,string)   string ,
+
+const char * const jpeg_std_message_table[] = {
+#include "jerror.h"
+  NULL
+};
+
+
+/*
+ * Error exit handler: must not return to caller.
+ *
+ * Applications may override this if they want to get control back after
+ * an error.  Typically one would longjmp somewhere instead of exiting.
+ * The setjmp buffer can be made a private field within an expanded error
+ * handler object.  Note that the info needed to generate an error message
+ * is stored in the error object, so you can generate the message now or
+ * later, at your convenience.
+ * You should make sure that the JPEG object is cleaned up (with jpeg_abort
+ * or jpeg_destroy) at some point.
+ */
+
+METHODDEF(void)
+error_exit (j_common_ptr cinfo)
+{
+  /* Always display the message */
+  (*cinfo->err->output_message) (cinfo);
+
+  /* Let the memory manager delete any temp files before we die */
+  jpeg_destroy(cinfo);
+
+  /*
+   * This should never happen since the Java library replaces the
+   * error_exit pointer in the error handler structs it uses.
+   *
+   * exit(EXIT_FAILURE);
+   */
+}
+
+
+/*
+ * Actual output of an error or trace message.
+ * Applications may override this method to send JPEG messages somewhere
+ * other than stderr.
+ *
+ * On Windows, printing to stderr is generally completely useless,
+ * so we provide optional code to produce an error-dialog popup.
+ * Most Windows applications will still prefer to override this routine,
+ * but if they don't, it'll do something at least marginally useful.
+ *
+ * NOTE: to use the library in an environment that doesn't support the
+ * C stdio library, you may have to delete the call to fprintf() entirely,
+ * not just not use this routine.
+ */
+
+METHODDEF(void)
+output_message (j_common_ptr cinfo)
+{
+  char buffer[JMSG_LENGTH_MAX];
+
+  /* Create the message */
+  (*cinfo->err->format_message) (cinfo, buffer);
+
+#ifdef USE_WINDOWS_MESSAGEBOX
+  /* Display it in a message dialog box */
+  MessageBox(GetActiveWindow(), buffer, "JPEG Library Error",
+             MB_OK | MB_ICONERROR);
+#else
+  /* Send it to stderr, adding a newline */
+  fprintf(stderr, "%s\n", buffer);
+#endif
+}
+
+
+/*
+ * Decide whether to emit a trace or warning message.
+ * msg_level is one of:
+ *   -1: recoverable corrupt-data warning, may want to abort.
+ *    0: important advisory messages (always display to user).
+ *    1: first level of tracing detail.
+ *    2,3,...: successively more detailed tracing messages.
+ * An application might override this method if it wanted to abort on warnings
+ * or change the policy about which messages to display.
+ */
+
+METHODDEF(void)
+emit_message (j_common_ptr cinfo, int msg_level)
+{
+  struct jpeg_error_mgr * err = cinfo->err;
+
+  if (msg_level < 0) {
+    /* It's a warning message.  Since corrupt files may generate many warnings,
+     * the policy implemented here is to show only the first warning,
+     * unless trace_level >= 3.
+     */
+    if (err->num_warnings == 0 || err->trace_level >= 3)
+      (*err->output_message) (cinfo);
+    /* Always count warnings in num_warnings. */
+    err->num_warnings++;
+  } else {
+    /* It's a trace message.  Show it if trace_level >= msg_level. */
+    if (err->trace_level >= msg_level)
+      (*err->output_message) (cinfo);
+  }
+}
+
+
+/*
+ * Format a message string for the most recent JPEG error or message.
+ * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX
+ * characters.  Note that no '\n' character is added to the string.
+ * Few applications should need to override this method.
+ */
+
+METHODDEF(void)
+format_message (j_common_ptr cinfo, char * buffer)
+{
+
+/* Had to kill this function altogether
+   to avoid linking to VM when building the splash screen with static libjpeg */
+
+#ifndef SPLASHSCREEN
+  int jio_snprintf(char *str, size_t count, const char *fmt, ...);
+  struct jpeg_error_mgr * err = cinfo->err;
+  int msg_code = err->msg_code;
+  const char * msgtext = NULL;
+  const char * msgptr;
+  char ch;
+  boolean isstring;
+
+  /* Look up message string in proper table */
+  if (msg_code > 0 && msg_code <= err->last_jpeg_message) {
+    msgtext = err->jpeg_message_table[msg_code];
+  } else if (err->addon_message_table != NULL &&
+             msg_code >= err->first_addon_message &&
+             msg_code <= err->last_addon_message) {
+    msgtext = err->addon_message_table[msg_code - err->first_addon_message];
+  }
+
+  /* Defend against bogus message number */
+  if (msgtext == NULL) {
+    err->msg_parm.i[0] = msg_code;
+    msgtext = err->jpeg_message_table[0];
+  }
+
+  /* Check for string parameter, as indicated by %s in the message text */
+  isstring = FALSE;
+  msgptr = msgtext;
+  while ((ch = *msgptr++) != '\0') {
+    if (ch == '%') {
+      if (*msgptr == 's') isstring = TRUE;
+      break;
+    }
+  }
+
+  /* Format the message into the passed buffer */
+  if (isstring)
+    /* Buffer size is JMSG_LENGTH_MAX, quietly truncate on overflow */
+    (void) jio_snprintf(buffer, JMSG_LENGTH_MAX, msgtext, err->msg_parm.s);
+  else
+    /* Buffer size is JMSG_LENGTH_MAX, quietly truncate on overflow */
+    (void) jio_snprintf(buffer, JMSG_LENGTH_MAX, msgtext,
+                        err->msg_parm.i[0], err->msg_parm.i[1],
+                        err->msg_parm.i[2], err->msg_parm.i[3],
+                        err->msg_parm.i[4], err->msg_parm.i[5],
+                        err->msg_parm.i[6], err->msg_parm.i[7]);
+#else /* SPLASHSCREEN */
+        *buffer = '\0';
+#endif /* SPLASHSCREEN */
+}
+
+
+/*
+ * Reset error state variables at start of a new image.
+ * This is called during compression startup to reset trace/error
+ * processing to default state, without losing any application-specific
+ * method pointers.  An application might possibly want to override
+ * this method if it has additional error processing state.
+ */
+
+METHODDEF(void)
+reset_error_mgr (j_common_ptr cinfo)
+{
+  cinfo->err->num_warnings = 0;
+  /* trace_level is not reset since it is an application-supplied parameter */
+  cinfo->err->msg_code = 0;     /* may be useful as a flag for "no error" */
+}
+
+
+/*
+ * Fill in the standard error-handling methods in a jpeg_error_mgr object.
+ * Typical call is:
+ *      struct jpeg_compress_struct cinfo;
+ *      struct jpeg_error_mgr err;
+ *
+ *      cinfo.err = jpeg_std_error(&err);
+ * after which the application may override some of the methods.
+ */
+
+GLOBAL(struct jpeg_error_mgr *)
+jpeg_std_error (struct jpeg_error_mgr * err)
+{
+  err->error_exit = error_exit;
+  err->emit_message = emit_message;
+  err->output_message = output_message;
+  err->format_message = format_message;
+  err->reset_error_mgr = reset_error_mgr;
+
+  err->trace_level = 0;         /* default = no tracing */
+  err->num_warnings = 0;        /* no warnings emitted yet */
+  err->msg_code = 0;            /* may be useful as a flag for "no error" */
+
+  /* Initialize message table pointers */
+  err->jpeg_message_table = jpeg_std_message_table;
+  err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;
+
+  err->addon_message_table = NULL;
+  err->first_addon_message = 0; /* for safety */
+  err->last_addon_message = 0;
+
+  return err;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jerror.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,295 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jerror.h
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the error and message codes for the JPEG library.
+ * Edit this file to add new codes, or to translate the message strings to
+ * some other language.
+ * A set of error-reporting macros are defined too.  Some applications using
+ * the JPEG library may wish to include this file to get the error codes
+ * and/or the macros.
+ */
+
+/*
+ * To define the enum list of message codes, include this file without
+ * defining macro JMESSAGE.  To create a message string table, include it
+ * again with a suitable JMESSAGE definition (see jerror.c for an example).
+ */
+#ifndef JMESSAGE
+#ifndef JERROR_H
+/* First time through, define the enum list */
+#define JMAKE_ENUM_LIST
+#else
+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
+#define JMESSAGE(code,string)
+#endif /* JERROR_H */
+#endif /* JMESSAGE */
+
+#ifdef JMAKE_ENUM_LIST
+
+typedef enum {
+
+#define JMESSAGE(code,string)   code ,
+
+#endif /* JMAKE_ENUM_LIST */
+
+JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */
+
+/* For maintenance convenience, list is alphabetical by message code name */
+JMESSAGE(JERR_ARITH_NOTIMPL,
+         "Sorry, there are legal restrictions on arithmetic coding")
+JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")
+JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
+JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
+JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
+JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
+JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
+JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
+JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
+JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
+JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")
+JMESSAGE(JERR_BAD_LIB_VERSION,
+         "Wrong JPEG library version: library is %d, caller expects %d")
+JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")
+JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")
+JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")
+JMESSAGE(JERR_BAD_PROGRESSION,
+         "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")
+JMESSAGE(JERR_BAD_PROG_SCRIPT,
+         "Invalid progressive parameters at scan script entry %d")
+JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")
+JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")
+JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")
+JMESSAGE(JERR_BAD_STRUCT_SIZE,
+         "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")
+JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")
+JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")
+JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")
+JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")
+JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")
+JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")
+JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")
+JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")
+JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")
+JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")
+JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")
+JMESSAGE(JERR_EMS_READ, "Read from EMS failed")
+JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")
+JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
+JMESSAGE(JERR_FILE_READ, "Input file read error")
+JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
+JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
+JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
+JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
+JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
+JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
+JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")
+JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,
+         "Cannot transcode due to multiple use of quantization table %d")
+JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
+JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
+JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
+JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
+JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
+JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
+JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
+JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")
+JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")
+JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")
+JMESSAGE(JERR_QUANT_COMPONENTS,
+         "Cannot quantize more than %d color components")
+JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
+JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
+JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
+JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
+JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
+JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
+JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
+JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
+JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
+JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
+JMESSAGE(JERR_TFILE_WRITE,
+         "Write failed on temporary file --- out of disk space?")
+JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")
+JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")
+JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")
+JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")
+JMESSAGE(JERR_XMS_READ, "Read from XMS failed")
+JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")
+JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)
+JMESSAGE(JMSG_VERSION, JVERSION)
+JMESSAGE(JTRC_16BIT_TABLES,
+         "Caution: quantization tables are too coarse for baseline JPEG")
+JMESSAGE(JTRC_ADOBE,
+         "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")
+JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")
+JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")
+JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")
+JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")
+JMESSAGE(JTRC_DQT, "Define Quantization Table %d  precision %d")
+JMESSAGE(JTRC_DRI, "Define Restart Interval %u")
+JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")
+JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")
+JMESSAGE(JTRC_EOI, "End Of Image")
+JMESSAGE(JTRC_HUFFBITS, "        %3d %3d %3d %3d %3d %3d %3d %3d")
+JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d  %d")
+JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,
+         "Warning: thumbnail image size does not match data length %u")
+JMESSAGE(JTRC_JFIF_EXTENSION,
+         "JFIF extension marker: type 0x%02x, length %u")
+JMESSAGE(JTRC_JFIF_THUMBNAIL, "    with %d x %d thumbnail image")
+JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")
+JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")
+JMESSAGE(JTRC_QUANTVALS, "        %4u %4u %4u %4u %4u %4u %4u %4u")
+JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")
+JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")
+JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")
+JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")
+JMESSAGE(JTRC_RST, "RST%d")
+JMESSAGE(JTRC_SMOOTH_NOTIMPL,
+         "Smoothing not supported with nonstandard sampling ratios")
+JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")
+JMESSAGE(JTRC_SOF_COMPONENT, "    Component %d: %dhx%dv q=%d")
+JMESSAGE(JTRC_SOI, "Start of Image")
+JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")
+JMESSAGE(JTRC_SOS_COMPONENT, "    Component %d: dc=%d ac=%d")
+JMESSAGE(JTRC_SOS_PARAMS, "  Ss=%d, Se=%d, Ah=%d, Al=%d")
+JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")
+JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")
+JMESSAGE(JTRC_THUMB_JPEG,
+         "JFIF extension marker: JPEG-compressed thumbnail image, length %u")
+JMESSAGE(JTRC_THUMB_PALETTE,
+         "JFIF extension marker: palette thumbnail image, length %u")
+JMESSAGE(JTRC_THUMB_RGB,
+         "JFIF extension marker: RGB thumbnail image, length %u")
+JMESSAGE(JTRC_UNKNOWN_IDS,
+         "Unrecognized component IDs %d %d %d, assuming YCbCr")
+JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
+JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
+JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
+JMESSAGE(JWRN_BOGUS_PROGRESSION,
+         "Inconsistent progression sequence for component %d coefficient %d")
+JMESSAGE(JWRN_EXTRANEOUS_DATA,
+         "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")
+JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")
+JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")
+JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")
+JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")
+JMESSAGE(JWRN_MUST_RESYNC,
+         "Corrupt JPEG data: found marker 0x%02x instead of RST%d")
+JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")
+JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")
+
+#ifdef JMAKE_ENUM_LIST
+
+  JMSG_LASTMSGCODE
+} J_MESSAGE_CODE;
+
+#undef JMAKE_ENUM_LIST
+#endif /* JMAKE_ENUM_LIST */
+
+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
+#undef JMESSAGE
+
+
+#ifndef JERROR_H
+#define JERROR_H
+
+/* Macros to simplify using the error and trace message stuff */
+/* The first parameter is either type of cinfo pointer */
+
+/* Fatal errors (print message and exit) */
+#define ERREXIT(cinfo,code)  \
+  ((cinfo)->err->msg_code = (code), \
+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT1(cinfo,code,p1)  \
+  ((cinfo)->err->msg_code = (code), \
+   (cinfo)->err->msg_parm.i[0] = (p1), \
+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT2(cinfo,code,p1,p2)  \
+  ((cinfo)->err->msg_code = (code), \
+   (cinfo)->err->msg_parm.i[0] = (p1), \
+   (cinfo)->err->msg_parm.i[1] = (p2), \
+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT3(cinfo,code,p1,p2,p3)  \
+  ((cinfo)->err->msg_code = (code), \
+   (cinfo)->err->msg_parm.i[0] = (p1), \
+   (cinfo)->err->msg_parm.i[1] = (p2), \
+   (cinfo)->err->msg_parm.i[2] = (p3), \
+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT4(cinfo,code,p1,p2,p3,p4)  \
+  ((cinfo)->err->msg_code = (code), \
+   (cinfo)->err->msg_parm.i[0] = (p1), \
+   (cinfo)->err->msg_parm.i[1] = (p2), \
+   (cinfo)->err->msg_parm.i[2] = (p3), \
+   (cinfo)->err->msg_parm.i[3] = (p4), \
+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXITS(cinfo,code,str)  \
+  ((cinfo)->err->msg_code = (code), \
+   strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+
+#define MAKESTMT(stuff)         do { stuff } while (0)
+
+/* Nonfatal errors (we can keep going, but the data is probably corrupt) */
+#define WARNMS(cinfo,code)  \
+  ((cinfo)->err->msg_code = (code), \
+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+#define WARNMS1(cinfo,code,p1)  \
+  ((cinfo)->err->msg_code = (code), \
+   (cinfo)->err->msg_parm.i[0] = (p1), \
+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+#define WARNMS2(cinfo,code,p1,p2)  \
+  ((cinfo)->err->msg_code = (code), \
+   (cinfo)->err->msg_parm.i[0] = (p1), \
+   (cinfo)->err->msg_parm.i[1] = (p2), \
+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+
+/* Informational/debugging messages */
+#define TRACEMS(cinfo,lvl,code)  \
+  ((cinfo)->err->msg_code = (code), \
+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS1(cinfo,lvl,code,p1)  \
+  ((cinfo)->err->msg_code = (code), \
+   (cinfo)->err->msg_parm.i[0] = (p1), \
+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS2(cinfo,lvl,code,p1,p2)  \
+  ((cinfo)->err->msg_code = (code), \
+   (cinfo)->err->msg_parm.i[0] = (p1), \
+   (cinfo)->err->msg_parm.i[1] = (p2), \
+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS3(cinfo,lvl,code,p1,p2,p3)  \
+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+           _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \
+           (cinfo)->err->msg_code = (code); \
+           (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4)  \
+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+           _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+           (cinfo)->err->msg_code = (code); \
+           (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5)  \
+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+           _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+           _mp[4] = (p5); \
+           (cinfo)->err->msg_code = (code); \
+           (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8)  \
+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+           _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+           _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \
+           (cinfo)->err->msg_code = (code); \
+           (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMSS(cinfo,lvl,code,str)  \
+  ((cinfo)->err->msg_code = (code), \
+   strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+
+#endif /* JERROR_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jfdctflt.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,172 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jfdctflt.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a floating-point implementation of the
+ * forward DCT (Discrete Cosine Transform).
+ *
+ * This implementation should be more accurate than either of the integer
+ * DCT implementations.  However, it may not give the same results on all
+ * machines because of differences in roundoff behavior.  Speed will depend
+ * on the hardware's floating point capacity.
+ *
+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
+ * on each column.  Direct algorithms are also available, but they are
+ * much more complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for
+ * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell
+ * JPEG textbook (see REFERENCES section in file README).  The following code
+ * is based directly on figure 4-8 in P&M.
+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is
+ * possible to arrange the computation so that many of the multiplies are
+ * simple scalings of the final outputs.  These multiplies can then be
+ * folded into the multiplications or divisions by the JPEG quantization
+ * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
+ * to be done in the DCT itself.
+ * The primary disadvantage of this method is that with a fixed-point
+ * implementation, accuracy is lost due to imprecise representation of the
+ * scaled quantization values.  However, that problem does not arise if
+ * we use floating point arithmetic.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+#ifdef DCT_FLOAT_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/*
+ * Perform the forward DCT on one block of samples.
+ */
+
+GLOBAL(void)
+jpeg_fdct_float (FAST_FLOAT * data)
+{
+  FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+  FAST_FLOAT tmp10, tmp11, tmp12, tmp13;
+  FAST_FLOAT z1, z2, z3, z4, z5, z11, z13;
+  FAST_FLOAT *dataptr;
+  int ctr;
+
+  /* Pass 1: process rows. */
+
+  dataptr = data;
+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+    tmp0 = dataptr[0] + dataptr[7];
+    tmp7 = dataptr[0] - dataptr[7];
+    tmp1 = dataptr[1] + dataptr[6];
+    tmp6 = dataptr[1] - dataptr[6];
+    tmp2 = dataptr[2] + dataptr[5];
+    tmp5 = dataptr[2] - dataptr[5];
+    tmp3 = dataptr[3] + dataptr[4];
+    tmp4 = dataptr[3] - dataptr[4];
+
+    /* Even part */
+
+    tmp10 = tmp0 + tmp3;        /* phase 2 */
+    tmp13 = tmp0 - tmp3;
+    tmp11 = tmp1 + tmp2;
+    tmp12 = tmp1 - tmp2;
+
+    dataptr[0] = tmp10 + tmp11; /* phase 3 */
+    dataptr[4] = tmp10 - tmp11;
+
+    z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */
+    dataptr[2] = tmp13 + z1;    /* phase 5 */
+    dataptr[6] = tmp13 - z1;
+
+    /* Odd part */
+
+    tmp10 = tmp4 + tmp5;        /* phase 2 */
+    tmp11 = tmp5 + tmp6;
+    tmp12 = tmp6 + tmp7;
+
+    /* The rotator is modified from fig 4-8 to avoid extra negations. */
+    z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */
+    z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */
+    z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */
+    z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */
+
+    z11 = tmp7 + z3;            /* phase 5 */
+    z13 = tmp7 - z3;
+
+    dataptr[5] = z13 + z2;      /* phase 6 */
+    dataptr[3] = z13 - z2;
+    dataptr[1] = z11 + z4;
+    dataptr[7] = z11 - z4;
+
+    dataptr += DCTSIZE;         /* advance pointer to next row */
+  }
+
+  /* Pass 2: process columns. */
+
+  dataptr = data;
+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
+    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
+    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
+    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
+    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
+    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
+    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
+    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
+
+    /* Even part */
+
+    tmp10 = tmp0 + tmp3;        /* phase 2 */
+    tmp13 = tmp0 - tmp3;
+    tmp11 = tmp1 + tmp2;
+    tmp12 = tmp1 - tmp2;
+
+    dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
+    dataptr[DCTSIZE*4] = tmp10 - tmp11;
+
+    z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */
+    dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
+    dataptr[DCTSIZE*6] = tmp13 - z1;
+
+    /* Odd part */
+
+    tmp10 = tmp4 + tmp5;        /* phase 2 */
+    tmp11 = tmp5 + tmp6;
+    tmp12 = tmp6 + tmp7;
+
+    /* The rotator is modified from fig 4-8 to avoid extra negations. */
+    z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */
+    z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */
+    z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */
+    z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */
+
+    z11 = tmp7 + z3;            /* phase 5 */
+    z13 = tmp7 - z3;
+
+    dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
+    dataptr[DCTSIZE*3] = z13 - z2;
+    dataptr[DCTSIZE*1] = z11 + z4;
+    dataptr[DCTSIZE*7] = z11 - z4;
+
+    dataptr++;                  /* advance pointer to next column */
+  }
+}
+
+#endif /* DCT_FLOAT_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jfdctfst.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,228 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jfdctfst.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a fast, not so accurate integer implementation of the
+ * forward DCT (Discrete Cosine Transform).
+ *
+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
+ * on each column.  Direct algorithms are also available, but they are
+ * much more complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for
+ * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell
+ * JPEG textbook (see REFERENCES section in file README).  The following code
+ * is based directly on figure 4-8 in P&M.
+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is
+ * possible to arrange the computation so that many of the multiplies are
+ * simple scalings of the final outputs.  These multiplies can then be
+ * folded into the multiplications or divisions by the JPEG quantization
+ * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
+ * to be done in the DCT itself.
+ * The primary disadvantage of this method is that with fixed-point math,
+ * accuracy is lost due to imprecise representation of the scaled
+ * quantization values.  The smaller the quantization table entry, the less
+ * precise the scaled value, so this implementation does worse with high-
+ * quality-setting files than with low-quality ones.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+#ifdef DCT_IFAST_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling decisions are generally the same as in the LL&M algorithm;
+ * see jfdctint.c for more details.  However, we choose to descale
+ * (right shift) multiplication products as soon as they are formed,
+ * rather than carrying additional fractional bits into subsequent additions.
+ * This compromises accuracy slightly, but it lets us save a few shifts.
+ * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
+ * everywhere except in the multiplications proper; this saves a good deal
+ * of work on 16-bit-int machines.
+ *
+ * Again to save a few shifts, the intermediate results between pass 1 and
+ * pass 2 are not upscaled, but are represented only to integral precision.
+ *
+ * A final compromise is to represent the multiplicative constants to only
+ * 8 fractional bits, rather than 13.  This saves some shifting work on some
+ * machines, and may also reduce the cost of multiplication (since there
+ * are fewer one-bits in the constants).
+ */
+
+#define CONST_BITS  8
+
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 8
+#define FIX_0_382683433  ((INT32)   98)         /* FIX(0.382683433) */
+#define FIX_0_541196100  ((INT32)  139)         /* FIX(0.541196100) */
+#define FIX_0_707106781  ((INT32)  181)         /* FIX(0.707106781) */
+#define FIX_1_306562965  ((INT32)  334)         /* FIX(1.306562965) */
+#else
+#define FIX_0_382683433  FIX(0.382683433)
+#define FIX_0_541196100  FIX(0.541196100)
+#define FIX_0_707106781  FIX(0.707106781)
+#define FIX_1_306562965  FIX(1.306562965)
+#endif
+
+
+/* We can gain a little more speed, with a further compromise in accuracy,
+ * by omitting the addition in a descaling shift.  This yields an incorrectly
+ * rounded result half the time...
+ */
+
+#ifndef USE_ACCURATE_ROUNDING
+#undef DESCALE
+#define DESCALE(x,n)  RIGHT_SHIFT(x, n)
+#endif
+
+
+/* Multiply a DCTELEM variable by an INT32 constant, and immediately
+ * descale to yield a DCTELEM result.
+ */
+
+#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
+
+
+/*
+ * Perform the forward DCT on one block of samples.
+ */
+
+GLOBAL(void)
+jpeg_fdct_ifast (DCTELEM * data)
+{
+  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+  DCTELEM tmp10, tmp11, tmp12, tmp13;
+  DCTELEM z1, z2, z3, z4, z5, z11, z13;
+  DCTELEM *dataptr;
+  int ctr;
+  SHIFT_TEMPS
+
+  /* Pass 1: process rows. */
+
+  dataptr = data;
+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+    tmp0 = dataptr[0] + dataptr[7];
+    tmp7 = dataptr[0] - dataptr[7];
+    tmp1 = dataptr[1] + dataptr[6];
+    tmp6 = dataptr[1] - dataptr[6];
+    tmp2 = dataptr[2] + dataptr[5];
+    tmp5 = dataptr[2] - dataptr[5];
+    tmp3 = dataptr[3] + dataptr[4];
+    tmp4 = dataptr[3] - dataptr[4];
+
+    /* Even part */
+
+    tmp10 = tmp0 + tmp3;        /* phase 2 */
+    tmp13 = tmp0 - tmp3;
+    tmp11 = tmp1 + tmp2;
+    tmp12 = tmp1 - tmp2;
+
+    dataptr[0] = tmp10 + tmp11; /* phase 3 */
+    dataptr[4] = tmp10 - tmp11;
+
+    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
+    dataptr[2] = tmp13 + z1;    /* phase 5 */
+    dataptr[6] = tmp13 - z1;
+
+    /* Odd part */
+
+    tmp10 = tmp4 + tmp5;        /* phase 2 */
+    tmp11 = tmp5 + tmp6;
+    tmp12 = tmp6 + tmp7;
+
+    /* The rotator is modified from fig 4-8 to avoid extra negations. */
+    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
+    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
+    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
+    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
+
+    z11 = tmp7 + z3;            /* phase 5 */
+    z13 = tmp7 - z3;
+
+    dataptr[5] = z13 + z2;      /* phase 6 */
+    dataptr[3] = z13 - z2;
+    dataptr[1] = z11 + z4;
+    dataptr[7] = z11 - z4;
+
+    dataptr += DCTSIZE;         /* advance pointer to next row */
+  }
+
+  /* Pass 2: process columns. */
+
+  dataptr = data;
+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
+    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
+    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
+    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
+    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
+    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
+    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
+    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
+
+    /* Even part */
+
+    tmp10 = tmp0 + tmp3;        /* phase 2 */
+    tmp13 = tmp0 - tmp3;
+    tmp11 = tmp1 + tmp2;
+    tmp12 = tmp1 - tmp2;
+
+    dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
+    dataptr[DCTSIZE*4] = tmp10 - tmp11;
+
+    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
+    dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
+    dataptr[DCTSIZE*6] = tmp13 - z1;
+
+    /* Odd part */
+
+    tmp10 = tmp4 + tmp5;        /* phase 2 */
+    tmp11 = tmp5 + tmp6;
+    tmp12 = tmp6 + tmp7;
+
+    /* The rotator is modified from fig 4-8 to avoid extra negations. */
+    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
+    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
+    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
+    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
+
+    z11 = tmp7 + z3;            /* phase 5 */
+    z13 = tmp7 - z3;
+
+    dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
+    dataptr[DCTSIZE*3] = z13 - z2;
+    dataptr[DCTSIZE*1] = z11 + z4;
+    dataptr[DCTSIZE*7] = z11 - z4;
+
+    dataptr++;                  /* advance pointer to next column */
+  }
+}
+
+#endif /* DCT_IFAST_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jfdctint.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,287 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jfdctint.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a slow-but-accurate integer implementation of the
+ * forward DCT (Discrete Cosine Transform).
+ *
+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
+ * on each column.  Direct algorithms are also available, but they are
+ * much more complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on an algorithm described in
+ *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
+ *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
+ *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
+ * The primary algorithm described there uses 11 multiplies and 29 adds.
+ * We use their alternate method with 12 multiplies and 32 adds.
+ * The advantage of this method is that no data path contains more than one
+ * multiplication; this allows a very simple and accurate implementation in
+ * scaled fixed-point arithmetic, with a minimal number of shifts.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+#ifdef DCT_ISLOW_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/*
+ * The poop on this scaling stuff is as follows:
+ *
+ * Each 1-D DCT step produces outputs which are a factor of sqrt(N)
+ * larger than the true DCT outputs.  The final outputs are therefore
+ * a factor of N larger than desired; since N=8 this can be cured by
+ * a simple right shift at the end of the algorithm.  The advantage of
+ * this arrangement is that we save two multiplications per 1-D DCT,
+ * because the y0 and y4 outputs need not be divided by sqrt(N).
+ * In the IJG code, this factor of 8 is removed by the quantization step
+ * (in jcdctmgr.c), NOT in this module.
+ *
+ * We have to do addition and subtraction of the integer inputs, which
+ * is no problem, and multiplication by fractional constants, which is
+ * a problem to do in integer arithmetic.  We multiply all the constants
+ * by CONST_SCALE and convert them to integer constants (thus retaining
+ * CONST_BITS bits of precision in the constants).  After doing a
+ * multiplication we have to divide the product by CONST_SCALE, with proper
+ * rounding, to produce the correct output.  This division can be done
+ * cheaply as a right shift of CONST_BITS bits.  We postpone shifting
+ * as long as possible so that partial sums can be added together with
+ * full fractional precision.
+ *
+ * The outputs of the first pass are scaled up by PASS1_BITS bits so that
+ * they are represented to better-than-integral precision.  These outputs
+ * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
+ * with the recommended scaling.  (For 12-bit sample data, the intermediate
+ * array is INT32 anyway.)
+ *
+ * To avoid overflow of the 32-bit intermediate results in pass 2, we must
+ * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis
+ * shows that the values given below are the most effective.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS  13
+#define PASS1_BITS  2
+#else
+#define CONST_BITS  13
+#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_298631336  ((INT32)  2446)        /* FIX(0.298631336) */
+#define FIX_0_390180644  ((INT32)  3196)        /* FIX(0.390180644) */
+#define FIX_0_541196100  ((INT32)  4433)        /* FIX(0.541196100) */
+#define FIX_0_765366865  ((INT32)  6270)        /* FIX(0.765366865) */
+#define FIX_0_899976223  ((INT32)  7373)        /* FIX(0.899976223) */
+#define FIX_1_175875602  ((INT32)  9633)        /* FIX(1.175875602) */
+#define FIX_1_501321110  ((INT32)  12299)       /* FIX(1.501321110) */
+#define FIX_1_847759065  ((INT32)  15137)       /* FIX(1.847759065) */
+#define FIX_1_961570560  ((INT32)  16069)       /* FIX(1.961570560) */
+#define FIX_2_053119869  ((INT32)  16819)       /* FIX(2.053119869) */
+#define FIX_2_562915447  ((INT32)  20995)       /* FIX(2.562915447) */
+#define FIX_3_072711026  ((INT32)  25172)       /* FIX(3.072711026) */
+#else
+#define FIX_0_298631336  FIX(0.298631336)
+#define FIX_0_390180644  FIX(0.390180644)
+#define FIX_0_541196100  FIX(0.541196100)
+#define FIX_0_765366865  FIX(0.765366865)
+#define FIX_0_899976223  FIX(0.899976223)
+#define FIX_1_175875602  FIX(1.175875602)
+#define FIX_1_501321110  FIX(1.501321110)
+#define FIX_1_847759065  FIX(1.847759065)
+#define FIX_1_961570560  FIX(1.961570560)
+#define FIX_2_053119869  FIX(2.053119869)
+#define FIX_2_562915447  FIX(2.562915447)
+#define FIX_3_072711026  FIX(3.072711026)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const)  ((var) * (const))
+#endif
+
+
+/*
+ * Perform the forward DCT on one block of samples.
+ */
+
+GLOBAL(void)
+jpeg_fdct_islow (DCTELEM * data)
+{
+  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+  INT32 tmp10, tmp11, tmp12, tmp13;
+  INT32 z1, z2, z3, z4, z5;
+  DCTELEM *dataptr;
+  int ctr;
+  SHIFT_TEMPS
+
+  /* Pass 1: process rows. */
+  /* Note results are scaled up by sqrt(8) compared to a true DCT; */
+  /* furthermore, we scale the results by 2**PASS1_BITS. */
+
+  dataptr = data;
+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+    tmp0 = dataptr[0] + dataptr[7];
+    tmp7 = dataptr[0] - dataptr[7];
+    tmp1 = dataptr[1] + dataptr[6];
+    tmp6 = dataptr[1] - dataptr[6];
+    tmp2 = dataptr[2] + dataptr[5];
+    tmp5 = dataptr[2] - dataptr[5];
+    tmp3 = dataptr[3] + dataptr[4];
+    tmp4 = dataptr[3] - dataptr[4];
+
+    /* Even part per LL&M figure 1 --- note that published figure is faulty;
+     * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+     */
+
+    tmp10 = tmp0 + tmp3;
+    tmp13 = tmp0 - tmp3;
+    tmp11 = tmp1 + tmp2;
+    tmp12 = tmp1 - tmp2;
+
+    dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
+    dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
+
+    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+    dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
+                                   CONST_BITS-PASS1_BITS);
+    dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
+                                   CONST_BITS-PASS1_BITS);
+
+    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
+     * cK represents cos(K*pi/16).
+     * i0..i3 in the paper are tmp4..tmp7 here.
+     */
+
+    z1 = tmp4 + tmp7;
+    z2 = tmp5 + tmp6;
+    z3 = tmp4 + tmp6;
+    z4 = tmp5 + tmp7;
+    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+    tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+    z3 += z5;
+    z4 += z5;
+
+    dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
+    dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
+    dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
+    dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
+
+    dataptr += DCTSIZE;         /* advance pointer to next row */
+  }
+
+  /* Pass 2: process columns.
+   * We remove the PASS1_BITS scaling, but leave the results scaled up
+   * by an overall factor of 8.
+   */
+
+  dataptr = data;
+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
+    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
+    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
+    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
+    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
+    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
+    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
+    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
+
+    /* Even part per LL&M figure 1 --- note that published figure is faulty;
+     * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+     */
+
+    tmp10 = tmp0 + tmp3;
+    tmp13 = tmp0 - tmp3;
+    tmp11 = tmp1 + tmp2;
+    tmp12 = tmp1 - tmp2;
+
+    dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
+    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
+
+    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
+                                           CONST_BITS+PASS1_BITS);
+    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
+                                           CONST_BITS+PASS1_BITS);
+
+    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
+     * cK represents cos(K*pi/16).
+     * i0..i3 in the paper are tmp4..tmp7 here.
+     */
+
+    z1 = tmp4 + tmp7;
+    z2 = tmp5 + tmp6;
+    z3 = tmp4 + tmp6;
+    z4 = tmp5 + tmp7;
+    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+    tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+    z3 += z5;
+    z4 += z5;
+
+    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
+                                           CONST_BITS+PASS1_BITS);
+    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
+                                           CONST_BITS+PASS1_BITS);
+    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
+                                           CONST_BITS+PASS1_BITS);
+    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
+                                           CONST_BITS+PASS1_BITS);
+
+    dataptr++;                  /* advance pointer to next column */
+  }
+}
+
+#endif /* DCT_ISLOW_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jidctflt.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,246 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jidctflt.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a floating-point implementation of the
+ * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine
+ * must also perform dequantization of the input coefficients.
+ *
+ * This implementation should be more accurate than either of the integer
+ * IDCT implementations.  However, it may not give the same results on all
+ * machines because of differences in roundoff behavior.  Speed will depend
+ * on the hardware's floating point capacity.
+ *
+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
+ * on each row (or vice versa, but it's more convenient to emit a row at
+ * a time).  Direct algorithms are also available, but they are much more
+ * complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for
+ * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell
+ * JPEG textbook (see REFERENCES section in file README).  The following code
+ * is based directly on figure 4-8 in P&M.
+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is
+ * possible to arrange the computation so that many of the multiplies are
+ * simple scalings of the final outputs.  These multiplies can then be
+ * folded into the multiplications or divisions by the JPEG quantization
+ * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
+ * to be done in the DCT itself.
+ * The primary disadvantage of this method is that with a fixed-point
+ * implementation, accuracy is lost due to imprecise representation of the
+ * scaled quantization values.  However, that problem does not arise if
+ * we use floating point arithmetic.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+#ifdef DCT_FLOAT_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce a float result.
+ */
+
+#define DEQUANTIZE(coef,quantval)  (((FAST_FLOAT) (coef)) * (quantval))
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients.
+ */
+
+GLOBAL(void)
+jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+                 JCOEFPTR coef_block,
+                 JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+  FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+  FAST_FLOAT tmp10, tmp11, tmp12, tmp13;
+  FAST_FLOAT z5, z10, z11, z12, z13;
+  JCOEFPTR inptr;
+  FLOAT_MULT_TYPE * quantptr;
+  FAST_FLOAT * wsptr;
+  JSAMPROW outptr;
+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+  int ctr;
+  FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */
+  SHIFT_TEMPS
+
+  /* Pass 1: process columns from input, store into work array. */
+
+  inptr = coef_block;
+  quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table;
+  wsptr = workspace;
+  for (ctr = DCTSIZE; ctr > 0; ctr--) {
+    /* Due to quantization, we will usually find that many of the input
+     * coefficients are zero, especially the AC terms.  We can exploit this
+     * by short-circuiting the IDCT calculation for any column in which all
+     * the AC terms are zero.  In that case each output is equal to the
+     * DC coefficient (with scale factor as needed).
+     * With typical images and quantization tables, half or more of the
+     * column DCT calculations can be simplified this way.
+     */
+
+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+        inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
+        inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
+        inptr[DCTSIZE*7] == 0) {
+      /* AC terms all zero */
+      FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+
+      wsptr[DCTSIZE*0] = dcval;
+      wsptr[DCTSIZE*1] = dcval;
+      wsptr[DCTSIZE*2] = dcval;
+      wsptr[DCTSIZE*3] = dcval;
+      wsptr[DCTSIZE*4] = dcval;
+      wsptr[DCTSIZE*5] = dcval;
+      wsptr[DCTSIZE*6] = dcval;
+      wsptr[DCTSIZE*7] = dcval;
+
+      inptr++;                  /* advance pointers to next column */
+      quantptr++;
+      wsptr++;
+      continue;
+    }
+
+    /* Even part */
+
+    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+    tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
+    tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+    tmp10 = tmp0 + tmp2;        /* phase 3 */
+    tmp11 = tmp0 - tmp2;
+
+    tmp13 = tmp1 + tmp3;        /* phases 5-3 */
+    tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */
+
+    tmp0 = tmp10 + tmp13;       /* phase 2 */
+    tmp3 = tmp10 - tmp13;
+    tmp1 = tmp11 + tmp12;
+    tmp2 = tmp11 - tmp12;
+
+    /* Odd part */
+
+    tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+    tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+    tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+    tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+
+    z13 = tmp6 + tmp5;          /* phase 6 */
+    z10 = tmp6 - tmp5;
+    z11 = tmp4 + tmp7;
+    z12 = tmp4 - tmp7;
+
+    tmp7 = z11 + z13;           /* phase 5 */
+    tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */
+
+    z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */
+    tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */
+    tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */
+
+    tmp6 = tmp12 - tmp7;        /* phase 2 */
+    tmp5 = tmp11 - tmp6;
+    tmp4 = tmp10 + tmp5;
+
+    wsptr[DCTSIZE*0] = tmp0 + tmp7;
+    wsptr[DCTSIZE*7] = tmp0 - tmp7;
+    wsptr[DCTSIZE*1] = tmp1 + tmp6;
+    wsptr[DCTSIZE*6] = tmp1 - tmp6;
+    wsptr[DCTSIZE*2] = tmp2 + tmp5;
+    wsptr[DCTSIZE*5] = tmp2 - tmp5;
+    wsptr[DCTSIZE*4] = tmp3 + tmp4;
+    wsptr[DCTSIZE*3] = tmp3 - tmp4;
+
+    inptr++;                    /* advance pointers to next column */
+    quantptr++;
+    wsptr++;
+  }
+
+  /* Pass 2: process rows from work array, store into output array. */
+  /* Note that we must descale the results by a factor of 8 == 2**3. */
+
+  wsptr = workspace;
+  for (ctr = 0; ctr < DCTSIZE; ctr++) {
+    outptr = output_buf[ctr] + output_col;
+    /* Rows of zeroes can be exploited in the same way as we did with columns.
+     * However, the column calculation has created many nonzero AC terms, so
+     * the simplification applies less often (typically 5% to 10% of the time).
+     * And testing floats for zero is relatively expensive, so we don't bother.
+     */
+
+    /* Even part */
+
+    tmp10 = wsptr[0] + wsptr[4];
+    tmp11 = wsptr[0] - wsptr[4];
+
+    tmp13 = wsptr[2] + wsptr[6];
+    tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13;
+
+    tmp0 = tmp10 + tmp13;
+    tmp3 = tmp10 - tmp13;
+    tmp1 = tmp11 + tmp12;
+    tmp2 = tmp11 - tmp12;
+
+    /* Odd part */
+
+    z13 = wsptr[5] + wsptr[3];
+    z10 = wsptr[5] - wsptr[3];
+    z11 = wsptr[1] + wsptr[7];
+    z12 = wsptr[1] - wsptr[7];
+
+    tmp7 = z11 + z13;
+    tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562);
+
+    z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */
+    tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */
+    tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */
+
+    tmp6 = tmp12 - tmp7;
+    tmp5 = tmp11 - tmp6;
+    tmp4 = tmp10 + tmp5;
+
+    /* Final output stage: scale down by a factor of 8 and range-limit */
+
+    outptr[0] = range_limit[(int) DESCALE((INT32) (tmp0 + tmp7), 3)
+                            & RANGE_MASK];
+    outptr[7] = range_limit[(int) DESCALE((INT32) (tmp0 - tmp7), 3)
+                            & RANGE_MASK];
+    outptr[1] = range_limit[(int) DESCALE((INT32) (tmp1 + tmp6), 3)
+                            & RANGE_MASK];
+    outptr[6] = range_limit[(int) DESCALE((INT32) (tmp1 - tmp6), 3)
+                            & RANGE_MASK];
+    outptr[2] = range_limit[(int) DESCALE((INT32) (tmp2 + tmp5), 3)
+                            & RANGE_MASK];
+    outptr[5] = range_limit[(int) DESCALE((INT32) (tmp2 - tmp5), 3)
+                            & RANGE_MASK];
+    outptr[4] = range_limit[(int) DESCALE((INT32) (tmp3 + tmp4), 3)
+                            & RANGE_MASK];
+    outptr[3] = range_limit[(int) DESCALE((INT32) (tmp3 - tmp4), 3)
+                            & RANGE_MASK];
+
+    wsptr += DCTSIZE;           /* advance pointer to next row */
+  }
+}
+
+#endif /* DCT_FLOAT_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jidctfst.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,372 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jidctfst.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a fast, not so accurate integer implementation of the
+ * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine
+ * must also perform dequantization of the input coefficients.
+ *
+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
+ * on each row (or vice versa, but it's more convenient to emit a row at
+ * a time).  Direct algorithms are also available, but they are much more
+ * complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for
+ * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell
+ * JPEG textbook (see REFERENCES section in file README).  The following code
+ * is based directly on figure 4-8 in P&M.
+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is
+ * possible to arrange the computation so that many of the multiplies are
+ * simple scalings of the final outputs.  These multiplies can then be
+ * folded into the multiplications or divisions by the JPEG quantization
+ * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
+ * to be done in the DCT itself.
+ * The primary disadvantage of this method is that with fixed-point math,
+ * accuracy is lost due to imprecise representation of the scaled
+ * quantization values.  The smaller the quantization table entry, the less
+ * precise the scaled value, so this implementation does worse with high-
+ * quality-setting files than with low-quality ones.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+#ifdef DCT_IFAST_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling decisions are generally the same as in the LL&M algorithm;
+ * see jidctint.c for more details.  However, we choose to descale
+ * (right shift) multiplication products as soon as they are formed,
+ * rather than carrying additional fractional bits into subsequent additions.
+ * This compromises accuracy slightly, but it lets us save a few shifts.
+ * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
+ * everywhere except in the multiplications proper; this saves a good deal
+ * of work on 16-bit-int machines.
+ *
+ * The dequantized coefficients are not integers because the AA&N scaling
+ * factors have been incorporated.  We represent them scaled up by PASS1_BITS,
+ * so that the first and second IDCT rounds have the same input scaling.
+ * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to
+ * avoid a descaling shift; this compromises accuracy rather drastically
+ * for small quantization table entries, but it saves a lot of shifts.
+ * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway,
+ * so we use a much larger scaling factor to preserve accuracy.
+ *
+ * A final compromise is to represent the multiplicative constants to only
+ * 8 fractional bits, rather than 13.  This saves some shifting work on some
+ * machines, and may also reduce the cost of multiplication (since there
+ * are fewer one-bits in the constants).
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS  8
+#define PASS1_BITS  2
+#else
+#define CONST_BITS  8
+#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 8
+#define FIX_1_082392200  ((INT32)  277)         /* FIX(1.082392200) */
+#define FIX_1_414213562  ((INT32)  362)         /* FIX(1.414213562) */
+#define FIX_1_847759065  ((INT32)  473)         /* FIX(1.847759065) */
+#define FIX_2_613125930  ((INT32)  669)         /* FIX(2.613125930) */
+#else
+#define FIX_1_082392200  FIX(1.082392200)
+#define FIX_1_414213562  FIX(1.414213562)
+#define FIX_1_847759065  FIX(1.847759065)
+#define FIX_2_613125930  FIX(2.613125930)
+#endif
+
+
+/* We can gain a little more speed, with a further compromise in accuracy,
+ * by omitting the addition in a descaling shift.  This yields an incorrectly
+ * rounded result half the time...
+ */
+
+#ifndef USE_ACCURATE_ROUNDING
+#undef DESCALE
+#define DESCALE(x,n)  RIGHT_SHIFT(x, n)
+#endif
+
+
+/* Multiply a DCTELEM variable by an INT32 constant, and immediately
+ * descale to yield a DCTELEM result.
+ */
+
+#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce a DCTELEM result.  For 8-bit data a 16x16->16
+ * multiplication will do.  For 12-bit data, the multiplier table is
+ * declared INT32, so a 32-bit multiply will be used.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define DEQUANTIZE(coef,quantval)  (((IFAST_MULT_TYPE) (coef)) * (quantval))
+#else
+#define DEQUANTIZE(coef,quantval)  \
+        DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS)
+#endif
+
+
+/* Like DESCALE, but applies to a DCTELEM and produces an int.
+ * We assume that int right shift is unsigned if INT32 right shift is.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define ISHIFT_TEMPS    DCTELEM ishift_temp;
+#if BITS_IN_JSAMPLE == 8
+#define DCTELEMBITS  16         /* DCTELEM may be 16 or 32 bits */
+#else
+#define DCTELEMBITS  32         /* DCTELEM must be 32 bits */
+#endif
+#define IRIGHT_SHIFT(x,shft)  \
+    ((ishift_temp = (x)) < 0 ? \
+     (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \
+     (ishift_temp >> (shft)))
+#else
+#define ISHIFT_TEMPS
+#define IRIGHT_SHIFT(x,shft)    ((x) >> (shft))
+#endif
+
+#ifdef USE_ACCURATE_ROUNDING
+#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))
+#else
+#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT(x, n))
+#endif
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients.
+ */
+
+GLOBAL(void)
+jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+                 JCOEFPTR coef_block,
+                 JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+  DCTELEM tmp10, tmp11, tmp12, tmp13;
+  DCTELEM z5, z10, z11, z12, z13;
+  JCOEFPTR inptr;
+  IFAST_MULT_TYPE * quantptr;
+  int * wsptr;
+  JSAMPROW outptr;
+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+  int ctr;
+  int workspace[DCTSIZE2];      /* buffers data between passes */
+  SHIFT_TEMPS                   /* for DESCALE */
+  ISHIFT_TEMPS                  /* for IDESCALE */
+
+  /* Pass 1: process columns from input, store into work array. */
+
+  inptr = coef_block;
+  quantptr = (IFAST_MULT_TYPE *) compptr->dct_table;
+  wsptr = workspace;
+  for (ctr = DCTSIZE; ctr > 0; ctr--) {
+    /* Due to quantization, we will usually find that many of the input
+     * coefficients are zero, especially the AC terms.  We can exploit this
+     * by short-circuiting the IDCT calculation for any column in which all
+     * the AC terms are zero.  In that case each output is equal to the
+     * DC coefficient (with scale factor as needed).
+     * With typical images and quantization tables, half or more of the
+     * column DCT calculations can be simplified this way.
+     */
+
+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+        inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
+        inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
+        inptr[DCTSIZE*7] == 0) {
+      /* AC terms all zero */
+      int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+
+      wsptr[DCTSIZE*0] = dcval;
+      wsptr[DCTSIZE*1] = dcval;
+      wsptr[DCTSIZE*2] = dcval;
+      wsptr[DCTSIZE*3] = dcval;
+      wsptr[DCTSIZE*4] = dcval;
+      wsptr[DCTSIZE*5] = dcval;
+      wsptr[DCTSIZE*6] = dcval;
+      wsptr[DCTSIZE*7] = dcval;
+
+      inptr++;                  /* advance pointers to next column */
+      quantptr++;
+      wsptr++;
+      continue;
+    }
+
+    /* Even part */
+
+    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+    tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
+    tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+    tmp10 = tmp0 + tmp2;        /* phase 3 */
+    tmp11 = tmp0 - tmp2;
+
+    tmp13 = tmp1 + tmp3;        /* phases 5-3 */
+    tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */
+
+    tmp0 = tmp10 + tmp13;       /* phase 2 */
+    tmp3 = tmp10 - tmp13;
+    tmp1 = tmp11 + tmp12;
+    tmp2 = tmp11 - tmp12;
+
+    /* Odd part */
+
+    tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+    tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+    tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+    tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+
+    z13 = tmp6 + tmp5;          /* phase 6 */
+    z10 = tmp6 - tmp5;
+    z11 = tmp4 + tmp7;
+    z12 = tmp4 - tmp7;
+
+    tmp7 = z11 + z13;           /* phase 5 */
+    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
+
+    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
+    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
+    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
+
+    tmp6 = tmp12 - tmp7;        /* phase 2 */
+    tmp5 = tmp11 - tmp6;
+    tmp4 = tmp10 + tmp5;
+
+    wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);
+    wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);
+    wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);
+    wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);
+    wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);
+    wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);
+    wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);
+    wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);
+
+    inptr++;                    /* advance pointers to next column */
+    quantptr++;
+    wsptr++;
+  }
+
+  /* Pass 2: process rows from work array, store into output array. */
+  /* Note that we must descale the results by a factor of 8 == 2**3, */
+  /* and also undo the PASS1_BITS scaling. */
+
+  wsptr = workspace;
+  for (ctr = 0; ctr < DCTSIZE; ctr++) {
+    outptr = output_buf[ctr] + output_col;
+    /* Rows of zeroes can be exploited in the same way as we did with columns.
+     * However, the column calculation has created many nonzero AC terms, so
+     * the simplification applies less often (typically 5% to 10% of the time).
+     * On machines with very fast multiplication, it's possible that the
+     * test takes more time than it's worth.  In that case this section
+     * may be commented out.
+     */
+
+#ifndef NO_ZERO_ROW_TEST
+    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
+        wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+      /* AC terms all zero */
+      JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)
+                                  & RANGE_MASK];
+
+      outptr[0] = dcval;
+      outptr[1] = dcval;
+      outptr[2] = dcval;
+      outptr[3] = dcval;
+      outptr[4] = dcval;
+      outptr[5] = dcval;
+      outptr[6] = dcval;
+      outptr[7] = dcval;
+
+      wsptr += DCTSIZE;         /* advance pointer to next row */
+      continue;
+    }
+#endif
+
+    /* Even part */
+
+    tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
+    tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
+
+    tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
+    tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)
+            - tmp13;
+
+    tmp0 = tmp10 + tmp13;
+    tmp3 = tmp10 - tmp13;
+    tmp1 = tmp11 + tmp12;
+    tmp2 = tmp11 - tmp12;
+
+    /* Odd part */
+
+    z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];
+    z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];
+    z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];
+    z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];
+
+    tmp7 = z11 + z13;           /* phase 5 */
+    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
+
+    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
+    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
+    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
+
+    tmp6 = tmp12 - tmp7;        /* phase 2 */
+    tmp5 = tmp11 - tmp6;
+    tmp4 = tmp10 + tmp5;
+
+    /* Final output stage: scale down by a factor of 8 and range-limit */
+
+    outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
+                            & RANGE_MASK];
+
+    wsptr += DCTSIZE;           /* advance pointer to next row */
+  }
+}
+
+#endif /* DCT_IFAST_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jidctint.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,393 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jidctint.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a slow-but-accurate integer implementation of the
+ * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine
+ * must also perform dequantization of the input coefficients.
+ *
+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
+ * on each row (or vice versa, but it's more convenient to emit a row at
+ * a time).  Direct algorithms are also available, but they are much more
+ * complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on an algorithm described in
+ *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
+ *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
+ *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
+ * The primary algorithm described there uses 11 multiplies and 29 adds.
+ * We use their alternate method with 12 multiplies and 32 adds.
+ * The advantage of this method is that no data path contains more than one
+ * multiplication; this allows a very simple and accurate implementation in
+ * scaled fixed-point arithmetic, with a minimal number of shifts.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+#ifdef DCT_ISLOW_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/*
+ * The poop on this scaling stuff is as follows:
+ *
+ * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
+ * larger than the true IDCT outputs.  The final outputs are therefore
+ * a factor of N larger than desired; since N=8 this can be cured by
+ * a simple right shift at the end of the algorithm.  The advantage of
+ * this arrangement is that we save two multiplications per 1-D IDCT,
+ * because the y0 and y4 inputs need not be divided by sqrt(N).
+ *
+ * We have to do addition and subtraction of the integer inputs, which
+ * is no problem, and multiplication by fractional constants, which is
+ * a problem to do in integer arithmetic.  We multiply all the constants
+ * by CONST_SCALE and convert them to integer constants (thus retaining
+ * CONST_BITS bits of precision in the constants).  After doing a
+ * multiplication we have to divide the product by CONST_SCALE, with proper
+ * rounding, to produce the correct output.  This division can be done
+ * cheaply as a right shift of CONST_BITS bits.  We postpone shifting
+ * as long as possible so that partial sums can be added together with
+ * full fractional precision.
+ *
+ * The outputs of the first pass are scaled up by PASS1_BITS bits so that
+ * they are represented to better-than-integral precision.  These outputs
+ * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
+ * with the recommended scaling.  (To scale up 12-bit sample data further, an
+ * intermediate INT32 array would be needed.)
+ *
+ * To avoid overflow of the 32-bit intermediate results in pass 2, we must
+ * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis
+ * shows that the values given below are the most effective.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS  13
+#define PASS1_BITS  2
+#else
+#define CONST_BITS  13
+#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_298631336  ((INT32)  2446)        /* FIX(0.298631336) */
+#define FIX_0_390180644  ((INT32)  3196)        /* FIX(0.390180644) */
+#define FIX_0_541196100  ((INT32)  4433)        /* FIX(0.541196100) */
+#define FIX_0_765366865  ((INT32)  6270)        /* FIX(0.765366865) */
+#define FIX_0_899976223  ((INT32)  7373)        /* FIX(0.899976223) */
+#define FIX_1_175875602  ((INT32)  9633)        /* FIX(1.175875602) */
+#define FIX_1_501321110  ((INT32)  12299)       /* FIX(1.501321110) */
+#define FIX_1_847759065  ((INT32)  15137)       /* FIX(1.847759065) */
+#define FIX_1_961570560  ((INT32)  16069)       /* FIX(1.961570560) */
+#define FIX_2_053119869  ((INT32)  16819)       /* FIX(2.053119869) */
+#define FIX_2_562915447  ((INT32)  20995)       /* FIX(2.562915447) */
+#define FIX_3_072711026  ((INT32)  25172)       /* FIX(3.072711026) */
+#else
+#define FIX_0_298631336  FIX(0.298631336)
+#define FIX_0_390180644  FIX(0.390180644)
+#define FIX_0_541196100  FIX(0.541196100)
+#define FIX_0_765366865  FIX(0.765366865)
+#define FIX_0_899976223  FIX(0.899976223)
+#define FIX_1_175875602  FIX(1.175875602)
+#define FIX_1_501321110  FIX(1.501321110)
+#define FIX_1_847759065  FIX(1.847759065)
+#define FIX_1_961570560  FIX(1.961570560)
+#define FIX_2_053119869  FIX(2.053119869)
+#define FIX_2_562915447  FIX(2.562915447)
+#define FIX_3_072711026  FIX(3.072711026)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const)  ((var) * (const))
+#endif
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce an int result.  In this module, both inputs and result
+ * are 16 bits or less, so either int or short multiply will work.
+ */
+
+#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients.
+ */
+
+GLOBAL(void)
+jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+                 JCOEFPTR coef_block,
+                 JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+  INT32 tmp0, tmp1, tmp2, tmp3;
+  INT32 tmp10, tmp11, tmp12, tmp13;
+  INT32 z1, z2, z3, z4, z5;
+  JCOEFPTR inptr;
+  ISLOW_MULT_TYPE * quantptr;
+  int * wsptr;
+  JSAMPROW outptr;
+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+  int ctr;
+  int workspace[DCTSIZE2];      /* buffers data between passes */
+  SHIFT_TEMPS
+
+  /* Pass 1: process columns from input, store into work array. */
+  /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
+  /* furthermore, we scale the results by 2**PASS1_BITS. */
+
+  inptr = coef_block;
+  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+  wsptr = workspace;
+  for (ctr = DCTSIZE; ctr > 0; ctr--) {
+    /* Due to quantization, we will usually find that many of the input
+     * coefficients are zero, especially the AC terms.  We can exploit this
+     * by short-circuiting the IDCT calculation for any column in which all
+     * the AC terms are zero.  In that case each output is equal to the
+     * DC coefficient (with scale factor as needed).
+     * With typical images and quantization tables, half or more of the
+     * column DCT calculations can be simplified this way.
+     */
+
+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+        inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
+        inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
+        inptr[DCTSIZE*7] == 0) {
+      /* AC terms all zero */
+      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+      wsptr[DCTSIZE*0] = dcval;
+      wsptr[DCTSIZE*1] = dcval;
+      wsptr[DCTSIZE*2] = dcval;
+      wsptr[DCTSIZE*3] = dcval;
+      wsptr[DCTSIZE*4] = dcval;
+      wsptr[DCTSIZE*5] = dcval;
+      wsptr[DCTSIZE*6] = dcval;
+      wsptr[DCTSIZE*7] = dcval;
+
+      inptr++;                  /* advance pointers to next column */
+      quantptr++;
+      wsptr++;
+      continue;
+    }
+
+    /* Even part: reverse the even part of the forward DCT. */
+    /* The rotator is sqrt(2)*c(-6). */
+
+    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
+    tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
+    tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
+
+    z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
+
+    tmp0 = (z2 + z3) << CONST_BITS;
+    tmp1 = (z2 - z3) << CONST_BITS;
+
+    tmp10 = tmp0 + tmp3;
+    tmp13 = tmp0 - tmp3;
+    tmp11 = tmp1 + tmp2;
+    tmp12 = tmp1 - tmp2;
+
+    /* Odd part per figure 8; the matrix is unitary and hence its
+     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
+     */
+
+    tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+    tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+    tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+    tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+
+    z1 = tmp0 + tmp3;
+    z2 = tmp1 + tmp2;
+    z3 = tmp0 + tmp2;
+    z4 = tmp1 + tmp3;
+    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+    z3 += z5;
+    z4 += z5;
+
+    tmp0 += z1 + z3;
+    tmp1 += z2 + z4;
+    tmp2 += z2 + z3;
+    tmp3 += z1 + z4;
+
+    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
+
+    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
+    wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
+    wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
+    wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
+    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
+    wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
+    wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
+    wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
+
+    inptr++;                    /* advance pointers to next column */
+    quantptr++;
+    wsptr++;
+  }
+
+  /* Pass 2: process rows from work array, store into output array. */
+  /* Note that we must descale the results by a factor of 8 == 2**3, */
+  /* and also undo the PASS1_BITS scaling. */
+
+  wsptr = workspace;
+  for (ctr = 0; ctr < DCTSIZE; ctr++) {
+    outptr = output_buf[ctr] + output_col;
+    /* Rows of zeroes can be exploited in the same way as we did with columns.
+     * However, the column calculation has created many nonzero AC terms, so
+     * the simplification applies less often (typically 5% to 10% of the time).
+     * On machines with very fast multiplication, it's possible that the
+     * test takes more time than it's worth.  In that case this section
+     * may be commented out.
+     */
+
+#ifndef NO_ZERO_ROW_TEST
+    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
+        wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+      /* AC terms all zero */
+      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+                                  & RANGE_MASK];
+
+      outptr[0] = dcval;
+      outptr[1] = dcval;
+      outptr[2] = dcval;
+      outptr[3] = dcval;
+      outptr[4] = dcval;
+      outptr[5] = dcval;
+      outptr[6] = dcval;
+      outptr[7] = dcval;
+
+      wsptr += DCTSIZE;         /* advance pointer to next row */
+      continue;
+    }
+#endif
+
+    /* Even part: reverse the even part of the forward DCT. */
+    /* The rotator is sqrt(2)*c(-6). */
+
+    z2 = (INT32) wsptr[2];
+    z3 = (INT32) wsptr[6];
+
+    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
+    tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
+    tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
+
+    tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
+    tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
+
+    tmp10 = tmp0 + tmp3;
+    tmp13 = tmp0 - tmp3;
+    tmp11 = tmp1 + tmp2;
+    tmp12 = tmp1 - tmp2;
+
+    /* Odd part per figure 8; the matrix is unitary and hence its
+     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
+     */
+
+    tmp0 = (INT32) wsptr[7];
+    tmp1 = (INT32) wsptr[5];
+    tmp2 = (INT32) wsptr[3];
+    tmp3 = (INT32) wsptr[1];
+
+    z1 = tmp0 + tmp3;
+    z2 = tmp1 + tmp2;
+    z3 = tmp0 + tmp2;
+    z4 = tmp1 + tmp3;
+    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+    z3 += z5;
+    z4 += z5;
+
+    tmp0 += z1 + z3;
+    tmp1 += z2 + z4;
+    tmp2 += z2 + z3;
+    tmp3 += z1 + z4;
+
+    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
+
+    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
+                                          CONST_BITS+PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
+                                          CONST_BITS+PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
+                                          CONST_BITS+PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
+                                          CONST_BITS+PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
+                                          CONST_BITS+PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
+                                          CONST_BITS+PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
+                                          CONST_BITS+PASS1_BITS+3)
+                            & RANGE_MASK];
+    outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
+                                          CONST_BITS+PASS1_BITS+3)
+                            & RANGE_MASK];
+
+    wsptr += DCTSIZE;           /* advance pointer to next row */
+  }
+}
+
+#endif /* DCT_ISLOW_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jidctred.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,402 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jidctred.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains inverse-DCT routines that produce reduced-size output:
+ * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.
+ *
+ * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)
+ * algorithm used in jidctint.c.  We simply replace each 8-to-8 1-D IDCT step
+ * with an 8-to-4 step that produces the four averages of two adjacent outputs
+ * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).
+ * These steps were derived by computing the corresponding values at the end
+ * of the normal LL&M code, then simplifying as much as possible.
+ *
+ * 1x1 is trivial: just take the DC coefficient divided by 8.
+ *
+ * See jidctint.c for additional comments.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h"               /* Private declarations for DCT subsystem */
+
+#ifdef IDCT_SCALING_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling is the same as in jidctint.c. */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS  13
+#define PASS1_BITS  2
+#else
+#define CONST_BITS  13
+#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_211164243  ((INT32)  1730)        /* FIX(0.211164243) */
+#define FIX_0_509795579  ((INT32)  4176)        /* FIX(0.509795579) */
+#define FIX_0_601344887  ((INT32)  4926)        /* FIX(0.601344887) */
+#define FIX_0_720959822  ((INT32)  5906)        /* FIX(0.720959822) */
+#define FIX_0_765366865  ((INT32)  6270)        /* FIX(0.765366865) */
+#define FIX_0_850430095  ((INT32)  6967)        /* FIX(0.850430095) */
+#define FIX_0_899976223  ((INT32)  7373)        /* FIX(0.899976223) */
+#define FIX_1_061594337  ((INT32)  8697)        /* FIX(1.061594337) */
+#define FIX_1_272758580  ((INT32)  10426)       /* FIX(1.272758580) */
+#define FIX_1_451774981  ((INT32)  11893)       /* FIX(1.451774981) */
+#define FIX_1_847759065  ((INT32)  15137)       /* FIX(1.847759065) */
+#define FIX_2_172734803  ((INT32)  17799)       /* FIX(2.172734803) */
+#define FIX_2_562915447  ((INT32)  20995)       /* FIX(2.562915447) */
+#define FIX_3_624509785  ((INT32)  29692)       /* FIX(3.624509785) */
+#else
+#define FIX_0_211164243  FIX(0.211164243)
+#define FIX_0_509795579  FIX(0.509795579)
+#define FIX_0_601344887  FIX(0.601344887)
+#define FIX_0_720959822  FIX(0.720959822)
+#define FIX_0_765366865  FIX(0.765366865)
+#define FIX_0_850430095  FIX(0.850430095)
+#define FIX_0_899976223  FIX(0.899976223)
+#define FIX_1_061594337  FIX(1.061594337)
+#define FIX_1_272758580  FIX(1.272758580)
+#define FIX_1_451774981  FIX(1.451774981)
+#define FIX_1_847759065  FIX(1.847759065)
+#define FIX_2_172734803  FIX(2.172734803)
+#define FIX_2_562915447  FIX(2.562915447)
+#define FIX_3_624509785  FIX(3.624509785)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const)  ((var) * (const))
+#endif
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce an int result.  In this module, both inputs and result
+ * are 16 bits or less, so either int or short multiply will work.
+ */
+
+#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 4x4 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+               JCOEFPTR coef_block,
+               JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+  INT32 tmp0, tmp2, tmp10, tmp12;
+  INT32 z1, z2, z3, z4;
+  JCOEFPTR inptr;
+  ISLOW_MULT_TYPE * quantptr;
+  int * wsptr;
+  JSAMPROW outptr;
+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+  int ctr;
+  int workspace[DCTSIZE*4];     /* buffers data between passes */
+  SHIFT_TEMPS
+
+  /* Pass 1: process columns from input, store into work array. */
+
+  inptr = coef_block;
+  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+  wsptr = workspace;
+  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
+    /* Don't bother to process column 4, because second pass won't use it */
+    if (ctr == DCTSIZE-4)
+      continue;
+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+        inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&
+        inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {
+      /* AC terms all zero; we need not examine term 4 for 4x4 output */
+      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+      wsptr[DCTSIZE*0] = dcval;
+      wsptr[DCTSIZE*1] = dcval;
+      wsptr[DCTSIZE*2] = dcval;
+      wsptr[DCTSIZE*3] = dcval;
+
+      continue;
+    }
+
+    /* Even part */
+
+    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+    tmp0 <<= (CONST_BITS+1);
+
+    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+    tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);
+
+    tmp10 = tmp0 + tmp2;
+    tmp12 = tmp0 - tmp2;
+
+    /* Odd part */
+
+    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+    z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+    z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+
+    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
+         + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
+         + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
+         + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
+
+    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
+         + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
+         + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
+         + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
+
+    /* Final output stage */
+
+    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);
+    wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);
+    wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);
+    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);
+  }
+
+  /* Pass 2: process 4 rows from work array, store into output array. */
+
+  wsptr = workspace;
+  for (ctr = 0; ctr < 4; ctr++) {
+    outptr = output_buf[ctr] + output_col;
+    /* It's not clear whether a zero row test is worthwhile here ... */
+
+#ifndef NO_ZERO_ROW_TEST
+    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&
+        wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+      /* AC terms all zero */
+      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+                                  & RANGE_MASK];
+
+      outptr[0] = dcval;
+      outptr[1] = dcval;
+      outptr[2] = dcval;
+      outptr[3] = dcval;
+
+      wsptr += DCTSIZE;         /* advance pointer to next row */
+      continue;
+    }
+#endif
+
+    /* Even part */
+
+    tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);
+
+    tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)
+         + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);
+
+    tmp10 = tmp0 + tmp2;
+    tmp12 = tmp0 - tmp2;
+
+    /* Odd part */
+
+    z1 = (INT32) wsptr[7];
+    z2 = (INT32) wsptr[5];
+    z3 = (INT32) wsptr[3];
+    z4 = (INT32) wsptr[1];
+
+    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
+         + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
+         + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
+         + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
+
+    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
+         + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
+         + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
+         + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
+
+    /* Final output stage */
+
+    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,
+                                          CONST_BITS+PASS1_BITS+3+1)
+                            & RANGE_MASK];
+    outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,
+                                          CONST_BITS+PASS1_BITS+3+1)
+                            & RANGE_MASK];
+    outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,
+                                          CONST_BITS+PASS1_BITS+3+1)
+                            & RANGE_MASK];
+    outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,
+                                          CONST_BITS+PASS1_BITS+3+1)
+                            & RANGE_MASK];
+
+    wsptr += DCTSIZE;           /* advance pointer to next row */
+  }
+}
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 2x2 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+               JCOEFPTR coef_block,
+               JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+  INT32 tmp0, tmp10, z1;
+  JCOEFPTR inptr;
+  ISLOW_MULT_TYPE * quantptr;
+  int * wsptr;
+  JSAMPROW outptr;
+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+  int ctr;
+  int workspace[DCTSIZE*2];     /* buffers data between passes */
+  SHIFT_TEMPS
+
+  /* Pass 1: process columns from input, store into work array. */
+
+  inptr = coef_block;
+  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+  wsptr = workspace;
+  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
+    /* Don't bother to process columns 2,4,6 */
+    if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)
+      continue;
+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&
+        inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {
+      /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */
+      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+      wsptr[DCTSIZE*0] = dcval;
+      wsptr[DCTSIZE*1] = dcval;
+
+      continue;
+    }
+
+    /* Even part */
+
+    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+    tmp10 = z1 << (CONST_BITS+2);
+
+    /* Odd part */
+
+    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+    tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */
+    z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+    tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */
+    z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+    tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */
+    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+    tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
+
+    /* Final output stage */
+
+    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);
+    wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);
+  }
+
+  /* Pass 2: process 2 rows from work array, store into output array. */
+
+  wsptr = workspace;
+  for (ctr = 0; ctr < 2; ctr++) {
+    outptr = output_buf[ctr] + output_col;
+    /* It's not clear whether a zero row test is worthwhile here ... */
+
+#ifndef NO_ZERO_ROW_TEST
+    if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {
+      /* AC terms all zero */
+      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+                                  & RANGE_MASK];
+
+      outptr[0] = dcval;
+      outptr[1] = dcval;
+
+      wsptr += DCTSIZE;         /* advance pointer to next row */
+      continue;
+    }
+#endif
+
+    /* Even part */
+
+    tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);
+
+    /* Odd part */
+
+    tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */
+         + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */
+         + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */
+         + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
+
+    /* Final output stage */
+
+    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,
+                                          CONST_BITS+PASS1_BITS+3+2)
+                            & RANGE_MASK];
+    outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,
+                                          CONST_BITS+PASS1_BITS+3+2)
+                            & RANGE_MASK];
+
+    wsptr += DCTSIZE;           /* advance pointer to next row */
+  }
+}
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 1x1 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+               JCOEFPTR coef_block,
+               JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+  int dcval;
+  ISLOW_MULT_TYPE * quantptr;
+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+  SHIFT_TEMPS
+
+  /* We hardly need an inverse DCT routine for this: just take the
+   * average pixel value, which is one-eighth of the DC coefficient.
+   */
+  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+  dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
+  dcval = (int) DESCALE((INT32) dcval, 3);
+
+  output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];
+}
+
+#endif /* IDCT_SCALING_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jinclude.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,95 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jinclude.h
+ *
+ * Copyright (C) 1991-1994, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file exists to provide a single place to fix any problems with
+ * including the wrong system include files.  (Common problems are taken
+ * care of by the standard jconfig symbols, but on really weird systems
+ * you may have to edit this file.)
+ *
+ * NOTE: this file is NOT intended to be included by applications using the
+ * JPEG library.  Most applications need only include jpeglib.h.
+ */
+
+
+/* Include auto-config file to find out which system include files we need. */
+
+#include "jconfig.h"            /* auto configuration options */
+#define JCONFIG_INCLUDED        /* so that jpeglib.h doesn't do it again */
+
+/*
+ * We need the NULL macro and size_t typedef.
+ * On an ANSI-conforming system it is sufficient to include <stddef.h>.
+ * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to
+ * pull in <sys/types.h> as well.
+ * Note that the core JPEG library does not require <stdio.h>;
+ * only the default error handler and data source/destination modules do.
+ * But we must pull it in because of the references to FILE in jpeglib.h.
+ * You can remove those references if you want to compile without <stdio.h>.
+ */
+
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef NEED_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include <stdio.h>
+
+/*
+ * We need memory copying and zeroing functions, plus strncpy().
+ * ANSI and System V implementations declare these in <string.h>.
+ * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().
+ * Some systems may declare memset and memcpy in <memory.h>.
+ *
+ * NOTE: we assume the size parameters to these functions are of type size_t.
+ * Change the casts in these macros if not!
+ */
+
+#ifdef NEED_BSD_STRINGS
+
+#include <strings.h>
+#define MEMZERO(target,size)    bzero((void *)(target), (size_t)(size))
+#define MEMCOPY(dest,src,size)  bcopy((const void *)(src), (void *)(dest), (size_t)(size))
+
+#else /* not BSD, assume ANSI/SysV string lib */
+
+#include <string.h>
+#define MEMZERO(target,size)    memset((void *)(target), 0, (size_t)(size))
+#define MEMCOPY(dest,src,size)  memcpy((void *)(dest), (const void *)(src), (size_t)(size))
+
+#endif
+
+/*
+ * In ANSI C, and indeed any rational implementation, size_t is also the
+ * type returned by sizeof().  However, it seems there are some irrational
+ * implementations out there, in which sizeof() returns an int even though
+ * size_t is defined as long or unsigned long.  To ensure consistent results
+ * we always use this SIZEOF() macro in place of using sizeof() directly.
+ */
+
+#define SIZEOF(object)  ((size_t) sizeof(object))
+
+/*
+ * The modules that use fread() and fwrite() always invoke them through
+ * these macros.  On some systems you may need to twiddle the argument casts.
+ * CAUTION: argument order is different from underlying functions!
+ */
+
+#define JFREAD(file,buf,sizeofbuf)  \
+  ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
+#define JFWRITE(file,buf,sizeofbuf)  \
+  ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jmemmgr.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,1124 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jmemmgr.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the JPEG system-independent memory management
+ * routines.  This code is usable across a wide variety of machines; most
+ * of the system dependencies have been isolated in a separate file.
+ * The major functions provided here are:
+ *   * pool-based allocation and freeing of memory;
+ *   * policy decisions about how to divide available memory among the
+ *     virtual arrays;
+ *   * control logic for swapping virtual arrays between main memory and
+ *     backing storage.
+ * The separate system-dependent file provides the actual backing-storage
+ * access code, and it contains the policy decision about how much total
+ * main memory to use.
+ * This file is system-dependent in the sense that some of its functions
+ * are unnecessary in some systems.  For example, if there is enough virtual
+ * memory so that backing storage will never be used, much of the virtual
+ * array control logic could be removed.  (Of course, if you have that much
+ * memory then you shouldn't care about a little bit of unused code...)
+ */
+
+#define JPEG_INTERNALS
+#define AM_MEMORY_MANAGER       /* we define jvirt_Xarray_control structs */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jmemsys.h"            /* import the system-dependent declarations */
+
+#ifndef NO_GETENV
+#ifndef HAVE_STDLIB_H           /* <stdlib.h> should declare getenv() */
+extern char * getenv JPP((const char * name));
+#endif
+#endif
+
+
+/*
+ * Some important notes:
+ *   The allocation routines provided here must never return NULL.
+ *   They should exit to error_exit if unsuccessful.
+ *
+ *   It's not a good idea to try to merge the sarray and barray routines,
+ *   even though they are textually almost the same, because samples are
+ *   usually stored as bytes while coefficients are shorts or ints.  Thus,
+ *   in machines where byte pointers have a different representation from
+ *   word pointers, the resulting machine code could not be the same.
+ */
+
+
+/*
+ * Many machines require storage alignment: longs must start on 4-byte
+ * boundaries, doubles on 8-byte boundaries, etc.  On such machines, malloc()
+ * always returns pointers that are multiples of the worst-case alignment
+ * requirement, and we had better do so too.
+ * There isn't any really portable way to determine the worst-case alignment
+ * requirement.  This module assumes that the alignment requirement is
+ * multiples of sizeof(ALIGN_TYPE).
+ * By default, we define ALIGN_TYPE as double.  This is necessary on some
+ * workstations (where doubles really do need 8-byte alignment) and will work
+ * fine on nearly everything.  If your machine has lesser alignment needs,
+ * you can save a few bytes by making ALIGN_TYPE smaller.
+ * The only place I know of where this will NOT work is certain Macintosh
+ * 680x0 compilers that define double as a 10-byte IEEE extended float.
+ * Doing 10-byte alignment is counterproductive because longwords won't be
+ * aligned well.  Put "#define ALIGN_TYPE long" in jconfig.h if you have
+ * such a compiler.
+ */
+
+#ifndef ALIGN_TYPE              /* so can override from jconfig.h */
+#define ALIGN_TYPE  double
+#endif
+
+
+/*
+ * We allocate objects from "pools", where each pool is gotten with a single
+ * request to jpeg_get_small() or jpeg_get_large().  There is no per-object
+ * overhead within a pool, except for alignment padding.  Each pool has a
+ * header with a link to the next pool of the same class.
+ * Small and large pool headers are identical except that the latter's
+ * link pointer must be FAR on 80x86 machines.
+ * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE
+ * field.  This forces the compiler to make SIZEOF(small_pool_hdr) a multiple
+ * of the alignment requirement of ALIGN_TYPE.
+ */
+
+typedef union small_pool_struct * small_pool_ptr;
+
+typedef union small_pool_struct {
+  struct {
+    small_pool_ptr next;        /* next in list of pools */
+    size_t bytes_used;          /* how many bytes already used within pool */
+    size_t bytes_left;          /* bytes still available in this pool */
+  } hdr;
+  ALIGN_TYPE dummy;             /* included in union to ensure alignment */
+} small_pool_hdr;
+
+typedef union large_pool_struct FAR * large_pool_ptr;
+
+typedef union large_pool_struct {
+  struct {
+    large_pool_ptr next;        /* next in list of pools */
+    size_t bytes_used;          /* how many bytes already used within pool */
+    size_t bytes_left;          /* bytes still available in this pool */
+  } hdr;
+  ALIGN_TYPE dummy;             /* included in union to ensure alignment */
+} large_pool_hdr;
+
+
+/*
+ * Here is the full definition of a memory manager object.
+ */
+
+typedef struct {
+  struct jpeg_memory_mgr pub;   /* public fields */
+
+  /* Each pool identifier (lifetime class) names a linked list of pools. */
+  small_pool_ptr small_list[JPOOL_NUMPOOLS];
+  large_pool_ptr large_list[JPOOL_NUMPOOLS];
+
+  /* Since we only have one lifetime class of virtual arrays, only one
+   * linked list is necessary (for each datatype).  Note that the virtual
+   * array control blocks being linked together are actually stored somewhere
+   * in the small-pool list.
+   */
+  jvirt_sarray_ptr virt_sarray_list;
+  jvirt_barray_ptr virt_barray_list;
+
+  /* This counts total space obtained from jpeg_get_small/large */
+  size_t total_space_allocated;
+
+  /* alloc_sarray and alloc_barray set this value for use by virtual
+   * array routines.
+   */
+  JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */
+} my_memory_mgr;
+
+typedef my_memory_mgr * my_mem_ptr;
+
+
+/*
+ * The control blocks for virtual arrays.
+ * Note that these blocks are allocated in the "small" pool area.
+ * System-dependent info for the associated backing store (if any) is hidden
+ * inside the backing_store_info struct.
+ */
+
+struct jvirt_sarray_control {
+  JSAMPARRAY mem_buffer;        /* => the in-memory buffer */
+  JDIMENSION rows_in_array;     /* total virtual array height */
+  JDIMENSION samplesperrow;     /* width of array (and of memory buffer) */
+  JDIMENSION maxaccess;         /* max rows accessed by access_virt_sarray */
+  JDIMENSION rows_in_mem;       /* height of memory buffer */
+  JDIMENSION rowsperchunk;      /* allocation chunk size in mem_buffer */
+  JDIMENSION cur_start_row;     /* first logical row # in the buffer */
+  JDIMENSION first_undef_row;   /* row # of first uninitialized row */
+  boolean pre_zero;             /* pre-zero mode requested? */
+  boolean dirty;                /* do current buffer contents need written? */
+  boolean b_s_open;             /* is backing-store data valid? */
+  jvirt_sarray_ptr next;        /* link to next virtual sarray control block */
+  backing_store_info b_s_info;  /* System-dependent control info */
+};
+
+struct jvirt_barray_control {
+  JBLOCKARRAY mem_buffer;       /* => the in-memory buffer */
+  JDIMENSION rows_in_array;     /* total virtual array height */
+  JDIMENSION blocksperrow;      /* width of array (and of memory buffer) */
+  JDIMENSION maxaccess;         /* max rows accessed by access_virt_barray */
+  JDIMENSION rows_in_mem;       /* height of memory buffer */
+  JDIMENSION rowsperchunk;      /* allocation chunk size in mem_buffer */
+  JDIMENSION cur_start_row;     /* first logical row # in the buffer */
+  JDIMENSION first_undef_row;   /* row # of first uninitialized row */
+  boolean pre_zero;             /* pre-zero mode requested? */
+  boolean dirty;                /* do current buffer contents need written? */
+  boolean b_s_open;             /* is backing-store data valid? */
+  jvirt_barray_ptr next;        /* link to next virtual barray control block */
+  backing_store_info b_s_info;  /* System-dependent control info */
+};
+
+
+#ifdef MEM_STATS                /* optional extra stuff for statistics */
+
+LOCAL(void)
+print_mem_stats (j_common_ptr cinfo, int pool_id)
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  small_pool_ptr shdr_ptr;
+  large_pool_ptr lhdr_ptr;
+
+  /* Since this is only a debugging stub, we can cheat a little by using
+   * fprintf directly rather than going through the trace message code.
+   * This is helpful because message parm array can't handle longs.
+   */
+  fprintf(stderr, "Freeing pool %d, total space = %ld\n",
+          pool_id, mem->total_space_allocated);
+
+  for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
+       lhdr_ptr = lhdr_ptr->hdr.next) {
+    fprintf(stderr, "  Large chunk used %ld\n",
+            (long) lhdr_ptr->hdr.bytes_used);
+  }
+
+  for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL;
+       shdr_ptr = shdr_ptr->hdr.next) {
+    fprintf(stderr, "  Small chunk used %ld free %ld\n",
+            (long) shdr_ptr->hdr.bytes_used,
+            (long) shdr_ptr->hdr.bytes_left);
+  }
+}
+
+#endif /* MEM_STATS */
+
+
+LOCAL(void)
+out_of_memory (j_common_ptr cinfo, int which)
+/* Report an out-of-memory error and stop execution */
+/* If we compiled MEM_STATS support, report alloc requests before dying */
+{
+#ifdef MEM_STATS
+  cinfo->err->trace_level = 2;  /* force self_destruct to report stats */
+#endif
+  ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which);
+}
+
+
+/*
+ * Allocation of "small" objects.
+ *
+ * For these, we use pooled storage.  When a new pool must be created,
+ * we try to get enough space for the current request plus a "slop" factor,
+ * where the slop will be the amount of leftover space in the new pool.
+ * The speed vs. space tradeoff is largely determined by the slop values.
+ * A different slop value is provided for each pool class (lifetime),
+ * and we also distinguish the first pool of a class from later ones.
+ * NOTE: the values given work fairly well on both 16- and 32-bit-int
+ * machines, but may be too small if longs are 64 bits or more.
+ */
+
+static const size_t first_pool_slop[JPOOL_NUMPOOLS] =
+{
+        1600,                   /* first PERMANENT pool */
+        16000                   /* first IMAGE pool */
+};
+
+static const size_t extra_pool_slop[JPOOL_NUMPOOLS] =
+{
+        0,                      /* additional PERMANENT pools */
+        5000                    /* additional IMAGE pools */
+};
+
+#define MIN_SLOP  50            /* greater than 0 to avoid futile looping */
+
+
+METHODDEF(void *)
+alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
+/* Allocate a "small" object */
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  small_pool_ptr hdr_ptr, prev_hdr_ptr;
+  char * data_ptr;
+  size_t odd_bytes, min_request, slop;
+
+  /* Check for unsatisfiable request (do now to ensure no overflow below) */
+  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))
+    out_of_memory(cinfo, 1);    /* request exceeds malloc's ability */
+
+  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
+  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
+  if (odd_bytes > 0)
+    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
+
+  /* See if space is available in any existing pool */
+  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+  prev_hdr_ptr = NULL;
+  hdr_ptr = mem->small_list[pool_id];
+  while (hdr_ptr != NULL) {
+    if (hdr_ptr->hdr.bytes_left >= sizeofobject)
+      break;                    /* found pool with enough space */
+    prev_hdr_ptr = hdr_ptr;
+    hdr_ptr = hdr_ptr->hdr.next;
+  }
+
+  /* Time to make a new pool? */
+  if (hdr_ptr == NULL) {
+    /* min_request is what we need now, slop is what will be leftover */
+    min_request = sizeofobject + SIZEOF(small_pool_hdr);
+    if (prev_hdr_ptr == NULL)   /* first pool in class? */
+      slop = first_pool_slop[pool_id];
+    else
+      slop = extra_pool_slop[pool_id];
+    /* Don't ask for more than MAX_ALLOC_CHUNK */
+    if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))
+      slop = (size_t) (MAX_ALLOC_CHUNK-min_request);
+    /* Try to get space, if fail reduce slop and try again */
+    for (;;) {
+      hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
+      if (hdr_ptr != NULL)
+        break;
+      slop /= 2;
+      if (slop < MIN_SLOP)      /* give up when it gets real small */
+        out_of_memory(cinfo, 2); /* jpeg_get_small failed */
+    }
+    mem->total_space_allocated += min_request + slop;
+    /* Success, initialize the new pool header and add to end of list */
+    hdr_ptr->hdr.next = NULL;
+    hdr_ptr->hdr.bytes_used = 0;
+    hdr_ptr->hdr.bytes_left = sizeofobject + slop;
+    if (prev_hdr_ptr == NULL)   /* first pool in class? */
+      mem->small_list[pool_id] = hdr_ptr;
+    else
+      prev_hdr_ptr->hdr.next = hdr_ptr;
+  }
+
+  /* OK, allocate the object from the current pool */
+  data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */
+  data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */
+  hdr_ptr->hdr.bytes_used += sizeofobject;
+  hdr_ptr->hdr.bytes_left -= sizeofobject;
+
+  return (void *) data_ptr;
+}
+
+
+/*
+ * Allocation of "large" objects.
+ *
+ * The external semantics of these are the same as "small" objects,
+ * except that FAR pointers are used on 80x86.  However the pool
+ * management heuristics are quite different.  We assume that each
+ * request is large enough that it may as well be passed directly to
+ * jpeg_get_large; the pool management just links everything together
+ * so that we can free it all on demand.
+ * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY
+ * structures.  The routines that create these structures (see below)
+ * deliberately bunch rows together to ensure a large request size.
+ */
+
+METHODDEF(void FAR *)
+alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
+/* Allocate a "large" object */
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  large_pool_ptr hdr_ptr;
+  size_t odd_bytes;
+
+  /* Check for unsatisfiable request (do now to ensure no overflow below) */
+  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))
+    out_of_memory(cinfo, 3);    /* request exceeds malloc's ability */
+
+  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
+  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
+  if (odd_bytes > 0)
+    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
+
+  /* Always make a new pool */
+  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+  hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject +
+                                            SIZEOF(large_pool_hdr));
+  if (hdr_ptr == NULL)
+    out_of_memory(cinfo, 4);    /* jpeg_get_large failed */
+  mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);
+
+  /* Success, initialize the new pool header and add to list */
+  hdr_ptr->hdr.next = mem->large_list[pool_id];
+  /* We maintain space counts in each pool header for statistical purposes,
+   * even though they are not needed for allocation.
+   */
+  hdr_ptr->hdr.bytes_used = sizeofobject;
+  hdr_ptr->hdr.bytes_left = 0;
+  mem->large_list[pool_id] = hdr_ptr;
+
+  return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */
+}
+
+
+/*
+ * Creation of 2-D sample arrays.
+ * The pointers are in near heap, the samples themselves in FAR heap.
+ *
+ * To minimize allocation overhead and to allow I/O of large contiguous
+ * blocks, we allocate the sample rows in groups of as many rows as possible
+ * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request.
+ * NB: the virtual array control routines, later in this file, know about
+ * this chunking of rows.  The rowsperchunk value is left in the mem manager
+ * object so that it can be saved away if this sarray is the workspace for
+ * a virtual array.
+ */
+
+METHODDEF(JSAMPARRAY)
+alloc_sarray (j_common_ptr cinfo, int pool_id,
+              JDIMENSION samplesperrow, JDIMENSION numrows)
+/* Allocate a 2-D sample array */
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  JSAMPARRAY result;
+  JSAMPROW workspace;
+  JDIMENSION rowsperchunk, currow, i;
+  long ltemp;
+
+  /* Calculate max # of rows allowed in one allocation chunk */
+  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
+          ((long) samplesperrow * SIZEOF(JSAMPLE));
+  if (ltemp <= 0)
+    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+  if (ltemp < (long) numrows)
+    rowsperchunk = (JDIMENSION) ltemp;
+  else
+    rowsperchunk = numrows;
+  mem->last_rowsperchunk = rowsperchunk;
+
+  /* Get space for row pointers (small object) */
+  result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
+                                    (size_t) (numrows * SIZEOF(JSAMPROW)));
+
+  /* Get the rows themselves (large objects) */
+  currow = 0;
+  while (currow < numrows) {
+    rowsperchunk = MIN(rowsperchunk, numrows - currow);
+    workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
+        (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow
+                  * SIZEOF(JSAMPLE)));
+    for (i = rowsperchunk; i > 0; i--) {
+      result[currow++] = workspace;
+      workspace += samplesperrow;
+    }
+  }
+
+  return result;
+}
+
+
+/*
+ * Creation of 2-D coefficient-block arrays.
+ * This is essentially the same as the code for sample arrays, above.
+ */
+
+METHODDEF(JBLOCKARRAY)
+alloc_barray (j_common_ptr cinfo, int pool_id,
+              JDIMENSION blocksperrow, JDIMENSION numrows)
+/* Allocate a 2-D coefficient-block array */
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  JBLOCKARRAY result;
+  JBLOCKROW workspace;
+  JDIMENSION rowsperchunk, currow, i;
+  long ltemp;
+
+  /* Calculate max # of rows allowed in one allocation chunk */
+  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
+          ((long) blocksperrow * SIZEOF(JBLOCK));
+  if (ltemp <= 0)
+    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+  if (ltemp < (long) numrows)
+    rowsperchunk = (JDIMENSION) ltemp;
+  else
+    rowsperchunk = numrows;
+  mem->last_rowsperchunk = rowsperchunk;
+
+  /* Get space for row pointers (small object) */
+  result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
+                                     (size_t) (numrows * SIZEOF(JBLOCKROW)));
+
+  /* Get the rows themselves (large objects) */
+  currow = 0;
+  while (currow < numrows) {
+    rowsperchunk = MIN(rowsperchunk, numrows - currow);
+    workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
+        (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow
+                  * SIZEOF(JBLOCK)));
+    for (i = rowsperchunk; i > 0; i--) {
+      result[currow++] = workspace;
+      workspace += blocksperrow;
+    }
+  }
+
+  return result;
+}
+
+
+/*
+ * About virtual array management:
+ *
+ * The above "normal" array routines are only used to allocate strip buffers
+ * (as wide as the image, but just a few rows high).  Full-image-sized buffers
+ * are handled as "virtual" arrays.  The array is still accessed a strip at a
+ * time, but the memory manager must save the whole array for repeated
+ * accesses.  The intended implementation is that there is a strip buffer in
+ * memory (as high as is possible given the desired memory limit), plus a
+ * backing file that holds the rest of the array.
+ *
+ * The request_virt_array routines are told the total size of the image and
+ * the maximum number of rows that will be accessed at once.  The in-memory
+ * buffer must be at least as large as the maxaccess value.
+ *
+ * The request routines create control blocks but not the in-memory buffers.
+ * That is postponed until realize_virt_arrays is called.  At that time the
+ * total amount of space needed is known (approximately, anyway), so free
+ * memory can be divided up fairly.
+ *
+ * The access_virt_array routines are responsible for making a specific strip
+ * area accessible (after reading or writing the backing file, if necessary).
+ * Note that the access routines are told whether the caller intends to modify
+ * the accessed strip; during a read-only pass this saves having to rewrite
+ * data to disk.  The access routines are also responsible for pre-zeroing
+ * any newly accessed rows, if pre-zeroing was requested.
+ *
+ * In current usage, the access requests are usually for nonoverlapping
+ * strips; that is, successive access start_row numbers differ by exactly
+ * num_rows = maxaccess.  This means we can get good performance with simple
+ * buffer dump/reload logic, by making the in-memory buffer be a multiple
+ * of the access height; then there will never be accesses across bufferload
+ * boundaries.  The code will still work with overlapping access requests,
+ * but it doesn't handle bufferload overlaps very efficiently.
+ */
+
+
+METHODDEF(jvirt_sarray_ptr)
+request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
+                     JDIMENSION samplesperrow, JDIMENSION numrows,
+                     JDIMENSION maxaccess)
+/* Request a virtual 2-D sample array */
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  jvirt_sarray_ptr result;
+
+  /* Only IMAGE-lifetime virtual arrays are currently supported */
+  if (pool_id != JPOOL_IMAGE)
+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+  /* get control block */
+  result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,
+                                          SIZEOF(struct jvirt_sarray_control));
+
+  result->mem_buffer = NULL;    /* marks array not yet realized */
+  result->rows_in_array = numrows;
+  result->samplesperrow = samplesperrow;
+  result->maxaccess = maxaccess;
+  result->pre_zero = pre_zero;
+  result->b_s_open = FALSE;     /* no associated backing-store object */
+  result->next = mem->virt_sarray_list; /* add to list of virtual arrays */
+  mem->virt_sarray_list = result;
+
+  return result;
+}
+
+
+METHODDEF(jvirt_barray_ptr)
+request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
+                     JDIMENSION blocksperrow, JDIMENSION numrows,
+                     JDIMENSION maxaccess)
+/* Request a virtual 2-D coefficient-block array */
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  jvirt_barray_ptr result;
+
+  /* Only IMAGE-lifetime virtual arrays are currently supported */
+  if (pool_id != JPOOL_IMAGE)
+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+  /* get control block */
+  result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,
+                                          SIZEOF(struct jvirt_barray_control));
+
+  result->mem_buffer = NULL;    /* marks array not yet realized */
+  result->rows_in_array = numrows;
+  result->blocksperrow = blocksperrow;
+  result->maxaccess = maxaccess;
+  result->pre_zero = pre_zero;
+  result->b_s_open = FALSE;     /* no associated backing-store object */
+  result->next = mem->virt_barray_list; /* add to list of virtual arrays */
+  mem->virt_barray_list = result;
+
+  return result;
+}
+
+
+METHODDEF(void)
+realize_virt_arrays (j_common_ptr cinfo)
+/* Allocate the in-memory buffers for any unrealized virtual arrays */
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  size_t space_per_minheight, maximum_space, avail_mem;
+  size_t minheights, max_minheights;
+  jvirt_sarray_ptr sptr;
+  jvirt_barray_ptr bptr;
+
+  /* Compute the minimum space needed (maxaccess rows in each buffer)
+   * and the maximum space needed (full image height in each buffer).
+   * These may be of use to the system-dependent jpeg_mem_available routine.
+   */
+  space_per_minheight = 0;
+  maximum_space = 0;
+  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+    if (sptr->mem_buffer == NULL) { /* if not realized yet */
+      space_per_minheight += (long) sptr->maxaccess *
+                             (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
+      maximum_space += (long) sptr->rows_in_array *
+                       (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
+    }
+  }
+  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+    if (bptr->mem_buffer == NULL) { /* if not realized yet */
+      space_per_minheight += (long) bptr->maxaccess *
+                             (long) bptr->blocksperrow * SIZEOF(JBLOCK);
+      maximum_space += (long) bptr->rows_in_array *
+                       (long) bptr->blocksperrow * SIZEOF(JBLOCK);
+    }
+  }
+
+  if (space_per_minheight <= 0)
+    return;                     /* no unrealized arrays, no work */
+
+  /* Determine amount of memory to actually use; this is system-dependent. */
+  avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
+                                 mem->total_space_allocated);
+
+  /* If the maximum space needed is available, make all the buffers full
+   * height; otherwise parcel it out with the same number of minheights
+   * in each buffer.
+   */
+  if (avail_mem >= maximum_space)
+    max_minheights = 1000000000L;
+  else {
+    max_minheights = avail_mem / space_per_minheight;
+    /* If there doesn't seem to be enough space, try to get the minimum
+     * anyway.  This allows a "stub" implementation of jpeg_mem_available().
+     */
+    if (max_minheights <= 0)
+      max_minheights = 1;
+  }
+
+  /* Allocate the in-memory buffers and initialize backing store as needed. */
+
+  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+    if (sptr->mem_buffer == NULL) { /* if not realized yet */
+      minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;
+      if (minheights <= max_minheights) {
+        /* This buffer fits in memory */
+        sptr->rows_in_mem = sptr->rows_in_array;
+      } else {
+        /* It doesn't fit in memory, create backing store. */
+        sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);
+        jpeg_open_backing_store(cinfo, & sptr->b_s_info,
+                                (long) sptr->rows_in_array *
+                                (long) sptr->samplesperrow *
+                                (long) SIZEOF(JSAMPLE));
+        sptr->b_s_open = TRUE;
+      }
+      sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,
+                                      sptr->samplesperrow, sptr->rows_in_mem);
+      sptr->rowsperchunk = mem->last_rowsperchunk;
+      sptr->cur_start_row = 0;
+      sptr->first_undef_row = 0;
+      sptr->dirty = FALSE;
+    }
+  }
+
+  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+    if (bptr->mem_buffer == NULL) { /* if not realized yet */
+      minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;
+      if (minheights <= max_minheights) {
+        /* This buffer fits in memory */
+        bptr->rows_in_mem = bptr->rows_in_array;
+      } else {
+        /* It doesn't fit in memory, create backing store. */
+        bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);
+        jpeg_open_backing_store(cinfo, & bptr->b_s_info,
+                                (long) bptr->rows_in_array *
+                                (long) bptr->blocksperrow *
+                                (long) SIZEOF(JBLOCK));
+        bptr->b_s_open = TRUE;
+      }
+      bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,
+                                      bptr->blocksperrow, bptr->rows_in_mem);
+      bptr->rowsperchunk = mem->last_rowsperchunk;
+      bptr->cur_start_row = 0;
+      bptr->first_undef_row = 0;
+      bptr->dirty = FALSE;
+    }
+  }
+}
+
+
+LOCAL(void)
+do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)
+/* Do backing store read or write of a virtual sample array */
+{
+  long bytesperrow, file_offset, byte_count, rows, thisrow, i;
+
+  bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
+  file_offset = ptr->cur_start_row * bytesperrow;
+  /* Loop to read or write each allocation chunk in mem_buffer */
+  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
+    /* One chunk, but check for short chunk at end of buffer */
+    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
+    /* Transfer no more than is currently defined */
+    thisrow = (long) ptr->cur_start_row + i;
+    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
+    /* Transfer no more than fits in file */
+    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
+    if (rows <= 0)              /* this chunk might be past end of file! */
+      break;
+    byte_count = rows * bytesperrow;
+    if (writing)
+      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
+                                            (void FAR *) ptr->mem_buffer[i],
+                                            file_offset, byte_count);
+    else
+      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
+                                           (void FAR *) ptr->mem_buffer[i],
+                                           file_offset, byte_count);
+    file_offset += byte_count;
+  }
+}
+
+
+LOCAL(void)
+do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)
+/* Do backing store read or write of a virtual coefficient-block array */
+{
+  long bytesperrow, file_offset, byte_count, rows, thisrow, i;
+
+  bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
+  file_offset = ptr->cur_start_row * bytesperrow;
+  /* Loop to read or write each allocation chunk in mem_buffer */
+  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
+    /* One chunk, but check for short chunk at end of buffer */
+    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
+    /* Transfer no more than is currently defined */
+    thisrow = (long) ptr->cur_start_row + i;
+    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
+    /* Transfer no more than fits in file */
+    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
+    if (rows <= 0)              /* this chunk might be past end of file! */
+      break;
+    byte_count = rows * bytesperrow;
+    if (writing)
+      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
+                                            (void FAR *) ptr->mem_buffer[i],
+                                            file_offset, byte_count);
+    else
+      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
+                                           (void FAR *) ptr->mem_buffer[i],
+                                           file_offset, byte_count);
+    file_offset += byte_count;
+  }
+}
+
+
+METHODDEF(JSAMPARRAY)
+access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
+                    JDIMENSION start_row, JDIMENSION num_rows,
+                    boolean writable)
+/* Access the part of a virtual sample array starting at start_row */
+/* and extending for num_rows rows.  writable is true if  */
+/* caller intends to modify the accessed area. */
+{
+  JDIMENSION end_row = start_row + num_rows;
+  JDIMENSION undef_row;
+
+  /* debugging check */
+  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
+      ptr->mem_buffer == NULL)
+    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+
+  /* Make the desired part of the virtual array accessible */
+  if (start_row < ptr->cur_start_row ||
+      end_row > ptr->cur_start_row+ptr->rows_in_mem) {
+    if (! ptr->b_s_open)
+      ERREXIT(cinfo, JERR_VIRTUAL_BUG);
+    /* Flush old buffer contents if necessary */
+    if (ptr->dirty) {
+      do_sarray_io(cinfo, ptr, TRUE);
+      ptr->dirty = FALSE;
+    }
+    /* Decide what part of virtual array to access.
+     * Algorithm: if target address > current window, assume forward scan,
+     * load starting at target address.  If target address < current window,
+     * assume backward scan, load so that target area is top of window.
+     * Note that when switching from forward write to forward read, will have
+     * start_row = 0, so the limiting case applies and we load from 0 anyway.
+     */
+    if (start_row > ptr->cur_start_row) {
+      ptr->cur_start_row = start_row;
+    } else {
+      /* use long arithmetic here to avoid overflow & unsigned problems */
+      long ltemp;
+
+      ltemp = (long) end_row - (long) ptr->rows_in_mem;
+      if (ltemp < 0)
+        ltemp = 0;              /* don't fall off front end of file */
+      ptr->cur_start_row = (JDIMENSION) ltemp;
+    }
+    /* Read in the selected part of the array.
+     * During the initial write pass, we will do no actual read
+     * because the selected part is all undefined.
+     */
+    do_sarray_io(cinfo, ptr, FALSE);
+  }
+  /* Ensure the accessed part of the array is defined; prezero if needed.
+   * To improve locality of access, we only prezero the part of the array
+   * that the caller is about to access, not the entire in-memory array.
+   */
+  if (ptr->first_undef_row < end_row) {
+    if (ptr->first_undef_row < start_row) {
+      if (writable)             /* writer skipped over a section of array */
+        ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+      undef_row = start_row;    /* but reader is allowed to read ahead */
+    } else {
+      undef_row = ptr->first_undef_row;
+    }
+    if (writable)
+      ptr->first_undef_row = end_row;
+    if (ptr->pre_zero) {
+      size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE);
+      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
+      end_row -= ptr->cur_start_row;
+      while (undef_row < end_row) {
+        jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+        undef_row++;
+      }
+    } else {
+      if (! writable)           /* reader looking at undefined data */
+        ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+    }
+  }
+  /* Flag the buffer dirty if caller will write in it */
+  if (writable)
+    ptr->dirty = TRUE;
+  /* Return address of proper part of the buffer */
+  return ptr->mem_buffer + (start_row - ptr->cur_start_row);
+}
+
+
+METHODDEF(JBLOCKARRAY)
+access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
+                    JDIMENSION start_row, JDIMENSION num_rows,
+                    boolean writable)
+/* Access the part of a virtual block array starting at start_row */
+/* and extending for num_rows rows.  writable is true if  */
+/* caller intends to modify the accessed area. */
+{
+  JDIMENSION end_row = start_row + num_rows;
+  JDIMENSION undef_row;
+
+  /* debugging check */
+  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
+      ptr->mem_buffer == NULL)
+    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+
+  /* Make the desired part of the virtual array accessible */
+  if (start_row < ptr->cur_start_row ||
+      end_row > ptr->cur_start_row+ptr->rows_in_mem) {
+    if (! ptr->b_s_open)
+      ERREXIT(cinfo, JERR_VIRTUAL_BUG);
+    /* Flush old buffer contents if necessary */
+    if (ptr->dirty) {
+      do_barray_io(cinfo, ptr, TRUE);
+      ptr->dirty = FALSE;
+    }
+    /* Decide what part of virtual array to access.
+     * Algorithm: if target address > current window, assume forward scan,
+     * load starting at target address.  If target address < current window,
+     * assume backward scan, load so that target area is top of window.
+     * Note that when switching from forward write to forward read, will have
+     * start_row = 0, so the limiting case applies and we load from 0 anyway.
+     */
+    if (start_row > ptr->cur_start_row) {
+      ptr->cur_start_row = start_row;
+    } else {
+      /* use long arithmetic here to avoid overflow & unsigned problems */
+      long ltemp;
+
+      ltemp = (long) end_row - (long) ptr->rows_in_mem;
+      if (ltemp < 0)
+        ltemp = 0;              /* don't fall off front end of file */
+      ptr->cur_start_row = (JDIMENSION) ltemp;
+    }
+    /* Read in the selected part of the array.
+     * During the initial write pass, we will do no actual read
+     * because the selected part is all undefined.
+     */
+    do_barray_io(cinfo, ptr, FALSE);
+  }
+  /* Ensure the accessed part of the array is defined; prezero if needed.
+   * To improve locality of access, we only prezero the part of the array
+   * that the caller is about to access, not the entire in-memory array.
+   */
+  if (ptr->first_undef_row < end_row) {
+    if (ptr->first_undef_row < start_row) {
+      if (writable)             /* writer skipped over a section of array */
+        ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+      undef_row = start_row;    /* but reader is allowed to read ahead */
+    } else {
+      undef_row = ptr->first_undef_row;
+    }
+    if (writable)
+      ptr->first_undef_row = end_row;
+    if (ptr->pre_zero) {
+      size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK);
+      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
+      end_row -= ptr->cur_start_row;
+      while (undef_row < end_row) {
+        jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+        undef_row++;
+      }
+    } else {
+      if (! writable)           /* reader looking at undefined data */
+        ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+    }
+  }
+  /* Flag the buffer dirty if caller will write in it */
+  if (writable)
+    ptr->dirty = TRUE;
+  /* Return address of proper part of the buffer */
+  return ptr->mem_buffer + (start_row - ptr->cur_start_row);
+}
+
+
+/*
+ * Release all objects belonging to a specified pool.
+ */
+
+METHODDEF(void)
+free_pool (j_common_ptr cinfo, int pool_id)
+{
+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+  small_pool_ptr shdr_ptr;
+  large_pool_ptr lhdr_ptr;
+  size_t space_freed;
+
+  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+#ifdef MEM_STATS
+  if (cinfo->err->trace_level > 1)
+    print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */
+#endif
+
+  /* If freeing IMAGE pool, close any virtual arrays first */
+  if (pool_id == JPOOL_IMAGE) {
+    jvirt_sarray_ptr sptr;
+    jvirt_barray_ptr bptr;
+
+    for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+      if (sptr->b_s_open) {     /* there may be no backing store */
+        sptr->b_s_open = FALSE; /* prevent recursive close if error */
+        (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info);
+      }
+    }
+    mem->virt_sarray_list = NULL;
+    for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+      if (bptr->b_s_open) {     /* there may be no backing store */
+        bptr->b_s_open = FALSE; /* prevent recursive close if error */
+        (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info);
+      }
+    }
+    mem->virt_barray_list = NULL;
+  }
+
+  /* Release large objects */
+  lhdr_ptr = mem->large_list[pool_id];
+  mem->large_list[pool_id] = NULL;
+
+  while (lhdr_ptr != NULL) {
+    large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next;
+    space_freed = lhdr_ptr->hdr.bytes_used +
+                  lhdr_ptr->hdr.bytes_left +
+                  SIZEOF(large_pool_hdr);
+    jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);
+    mem->total_space_allocated -= space_freed;
+    lhdr_ptr = next_lhdr_ptr;
+  }
+
+  /* Release small objects */
+  shdr_ptr = mem->small_list[pool_id];
+  mem->small_list[pool_id] = NULL;
+
+  while (shdr_ptr != NULL) {
+    small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next;
+    space_freed = shdr_ptr->hdr.bytes_used +
+                  shdr_ptr->hdr.bytes_left +
+                  SIZEOF(small_pool_hdr);
+    jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);
+    mem->total_space_allocated -= space_freed;
+    shdr_ptr = next_shdr_ptr;
+  }
+}
+
+
+/*
+ * Close up shop entirely.
+ * Note that this cannot be called unless cinfo->mem is non-NULL.
+ */
+
+METHODDEF(void)
+self_destruct (j_common_ptr cinfo)
+{
+  int pool;
+
+  /* Close all backing store, release all memory.
+   * Releasing pools in reverse order might help avoid fragmentation
+   * with some (brain-damaged) malloc libraries.
+   */
+  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
+    free_pool(cinfo, pool);
+  }
+
+  /* Release the memory manager control block too. */
+  jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr));
+  cinfo->mem = NULL;            /* ensures I will be called only once */
+
+  jpeg_mem_term(cinfo);         /* system-dependent cleanup */
+}
+
+
+/*
+ * Memory manager initialization.
+ * When this is called, only the error manager pointer is valid in cinfo!
+ */
+
+GLOBAL(void)
+jinit_memory_mgr (j_common_ptr cinfo)
+{
+  my_mem_ptr mem;
+  size_t max_to_use;
+  int pool;
+  size_t test_mac;
+
+  cinfo->mem = NULL;            /* for safety if init fails */
+
+  /* Check for configuration errors.
+   * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably
+   * doesn't reflect any real hardware alignment requirement.
+   * The test is a little tricky: for X>0, X and X-1 have no one-bits
+   * in common if and only if X is a power of 2, ie has only one one-bit.
+   * Some compilers may give an "unreachable code" warning here; ignore it.
+   */
+  if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0)
+    ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE);
+  /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be
+   * a multiple of SIZEOF(ALIGN_TYPE).
+   * Again, an "unreachable code" warning may be ignored here.
+   * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK.
+   */
+  test_mac = (size_t) MAX_ALLOC_CHUNK;
+  if ((long) test_mac != MAX_ALLOC_CHUNK ||
+      (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0)
+    ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);
+
+  max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */
+
+  /* Attempt to allocate memory manager's control block */
+  mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr));
+
+  if (mem == NULL) {
+    jpeg_mem_term(cinfo);       /* system-dependent cleanup */
+    ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0);
+  }
+
+  /* OK, fill in the method pointers */
+  mem->pub.alloc_small = alloc_small;
+  mem->pub.alloc_large = alloc_large;
+  mem->pub.alloc_sarray = alloc_sarray;
+  mem->pub.alloc_barray = alloc_barray;
+  mem->pub.request_virt_sarray = request_virt_sarray;
+  mem->pub.request_virt_barray = request_virt_barray;
+  mem->pub.realize_virt_arrays = realize_virt_arrays;
+  mem->pub.access_virt_sarray = access_virt_sarray;
+  mem->pub.access_virt_barray = access_virt_barray;
+  mem->pub.free_pool = free_pool;
+  mem->pub.self_destruct = self_destruct;
+
+  /* Make MAX_ALLOC_CHUNK accessible to other modules */
+  mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK;
+
+  /* Initialize working state */
+  mem->pub.max_memory_to_use = max_to_use;
+
+  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
+    mem->small_list[pool] = NULL;
+    mem->large_list[pool] = NULL;
+  }
+  mem->virt_sarray_list = NULL;
+  mem->virt_barray_list = NULL;
+
+  mem->total_space_allocated = SIZEOF(my_memory_mgr);
+
+  /* Declare ourselves open for business */
+  cinfo->mem = & mem->pub;
+
+  /* Check for an environment variable JPEGMEM; if found, override the
+   * default max_memory setting from jpeg_mem_init.  Note that the
+   * surrounding application may again override this value.
+   * If your system doesn't support getenv(), define NO_GETENV to disable
+   * this feature.
+   */
+#ifndef NO_GETENV
+  { char * memenv;
+
+    if ((memenv = getenv("JPEGMEM")) != NULL) {
+      char ch = 'x';
+      unsigned int mem_max = 0u;
+
+      if (sscanf(memenv, "%u%c", &mem_max, &ch) > 0) {
+        max_to_use = (size_t)mem_max;
+        if (ch == 'm' || ch == 'M')
+          max_to_use *= 1000L;
+        mem->pub.max_memory_to_use = max_to_use * 1000L;
+      }
+    }
+  }
+#endif
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jmemnobs.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,113 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jmemnobs.c
+ *
+ * Copyright (C) 1992-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file provides a really simple implementation of the system-
+ * dependent portion of the JPEG memory manager.  This implementation
+ * assumes that no backing-store files are needed: all required space
+ * can be obtained from malloc().
+ * This is very portable in the sense that it'll compile on almost anything,
+ * but you'd better have lots of main memory (or virtual memory) if you want
+ * to process big images.
+ * Note that the max_memory_to_use option is ignored by this implementation.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jmemsys.h"            /* import the system-dependent declarations */
+
+#ifndef HAVE_STDLIB_H           /* <stdlib.h> should declare malloc(),free() */
+extern void * malloc JPP((size_t size));
+extern void free JPP((void *ptr));
+#endif
+
+
+/*
+ * Memory allocation and freeing are controlled by the regular library
+ * routines malloc() and free().
+ */
+
+GLOBAL(void *)
+jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)
+{
+  return (void *) malloc(sizeofobject);
+}
+
+GLOBAL(void)
+jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)
+{
+  free(object);
+}
+
+
+/*
+ * "Large" objects are treated the same as "small" ones.
+ * NB: although we include FAR keywords in the routine declarations,
+ * this file won't actually work in 80x86 small/medium model; at least,
+ * you probably won't be able to process useful-size images in only 64KB.
+ */
+
+GLOBAL(void FAR *)
+jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)
+{
+  return (void FAR *) malloc(sizeofobject);
+}
+
+GLOBAL(void)
+jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
+{
+  free(object);
+}
+
+
+/*
+ * This routine computes the total memory space available for allocation.
+ * Here we always say, "we got all you want bud!"
+ */
+
+GLOBAL(size_t)
+jpeg_mem_available (j_common_ptr cinfo, size_t min_bytes_needed,
+                    size_t max_bytes_needed, size_t already_allocated)
+{
+  return max_bytes_needed;
+}
+
+
+/*
+ * Backing store (temporary file) management.
+ * Since jpeg_mem_available always promised the moon,
+ * this should never be called and we can just error out.
+ */
+
+GLOBAL(void)
+jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,
+                         long total_bytes_needed)
+{
+  ERREXIT(cinfo, JERR_NO_BACKING_STORE);
+}
+
+
+/*
+ * These routines take care of any system-dependent initialization and
+ * cleanup required.  Here, there isn't any.
+ */
+
+GLOBAL(size_t)
+jpeg_mem_init (j_common_ptr cinfo)
+{
+  return 0;                     /* just set max_memory_to_use to 0 */
+}
+
+GLOBAL(void)
+jpeg_mem_term (j_common_ptr cinfo)
+{
+  /* no work */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jmemsys.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,202 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jmemsys.h
+ *
+ * Copyright (C) 1992-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This include file defines the interface between the system-independent
+ * and system-dependent portions of the JPEG memory manager.  No other
+ * modules need include it.  (The system-independent portion is jmemmgr.c;
+ * there are several different versions of the system-dependent portion.)
+ *
+ * This file works as-is for the system-dependent memory managers supplied
+ * in the IJG distribution.  You may need to modify it if you write a
+ * custom memory manager.  If system-dependent changes are needed in
+ * this file, the best method is to #ifdef them based on a configuration
+ * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR
+ * and USE_MAC_MEMMGR.
+ */
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_get_small          jGetSmall
+#define jpeg_free_small         jFreeSmall
+#define jpeg_get_large          jGetLarge
+#define jpeg_free_large         jFreeLarge
+#define jpeg_mem_available      jMemAvail
+#define jpeg_open_backing_store jOpenBackStore
+#define jpeg_mem_init           jMemInit
+#define jpeg_mem_term           jMemTerm
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/*
+ * These two functions are used to allocate and release small chunks of
+ * memory.  (Typically the total amount requested through jpeg_get_small is
+ * no more than 20K or so; this will be requested in chunks of a few K each.)
+ * Behavior should be the same as for the standard library functions malloc
+ * and free; in particular, jpeg_get_small must return NULL on failure.
+ * On most systems, these ARE malloc and free.  jpeg_free_small is passed the
+ * size of the object being freed, just in case it's needed.
+ * On an 80x86 machine using small-data memory model, these manage near heap.
+ */
+
+EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));
+EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,
+                                  size_t sizeofobject));
+
+/*
+ * These two functions are used to allocate and release large chunks of
+ * memory (up to the total free space designated by jpeg_mem_available).
+ * The interface is the same as above, except that on an 80x86 machine,
+ * far pointers are used.  On most other machines these are identical to
+ * the jpeg_get/free_small routines; but we keep them separate anyway,
+ * in case a different allocation strategy is desirable for large chunks.
+ */
+
+EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,
+                                       size_t sizeofobject));
+EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,
+                                  size_t sizeofobject));
+
+/*
+ * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may
+ * be requested in a single call to jpeg_get_large (and jpeg_get_small for that
+ * matter, but that case should never come into play).  This macro is needed
+ * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.
+ * On those machines, we expect that jconfig.h will provide a proper value.
+ * On machines with 32-bit flat address spaces, any large constant may be used.
+ *
+ * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type
+ * size_t and will be a multiple of sizeof(align_type).
+ */
+
+#ifndef MAX_ALLOC_CHUNK         /* may be overridden in jconfig.h */
+#define MAX_ALLOC_CHUNK  1000000000L
+#endif
+
+/*
+ * This routine computes the total space still available for allocation by
+ * jpeg_get_large.  If more space than this is needed, backing store will be
+ * used.  NOTE: any memory already allocated must not be counted.
+ *
+ * There is a minimum space requirement, corresponding to the minimum
+ * feasible buffer sizes; jmemmgr.c will request that much space even if
+ * jpeg_mem_available returns zero.  The maximum space needed, enough to hold
+ * all working storage in memory, is also passed in case it is useful.
+ * Finally, the total space already allocated is passed.  If no better
+ * method is available, cinfo->mem->max_memory_to_use - already_allocated
+ * is often a suitable calculation.
+ *
+ * It is OK for jpeg_mem_available to underestimate the space available
+ * (that'll just lead to more backing-store access than is really necessary).
+ * However, an overestimate will lead to failure.  Hence it's wise to subtract
+ * a slop factor from the true available space.  5% should be enough.
+ *
+ * On machines with lots of virtual memory, any large constant may be returned.
+ * Conversely, zero may be returned to always use the minimum amount of memory.
+ */
+
+EXTERN(size_t) jpeg_mem_available JPP((j_common_ptr cinfo,
+                                     size_t min_bytes_needed,
+                                     size_t max_bytes_needed,
+                                     size_t already_allocated));
+
+
+/*
+ * This structure holds whatever state is needed to access a single
+ * backing-store object.  The read/write/close method pointers are called
+ * by jmemmgr.c to manipulate the backing-store object; all other fields
+ * are private to the system-dependent backing store routines.
+ */
+
+#define TEMP_NAME_LENGTH   64   /* max length of a temporary file's name */
+
+
+#ifdef USE_MSDOS_MEMMGR         /* DOS-specific junk */
+
+typedef unsigned short XMSH;    /* type of extended-memory handles */
+typedef unsigned short EMSH;    /* type of expanded-memory handles */
+
+typedef union {
+  short file_handle;            /* DOS file handle if it's a temp file */
+  XMSH xms_handle;              /* handle if it's a chunk of XMS */
+  EMSH ems_handle;              /* handle if it's a chunk of EMS */
+} handle_union;
+
+#endif /* USE_MSDOS_MEMMGR */
+
+#ifdef USE_MAC_MEMMGR           /* Mac-specific junk */
+#include <Files.h>
+#endif /* USE_MAC_MEMMGR */
+
+
+typedef struct backing_store_struct * backing_store_ptr;
+
+typedef struct backing_store_struct {
+  /* Methods for reading/writing/closing this backing-store object */
+  JMETHOD(void, read_backing_store, (j_common_ptr cinfo,
+                                     backing_store_ptr info,
+                                     void FAR * buffer_address,
+                                     long file_offset, long byte_count));
+  JMETHOD(void, write_backing_store, (j_common_ptr cinfo,
+                                      backing_store_ptr info,
+                                      void FAR * buffer_address,
+                                      long file_offset, long byte_count));
+  JMETHOD(void, close_backing_store, (j_common_ptr cinfo,
+                                      backing_store_ptr info));
+
+  /* Private fields for system-dependent backing-store management */
+#ifdef USE_MSDOS_MEMMGR
+  /* For the MS-DOS manager (jmemdos.c), we need: */
+  handle_union handle;          /* reference to backing-store storage object */
+  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
+#else
+#ifdef USE_MAC_MEMMGR
+  /* For the Mac manager (jmemmac.c), we need: */
+  short temp_file;              /* file reference number to temp file */
+  FSSpec tempSpec;              /* the FSSpec for the temp file */
+  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
+#else
+  /* For a typical implementation with temp files, we need: */
+  FILE * temp_file;             /* stdio reference to temp file */
+  char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
+#endif
+#endif
+} backing_store_info;
+
+
+/*
+ * Initial opening of a backing-store object.  This must fill in the
+ * read/write/close pointers in the object.  The read/write routines
+ * may take an error exit if the specified maximum file size is exceeded.
+ * (If jpeg_mem_available always returns a large value, this routine can
+ * just take an error exit.)
+ */
+
+EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,
+                                          backing_store_ptr info,
+                                          long total_bytes_needed));
+
+
+/*
+ * These routines take care of any system-dependent initialization and
+ * cleanup required.  jpeg_mem_init will be called before anything is
+ * allocated (and, therefore, nothing in cinfo is of use except the error
+ * manager pointer).  It should return a suitable default value for
+ * max_memory_to_use; this may subsequently be overridden by the surrounding
+ * application.  (Note that max_memory_to_use is only important if
+ * jpeg_mem_available chooses to consult it ... no one else will.)
+ * jpeg_mem_term may assume that all requested memory has been freed and that
+ * all opened backing-store objects have been closed.
+ */
+
+EXTERN(size_t) jpeg_mem_init JPP((j_common_ptr cinfo));
+EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jmorecfg.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,378 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jmorecfg.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains additional configuration options that customize the
+ * JPEG software for special applications or support machine-dependent
+ * optimizations.  Most users will not need to touch this file.
+ */
+
+
+/*
+ * Define BITS_IN_JSAMPLE as either
+ *   8   for 8-bit sample values (the usual setting)
+ *   12  for 12-bit sample values
+ * Only 8 and 12 are legal data precisions for lossy JPEG according to the
+ * JPEG standard, and the IJG code does not support anything else!
+ * We do not support run-time selection of data precision, sorry.
+ */
+
+#define BITS_IN_JSAMPLE  8      /* use 8 or 12 */
+
+
+/*
+ * Maximum number of components (color channels) allowed in JPEG image.
+ * To meet the letter of the JPEG spec, set this to 255.  However, darn
+ * few applications need more than 4 channels (maybe 5 for CMYK + alpha
+ * mask).  We recommend 10 as a reasonable compromise; use 4 if you are
+ * really short on memory.  (Each allowed component costs a hundred or so
+ * bytes of storage, whether actually used in an image or not.)
+ */
+
+#define MAX_COMPONENTS  10      /* maximum number of image components */
+
+
+/*
+ * Basic data types.
+ * You may need to change these if you have a machine with unusual data
+ * type sizes; for example, "char" not 8 bits, "short" not 16 bits,
+ * or "long" not 32 bits.  We don't care whether "int" is 16 or 32 bits,
+ * but it had better be at least 16.
+ */
+
+/* Representation of a single sample (pixel element value).
+ * We frequently allocate large arrays of these, so it's important to keep
+ * them small.  But if you have memory to burn and access to char or short
+ * arrays is very slow on your hardware, you might want to change these.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+/* JSAMPLE should be the smallest type that will hold the values 0..255.
+ * You can use a signed char by having GETJSAMPLE mask it with 0xFF.
+ */
+
+#ifdef HAVE_UNSIGNED_CHAR
+
+typedef unsigned char JSAMPLE;
+#define GETJSAMPLE(value)  ((int) (value))
+
+#else /* not HAVE_UNSIGNED_CHAR */
+
+typedef char JSAMPLE;
+#ifdef CHAR_IS_UNSIGNED
+#define GETJSAMPLE(value)  ((int) (value))
+#else
+#define GETJSAMPLE(value)  ((int) (value) & 0xFF)
+#endif /* CHAR_IS_UNSIGNED */
+
+#endif /* HAVE_UNSIGNED_CHAR */
+
+#define MAXJSAMPLE      255
+#define CENTERJSAMPLE   128
+
+#endif /* BITS_IN_JSAMPLE == 8 */
+
+
+#if BITS_IN_JSAMPLE == 12
+/* JSAMPLE should be the smallest type that will hold the values 0..4095.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value)  ((int) (value))
+
+#define MAXJSAMPLE      4095
+#define CENTERJSAMPLE   2048
+
+#endif /* BITS_IN_JSAMPLE == 12 */
+
+
+/* Representation of a DCT frequency coefficient.
+ * This should be a signed value of at least 16 bits; "short" is usually OK.
+ * Again, we allocate large arrays of these, but you can change to int
+ * if you have memory to burn and "short" is really slow.
+ */
+
+typedef short JCOEF;
+
+
+/* Compressed datastreams are represented as arrays of JOCTET.
+ * These must be EXACTLY 8 bits wide, at least once they are written to
+ * external storage.  Note that when using the stdio data source/destination
+ * managers, this is also the data type passed to fread/fwrite.
+ */
+
+#ifdef HAVE_UNSIGNED_CHAR
+
+typedef unsigned char JOCTET;
+#define GETJOCTET(value)  (value)
+
+#else /* not HAVE_UNSIGNED_CHAR */
+
+typedef char JOCTET;
+#ifdef CHAR_IS_UNSIGNED
+#define GETJOCTET(value)  (value)
+#else
+#define GETJOCTET(value)  ((value) & 0xFF)
+#endif /* CHAR_IS_UNSIGNED */
+
+#endif /* HAVE_UNSIGNED_CHAR */
+
+
+/* These typedefs are used for various table entries and so forth.
+ * They must be at least as wide as specified; but making them too big
+ * won't cost a huge amount of memory, so we don't provide special
+ * extraction code like we did for JSAMPLE.  (In other words, these
+ * typedefs live at a different point on the speed/space tradeoff curve.)
+ */
+
+/* UINT8 must hold at least the values 0..255. */
+
+#ifdef HAVE_UNSIGNED_CHAR
+typedef unsigned char UINT8;
+#else /* not HAVE_UNSIGNED_CHAR */
+#ifdef CHAR_IS_UNSIGNED
+typedef char UINT8;
+#else /* not CHAR_IS_UNSIGNED */
+typedef short UINT8;
+#endif /* CHAR_IS_UNSIGNED */
+#endif /* HAVE_UNSIGNED_CHAR */
+
+/* UINT16 must hold at least the values 0..65535. */
+
+#ifdef HAVE_UNSIGNED_SHORT
+typedef unsigned short UINT16;
+#else /* not HAVE_UNSIGNED_SHORT */
+typedef unsigned int UINT16;
+#endif /* HAVE_UNSIGNED_SHORT */
+
+/* INT16 must hold at least the values -32768..32767. */
+
+#ifndef XMD_H                   /* X11/xmd.h correctly defines INT16 */
+typedef short INT16;
+#endif
+
+/* INT32 must hold at least signed 32-bit values. */
+
+#ifndef XMD_H                         /* X11/xmd.h correctly defines INT32 */
+#if defined(_LP64) || defined(_WIN32) /* _WIN32 is on all windows platfroms (x86 and x64) */
+typedef int INT32;
+#else
+typedef long INT32;
+#endif
+#endif
+
+/* Datatype used for image dimensions.  The JPEG standard only supports
+ * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore
+ * "unsigned int" is sufficient on all machines.  However, if you need to
+ * handle larger images and you don't mind deviating from the spec, you
+ * can change this datatype.
+ */
+
+typedef unsigned int JDIMENSION;
+
+#ifndef _LP64
+#define JPEG_MAX_DIMENSION  65500L  /* a tad under 64K to prevent overflows */
+#else
+#define JPEG_MAX_DIMENSION  65500  /* a tad under 64K to prevent overflows */
+#endif
+
+
+/* These macros are used in all function definitions and extern declarations.
+ * You could modify them if you need to change function linkage conventions;
+ * in particular, you'll need to do that to make the library a Windows DLL.
+ * Another application is to make all functions global for use with debuggers
+ * or code profilers that require it.
+ */
+
+/* a function called through method pointers: */
+#define METHODDEF(type)         static type
+/* a function used only in its module: */
+#define LOCAL(type)             static type
+/* a function referenced thru EXTERNs: */
+#define GLOBAL(type)            type
+/* a reference to a GLOBAL function: */
+#define EXTERN(type)            extern type
+
+
+/* This macro is used to declare a "method", that is, a function pointer.
+ * We want to supply prototype parameters if the compiler can cope.
+ * Note that the arglist parameter must be parenthesized!
+ * Again, you can customize this if you need special linkage keywords.
+ */
+
+#ifdef HAVE_PROTOTYPES
+#define JMETHOD(type,methodname,arglist)  type (*methodname) arglist
+#else
+#define JMETHOD(type,methodname,arglist)  type (*methodname) ()
+#endif
+
+
+/* Here is the pseudo-keyword for declaring pointers that must be "far"
+ * on 80x86 machines.  Most of the specialized coding for 80x86 is handled
+ * by just saying "FAR *" where such a pointer is needed.  In a few places
+ * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
+ */
+
+
+#ifndef FAR
+#ifdef NEED_FAR_POINTERS
+#define FAR  far
+#else
+#define FAR
+#endif
+#endif
+
+
+/*
+ * On a few systems, type boolean and/or its values FALSE, TRUE may appear
+ * in standard header files.  Or you may have conflicts with application-
+ * specific header files that you want to include together with these files.
+ * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
+ */
+
+#ifndef HAVE_BOOLEAN
+typedef int boolean;
+#endif
+#ifndef FALSE                   /* in case these macros already exist */
+#define FALSE   0               /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE    1
+#endif
+
+
+/*
+ * The remaining options affect code selection within the JPEG library,
+ * but they don't need to be visible to most applications using the library.
+ * To minimize application namespace pollution, the symbols won't be
+ * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
+ */
+
+#ifdef JPEG_INTERNALS
+#define JPEG_INTERNAL_OPTIONS
+#endif
+
+#ifdef JPEG_INTERNAL_OPTIONS
+
+
+/*
+ * These defines indicate whether to include various optional functions.
+ * Undefining some of these symbols will produce a smaller but less capable
+ * library.  Note that you can leave certain source files out of the
+ * compilation/linking process if you've #undef'd the corresponding symbols.
+ * (You may HAVE to do that if your compiler doesn't like null source files.)
+ */
+
+/* Arithmetic coding is unsupported for legal reasons.  Complaints to IBM. */
+
+/* Capability options common to encoder and decoder: */
+
+#define DCT_ISLOW_SUPPORTED     /* slow but accurate integer algorithm */
+#define DCT_IFAST_SUPPORTED     /* faster, less accurate integer method */
+#define DCT_FLOAT_SUPPORTED     /* floating-point: accurate, fast on fast HW */
+
+/* Encoder capability options: */
+
+#undef  C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */
+#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
+#define C_PROGRESSIVE_SUPPORTED     /* Progressive JPEG? (Requires MULTISCAN)*/
+#define ENTROPY_OPT_SUPPORTED       /* Optimization of entropy coding parms? */
+/* Note: if you selected 12-bit data precision, it is dangerous to turn off
+ * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit
+ * precision, so jchuff.c normally uses entropy optimization to compute
+ * usable tables for higher precision.  If you don't want to do optimization,
+ * you'll have to supply different default Huffman tables.
+ * The exact same statements apply for progressive JPEG: the default tables
+ * don't work for progressive mode.  (This may get fixed, however.)
+ */
+#define INPUT_SMOOTHING_SUPPORTED   /* Input image smoothing option? */
+
+/* Decoder capability options: */
+
+#undef  D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */
+#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
+#define D_PROGRESSIVE_SUPPORTED     /* Progressive JPEG? (Requires MULTISCAN)*/
+#define SAVE_MARKERS_SUPPORTED      /* jpeg_save_markers() needed? */
+#define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */
+#define IDCT_SCALING_SUPPORTED      /* Output rescaling via IDCT? */
+#undef  UPSAMPLE_SCALING_SUPPORTED  /* Output rescaling at upsample stage? */
+#define UPSAMPLE_MERGING_SUPPORTED  /* Fast path for sloppy upsampling? */
+#define QUANT_1PASS_SUPPORTED       /* 1-pass color quantization? */
+#define QUANT_2PASS_SUPPORTED       /* 2-pass color quantization? */
+
+/* more capability options later, no doubt */
+
+
+/*
+ * Ordering of RGB data in scanlines passed to or from the application.
+ * If your application wants to deal with data in the order B,G,R, just
+ * change these macros.  You can also deal with formats such as R,G,B,X
+ * (one extra byte per pixel) by changing RGB_PIXELSIZE.  Note that changing
+ * the offsets will also change the order in which colormap data is organized.
+ * RESTRICTIONS:
+ * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
+ * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
+ *    useful if you are using JPEG color spaces other than YCbCr or grayscale.
+ * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
+ *    is not 3 (they don't understand about dummy color components!).  So you
+ *    can't use color quantization if you change that value.
+ */
+
+#define RGB_RED         0       /* Offset of Red in an RGB scanline element */
+#define RGB_GREEN       1       /* Offset of Green */
+#define RGB_BLUE        2       /* Offset of Blue */
+#define RGB_PIXELSIZE   3       /* JSAMPLEs per RGB scanline element */
+
+
+/* Definitions for speed-related optimizations. */
+
+
+/* If your compiler supports inline functions, define INLINE
+ * as the inline keyword; otherwise define it as empty.
+ */
+
+#ifndef INLINE
+#ifdef __GNUC__                 /* for instance, GNU C knows about inline */
+#define INLINE __inline__
+#endif
+#ifndef INLINE
+#define INLINE                  /* default is to define it as empty */
+#endif
+#endif
+
+
+/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
+ * two 16-bit shorts is faster than multiplying two ints.  Define MULTIPLIER
+ * as short on such a machine.  MULTIPLIER must be at least 16 bits wide.
+ */
+
+#ifndef MULTIPLIER
+#define MULTIPLIER  int         /* type for fastest integer multiply */
+#endif
+
+
+/* FAST_FLOAT should be either float or double, whichever is done faster
+ * by your compiler.  (Note that this type is only used in the floating point
+ * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
+ * Typically, float is faster in ANSI C compilers, while double is faster in
+ * pre-ANSI compilers (because they insist on converting to double anyway).
+ * The code below therefore chooses float if we have ANSI-style prototypes.
+ */
+
+#ifndef FAST_FLOAT
+#ifdef HAVE_PROTOTYPES
+#define FAST_FLOAT  float
+#else
+#define FAST_FLOAT  double
+#endif
+#endif
+
+#endif /* JPEG_INTERNAL_OPTIONS */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jpegint.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,396 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jpegint.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file provides common declarations for the various JPEG modules.
+ * These declarations are considered internal to the JPEG library; most
+ * applications using the library shouldn't need to include this file.
+ */
+
+
+/* Declarations for both compression & decompression */
+
+typedef enum {                  /* Operating modes for buffer controllers */
+        JBUF_PASS_THRU,         /* Plain stripwise operation */
+        /* Remaining modes require a full-image buffer to have been created */
+        JBUF_SAVE_SOURCE,       /* Run source subobject only, save output */
+        JBUF_CRANK_DEST,        /* Run dest subobject only, using saved data */
+        JBUF_SAVE_AND_PASS      /* Run both subobjects, save output */
+} J_BUF_MODE;
+
+/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
+#define CSTATE_START    100     /* after create_compress */
+#define CSTATE_SCANNING 101     /* start_compress done, write_scanlines OK */
+#define CSTATE_RAW_OK   102     /* start_compress done, write_raw_data OK */
+#define CSTATE_WRCOEFS  103     /* jpeg_write_coefficients done */
+#define DSTATE_START    200     /* after create_decompress */
+#define DSTATE_INHEADER 201     /* reading header markers, no SOS yet */
+#define DSTATE_READY    202     /* found SOS, ready for start_decompress */
+#define DSTATE_PRELOAD  203     /* reading multiscan file in start_decompress*/
+#define DSTATE_PRESCAN  204     /* performing dummy pass for 2-pass quant */
+#define DSTATE_SCANNING 205     /* start_decompress done, read_scanlines OK */
+#define DSTATE_RAW_OK   206     /* start_decompress done, read_raw_data OK */
+#define DSTATE_BUFIMAGE 207     /* expecting jpeg_start_output */
+#define DSTATE_BUFPOST  208     /* looking for SOS/EOI in jpeg_finish_output */
+#define DSTATE_RDCOEFS  209     /* reading file in jpeg_read_coefficients */
+#define DSTATE_STOPPING 210     /* looking for EOI in jpeg_finish_decompress */
+
+
+/* Declarations for compression modules */
+
+/* Master control module */
+struct jpeg_comp_master {
+  JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
+  JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
+  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+
+  /* State variables made visible to other modules */
+  boolean call_pass_startup;    /* True if pass_startup must be called */
+  boolean is_last_pass;         /* True during last pass */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_c_main_controller {
+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+  JMETHOD(void, process_data, (j_compress_ptr cinfo,
+                               JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+                               JDIMENSION in_rows_avail));
+};
+
+/* Compression preprocessing (downsampling input buffer control) */
+struct jpeg_c_prep_controller {
+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+  JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
+                                   JSAMPARRAY input_buf,
+                                   JDIMENSION *in_row_ctr,
+                                   JDIMENSION in_rows_avail,
+                                   JSAMPIMAGE output_buf,
+                                   JDIMENSION *out_row_group_ctr,
+                                   JDIMENSION out_row_groups_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_c_coef_controller {
+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+  JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
+                                   JSAMPIMAGE input_buf));
+};
+
+/* Colorspace conversion */
+struct jpeg_color_converter {
+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+  JMETHOD(void, color_convert, (j_compress_ptr cinfo,
+                                JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+                                JDIMENSION output_row, int num_rows));
+};
+
+/* Downsampling */
+struct jpeg_downsampler {
+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+  JMETHOD(void, downsample, (j_compress_ptr cinfo,
+                             JSAMPIMAGE input_buf, JDIMENSION in_row_index,
+                             JSAMPIMAGE output_buf,
+                             JDIMENSION out_row_group_index));
+
+  boolean need_context_rows;    /* TRUE if need rows above & below */
+};
+
+/* Forward DCT (also controls coefficient quantization) */
+struct jpeg_forward_dct {
+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+  /* perhaps this should be an array??? */
+  JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
+                              jpeg_component_info * compptr,
+                              JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+                              JDIMENSION start_row, JDIMENSION start_col,
+                              JDIMENSION num_blocks));
+};
+
+/* Entropy encoding */
+struct jpeg_entropy_encoder {
+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
+  JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
+  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+};
+
+/* Marker writing */
+struct jpeg_marker_writer {
+  JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
+  JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
+  JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
+  JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
+  JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
+  /* These routines are exported to allow insertion of extra markers */
+  /* Probably only COM and APPn markers should be written this way */
+  JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
+                                      unsigned int datalen));
+  JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
+};
+
+
+/* Declarations for decompression modules */
+
+/* Master control module */
+struct jpeg_decomp_master {
+  JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
+  JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
+
+  /* State variables made visible to other modules */
+  boolean is_dummy_pass;        /* True during 1st pass for 2-pass quant */
+};
+
+/* Input control module */
+struct jpeg_input_controller {
+  JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
+  JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
+  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+  JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
+
+  /* State variables made visible to other modules */
+  boolean has_multiple_scans;   /* True if file has multiple scans */
+  boolean eoi_reached;          /* True when EOI has been consumed */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_d_main_controller {
+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+  JMETHOD(void, process_data, (j_decompress_ptr cinfo,
+                               JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+                               JDIMENSION out_rows_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_d_coef_controller {
+  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+  JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
+  JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
+  JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
+                                 JSAMPIMAGE output_buf));
+  /* Pointer to array of coefficient virtual arrays, or NULL if none */
+  jvirt_barray_ptr *coef_arrays;
+};
+
+/* Decompression postprocessing (color quantization buffer control) */
+struct jpeg_d_post_controller {
+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+  JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
+                                    JSAMPIMAGE input_buf,
+                                    JDIMENSION *in_row_group_ctr,
+                                    JDIMENSION in_row_groups_avail,
+                                    JSAMPARRAY output_buf,
+                                    JDIMENSION *out_row_ctr,
+                                    JDIMENSION out_rows_avail));
+};
+
+/* Marker reading & parsing */
+struct jpeg_marker_reader {
+  JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
+  /* Read markers until SOS or EOI.
+   * Returns same codes as are defined for jpeg_consume_input:
+   * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+   */
+  JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
+  /* Read a restart marker --- exported for use by entropy decoder only */
+  jpeg_marker_parser_method read_restart_marker;
+
+  /* State of marker reader --- nominally internal, but applications
+   * supplying COM or APPn handlers might like to know the state.
+   */
+  boolean saw_SOI;              /* found SOI? */
+  boolean saw_SOF;              /* found SOF? */
+  int next_restart_num;         /* next restart number expected (0-7) */
+  unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
+};
+
+/* Entropy decoding */
+struct jpeg_entropy_decoder {
+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+  JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
+                                JBLOCKROW *MCU_data));
+
+  /* This is here to share code between baseline and progressive decoders; */
+  /* other modules probably should not use it */
+  boolean insufficient_data;    /* set TRUE after emitting warning */
+};
+
+/* Inverse DCT (also performs dequantization) */
+typedef JMETHOD(void, inverse_DCT_method_ptr,
+                (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+                 JCOEFPTR coef_block,
+                 JSAMPARRAY output_buf, JDIMENSION output_col));
+
+struct jpeg_inverse_dct {
+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+  /* It is useful to allow each component to have a separate IDCT method. */
+  inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
+};
+
+/* Upsampling (note that upsampler must also call color converter) */
+struct jpeg_upsampler {
+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+  JMETHOD(void, upsample, (j_decompress_ptr cinfo,
+                           JSAMPIMAGE input_buf,
+                           JDIMENSION *in_row_group_ctr,
+                           JDIMENSION in_row_groups_avail,
+                           JSAMPARRAY output_buf,
+                           JDIMENSION *out_row_ctr,
+                           JDIMENSION out_rows_avail));
+
+  boolean need_context_rows;    /* TRUE if need rows above & below */
+};
+
+/* Colorspace conversion */
+struct jpeg_color_deconverter {
+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+  JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
+                                JSAMPIMAGE input_buf, JDIMENSION input_row,
+                                JSAMPARRAY output_buf, int num_rows));
+};
+
+/* Color quantization or color precision reduction */
+struct jpeg_color_quantizer {
+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
+  JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
+                                 JSAMPARRAY input_buf, JSAMPARRAY output_buf,
+                                 int num_rows));
+  JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
+  JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
+};
+
+
+/* Miscellaneous useful macros */
+
+#undef MAX
+#define MAX(a,b)        ((a) > (b) ? (a) : (b))
+#undef MIN
+#define MIN(a,b)        ((a) < (b) ? (a) : (b))
+
+
+/* We assume that right shift corresponds to signed division by 2 with
+ * rounding towards minus infinity.  This is correct for typical "arithmetic
+ * shift" instructions that shift in copies of the sign bit.  But some
+ * C compilers implement >> with an unsigned shift.  For these machines you
+ * must define RIGHT_SHIFT_IS_UNSIGNED.
+ * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
+ * It is only applied with constant shift counts.  SHIFT_TEMPS must be
+ * included in the variables of any routine using RIGHT_SHIFT.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define SHIFT_TEMPS     INT32 shift_temp;
+#define RIGHT_SHIFT(x,shft)  \
+        ((shift_temp = (x)) < 0 ? \
+         (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
+         (shift_temp >> (shft)))
+#else
+#define SHIFT_TEMPS
+#define RIGHT_SHIFT(x,shft)     ((x) >> (shft))
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jinit_compress_master   jICompress
+#define jinit_c_master_control  jICMaster
+#define jinit_c_main_controller jICMainC
+#define jinit_c_prep_controller jICPrepC
+#define jinit_c_coef_controller jICCoefC
+#define jinit_color_converter   jICColor
+#define jinit_downsampler       jIDownsampler
+#define jinit_forward_dct       jIFDCT
+#define jinit_huff_encoder      jIHEncoder
+#define jinit_phuff_encoder     jIPHEncoder
+#define jinit_marker_writer     jIMWriter
+#define jinit_master_decompress jIDMaster
+#define jinit_d_main_controller jIDMainC
+#define jinit_d_coef_controller jIDCoefC
+#define jinit_d_post_controller jIDPostC
+#define jinit_input_controller  jIInCtlr
+#define jinit_marker_reader     jIMReader
+#define jinit_huff_decoder      jIHDecoder
+#define jinit_phuff_decoder     jIPHDecoder
+#define jinit_inverse_dct       jIIDCT
+#define jinit_upsampler         jIUpsampler
+#define jinit_color_deconverter jIDColor
+#define jinit_1pass_quantizer   jI1Quant
+#define jinit_2pass_quantizer   jI2Quant
+#define jinit_merged_upsampler  jIMUpsampler
+#define jinit_memory_mgr        jIMemMgr
+#define jdiv_round_up           jDivRound
+#define jround_up               jRound
+#define jcopy_sample_rows       jCopySamples
+#define jcopy_block_row         jCopyBlocks
+#define jzero_far               jZeroFar
+#define jpeg_zigzag_order       jZIGTable
+#define jpeg_natural_order      jZAGTable
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Compression module initialization routines */
+EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
+                                         boolean transcode_only));
+EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
+                                          boolean need_full_buffer));
+EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
+                                          boolean need_full_buffer));
+EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
+                                          boolean need_full_buffer));
+EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
+/* Decompression module initialization routines */
+EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
+                                          boolean need_full_buffer));
+EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
+                                          boolean need_full_buffer));
+EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
+                                          boolean need_full_buffer));
+EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
+/* Memory manager initialization */
+EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
+
+/* Utility routines in jutils.c */
+EXTERN(long) jdiv_round_up JPP((long a, long b));
+EXTERN(long) jround_up JPP((long a, long b));
+EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
+                                    JSAMPARRAY output_array, int dest_row,
+                                    int num_rows, JDIMENSION num_cols));
+EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
+                                  JDIMENSION num_blocks));
+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
+/* Constant tables in jutils.c */
+#if 0                           /* This table is not actually needed in v6a */
+extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
+#endif
+extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
+
+/* Suppress undefined-structure complaints if necessary. */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef AM_MEMORY_MANAGER       /* only jmemmgr.c defines these */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+#endif
+#endif /* INCOMPLETE_TYPES_BROKEN */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jpeglib.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,1100 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jpeglib.h
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the application interface for the JPEG library.
+ * Most applications using the library need only include this file,
+ * and perhaps jerror.h if they want to know the exact error codes.
+ */
+
+#ifndef JPEGLIB_H
+#define JPEGLIB_H
+
+/*
+ * First we include the configuration files that record how this
+ * installation of the JPEG library is set up.  jconfig.h can be
+ * generated automatically for many systems.  jmorecfg.h contains
+ * manual configuration options that most people need not worry about.
+ */
+
+#ifndef JCONFIG_INCLUDED        /* in case jinclude.h already did */
+#include "jconfig.h"            /* widely used configuration options */
+#endif
+#include "jmorecfg.h"           /* seldom changed options */
+
+
+/* Version ID for the JPEG library.
+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".
+ */
+
+#define JPEG_LIB_VERSION  62    /* Version 6b */
+
+
+/* Various constants determining the sizes of things.
+ * All of these are specified by the JPEG standard, so don't change them
+ * if you want to be compatible.
+ */
+
+#define DCTSIZE             8   /* The basic DCT block is 8x8 samples */
+#define DCTSIZE2            64  /* DCTSIZE squared; # of elements in a block */
+#define NUM_QUANT_TBLS      4   /* Quantization tables are numbered 0..3 */
+#define NUM_HUFF_TBLS       4   /* Huffman tables are numbered 0..3 */
+#define NUM_ARITH_TBLS      16  /* Arith-coding tables are numbered 0..15 */
+#define MAX_COMPS_IN_SCAN   4   /* JPEG limit on # of components in one scan */
+#define MAX_SAMP_FACTOR     4   /* JPEG limit on sampling factors */
+/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;
+ * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.
+ * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU
+ * to handle it.  We even let you do this from the jconfig.h file.  However,
+ * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe
+ * sometimes emits noncompliant files doesn't mean you should too.
+ */
+#define C_MAX_BLOCKS_IN_MCU   10 /* compressor's limit on blocks per MCU */
+#ifndef D_MAX_BLOCKS_IN_MCU
+#define D_MAX_BLOCKS_IN_MCU   10 /* decompressor's limit on blocks per MCU */
+#endif
+
+
+/* Data structures for images (arrays of samples and of DCT coefficients).
+ * On 80x86 machines, the image arrays are too big for near pointers,
+ * but the pointer arrays can fit in near memory.
+ */
+
+typedef JSAMPLE FAR *JSAMPROW;  /* ptr to one image row of pixel samples. */
+typedef JSAMPROW *JSAMPARRAY;   /* ptr to some rows (a 2-D sample array) */
+typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
+
+typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */
+typedef JBLOCK FAR *JBLOCKROW;  /* pointer to one row of coefficient blocks */
+typedef JBLOCKROW *JBLOCKARRAY;         /* a 2-D array of coefficient blocks */
+typedef JBLOCKARRAY *JBLOCKIMAGE;       /* a 3-D array of coefficient blocks */
+
+typedef JCOEF FAR *JCOEFPTR;    /* useful in a couple of places */
+
+
+/* Types for JPEG compression parameters and working tables. */
+
+
+/* DCT coefficient quantization tables. */
+
+typedef struct {
+  /* This array gives the coefficient quantizers in natural array order
+   * (not the zigzag order in which they are stored in a JPEG DQT marker).
+   * CAUTION: IJG versions prior to v6a kept this array in zigzag order.
+   */
+  UINT16 quantval[DCTSIZE2];    /* quantization step for each coefficient */
+  /* This field is used only during compression.  It's initialized FALSE when
+   * the table is created, and set TRUE when it's been output to the file.
+   * You could suppress output of a table by setting this to TRUE.
+   * (See jpeg_suppress_tables for an example.)
+   */
+  boolean sent_table;           /* TRUE when table has been output */
+} JQUANT_TBL;
+
+
+/* Huffman coding tables. */
+
+typedef struct {
+  /* These two fields directly represent the contents of a JPEG DHT marker */
+  UINT8 bits[17];               /* bits[k] = # of symbols with codes of */
+                                /* length k bits; bits[0] is unused */
+  UINT8 huffval[256];           /* The symbols, in order of incr code length */
+  /* This field is used only during compression.  It's initialized FALSE when
+   * the table is created, and set TRUE when it's been output to the file.
+   * You could suppress output of a table by setting this to TRUE.
+   * (See jpeg_suppress_tables for an example.)
+   */
+  boolean sent_table;           /* TRUE when table has been output */
+} JHUFF_TBL;
+
+
+/* Basic info about one component (color channel). */
+
+typedef struct {
+  /* These values are fixed over the whole image. */
+  /* For compression, they must be supplied by parameter setup; */
+  /* for decompression, they are read from the SOF marker. */
+  int component_id;             /* identifier for this component (0..255) */
+  int component_index;          /* its index in SOF or cinfo->comp_info[] */
+  int h_samp_factor;            /* horizontal sampling factor (1..4) */
+  int v_samp_factor;            /* vertical sampling factor (1..4) */
+  int quant_tbl_no;             /* quantization table selector (0..3) */
+  /* These values may vary between scans. */
+  /* For compression, they must be supplied by parameter setup; */
+  /* for decompression, they are read from the SOS marker. */
+  /* The decompressor output side may not use these variables. */
+  int dc_tbl_no;                /* DC entropy table selector (0..3) */
+  int ac_tbl_no;                /* AC entropy table selector (0..3) */
+
+  /* Remaining fields should be treated as private by applications. */
+
+  /* These values are computed during compression or decompression startup: */
+  /* Component's size in DCT blocks.
+   * Any dummy blocks added to complete an MCU are not counted; therefore
+   * these values do not depend on whether a scan is interleaved or not.
+   */
+  JDIMENSION width_in_blocks;
+  JDIMENSION height_in_blocks;
+  /* Size of a DCT block in samples.  Always DCTSIZE for compression.
+   * For decompression this is the size of the output from one DCT block,
+   * reflecting any scaling we choose to apply during the IDCT step.
+   * Values of 1,2,4,8 are likely to be supported.  Note that different
+   * components may receive different IDCT scalings.
+   */
+  int DCT_scaled_size;
+  /* The downsampled dimensions are the component's actual, unpadded number
+   * of samples at the main buffer (preprocessing/compression interface), thus
+   * downsampled_width = ceil(image_width * Hi/Hmax)
+   * and similarly for height.  For decompression, IDCT scaling is included, so
+   * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)
+   */
+  JDIMENSION downsampled_width;  /* actual width in samples */
+  JDIMENSION downsampled_height; /* actual height in samples */
+  /* This flag is used only for decompression.  In cases where some of the
+   * components will be ignored (eg grayscale output from YCbCr image),
+   * we can skip most computations for the unused components.
+   */
+  boolean component_needed;     /* do we need the value of this component? */
+
+  /* These values are computed before starting a scan of the component. */
+  /* The decompressor output side may not use these variables. */
+  int MCU_width;                /* number of blocks per MCU, horizontally */
+  int MCU_height;               /* number of blocks per MCU, vertically */
+  int MCU_blocks;               /* MCU_width * MCU_height */
+  int MCU_sample_width;         /* MCU width in samples, MCU_width*DCT_scaled_size */
+  int last_col_width;           /* # of non-dummy blocks across in last MCU */
+  int last_row_height;          /* # of non-dummy blocks down in last MCU */
+
+  /* Saved quantization table for component; NULL if none yet saved.
+   * See jdinput.c comments about the need for this information.
+   * This field is currently used only for decompression.
+   */
+  JQUANT_TBL * quant_table;
+
+  /* Private per-component storage for DCT or IDCT subsystem. */
+  void * dct_table;
+} jpeg_component_info;
+
+
+/* The script for encoding a multiple-scan file is an array of these: */
+
+typedef struct {
+  int comps_in_scan;            /* number of components encoded in this scan */
+  int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */
+  int Ss, Se;                   /* progressive JPEG spectral selection parms */
+  int Ah, Al;                   /* progressive JPEG successive approx. parms */
+} jpeg_scan_info;
+
+/* The decompressor can save APPn and COM markers in a list of these: */
+
+typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr;
+
+struct jpeg_marker_struct {
+  jpeg_saved_marker_ptr next;   /* next in list, or NULL */
+  UINT8 marker;                 /* marker code: JPEG_COM, or JPEG_APP0+n */
+  unsigned int original_length; /* # bytes of data in the file */
+  unsigned int data_length;     /* # bytes of data saved at data[] */
+  JOCTET FAR * data;            /* the data contained in the marker */
+  /* the marker length word is not counted in data_length or original_length */
+};
+
+/* Known color spaces. */
+
+typedef enum {
+        JCS_UNKNOWN,            /* error/unspecified */
+        JCS_GRAYSCALE,          /* monochrome */
+        JCS_RGB,                /* red/green/blue */
+        JCS_YCbCr,              /* Y/Cb/Cr (also known as YUV) */
+        JCS_CMYK,               /* C/M/Y/K */
+        JCS_YCCK                /* Y/Cb/Cr/K */
+} J_COLOR_SPACE;
+
+/* DCT/IDCT algorithm options. */
+
+typedef enum {
+        JDCT_ISLOW,             /* slow but accurate integer algorithm */
+        JDCT_IFAST,             /* faster, less accurate integer method */
+        JDCT_FLOAT              /* floating-point: accurate, fast on fast HW */
+} J_DCT_METHOD;
+
+#ifndef JDCT_DEFAULT            /* may be overridden in jconfig.h */
+#define JDCT_DEFAULT  JDCT_ISLOW
+#endif
+#ifndef JDCT_FASTEST            /* may be overridden in jconfig.h */
+#define JDCT_FASTEST  JDCT_IFAST
+#endif
+
+/* Dithering options for decompression. */
+
+typedef enum {
+        JDITHER_NONE,           /* no dithering */
+        JDITHER_ORDERED,        /* simple ordered dither */
+        JDITHER_FS              /* Floyd-Steinberg error diffusion dither */
+} J_DITHER_MODE;
+
+
+/* Common fields between JPEG compression and decompression master structs. */
+
+#define jpeg_common_fields \
+  struct jpeg_error_mgr * err;  /* Error handler module */\
+  struct jpeg_memory_mgr * mem; /* Memory manager module */\
+  struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\
+  void * client_data;           /* Available for use by application */\
+  boolean is_decompressor;      /* So common code can tell which is which */\
+  int global_state              /* For checking call sequence validity */
+
+/* Routines that are to be used by both halves of the library are declared
+ * to receive a pointer to this structure.  There are no actual instances of
+ * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.
+ */
+struct jpeg_common_struct {
+  jpeg_common_fields;           /* Fields common to both master struct types */
+  /* Additional fields follow in an actual jpeg_compress_struct or
+   * jpeg_decompress_struct.  All three structs must agree on these
+   * initial fields!  (This would be a lot cleaner in C++.)
+   */
+};
+
+typedef struct jpeg_common_struct * j_common_ptr;
+typedef struct jpeg_compress_struct * j_compress_ptr;
+typedef struct jpeg_decompress_struct * j_decompress_ptr;
+
+
+/* Master record for a compression instance */
+
+struct jpeg_compress_struct {
+  jpeg_common_fields;           /* Fields shared with jpeg_decompress_struct */
+
+  /* Destination for compressed data */
+  struct jpeg_destination_mgr * dest;
+
+  /* Description of source image --- these fields must be filled in by
+   * outer application before starting compression.  in_color_space must
+   * be correct before you can even call jpeg_set_defaults().
+   */
+
+  JDIMENSION image_width;       /* input image width */
+  JDIMENSION image_height;      /* input image height */
+  int input_components;         /* # of color components in input image */
+  J_COLOR_SPACE in_color_space; /* colorspace of input image */
+
+  double input_gamma;           /* image gamma of input image */
+
+  /* Compression parameters --- these fields must be set before calling
+   * jpeg_start_compress().  We recommend calling jpeg_set_defaults() to
+   * initialize everything to reasonable defaults, then changing anything
+   * the application specifically wants to change.  That way you won't get
+   * burnt when new parameters are added.  Also note that there are several
+   * helper routines to simplify changing parameters.
+   */
+
+  int data_precision;           /* bits of precision in image data */
+
+  int num_components;           /* # of color components in JPEG image */
+  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
+
+  jpeg_component_info * comp_info;
+  /* comp_info[i] describes component that appears i'th in SOF */
+
+  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
+  /* ptrs to coefficient quantization tables, or NULL if not defined */
+
+  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
+  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
+  /* ptrs to Huffman coding tables, or NULL if not defined */
+
+  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
+  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
+  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
+
+  int num_scans;                /* # of entries in scan_info array */
+  const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */
+  /* The default value of scan_info is NULL, which causes a single-scan
+   * sequential JPEG file to be emitted.  To create a multi-scan file,
+   * set num_scans and scan_info to point to an array of scan definitions.
+   */
+
+  boolean raw_data_in;          /* TRUE=caller supplies downsampled data */
+  boolean arith_code;           /* TRUE=arithmetic coding, FALSE=Huffman */
+  boolean optimize_coding;      /* TRUE=optimize entropy encoding parms */
+  boolean CCIR601_sampling;     /* TRUE=first samples are cosited */
+  int smoothing_factor;         /* 1..100, or 0 for no input smoothing */
+  J_DCT_METHOD dct_method;      /* DCT algorithm selector */
+
+  /* The restart interval can be specified in absolute MCUs by setting
+   * restart_interval, or in MCU rows by setting restart_in_rows
+   * (in which case the correct restart_interval will be figured
+   * for each scan).
+   */
+  unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */
+  int restart_in_rows;          /* if > 0, MCU rows per restart interval */
+
+  /* Parameters controlling emission of special markers. */
+
+  boolean write_JFIF_header;    /* should a JFIF marker be written? */
+  UINT8 JFIF_major_version;     /* What to write for the JFIF version number */
+  UINT8 JFIF_minor_version;
+  /* These three values are not used by the JPEG code, merely copied */
+  /* into the JFIF APP0 marker.  density_unit can be 0 for unknown, */
+  /* 1 for dots/inch, or 2 for dots/cm.  Note that the pixel aspect */
+  /* ratio is defined by X_density/Y_density even when density_unit=0. */
+  UINT8 density_unit;           /* JFIF code for pixel size units */
+  UINT16 X_density;             /* Horizontal pixel density */
+  UINT16 Y_density;             /* Vertical pixel density */
+  boolean write_Adobe_marker;   /* should an Adobe marker be written? */
+
+  /* State variable: index of next scanline to be written to
+   * jpeg_write_scanlines().  Application may use this to control its
+   * processing loop, e.g., "while (next_scanline < image_height)".
+   */
+
+  JDIMENSION next_scanline;     /* 0 .. image_height-1  */
+
+  /* Remaining fields are known throughout compressor, but generally
+   * should not be touched by a surrounding application.
+   */
+
+  /*
+   * These fields are computed during compression startup
+   */
+  boolean progressive_mode;     /* TRUE if scan script uses progressive mode */
+  int max_h_samp_factor;        /* largest h_samp_factor */
+  int max_v_samp_factor;        /* largest v_samp_factor */
+
+  JDIMENSION total_iMCU_rows;   /* # of iMCU rows to be input to coef ctlr */
+  /* The coefficient controller receives data in units of MCU rows as defined
+   * for fully interleaved scans (whether the JPEG file is interleaved or not).
+   * There are v_samp_factor * DCTSIZE sample rows of each component in an
+   * "iMCU" (interleaved MCU) row.
+   */
+
+  /*
+   * These fields are valid during any one scan.
+   * They describe the components and MCUs actually appearing in the scan.
+   */
+  int comps_in_scan;            /* # of JPEG components in this scan */
+  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
+  /* *cur_comp_info[i] describes component that appears i'th in SOS */
+
+  JDIMENSION MCUs_per_row;      /* # of MCUs across the image */
+  JDIMENSION MCU_rows_in_scan;  /* # of MCU rows in the image */
+
+  int blocks_in_MCU;            /* # of DCT blocks per MCU */
+  int MCU_membership[C_MAX_BLOCKS_IN_MCU];
+  /* MCU_membership[i] is index in cur_comp_info of component owning */
+  /* i'th block in an MCU */
+
+  int Ss, Se, Ah, Al;           /* progressive JPEG parameters for scan */
+
+  /*
+   * Links to compression subobjects (methods and private variables of modules)
+   */
+  struct jpeg_comp_master * master;
+  struct jpeg_c_main_controller * main;
+  struct jpeg_c_prep_controller * prep;
+  struct jpeg_c_coef_controller * coef;
+  struct jpeg_marker_writer * marker;
+  struct jpeg_color_converter * cconvert;
+  struct jpeg_downsampler * downsample;
+  struct jpeg_forward_dct * fdct;
+  struct jpeg_entropy_encoder * entropy;
+  jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */
+  int script_space_size;
+};
+
+
+/* Master record for a decompression instance */
+
+struct jpeg_decompress_struct {
+  jpeg_common_fields;           /* Fields shared with jpeg_compress_struct */
+
+  /* Source of compressed data */
+  struct jpeg_source_mgr * src;
+
+  /* Basic description of image --- filled in by jpeg_read_header(). */
+  /* Application may inspect these values to decide how to process image. */
+
+  JDIMENSION image_width;       /* nominal image width (from SOF marker) */
+  JDIMENSION image_height;      /* nominal image height */
+  int num_components;           /* # of color components in JPEG image */
+  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
+
+  /* Decompression processing parameters --- these fields must be set before
+   * calling jpeg_start_decompress().  Note that jpeg_read_header() initializes
+   * them to default values.
+   */
+
+  J_COLOR_SPACE out_color_space; /* colorspace for output */
+
+  unsigned int scale_num, scale_denom; /* fraction by which to scale image */
+
+  double output_gamma;          /* image gamma wanted in output */
+
+  boolean buffered_image;       /* TRUE=multiple output passes */
+  boolean raw_data_out;         /* TRUE=downsampled data wanted */
+
+  J_DCT_METHOD dct_method;      /* IDCT algorithm selector */
+  boolean do_fancy_upsampling;  /* TRUE=apply fancy upsampling */
+  boolean do_block_smoothing;   /* TRUE=apply interblock smoothing */
+
+  boolean quantize_colors;      /* TRUE=colormapped output wanted */
+  /* the following are ignored if not quantize_colors: */
+  J_DITHER_MODE dither_mode;    /* type of color dithering to use */
+  boolean two_pass_quantize;    /* TRUE=use two-pass color quantization */
+  int desired_number_of_colors; /* max # colors to use in created colormap */
+  /* these are significant only in buffered-image mode: */
+  boolean enable_1pass_quant;   /* enable future use of 1-pass quantizer */
+  boolean enable_external_quant;/* enable future use of external colormap */
+  boolean enable_2pass_quant;   /* enable future use of 2-pass quantizer */
+
+  /* Description of actual output image that will be returned to application.
+   * These fields are computed by jpeg_start_decompress().
+   * You can also use jpeg_calc_output_dimensions() to determine these values
+   * in advance of calling jpeg_start_decompress().
+   */
+
+  JDIMENSION output_width;      /* scaled image width */
+  JDIMENSION output_height;     /* scaled image height */
+  int out_color_components;     /* # of color components in out_color_space */
+  int output_components;        /* # of color components returned */
+  /* output_components is 1 (a colormap index) when quantizing colors;
+   * otherwise it equals out_color_components.
+   */
+  int rec_outbuf_height;        /* min recommended height of scanline buffer */
+  /* If the buffer passed to jpeg_read_scanlines() is less than this many rows
+   * high, space and time will be wasted due to unnecessary data copying.
+   * Usually rec_outbuf_height will be 1 or 2, at most 4.
+   */
+
+  /* When quantizing colors, the output colormap is described by these fields.
+   * The application can supply a colormap by setting colormap non-NULL before
+   * calling jpeg_start_decompress; otherwise a colormap is created during
+   * jpeg_start_decompress or jpeg_start_output.
+   * The map has out_color_components rows and actual_number_of_colors columns.
+   */
+  int actual_number_of_colors;  /* number of entries in use */
+  JSAMPARRAY colormap;          /* The color map as a 2-D pixel array */
+
+  /* State variables: these variables indicate the progress of decompression.
+   * The application may examine these but must not modify them.
+   */
+
+  /* Row index of next scanline to be read from jpeg_read_scanlines().
+   * Application may use this to control its processing loop, e.g.,
+   * "while (output_scanline < output_height)".
+   */
+  JDIMENSION output_scanline;   /* 0 .. output_height-1  */
+
+  /* Current input scan number and number of iMCU rows completed in scan.
+   * These indicate the progress of the decompressor input side.
+   */
+  int input_scan_number;        /* Number of SOS markers seen so far */
+  JDIMENSION input_iMCU_row;    /* Number of iMCU rows completed */
+
+  /* The "output scan number" is the notional scan being displayed by the
+   * output side.  The decompressor will not allow output scan/row number
+   * to get ahead of input scan/row, but it can fall arbitrarily far behind.
+   */
+  int output_scan_number;       /* Nominal scan number being displayed */
+  JDIMENSION output_iMCU_row;   /* Number of iMCU rows read */
+
+  /* Current progression status.  coef_bits[c][i] indicates the precision
+   * with which component c's DCT coefficient i (in zigzag order) is known.
+   * It is -1 when no data has yet been received, otherwise it is the point
+   * transform (shift) value for the most recent scan of the coefficient
+   * (thus, 0 at completion of the progression).
+   * This pointer is NULL when reading a non-progressive file.
+   */
+  int (*coef_bits)[DCTSIZE2];   /* -1 or current Al value for each coef */
+
+  /* Internal JPEG parameters --- the application usually need not look at
+   * these fields.  Note that the decompressor output side may not use
+   * any parameters that can change between scans.
+   */
+
+  /* Quantization and Huffman tables are carried forward across input
+   * datastreams when processing abbreviated JPEG datastreams.
+   */
+
+  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
+  /* ptrs to coefficient quantization tables, or NULL if not defined */
+
+  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
+  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
+  /* ptrs to Huffman coding tables, or NULL if not defined */
+
+  /* These parameters are never carried across datastreams, since they
+   * are given in SOF/SOS markers or defined to be reset by SOI.
+   */
+
+  int data_precision;           /* bits of precision in image data */
+
+  jpeg_component_info * comp_info;
+  /* comp_info[i] describes component that appears i'th in SOF */
+
+  boolean progressive_mode;     /* TRUE if SOFn specifies progressive mode */
+  boolean arith_code;           /* TRUE=arithmetic coding, FALSE=Huffman */
+
+  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
+  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
+  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
+
+  unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */
+
+  /* These fields record data obtained from optional markers recognized by
+   * the JPEG library.
+   */
+  boolean saw_JFIF_marker;      /* TRUE iff a JFIF APP0 marker was found */
+  /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */
+  UINT8 JFIF_major_version;     /* JFIF version number */
+  UINT8 JFIF_minor_version;
+  UINT8 density_unit;           /* JFIF code for pixel size units */
+  UINT16 X_density;             /* Horizontal pixel density */
+  UINT16 Y_density;             /* Vertical pixel density */
+  boolean saw_Adobe_marker;     /* TRUE iff an Adobe APP14 marker was found */
+  UINT8 Adobe_transform;        /* Color transform code from Adobe marker */
+
+  boolean CCIR601_sampling;     /* TRUE=first samples are cosited */
+
+  /* Aside from the specific data retained from APPn markers known to the
+   * library, the uninterpreted contents of any or all APPn and COM markers
+   * can be saved in a list for examination by the application.
+   */
+  jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */
+
+  /* Remaining fields are known throughout decompressor, but generally
+   * should not be touched by a surrounding application.
+   */
+
+  /*
+   * These fields are computed during decompression startup
+   */
+  int max_h_samp_factor;        /* largest h_samp_factor */
+  int max_v_samp_factor;        /* largest v_samp_factor */
+
+  int min_DCT_scaled_size;      /* smallest DCT_scaled_size of any component */
+
+  JDIMENSION total_iMCU_rows;   /* # of iMCU rows in image */
+  /* The coefficient controller's input and output progress is measured in
+   * units of "iMCU" (interleaved MCU) rows.  These are the same as MCU rows
+   * in fully interleaved JPEG scans, but are used whether the scan is
+   * interleaved or not.  We define an iMCU row as v_samp_factor DCT block
+   * rows of each component.  Therefore, the IDCT output contains
+   * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.
+   */
+
+  JSAMPLE * sample_range_limit; /* table for fast range-limiting */
+
+  /*
+   * These fields are valid during any one scan.
+   * They describe the components and MCUs actually appearing in the scan.
+   * Note that the decompressor output side must not use these fields.
+   */
+  int comps_in_scan;            /* # of JPEG components in this scan */
+  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
+  /* *cur_comp_info[i] describes component that appears i'th in SOS */
+
+  JDIMENSION MCUs_per_row;      /* # of MCUs across the image */
+  JDIMENSION MCU_rows_in_scan;  /* # of MCU rows in the image */
+
+  int blocks_in_MCU;            /* # of DCT blocks per MCU */
+  int MCU_membership[D_MAX_BLOCKS_IN_MCU];
+  /* MCU_membership[i] is index in cur_comp_info of component owning */
+  /* i'th block in an MCU */
+
+  int Ss, Se, Ah, Al;           /* progressive JPEG parameters for scan */
+
+  /* This field is shared between entropy decoder and marker parser.
+   * It is either zero or the code of a JPEG marker that has been
+   * read from the data source, but has not yet been processed.
+   */
+  int unread_marker;
+
+  /*
+   * Links to decompression subobjects (methods, private variables of modules)
+   */
+  struct jpeg_decomp_master * master;
+  struct jpeg_d_main_controller * main;
+  struct jpeg_d_coef_controller * coef;
+  struct jpeg_d_post_controller * post;
+  struct jpeg_input_controller * inputctl;
+  struct jpeg_marker_reader * marker;
+  struct jpeg_entropy_decoder * entropy;
+  struct jpeg_inverse_dct * idct;
+  struct jpeg_upsampler * upsample;
+  struct jpeg_color_deconverter * cconvert;
+  struct jpeg_color_quantizer * cquantize;
+};
+
+
+/* "Object" declarations for JPEG modules that may be supplied or called
+ * directly by the surrounding application.
+ * As with all objects in the JPEG library, these structs only define the
+ * publicly visible methods and state variables of a module.  Additional
+ * private fields may exist after the public ones.
+ */
+
+
+/* Error handler object */
+
+struct jpeg_error_mgr {
+  /* Error exit handler: does not return to caller */
+  JMETHOD(void, error_exit, (j_common_ptr cinfo));
+  /* Conditionally emit a trace or warning message */
+  JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
+  /* Routine that actually outputs a trace or error message */
+  JMETHOD(void, output_message, (j_common_ptr cinfo));
+  /* Format a message string for the most recent JPEG error or message */
+  JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
+#define JMSG_LENGTH_MAX  200    /* recommended size of format_message buffer */
+  /* Reset error state variables at start of a new image */
+  JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
+
+  /* The message ID code and any parameters are saved here.
+   * A message can have one string parameter or up to 8 int parameters.
+   */
+  int msg_code;
+#define JMSG_STR_PARM_MAX  80
+  union {
+    int i[8];
+    char s[JMSG_STR_PARM_MAX];
+  } msg_parm;
+
+  /* Standard state variables for error facility */
+
+  int trace_level;              /* max msg_level that will be displayed */
+
+  /* For recoverable corrupt-data errors, we emit a warning message,
+   * but keep going unless emit_message chooses to abort.  emit_message
+   * should count warnings in num_warnings.  The surrounding application
+   * can check for bad data by seeing if num_warnings is nonzero at the
+   * end of processing.
+   */
+  long num_warnings;            /* number of corrupt-data warnings */
+
+  /* These fields point to the table(s) of error message strings.
+   * An application can change the table pointer to switch to a different
+   * message list (typically, to change the language in which errors are
+   * reported).  Some applications may wish to add additional error codes
+   * that will be handled by the JPEG library error mechanism; the second
+   * table pointer is used for this purpose.
+   *
+   * First table includes all errors generated by JPEG library itself.
+   * Error code 0 is reserved for a "no such error string" message.
+   */
+  const char * const * jpeg_message_table; /* Library errors */
+  int last_jpeg_message;    /* Table contains strings 0..last_jpeg_message */
+  /* Second table can be added by application (see cjpeg/djpeg for example).
+   * It contains strings numbered first_addon_message..last_addon_message.
+   */
+  const char * const * addon_message_table; /* Non-library errors */
+  int first_addon_message;      /* code for first string in addon table */
+  int last_addon_message;       /* code for last string in addon table */
+};
+
+
+/* Progress monitor object */
+
+struct jpeg_progress_mgr {
+  JMETHOD(void, progress_monitor, (j_common_ptr cinfo));
+
+  long pass_counter;            /* work units completed in this pass */
+  long pass_limit;              /* total number of work units in this pass */
+  int completed_passes;         /* passes completed so far */
+  int total_passes;             /* total number of passes expected */
+};
+
+
+/* Data destination object for compression */
+
+struct jpeg_destination_mgr {
+  JOCTET * next_output_byte;    /* => next byte to write in buffer */
+  size_t free_in_buffer;        /* # of byte spaces remaining in buffer */
+
+  JMETHOD(void, init_destination, (j_compress_ptr cinfo));
+  JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));
+  JMETHOD(void, term_destination, (j_compress_ptr cinfo));
+};
+
+
+/* Data source object for decompression */
+
+struct jpeg_source_mgr {
+  const JOCTET * next_input_byte; /* => next byte to read from buffer */
+  size_t bytes_in_buffer;       /* # of bytes remaining in buffer */
+
+  JMETHOD(void, init_source, (j_decompress_ptr cinfo));
+  JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
+  JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
+  JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
+  JMETHOD(void, term_source, (j_decompress_ptr cinfo));
+};
+
+
+/* Memory manager object.
+ * Allocates "small" objects (a few K total), "large" objects (tens of K),
+ * and "really big" objects (virtual arrays with backing store if needed).
+ * The memory manager does not allow individual objects to be freed; rather,
+ * each created object is assigned to a pool, and whole pools can be freed
+ * at once.  This is faster and more convenient than remembering exactly what
+ * to free, especially where malloc()/free() are not too speedy.
+ * NB: alloc routines never return NULL.  They exit to error_exit if not
+ * successful.
+ */
+
+#define JPOOL_PERMANENT 0       /* lasts until master record is destroyed */
+#define JPOOL_IMAGE     1       /* lasts until done with image/datastream */
+#define JPOOL_NUMPOOLS  2
+
+typedef struct jvirt_sarray_control * jvirt_sarray_ptr;
+typedef struct jvirt_barray_control * jvirt_barray_ptr;
+
+
+struct jpeg_memory_mgr {
+  /* Method pointers */
+  JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,
+                                size_t sizeofobject));
+  JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id,
+                                     size_t sizeofobject));
+  JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,
+                                     JDIMENSION samplesperrow,
+                                     JDIMENSION numrows));
+  JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,
+                                      JDIMENSION blocksperrow,
+                                      JDIMENSION numrows));
+  JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,
+                                                  int pool_id,
+                                                  boolean pre_zero,
+                                                  JDIMENSION samplesperrow,
+                                                  JDIMENSION numrows,
+                                                  JDIMENSION maxaccess));
+  JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,
+                                                  int pool_id,
+                                                  boolean pre_zero,
+                                                  JDIMENSION blocksperrow,
+                                                  JDIMENSION numrows,
+                                                  JDIMENSION maxaccess));
+  JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));
+  JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,
+                                           jvirt_sarray_ptr ptr,
+                                           JDIMENSION start_row,
+                                           JDIMENSION num_rows,
+                                           boolean writable));
+  JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,
+                                            jvirt_barray_ptr ptr,
+                                            JDIMENSION start_row,
+                                            JDIMENSION num_rows,
+                                            boolean writable));
+  JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));
+  JMETHOD(void, self_destruct, (j_common_ptr cinfo));
+
+  /* Limit on memory allocation for this JPEG object.  (Note that this is
+   * merely advisory, not a guaranteed maximum; it only affects the space
+   * used for virtual-array buffers.)  May be changed by outer application
+   * after creating the JPEG object.
+   */
+  size_t max_memory_to_use;
+
+  /* Maximum allocation request accepted by alloc_large. */
+  size_t max_alloc_chunk;
+};
+
+
+/* Routine signature for application-supplied marker processing methods.
+ * Need not pass marker code since it is stored in cinfo->unread_marker.
+ */
+typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
+
+
+/* Declarations for routines called by application.
+ * The JPP macro hides prototype parameters from compilers that can't cope.
+ * Note JPP requires double parentheses.
+ */
+
+#ifdef HAVE_PROTOTYPES
+#define JPP(arglist)    arglist
+#else
+#define JPP(arglist)    ()
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers.
+ * We shorten external names to be unique in the first six letters, which
+ * is good enough for all known systems.
+ * (If your compiler itself needs names to be unique in less than 15
+ * characters, you are out of luck.  Get a better compiler.)
+ */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_std_error          jStdError
+#define jpeg_CreateCompress     jCreaCompress
+#define jpeg_CreateDecompress   jCreaDecompress
+#define jpeg_destroy_compress   jDestCompress
+#define jpeg_destroy_decompress jDestDecompress
+#define jpeg_stdio_dest         jStdDest
+#define jpeg_stdio_src          jStdSrc
+#define jpeg_set_defaults       jSetDefaults
+#define jpeg_set_colorspace     jSetColorspace
+#define jpeg_default_colorspace jDefColorspace
+#define jpeg_set_quality        jSetQuality
+#define jpeg_set_linear_quality jSetLQuality
+#define jpeg_add_quant_table    jAddQuantTable
+#define jpeg_quality_scaling    jQualityScaling
+#define jpeg_simple_progression jSimProgress
+#define jpeg_suppress_tables    jSuppressTables
+#define jpeg_alloc_quant_table  jAlcQTable
+#define jpeg_alloc_huff_table   jAlcHTable
+#define jpeg_start_compress     jStrtCompress
+#define jpeg_write_scanlines    jWrtScanlines
+#define jpeg_finish_compress    jFinCompress
+#define jpeg_write_raw_data     jWrtRawData
+#define jpeg_write_marker       jWrtMarker
+#define jpeg_write_m_header     jWrtMHeader
+#define jpeg_write_m_byte       jWrtMByte
+#define jpeg_write_tables       jWrtTables
+#define jpeg_read_header        jReadHeader
+#define jpeg_start_decompress   jStrtDecompress
+#define jpeg_read_scanlines     jReadScanlines
+#define jpeg_finish_decompress  jFinDecompress
+#define jpeg_read_raw_data      jReadRawData
+#define jpeg_has_multiple_scans jHasMultScn
+#define jpeg_start_output       jStrtOutput
+#define jpeg_finish_output      jFinOutput
+#define jpeg_input_complete     jInComplete
+#define jpeg_new_colormap       jNewCMap
+#define jpeg_consume_input      jConsumeInput
+#define jpeg_calc_output_dimensions     jCalcDimensions
+#define jpeg_save_markers       jSaveMarkers
+#define jpeg_set_marker_processor       jSetMarker
+#define jpeg_read_coefficients  jReadCoefs
+#define jpeg_write_coefficients jWrtCoefs
+#define jpeg_copy_critical_parameters   jCopyCrit
+#define jpeg_abort_compress     jAbrtCompress
+#define jpeg_abort_decompress   jAbrtDecompress
+#define jpeg_abort              jAbort
+#define jpeg_destroy            jDestroy
+#define jpeg_resync_to_restart  jResyncRestart
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Default error-management setup */
+EXTERN(struct jpeg_error_mgr *) jpeg_std_error
+        JPP((struct jpeg_error_mgr * err));
+
+/* Initialization of JPEG compression objects.
+ * jpeg_create_compress() and jpeg_create_decompress() are the exported
+ * names that applications should call.  These expand to calls on
+ * jpeg_CreateCompress and jpeg_CreateDecompress with additional information
+ * passed for version mismatch checking.
+ * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.
+ */
+#define jpeg_create_compress(cinfo) \
+    jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \
+                        (size_t) sizeof(struct jpeg_compress_struct))
+#define jpeg_create_decompress(cinfo) \
+    jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
+                          (size_t) sizeof(struct jpeg_decompress_struct))
+EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,
+                                      int version, size_t structsize));
+EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,
+                                        int version, size_t structsize));
+/* Destruction of JPEG compression objects */
+EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));
+
+/* Standard data source and destination managers: stdio streams. */
+/* Caller is responsible for opening the file before and closing after. */
+EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
+EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
+
+/* Default parameter setup for compression */
+EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
+/* Compression parameter setup aids */
+EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,
+                                      J_COLOR_SPACE colorspace));
+EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,
+                                   boolean force_baseline));
+EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,
+                                          int scale_factor,
+                                          boolean force_baseline));
+EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,
+                                       const unsigned int *basic_table,
+                                       int scale_factor,
+                                       boolean force_baseline));
+EXTERN(int) jpeg_quality_scaling JPP((int quality));
+EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
+                                       boolean suppress));
+EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
+EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
+
+/* Main entry points for compression */
+EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
+                                      boolean write_all_tables));
+EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,
+                                             JSAMPARRAY scanlines,
+                                             JDIMENSION num_lines));
+EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));
+
+/* Replaces jpeg_write_scanlines when writing raw downsampled data. */
+EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,
+                                            JSAMPIMAGE data,
+                                            JDIMENSION num_lines));
+
+/* Write a special marker.  See libjpeg.doc concerning safe usage. */
+EXTERN(void) jpeg_write_marker
+        JPP((j_compress_ptr cinfo, int marker,
+             const JOCTET * dataptr, unsigned int datalen));
+/* Same, but piecemeal. */
+EXTERN(void) jpeg_write_m_header
+        JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));
+EXTERN(void) jpeg_write_m_byte
+        JPP((j_compress_ptr cinfo, int val));
+
+/* Alternate compression function: just write an abbreviated table file */
+EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));
+
+/* Decompression startup: read start of JPEG datastream to see what's there */
+EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
+                                  boolean require_image));
+/* Return value is one of: */
+#define JPEG_SUSPENDED          0 /* Suspended due to lack of input data */
+#define JPEG_HEADER_OK          1 /* Found valid image datastream */
+#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */
+/* If you pass require_image = TRUE (normal case), you need not check for
+ * a TABLES_ONLY return code; an abbreviated file will cause an error exit.
+ * JPEG_SUSPENDED is only possible if you use a data source module that can
+ * give a suspension return (the stdio source module doesn't).
+ */
+
+/* Main entry points for decompression */
+EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,
+                                            JSAMPARRAY scanlines,
+                                            JDIMENSION max_lines));
+EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));
+
+/* Replaces jpeg_read_scanlines when reading raw downsampled data. */
+EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,
+                                           JSAMPIMAGE data,
+                                           JDIMENSION max_lines));
+
+/* Additional entry points for buffered-image mode. */
+EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));
+EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,
+                                       int scan_number));
+EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));
+EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));
+EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));
+EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));
+/* Return value is one of: */
+/* #define JPEG_SUSPENDED       0    Suspended due to lack of input data */
+#define JPEG_REACHED_SOS        1 /* Reached start of new scan */
+#define JPEG_REACHED_EOI        2 /* Reached end of image */
+#define JPEG_ROW_COMPLETED      3 /* Completed one iMCU row */
+#define JPEG_SCAN_COMPLETED     4 /* Completed last iMCU row of a scan */
+
+/* Precalculate output dimensions for current decompression parameters. */
+EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));
+
+/* Control saving of COM and APPn markers into marker_list. */
+EXTERN(void) jpeg_save_markers
+        JPP((j_decompress_ptr cinfo, int marker_code,
+             unsigned int length_limit));
+
+/* Install a special processing method for COM or APPn markers. */
+EXTERN(void) jpeg_set_marker_processor
+        JPP((j_decompress_ptr cinfo, int marker_code,
+             jpeg_marker_parser_method routine));
+
+/* Read or write raw DCT coefficients --- useful for lossless transcoding. */
+EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));
+EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,
+                                          jvirt_barray_ptr * coef_arrays));
+EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,
+                                                j_compress_ptr dstinfo));
+
+/* If you choose to abort compression or decompression before completing
+ * jpeg_finish_(de)compress, then you need to clean up to release memory,
+ * temporary files, etc.  You can just call jpeg_destroy_(de)compress
+ * if you're done with the JPEG object, but if you want to clean it up and
+ * reuse it, call this:
+ */
+EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));
+
+/* Generic versions of jpeg_abort and jpeg_destroy that work on either
+ * flavor of JPEG object.  These may be more convenient in some places.
+ */
+EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));
+EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));
+
+/* Default restart-marker-resync procedure for use by data source modules */
+EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,
+                                            int desired));
+
+
+/* These marker codes are exported since applications and data source modules
+ * are likely to want to use them.
+ */
+
+#define JPEG_RST0       0xD0    /* RST0 marker code */
+#define JPEG_EOI        0xD9    /* EOI marker code */
+#define JPEG_APP0       0xE0    /* APP0 marker code */
+#define JPEG_COM        0xFE    /* COM marker code */
+
+
+/* If we have a brain-damaged compiler that emits warnings (or worse, errors)
+ * for structure definitions that are never filled in, keep it quiet by
+ * supplying dummy definitions for the various substructures.
+ */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef JPEG_INTERNALS          /* will be defined in jpegint.h */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+struct jpeg_comp_master { long dummy; };
+struct jpeg_c_main_controller { long dummy; };
+struct jpeg_c_prep_controller { long dummy; };
+struct jpeg_c_coef_controller { long dummy; };
+struct jpeg_marker_writer { long dummy; };
+struct jpeg_color_converter { long dummy; };
+struct jpeg_downsampler { long dummy; };
+struct jpeg_forward_dct { long dummy; };
+struct jpeg_entropy_encoder { long dummy; };
+struct jpeg_decomp_master { long dummy; };
+struct jpeg_d_main_controller { long dummy; };
+struct jpeg_d_coef_controller { long dummy; };
+struct jpeg_d_post_controller { long dummy; };
+struct jpeg_input_controller { long dummy; };
+struct jpeg_marker_reader { long dummy; };
+struct jpeg_entropy_decoder { long dummy; };
+struct jpeg_inverse_dct { long dummy; };
+struct jpeg_upsampler { long dummy; };
+struct jpeg_color_deconverter { long dummy; };
+struct jpeg_color_quantizer { long dummy; };
+#endif /* JPEG_INTERNALS */
+#endif /* INCOMPLETE_TYPES_BROKEN */
+
+
+/*
+ * The JPEG library modules define JPEG_INTERNALS before including this file.
+ * The internal structure declarations are read only when that is true.
+ * Applications using the library should not include jpegint.h, but may wish
+ * to include jerror.h.
+ */
+
+#ifdef JPEG_INTERNALS
+#include "jpegint.h"            /* fetch private declarations */
+#include "jerror.h"             /* fetch error codes too */
+#endif
+
+#endif /* JPEGLIB_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jquant1.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,860 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jquant1.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains 1-pass color quantization (color mapping) routines.
+ * These routines provide mapping to a fixed color map using equally spaced
+ * color values.  Optional Floyd-Steinberg or ordered dithering is available.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+#ifdef QUANT_1PASS_SUPPORTED
+
+
+/*
+ * The main purpose of 1-pass quantization is to provide a fast, if not very
+ * high quality, colormapped output capability.  A 2-pass quantizer usually
+ * gives better visual quality; however, for quantized grayscale output this
+ * quantizer is perfectly adequate.  Dithering is highly recommended with this
+ * quantizer, though you can turn it off if you really want to.
+ *
+ * In 1-pass quantization the colormap must be chosen in advance of seeing the
+ * image.  We use a map consisting of all combinations of Ncolors[i] color
+ * values for the i'th component.  The Ncolors[] values are chosen so that
+ * their product, the total number of colors, is no more than that requested.
+ * (In most cases, the product will be somewhat less.)
+ *
+ * Since the colormap is orthogonal, the representative value for each color
+ * component can be determined without considering the other components;
+ * then these indexes can be combined into a colormap index by a standard
+ * N-dimensional-array-subscript calculation.  Most of the arithmetic involved
+ * can be precalculated and stored in the lookup table colorindex[].
+ * colorindex[i][j] maps pixel value j in component i to the nearest
+ * representative value (grid plane) for that component; this index is
+ * multiplied by the array stride for component i, so that the
+ * index of the colormap entry closest to a given pixel value is just
+ *    sum( colorindex[component-number][pixel-component-value] )
+ * Aside from being fast, this scheme allows for variable spacing between
+ * representative values with no additional lookup cost.
+ *
+ * If gamma correction has been applied in color conversion, it might be wise
+ * to adjust the color grid spacing so that the representative colors are
+ * equidistant in linear space.  At this writing, gamma correction is not
+ * implemented by jdcolor, so nothing is done here.
+ */
+
+
+/* Declarations for ordered dithering.
+ *
+ * We use a standard 16x16 ordered dither array.  The basic concept of ordered
+ * dithering is described in many references, for instance Dale Schumacher's
+ * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991).
+ * In place of Schumacher's comparisons against a "threshold" value, we add a
+ * "dither" value to the input pixel and then round the result to the nearest
+ * output value.  The dither value is equivalent to (0.5 - threshold) times
+ * the distance between output values.  For ordered dithering, we assume that
+ * the output colors are equally spaced; if not, results will probably be
+ * worse, since the dither may be too much or too little at a given point.
+ *
+ * The normal calculation would be to form pixel value + dither, range-limit
+ * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual.
+ * We can skip the separate range-limiting step by extending the colorindex
+ * table in both directions.
+ */
+
+#define ODITHER_SIZE  16        /* dimension of dither matrix */
+/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */
+#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE)       /* # cells in matrix */
+#define ODITHER_MASK  (ODITHER_SIZE-1) /* mask for wrapping around counters */
+
+typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE];
+typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE];
+
+static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = {
+  /* Bayer's order-4 dither array.  Generated by the code given in
+   * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I.
+   * The values in this array must range from 0 to ODITHER_CELLS-1.
+   */
+  {   0,192, 48,240, 12,204, 60,252,  3,195, 51,243, 15,207, 63,255 },
+  { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 },
+  {  32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 },
+  { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 },
+  {   8,200, 56,248,  4,196, 52,244, 11,203, 59,251,  7,199, 55,247 },
+  { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 },
+  {  40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 },
+  { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 },
+  {   2,194, 50,242, 14,206, 62,254,  1,193, 49,241, 13,205, 61,253 },
+  { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 },
+  {  34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 },
+  { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 },
+  {  10,202, 58,250,  6,198, 54,246,  9,201, 57,249,  5,197, 53,245 },
+  { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 },
+  {  42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 },
+  { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 }
+};
+
+
+/* Declarations for Floyd-Steinberg dithering.
+ *
+ * Errors are accumulated into the array fserrors[], at a resolution of
+ * 1/16th of a pixel count.  The error at a given pixel is propagated
+ * to its not-yet-processed neighbors using the standard F-S fractions,
+ *              ...     (here)  7/16
+ *              3/16    5/16    1/16
+ * We work left-to-right on even rows, right-to-left on odd rows.
+ *
+ * We can get away with a single array (holding one row's worth of errors)
+ * by using it to store the current row's errors at pixel columns not yet
+ * processed, but the next row's errors at columns already processed.  We
+ * need only a few extra variables to hold the errors immediately around the
+ * current column.  (If we are lucky, those variables are in registers, but
+ * even if not, they're probably cheaper to access than array elements are.)
+ *
+ * The fserrors[] array is indexed [component#][position].
+ * We provide (#columns + 2) entries per component; the extra entry at each
+ * end saves us from special-casing the first and last pixels.
+ *
+ * Note: on a wide image, we might not have enough room in a PC's near data
+ * segment to hold the error array; so it is allocated with alloc_large.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+typedef INT16 FSERROR;          /* 16 bits should be enough */
+typedef int LOCFSERROR;         /* use 'int' for calculation temps */
+#else
+typedef INT32 FSERROR;          /* may need more than 16 bits */
+typedef INT32 LOCFSERROR;       /* be sure calculation temps are big enough */
+#endif
+
+typedef FSERROR FAR *FSERRPTR;  /* pointer to error array (in FAR storage!) */
+
+
+/* Private subobject */
+
+#define MAX_Q_COMPS 4           /* max components I can handle */
+
+typedef struct {
+  struct jpeg_color_quantizer pub; /* public fields */
+
+  /* Initially allocated colormap is saved here */
+  JSAMPARRAY sv_colormap;       /* The color map as a 2-D pixel array */
+  int sv_actual;                /* number of entries in use */
+
+  JSAMPARRAY colorindex;        /* Precomputed mapping for speed */
+  /* colorindex[i][j] = index of color closest to pixel value j in component i,
+   * premultiplied as described above.  Since colormap indexes must fit into
+   * JSAMPLEs, the entries of this array will too.
+   */
+  boolean is_padded;            /* is the colorindex padded for odither? */
+
+  int Ncolors[MAX_Q_COMPS];     /* # of values alloced to each component */
+
+  /* Variables for ordered dithering */
+  int row_index;                /* cur row's vertical index in dither matrix */
+  ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */
+
+  /* Variables for Floyd-Steinberg dithering */
+  FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */
+  boolean on_odd_row;           /* flag to remember which row we are on */
+} my_cquantizer;
+
+typedef my_cquantizer * my_cquantize_ptr;
+
+
+/*
+ * Policy-making subroutines for create_colormap and create_colorindex.
+ * These routines determine the colormap to be used.  The rest of the module
+ * only assumes that the colormap is orthogonal.
+ *
+ *  * select_ncolors decides how to divvy up the available colors
+ *    among the components.
+ *  * output_value defines the set of representative values for a component.
+ *  * largest_input_value defines the mapping from input values to
+ *    representative values for a component.
+ * Note that the latter two routines may impose different policies for
+ * different components, though this is not currently done.
+ */
+
+
+LOCAL(int)
+select_ncolors (j_decompress_ptr cinfo, int Ncolors[])
+/* Determine allocation of desired colors to components, */
+/* and fill in Ncolors[] array to indicate choice. */
+/* Return value is total number of colors (product of Ncolors[] values). */
+{
+  int nc = cinfo->out_color_components; /* number of color components */
+  int max_colors = cinfo->desired_number_of_colors;
+  int total_colors, iroot, i, j;
+  boolean changed;
+  long temp;
+  static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE };
+
+  /* We can allocate at least the nc'th root of max_colors per component. */
+  /* Compute floor(nc'th root of max_colors). */
+  iroot = 1;
+  do {
+    iroot++;
+    temp = iroot;               /* set temp = iroot ** nc */
+    for (i = 1; i < nc; i++)
+      temp *= iroot;
+  } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */
+  iroot--;                      /* now iroot = floor(root) */
+
+  /* Must have at least 2 color values per component */
+  if (iroot < 2)
+    ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp);
+
+  /* Initialize to iroot color values for each component */
+  total_colors = 1;
+  for (i = 0; i < nc; i++) {
+    Ncolors[i] = iroot;
+    total_colors *= iroot;
+  }
+  /* We may be able to increment the count for one or more components without
+   * exceeding max_colors, though we know not all can be incremented.
+   * Sometimes, the first component can be incremented more than once!
+   * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.)
+   * In RGB colorspace, try to increment G first, then R, then B.
+   */
+  do {
+    changed = FALSE;
+    for (i = 0; i < nc; i++) {
+      j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i);
+      /* calculate new total_colors if Ncolors[j] is incremented */
+      temp = total_colors / Ncolors[j];
+      temp *= Ncolors[j]+1;     /* done in long arith to avoid oflo */
+      if (temp > (long) max_colors)
+        break;                  /* won't fit, done with this pass */
+      Ncolors[j]++;             /* OK, apply the increment */
+      total_colors = (int) temp;
+      changed = TRUE;
+    }
+  } while (changed);
+
+  return total_colors;
+}
+
+
+LOCAL(int)
+output_value (j_decompress_ptr cinfo, int ci, int j, int maxj)
+/* Return j'th output value, where j will range from 0 to maxj */
+/* The output values must fall in 0..MAXJSAMPLE in increasing order */
+{
+  /* We always provide values 0 and MAXJSAMPLE for each component;
+   * any additional values are equally spaced between these limits.
+   * (Forcing the upper and lower values to the limits ensures that
+   * dithering can't produce a color outside the selected gamut.)
+   */
+  return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj);
+}
+
+
+LOCAL(int)
+largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj)
+/* Return largest input value that should map to j'th output value */
+/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */
+{
+  /* Breakpoints are halfway between values returned by output_value */
+  return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj));
+}
+
+
+/*
+ * Create the colormap.
+ */
+
+LOCAL(void)
+create_colormap (j_decompress_ptr cinfo)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  JSAMPARRAY colormap;          /* Created colormap */
+  int total_colors;             /* Number of distinct output colors */
+  int i,j,k, nci, blksize, blkdist, ptr, val;
+
+  /* Select number of colors for each component */
+  total_colors = select_ncolors(cinfo, cquantize->Ncolors);
+
+  /* Report selected color counts */
+  if (cinfo->out_color_components == 3)
+    TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS,
+             total_colors, cquantize->Ncolors[0],
+             cquantize->Ncolors[1], cquantize->Ncolors[2]);
+  else
+    TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors);
+
+  /* Allocate and fill in the colormap. */
+  /* The colors are ordered in the map in standard row-major order, */
+  /* i.e. rightmost (highest-indexed) color changes most rapidly. */
+
+  colormap = (*cinfo->mem->alloc_sarray)
+    ((j_common_ptr) cinfo, JPOOL_IMAGE,
+     (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components);
+
+  /* blksize is number of adjacent repeated entries for a component */
+  /* blkdist is distance between groups of identical entries for a component */
+  blkdist = total_colors;
+
+  for (i = 0; i < cinfo->out_color_components; i++) {
+    /* fill in colormap entries for i'th color component */
+    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
+    blksize = blkdist / nci;
+    for (j = 0; j < nci; j++) {
+      /* Compute j'th output value (out of nci) for component */
+      val = output_value(cinfo, i, j, nci-1);
+      /* Fill in all colormap entries that have this value of this component */
+      for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) {
+        /* fill in blksize entries beginning at ptr */
+        for (k = 0; k < blksize; k++)
+          colormap[i][ptr+k] = (JSAMPLE) val;
+      }
+    }
+    blkdist = blksize;          /* blksize of this color is blkdist of next */
+  }
+
+  /* Save the colormap in private storage,
+   * where it will survive color quantization mode changes.
+   */
+  cquantize->sv_colormap = colormap;
+  cquantize->sv_actual = total_colors;
+}
+
+
+/*
+ * Create the color index table.
+ */
+
+LOCAL(void)
+create_colorindex (j_decompress_ptr cinfo)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  JSAMPROW indexptr;
+  int i,j,k, nci, blksize, val, pad;
+
+  /* For ordered dither, we pad the color index tables by MAXJSAMPLE in
+   * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE).
+   * This is not necessary in the other dithering modes.  However, we
+   * flag whether it was done in case user changes dithering mode.
+   */
+  if (cinfo->dither_mode == JDITHER_ORDERED) {
+    pad = MAXJSAMPLE*2;
+    cquantize->is_padded = TRUE;
+  } else {
+    pad = 0;
+    cquantize->is_padded = FALSE;
+  }
+
+  cquantize->colorindex = (*cinfo->mem->alloc_sarray)
+    ((j_common_ptr) cinfo, JPOOL_IMAGE,
+     (JDIMENSION) (MAXJSAMPLE+1 + pad),
+     (JDIMENSION) cinfo->out_color_components);
+
+  /* blksize is number of adjacent repeated entries for a component */
+  blksize = cquantize->sv_actual;
+
+  for (i = 0; i < cinfo->out_color_components; i++) {
+    /* fill in colorindex entries for i'th color component */
+    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
+    blksize = blksize / nci;
+
+    /* adjust colorindex pointers to provide padding at negative indexes. */
+    if (pad)
+      cquantize->colorindex[i] += MAXJSAMPLE;
+
+    /* in loop, val = index of current output value, */
+    /* and k = largest j that maps to current val */
+    indexptr = cquantize->colorindex[i];
+    val = 0;
+    k = largest_input_value(cinfo, i, 0, nci-1);
+    for (j = 0; j <= MAXJSAMPLE; j++) {
+      while (j > k)             /* advance val if past boundary */
+        k = largest_input_value(cinfo, i, ++val, nci-1);
+      /* premultiply so that no multiplication needed in main processing */
+      indexptr[j] = (JSAMPLE) (val * blksize);
+    }
+    /* Pad at both ends if necessary */
+    if (pad)
+      for (j = 1; j <= MAXJSAMPLE; j++) {
+        indexptr[-j] = indexptr[0];
+        indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE];
+      }
+  }
+}
+
+
+/*
+ * Create an ordered-dither array for a component having ncolors
+ * distinct output values.
+ */
+
+LOCAL(ODITHER_MATRIX_PTR)
+make_odither_array (j_decompress_ptr cinfo, int ncolors)
+{
+  ODITHER_MATRIX_PTR odither;
+  int j,k;
+  INT32 num,den;
+
+  odither = (ODITHER_MATRIX_PTR)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(ODITHER_MATRIX));
+  /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1).
+   * Hence the dither value for the matrix cell with fill order f
+   * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1).
+   * On 16-bit-int machine, be careful to avoid overflow.
+   */
+  den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1));
+  for (j = 0; j < ODITHER_SIZE; j++) {
+    for (k = 0; k < ODITHER_SIZE; k++) {
+      num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k])))
+            * MAXJSAMPLE;
+      /* Ensure round towards zero despite C's lack of consistency
+       * about rounding negative values in integer division...
+       */
+      odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den);
+    }
+  }
+  return odither;
+}
+
+
+/*
+ * Create the ordered-dither tables.
+ * Components having the same number of representative colors may
+ * share a dither table.
+ */
+
+LOCAL(void)
+create_odither_tables (j_decompress_ptr cinfo)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  ODITHER_MATRIX_PTR odither;
+  int i, j, nci;
+
+  for (i = 0; i < cinfo->out_color_components; i++) {
+    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
+    odither = NULL;             /* search for matching prior component */
+    for (j = 0; j < i; j++) {
+      if (nci == cquantize->Ncolors[j]) {
+        odither = cquantize->odither[j];
+        break;
+      }
+    }
+    if (odither == NULL)        /* need a new table? */
+      odither = make_odither_array(cinfo, nci);
+    cquantize->odither[i] = odither;
+  }
+}
+
+
+/*
+ * Map some rows of pixels to the output colormapped representation.
+ */
+
+METHODDEF(void)
+color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
+                JSAMPARRAY output_buf, int num_rows)
+/* General case, no dithering */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  JSAMPARRAY colorindex = cquantize->colorindex;
+  register int pixcode, ci;
+  register JSAMPROW ptrin, ptrout;
+  int row;
+  JDIMENSION col;
+  JDIMENSION width = cinfo->output_width;
+  register int nc = cinfo->out_color_components;
+
+  for (row = 0; row < num_rows; row++) {
+    ptrin = input_buf[row];
+    ptrout = output_buf[row];
+    for (col = width; col > 0; col--) {
+      pixcode = 0;
+      for (ci = 0; ci < nc; ci++) {
+        pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]);
+      }
+      *ptrout++ = (JSAMPLE) pixcode;
+    }
+  }
+}
+
+
+METHODDEF(void)
+color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
+                 JSAMPARRAY output_buf, int num_rows)
+/* Fast path for out_color_components==3, no dithering */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  register int pixcode;
+  register JSAMPROW ptrin, ptrout;
+  JSAMPROW colorindex0 = cquantize->colorindex[0];
+  JSAMPROW colorindex1 = cquantize->colorindex[1];
+  JSAMPROW colorindex2 = cquantize->colorindex[2];
+  int row;
+  JDIMENSION col;
+  JDIMENSION width = cinfo->output_width;
+
+  for (row = 0; row < num_rows; row++) {
+    ptrin = input_buf[row];
+    ptrout = output_buf[row];
+    for (col = width; col > 0; col--) {
+      pixcode  = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]);
+      pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]);
+      pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]);
+      *ptrout++ = (JSAMPLE) pixcode;
+    }
+  }
+}
+
+
+METHODDEF(void)
+quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
+                     JSAMPARRAY output_buf, int num_rows)
+/* General case, with ordered dithering */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  register JSAMPROW input_ptr;
+  register JSAMPROW output_ptr;
+  JSAMPROW colorindex_ci;
+  int * dither;                 /* points to active row of dither matrix */
+  int row_index, col_index;     /* current indexes into dither matrix */
+  int nc = cinfo->out_color_components;
+  int ci;
+  int row;
+  JDIMENSION col;
+  JDIMENSION width = cinfo->output_width;
+
+  for (row = 0; row < num_rows; row++) {
+    /* Initialize output values to 0 so can process components separately */
+    jzero_far((void FAR *) output_buf[row],
+              (size_t) (width * SIZEOF(JSAMPLE)));
+    row_index = cquantize->row_index;
+    for (ci = 0; ci < nc; ci++) {
+      input_ptr = input_buf[row] + ci;
+      output_ptr = output_buf[row];
+      colorindex_ci = cquantize->colorindex[ci];
+      dither = cquantize->odither[ci][row_index];
+      col_index = 0;
+
+      for (col = width; col > 0; col--) {
+        /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE,
+         * select output value, accumulate into output code for this pixel.
+         * Range-limiting need not be done explicitly, as we have extended
+         * the colorindex table to produce the right answers for out-of-range
+         * inputs.  The maximum dither is +- MAXJSAMPLE; this sets the
+         * required amount of padding.
+         */
+        *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]];
+        input_ptr += nc;
+        output_ptr++;
+        col_index = (col_index + 1) & ODITHER_MASK;
+      }
+    }
+    /* Advance row index for next row */
+    row_index = (row_index + 1) & ODITHER_MASK;
+    cquantize->row_index = row_index;
+  }
+}
+
+
+METHODDEF(void)
+quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
+                      JSAMPARRAY output_buf, int num_rows)
+/* Fast path for out_color_components==3, with ordered dithering */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  register int pixcode;
+  register JSAMPROW input_ptr;
+  register JSAMPROW output_ptr;
+  JSAMPROW colorindex0 = cquantize->colorindex[0];
+  JSAMPROW colorindex1 = cquantize->colorindex[1];
+  JSAMPROW colorindex2 = cquantize->colorindex[2];
+  int * dither0;                /* points to active row of dither matrix */
+  int * dither1;
+  int * dither2;
+  int row_index, col_index;     /* current indexes into dither matrix */
+  int row;
+  JDIMENSION col;
+  JDIMENSION width = cinfo->output_width;
+
+  for (row = 0; row < num_rows; row++) {
+    row_index = cquantize->row_index;
+    input_ptr = input_buf[row];
+    output_ptr = output_buf[row];
+    dither0 = cquantize->odither[0][row_index];
+    dither1 = cquantize->odither[1][row_index];
+    dither2 = cquantize->odither[2][row_index];
+    col_index = 0;
+
+    for (col = width; col > 0; col--) {
+      pixcode  = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) +
+                                        dither0[col_index]]);
+      pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) +
+                                        dither1[col_index]]);
+      pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) +
+                                        dither2[col_index]]);
+      *output_ptr++ = (JSAMPLE) pixcode;
+      col_index = (col_index + 1) & ODITHER_MASK;
+    }
+    row_index = (row_index + 1) & ODITHER_MASK;
+    cquantize->row_index = row_index;
+  }
+}
+
+
+METHODDEF(void)
+quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
+                    JSAMPARRAY output_buf, int num_rows)
+/* General case, with Floyd-Steinberg dithering */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  register LOCFSERROR cur;      /* current error or pixel value */
+  LOCFSERROR belowerr;          /* error for pixel below cur */
+  LOCFSERROR bpreverr;          /* error for below/prev col */
+  LOCFSERROR bnexterr;          /* error for below/next col */
+  LOCFSERROR delta;
+  register FSERRPTR errorptr;   /* => fserrors[] at column before current */
+  register JSAMPROW input_ptr;
+  register JSAMPROW output_ptr;
+  JSAMPROW colorindex_ci;
+  JSAMPROW colormap_ci;
+  int pixcode;
+  int nc = cinfo->out_color_components;
+  int dir;                      /* 1 for left-to-right, -1 for right-to-left */
+  int dirnc;                    /* dir * nc */
+  int ci;
+  int row;
+  JDIMENSION col;
+  JDIMENSION width = cinfo->output_width;
+  JSAMPLE *range_limit = cinfo->sample_range_limit;
+  SHIFT_TEMPS
+
+  for (row = 0; row < num_rows; row++) {
+    /* Initialize output values to 0 so can process components separately */
+    jzero_far((void FAR *) output_buf[row],
+              (size_t) (width * SIZEOF(JSAMPLE)));
+    for (ci = 0; ci < nc; ci++) {
+      input_ptr = input_buf[row] + ci;
+      output_ptr = output_buf[row];
+      if (cquantize->on_odd_row) {
+        /* work right to left in this row */
+        input_ptr += (width-1) * nc; /* so point to rightmost pixel */
+        output_ptr += width-1;
+        dir = -1;
+        dirnc = -nc;
+        errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */
+      } else {
+        /* work left to right in this row */
+        dir = 1;
+        dirnc = nc;
+        errorptr = cquantize->fserrors[ci]; /* => entry before first column */
+      }
+      colorindex_ci = cquantize->colorindex[ci];
+      colormap_ci = cquantize->sv_colormap[ci];
+      /* Preset error values: no error propagated to first pixel from left */
+      cur = 0;
+      /* and no error propagated to row below yet */
+      belowerr = bpreverr = 0;
+
+      for (col = width; col > 0; col--) {
+        /* cur holds the error propagated from the previous pixel on the
+         * current line.  Add the error propagated from the previous line
+         * to form the complete error correction term for this pixel, and
+         * round the error term (which is expressed * 16) to an integer.
+         * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
+         * for either sign of the error value.
+         * Note: errorptr points to *previous* column's array entry.
+         */
+        cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4);
+        /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
+         * The maximum error is +- MAXJSAMPLE; this sets the required size
+         * of the range_limit array.
+         */
+        cur += GETJSAMPLE(*input_ptr);
+        cur = GETJSAMPLE(range_limit[cur]);
+        /* Select output value, accumulate into output code for this pixel */
+        pixcode = GETJSAMPLE(colorindex_ci[cur]);
+        *output_ptr += (JSAMPLE) pixcode;
+        /* Compute actual representation error at this pixel */
+        /* Note: we can do this even though we don't have the final */
+        /* pixel code, because the colormap is orthogonal. */
+        cur -= GETJSAMPLE(colormap_ci[pixcode]);
+        /* Compute error fractions to be propagated to adjacent pixels.
+         * Add these into the running sums, and simultaneously shift the
+         * next-line error sums left by 1 column.
+         */
+        bnexterr = cur;
+        delta = cur * 2;
+        cur += delta;           /* form error * 3 */
+        errorptr[0] = (FSERROR) (bpreverr + cur);
+        cur += delta;           /* form error * 5 */
+        bpreverr = belowerr + cur;
+        belowerr = bnexterr;
+        cur += delta;           /* form error * 7 */
+        /* At this point cur contains the 7/16 error value to be propagated
+         * to the next pixel on the current line, and all the errors for the
+         * next line have been shifted over. We are therefore ready to move on.
+         */
+        input_ptr += dirnc;     /* advance input ptr to next column */
+        output_ptr += dir;      /* advance output ptr to next column */
+        errorptr += dir;        /* advance errorptr to current column */
+      }
+      /* Post-loop cleanup: we must unload the final error value into the
+       * final fserrors[] entry.  Note we need not unload belowerr because
+       * it is for the dummy column before or after the actual array.
+       */
+      errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */
+    }
+    cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE);
+  }
+}
+
+
+/*
+ * Allocate workspace for Floyd-Steinberg errors.
+ */
+
+LOCAL(void)
+alloc_fs_workspace (j_decompress_ptr cinfo)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  size_t arraysize;
+  int i;
+
+  arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
+  for (i = 0; i < cinfo->out_color_components; i++) {
+    cquantize->fserrors[i] = (FSERRPTR)
+      (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
+  }
+}
+
+
+/*
+ * Initialize for one-pass color quantization.
+ */
+
+METHODDEF(void)
+start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  size_t arraysize;
+  int i;
+
+  /* Install my colormap. */
+  cinfo->colormap = cquantize->sv_colormap;
+  cinfo->actual_number_of_colors = cquantize->sv_actual;
+
+  /* Initialize for desired dithering mode. */
+  switch (cinfo->dither_mode) {
+  case JDITHER_NONE:
+    if (cinfo->out_color_components == 3)
+      cquantize->pub.color_quantize = color_quantize3;
+    else
+      cquantize->pub.color_quantize = color_quantize;
+    break;
+  case JDITHER_ORDERED:
+    if (cinfo->out_color_components == 3)
+      cquantize->pub.color_quantize = quantize3_ord_dither;
+    else
+      cquantize->pub.color_quantize = quantize_ord_dither;
+    cquantize->row_index = 0;   /* initialize state for ordered dither */
+    /* If user changed to ordered dither from another mode,
+     * we must recreate the color index table with padding.
+     * This will cost extra space, but probably isn't very likely.
+     */
+    if (! cquantize->is_padded)
+      create_colorindex(cinfo);
+    /* Create ordered-dither tables if we didn't already. */
+    if (cquantize->odither[0] == NULL)
+      create_odither_tables(cinfo);
+    break;
+  case JDITHER_FS:
+    cquantize->pub.color_quantize = quantize_fs_dither;
+    cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */
+    /* Allocate Floyd-Steinberg workspace if didn't already. */
+    if (cquantize->fserrors[0] == NULL)
+      alloc_fs_workspace(cinfo);
+    /* Initialize the propagated errors to zero. */
+    arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
+    for (i = 0; i < cinfo->out_color_components; i++)
+      jzero_far((void FAR *) cquantize->fserrors[i], arraysize);
+    break;
+  default:
+    ERREXIT(cinfo, JERR_NOT_COMPILED);
+    break;
+  }
+}
+
+
+/*
+ * Finish up at the end of the pass.
+ */
+
+METHODDEF(void)
+finish_pass_1_quant (j_decompress_ptr cinfo)
+{
+  /* no work in 1-pass case */
+}
+
+
+/*
+ * Switch to a new external colormap between output passes.
+ * Shouldn't get to this module!
+ */
+
+METHODDEF(void)
+new_color_map_1_quant (j_decompress_ptr cinfo)
+{
+  ERREXIT(cinfo, JERR_MODE_CHANGE);
+}
+
+
+/*
+ * Module initialization routine for 1-pass color quantization.
+ */
+
+GLOBAL(void)
+jinit_1pass_quantizer (j_decompress_ptr cinfo)
+{
+  my_cquantize_ptr cquantize;
+
+  cquantize = (my_cquantize_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_cquantizer));
+  cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
+  cquantize->pub.start_pass = start_pass_1_quant;
+  cquantize->pub.finish_pass = finish_pass_1_quant;
+  cquantize->pub.new_color_map = new_color_map_1_quant;
+  cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */
+  cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */
+
+  /* Make sure my internal arrays won't overflow */
+  if (cinfo->out_color_components > MAX_Q_COMPS)
+    ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS);
+  /* Make sure colormap indexes can be represented by JSAMPLEs */
+  if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1))
+    ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1);
+
+  /* Create the colormap and color index table. */
+  create_colormap(cinfo);
+  create_colorindex(cinfo);
+
+  /* Allocate Floyd-Steinberg workspace now if requested.
+   * We do this now since it is FAR storage and may affect the memory
+   * manager's space calculations.  If the user changes to FS dither
+   * mode in a later pass, we will allocate the space then, and will
+   * possibly overrun the max_memory_to_use setting.
+   */
+  if (cinfo->dither_mode == JDITHER_FS)
+    alloc_fs_workspace(cinfo);
+}
+
+#endif /* QUANT_1PASS_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jquant2.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,1314 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jquant2.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains 2-pass color quantization (color mapping) routines.
+ * These routines provide selection of a custom color map for an image,
+ * followed by mapping of the image to that color map, with optional
+ * Floyd-Steinberg dithering.
+ * It is also possible to use just the second pass to map to an arbitrary
+ * externally-given color map.
+ *
+ * Note: ordered dithering is not supported, since there isn't any fast
+ * way to compute intercolor distances; it's unclear that ordered dither's
+ * fundamental assumptions even hold with an irregularly spaced color map.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+#ifdef QUANT_2PASS_SUPPORTED
+
+
+/*
+ * This module implements the well-known Heckbert paradigm for color
+ * quantization.  Most of the ideas used here can be traced back to
+ * Heckbert's seminal paper
+ *   Heckbert, Paul.  "Color Image Quantization for Frame Buffer Display",
+ *   Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304.
+ *
+ * In the first pass over the image, we accumulate a histogram showing the
+ * usage count of each possible color.  To keep the histogram to a reasonable
+ * size, we reduce the precision of the input; typical practice is to retain
+ * 5 or 6 bits per color, so that 8 or 4 different input values are counted
+ * in the same histogram cell.
+ *
+ * Next, the color-selection step begins with a box representing the whole
+ * color space, and repeatedly splits the "largest" remaining box until we
+ * have as many boxes as desired colors.  Then the mean color in each
+ * remaining box becomes one of the possible output colors.
+ *
+ * The second pass over the image maps each input pixel to the closest output
+ * color (optionally after applying a Floyd-Steinberg dithering correction).
+ * This mapping is logically trivial, but making it go fast enough requires
+ * considerable care.
+ *
+ * Heckbert-style quantizers vary a good deal in their policies for choosing
+ * the "largest" box and deciding where to cut it.  The particular policies
+ * used here have proved out well in experimental comparisons, but better ones
+ * may yet be found.
+ *
+ * In earlier versions of the IJG code, this module quantized in YCbCr color
+ * space, processing the raw upsampled data without a color conversion step.
+ * This allowed the color conversion math to be done only once per colormap
+ * entry, not once per pixel.  However, that optimization precluded other
+ * useful optimizations (such as merging color conversion with upsampling)
+ * and it also interfered with desired capabilities such as quantizing to an
+ * externally-supplied colormap.  We have therefore abandoned that approach.
+ * The present code works in the post-conversion color space, typically RGB.
+ *
+ * To improve the visual quality of the results, we actually work in scaled
+ * RGB space, giving G distances more weight than R, and R in turn more than
+ * B.  To do everything in integer math, we must use integer scale factors.
+ * The 2/3/1 scale factors used here correspond loosely to the relative
+ * weights of the colors in the NTSC grayscale equation.
+ * If you want to use this code to quantize a non-RGB color space, you'll
+ * probably need to change these scale factors.
+ */
+
+#define R_SCALE 2               /* scale R distances by this much */
+#define G_SCALE 3               /* scale G distances by this much */
+#define B_SCALE 1               /* and B by this much */
+
+/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined
+ * in jmorecfg.h.  As the code stands, it will do the right thing for R,G,B
+ * and B,G,R orders.  If you define some other weird order in jmorecfg.h,
+ * you'll get compile errors until you extend this logic.  In that case
+ * you'll probably want to tweak the histogram sizes too.
+ */
+
+#if RGB_RED == 0
+#define C0_SCALE R_SCALE
+#endif
+#if RGB_BLUE == 0
+#define C0_SCALE B_SCALE
+#endif
+#if RGB_GREEN == 1
+#define C1_SCALE G_SCALE
+#endif
+#if RGB_RED == 2
+#define C2_SCALE R_SCALE
+#endif
+#if RGB_BLUE == 2
+#define C2_SCALE B_SCALE
+#endif
+
+
+/*
+ * First we have the histogram data structure and routines for creating it.
+ *
+ * The number of bits of precision can be adjusted by changing these symbols.
+ * We recommend keeping 6 bits for G and 5 each for R and B.
+ * If you have plenty of memory and cycles, 6 bits all around gives marginally
+ * better results; if you are short of memory, 5 bits all around will save
+ * some space but degrade the results.
+ * To maintain a fully accurate histogram, we'd need to allocate a "long"
+ * (preferably unsigned long) for each cell.  In practice this is overkill;
+ * we can get by with 16 bits per cell.  Few of the cell counts will overflow,
+ * and clamping those that do overflow to the maximum value will give close-
+ * enough results.  This reduces the recommended histogram size from 256Kb
+ * to 128Kb, which is a useful savings on PC-class machines.
+ * (In the second pass the histogram space is re-used for pixel mapping data;
+ * in that capacity, each cell must be able to store zero to the number of
+ * desired colors.  16 bits/cell is plenty for that too.)
+ * Since the JPEG code is intended to run in small memory model on 80x86
+ * machines, we can't just allocate the histogram in one chunk.  Instead
+ * of a true 3-D array, we use a row of pointers to 2-D arrays.  Each
+ * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and
+ * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries.  Note that
+ * on 80x86 machines, the pointer row is in near memory but the actual
+ * arrays are in far memory (same arrangement as we use for image arrays).
+ */
+
+#define MAXNUMCOLORS  (MAXJSAMPLE+1) /* maximum size of colormap */
+
+/* These will do the right thing for either R,G,B or B,G,R color order,
+ * but you may not like the results for other color orders.
+ */
+#define HIST_C0_BITS  5         /* bits of precision in R/B histogram */
+#define HIST_C1_BITS  6         /* bits of precision in G histogram */
+#define HIST_C2_BITS  5         /* bits of precision in B/R histogram */
+
+/* Number of elements along histogram axes. */
+#define HIST_C0_ELEMS  (1<<HIST_C0_BITS)
+#define HIST_C1_ELEMS  (1<<HIST_C1_BITS)
+#define HIST_C2_ELEMS  (1<<HIST_C2_BITS)
+
+/* These are the amounts to shift an input value to get a histogram index. */
+#define C0_SHIFT  (BITS_IN_JSAMPLE-HIST_C0_BITS)
+#define C1_SHIFT  (BITS_IN_JSAMPLE-HIST_C1_BITS)
+#define C2_SHIFT  (BITS_IN_JSAMPLE-HIST_C2_BITS)
+
+
+typedef UINT16 histcell;        /* histogram cell; prefer an unsigned type */
+
+typedef histcell FAR * histptr; /* for pointers to histogram cells */
+
+typedef histcell hist1d[HIST_C2_ELEMS]; /* typedefs for the array */
+typedef hist1d FAR * hist2d;    /* type for the 2nd-level pointers */
+typedef hist2d * hist3d;        /* type for top-level pointer */
+
+
+/* Declarations for Floyd-Steinberg dithering.
+ *
+ * Errors are accumulated into the array fserrors[], at a resolution of
+ * 1/16th of a pixel count.  The error at a given pixel is propagated
+ * to its not-yet-processed neighbors using the standard F-S fractions,
+ *              ...     (here)  7/16
+ *              3/16    5/16    1/16
+ * We work left-to-right on even rows, right-to-left on odd rows.
+ *
+ * We can get away with a single array (holding one row's worth of errors)
+ * by using it to store the current row's errors at pixel columns not yet
+ * processed, but the next row's errors at columns already processed.  We
+ * need only a few extra variables to hold the errors immediately around the
+ * current column.  (If we are lucky, those variables are in registers, but
+ * even if not, they're probably cheaper to access than array elements are.)
+ *
+ * The fserrors[] array has (#columns + 2) entries; the extra entry at
+ * each end saves us from special-casing the first and last pixels.
+ * Each entry is three values long, one value for each color component.
+ *
+ * Note: on a wide image, we might not have enough room in a PC's near data
+ * segment to hold the error array; so it is allocated with alloc_large.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+typedef INT16 FSERROR;          /* 16 bits should be enough */
+typedef int LOCFSERROR;         /* use 'int' for calculation temps */
+#else
+typedef INT32 FSERROR;          /* may need more than 16 bits */
+typedef INT32 LOCFSERROR;       /* be sure calculation temps are big enough */
+#endif
+
+typedef FSERROR FAR *FSERRPTR;  /* pointer to error array (in FAR storage!) */
+
+
+/* Private subobject */
+
+typedef struct {
+  struct jpeg_color_quantizer pub; /* public fields */
+
+  /* Space for the eventually created colormap is stashed here */
+  JSAMPARRAY sv_colormap;       /* colormap allocated at init time */
+  int desired;                  /* desired # of colors = size of colormap */
+
+  /* Variables for accumulating image statistics */
+  hist3d histogram;             /* pointer to the histogram */
+
+  boolean needs_zeroed;         /* TRUE if next pass must zero histogram */
+
+  /* Variables for Floyd-Steinberg dithering */
+  FSERRPTR fserrors;            /* accumulated errors */
+  boolean on_odd_row;           /* flag to remember which row we are on */
+  int * error_limiter;          /* table for clamping the applied error */
+} my_cquantizer;
+
+typedef my_cquantizer * my_cquantize_ptr;
+
+
+/*
+ * Prescan some rows of pixels.
+ * In this module the prescan simply updates the histogram, which has been
+ * initialized to zeroes by start_pass.
+ * An output_buf parameter is required by the method signature, but no data
+ * is actually output (in fact the buffer controller is probably passing a
+ * NULL pointer).
+ */
+
+METHODDEF(void)
+prescan_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
+                  JSAMPARRAY output_buf, int num_rows)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  register JSAMPROW ptr;
+  register histptr histp;
+  register hist3d histogram = cquantize->histogram;
+  int row;
+  JDIMENSION col;
+  JDIMENSION width = cinfo->output_width;
+
+  for (row = 0; row < num_rows; row++) {
+    ptr = input_buf[row];
+    for (col = width; col > 0; col--) {
+      /* get pixel value and index into the histogram */
+      histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT]
+                         [GETJSAMPLE(ptr[1]) >> C1_SHIFT]
+                         [GETJSAMPLE(ptr[2]) >> C2_SHIFT];
+      /* increment, check for overflow and undo increment if so. */
+      if (++(*histp) <= 0)
+        (*histp)--;
+      ptr += 3;
+    }
+  }
+}
+
+
+/*
+ * Next we have the really interesting routines: selection of a colormap
+ * given the completed histogram.
+ * These routines work with a list of "boxes", each representing a rectangular
+ * subset of the input color space (to histogram precision).
+ */
+
+typedef struct {
+  /* The bounds of the box (inclusive); expressed as histogram indexes */
+  int c0min, c0max;
+  int c1min, c1max;
+  int c2min, c2max;
+  /* The volume (actually 2-norm) of the box */
+  INT32 volume;
+  /* The number of nonzero histogram cells within this box */
+  long colorcount;
+} box;
+
+typedef box * boxptr;
+
+
+LOCAL(boxptr)
+find_biggest_color_pop (boxptr boxlist, int numboxes)
+/* Find the splittable box with the largest color population */
+/* Returns NULL if no splittable boxes remain */
+{
+  register boxptr boxp;
+  register int i;
+  register long maxc = 0;
+  boxptr which = NULL;
+
+  for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
+    if (boxp->colorcount > maxc && boxp->volume > 0) {
+      which = boxp;
+      maxc = boxp->colorcount;
+    }
+  }
+  return which;
+}
+
+
+LOCAL(boxptr)
+find_biggest_volume (boxptr boxlist, int numboxes)
+/* Find the splittable box with the largest (scaled) volume */
+/* Returns NULL if no splittable boxes remain */
+{
+  register boxptr boxp;
+  register int i;
+  register INT32 maxv = 0;
+  boxptr which = NULL;
+
+  for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
+    if (boxp->volume > maxv) {
+      which = boxp;
+      maxv = boxp->volume;
+    }
+  }
+  return which;
+}
+
+
+LOCAL(void)
+update_box (j_decompress_ptr cinfo, boxptr boxp)
+/* Shrink the min/max bounds of a box to enclose only nonzero elements, */
+/* and recompute its volume and population */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  hist3d histogram = cquantize->histogram;
+  histptr histp;
+  int c0,c1,c2;
+  int c0min,c0max,c1min,c1max,c2min,c2max;
+  INT32 dist0,dist1,dist2;
+  long ccount;
+
+  c0min = boxp->c0min;  c0max = boxp->c0max;
+  c1min = boxp->c1min;  c1max = boxp->c1max;
+  c2min = boxp->c2min;  c2max = boxp->c2max;
+
+  if (c0max > c0min)
+    for (c0 = c0min; c0 <= c0max; c0++)
+      for (c1 = c1min; c1 <= c1max; c1++) {
+        histp = & histogram[c0][c1][c2min];
+        for (c2 = c2min; c2 <= c2max; c2++)
+          if (*histp++ != 0) {
+            boxp->c0min = c0min = c0;
+            goto have_c0min;
+          }
+      }
+ have_c0min:
+  if (c0max > c0min)
+    for (c0 = c0max; c0 >= c0min; c0--)
+      for (c1 = c1min; c1 <= c1max; c1++) {
+        histp = & histogram[c0][c1][c2min];
+        for (c2 = c2min; c2 <= c2max; c2++)
+          if (*histp++ != 0) {
+            boxp->c0max = c0max = c0;
+            goto have_c0max;
+          }
+      }
+ have_c0max:
+  if (c1max > c1min)
+    for (c1 = c1min; c1 <= c1max; c1++)
+      for (c0 = c0min; c0 <= c0max; c0++) {
+        histp = & histogram[c0][c1][c2min];
+        for (c2 = c2min; c2 <= c2max; c2++)
+          if (*histp++ != 0) {
+            boxp->c1min = c1min = c1;
+            goto have_c1min;
+          }
+      }
+ have_c1min:
+  if (c1max > c1min)
+    for (c1 = c1max; c1 >= c1min; c1--)
+      for (c0 = c0min; c0 <= c0max; c0++) {
+        histp = & histogram[c0][c1][c2min];
+        for (c2 = c2min; c2 <= c2max; c2++)
+          if (*histp++ != 0) {
+            boxp->c1max = c1max = c1;
+            goto have_c1max;
+          }
+      }
+ have_c1max:
+  if (c2max > c2min)
+    for (c2 = c2min; c2 <= c2max; c2++)
+      for (c0 = c0min; c0 <= c0max; c0++) {
+        histp = & histogram[c0][c1min][c2];
+        for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
+          if (*histp != 0) {
+            boxp->c2min = c2min = c2;
+            goto have_c2min;
+          }
+      }
+ have_c2min:
+  if (c2max > c2min)
+    for (c2 = c2max; c2 >= c2min; c2--)
+      for (c0 = c0min; c0 <= c0max; c0++) {
+        histp = & histogram[c0][c1min][c2];
+        for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
+          if (*histp != 0) {
+            boxp->c2max = c2max = c2;
+            goto have_c2max;
+          }
+      }
+ have_c2max:
+
+  /* Update box volume.
+   * We use 2-norm rather than real volume here; this biases the method
+   * against making long narrow boxes, and it has the side benefit that
+   * a box is splittable iff norm > 0.
+   * Since the differences are expressed in histogram-cell units,
+   * we have to shift back to JSAMPLE units to get consistent distances;
+   * after which, we scale according to the selected distance scale factors.
+   */
+  dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE;
+  dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE;
+  dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE;
+  boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2;
+
+  /* Now scan remaining volume of box and compute population */
+  ccount = 0;
+  for (c0 = c0min; c0 <= c0max; c0++)
+    for (c1 = c1min; c1 <= c1max; c1++) {
+      histp = & histogram[c0][c1][c2min];
+      for (c2 = c2min; c2 <= c2max; c2++, histp++)
+        if (*histp != 0) {
+          ccount++;
+        }
+    }
+  boxp->colorcount = ccount;
+}
+
+
+LOCAL(int)
+median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes,
+            int desired_colors)
+/* Repeatedly select and split the largest box until we have enough boxes */
+{
+  int n,lb;
+  int c0,c1,c2,cmax;
+  register boxptr b1,b2;
+
+  while (numboxes < desired_colors) {
+    /* Select box to split.
+     * Current algorithm: by population for first half, then by volume.
+     */
+    if (numboxes*2 <= desired_colors) {
+      b1 = find_biggest_color_pop(boxlist, numboxes);
+    } else {
+      b1 = find_biggest_volume(boxlist, numboxes);
+    }
+    if (b1 == NULL)             /* no splittable boxes left! */
+      break;
+    b2 = &boxlist[numboxes];    /* where new box will go */
+    /* Copy the color bounds to the new box. */
+    b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max;
+    b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min;
+    /* Choose which axis to split the box on.
+     * Current algorithm: longest scaled axis.
+     * See notes in update_box about scaling distances.
+     */
+    c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE;
+    c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE;
+    c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE;
+    /* We want to break any ties in favor of green, then red, blue last.
+     * This code does the right thing for R,G,B or B,G,R color orders only.
+     */
+#if RGB_RED == 0
+    cmax = c1; n = 1;
+    if (c0 > cmax) { cmax = c0; n = 0; }
+    if (c2 > cmax) { n = 2; }
+#else
+    cmax = c1; n = 1;
+    if (c2 > cmax) { cmax = c2; n = 2; }
+    if (c0 > cmax) { n = 0; }
+#endif
+    /* Choose split point along selected axis, and update box bounds.
+     * Current algorithm: split at halfway point.
+     * (Since the box has been shrunk to minimum volume,
+     * any split will produce two nonempty subboxes.)
+     * Note that lb value is max for lower box, so must be < old max.
+     */
+    switch (n) {
+    case 0:
+      lb = (b1->c0max + b1->c0min) / 2;
+      b1->c0max = lb;
+      b2->c0min = lb+1;
+      break;
+    case 1:
+      lb = (b1->c1max + b1->c1min) / 2;
+      b1->c1max = lb;
+      b2->c1min = lb+1;
+      break;
+    case 2:
+      lb = (b1->c2max + b1->c2min) / 2;
+      b1->c2max = lb;
+      b2->c2min = lb+1;
+      break;
+    }
+    /* Update stats for boxes */
+    update_box(cinfo, b1);
+    update_box(cinfo, b2);
+    numboxes++;
+  }
+  return numboxes;
+}
+
+
+LOCAL(void)
+compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor)
+/* Compute representative color for a box, put it in colormap[icolor] */
+{
+  /* Current algorithm: mean weighted by pixels (not colors) */
+  /* Note it is important to get the rounding correct! */
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  hist3d histogram = cquantize->histogram;
+  histptr histp;
+  int c0,c1,c2;
+  int c0min,c0max,c1min,c1max,c2min,c2max;
+  long count;
+  long total = 0;
+  long c0total = 0;
+  long c1total = 0;
+  long c2total = 0;
+
+  c0min = boxp->c0min;  c0max = boxp->c0max;
+  c1min = boxp->c1min;  c1max = boxp->c1max;
+  c2min = boxp->c2min;  c2max = boxp->c2max;
+
+  for (c0 = c0min; c0 <= c0max; c0++)
+    for (c1 = c1min; c1 <= c1max; c1++) {
+      histp = & histogram[c0][c1][c2min];
+      for (c2 = c2min; c2 <= c2max; c2++) {
+        if ((count = *histp++) != 0) {
+          total += count;
+          c0total += ((c0 << C0_SHIFT) + ((1<<C0_SHIFT)>>1)) * count;
+          c1total += ((c1 << C1_SHIFT) + ((1<<C1_SHIFT)>>1)) * count;
+          c2total += ((c2 << C2_SHIFT) + ((1<<C2_SHIFT)>>1)) * count;
+        }
+      }
+    }
+
+  cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total);
+  cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total);
+  cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total);
+}
+
+
+LOCAL(void)
+select_colors (j_decompress_ptr cinfo, int desired_colors)
+/* Master routine for color selection */
+{
+  boxptr boxlist;
+  int numboxes;
+  int i;
+
+  /* Allocate workspace for box list */
+  boxlist = (boxptr) (*cinfo->mem->alloc_small)
+    ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box));
+  /* Initialize one box containing whole space */
+  numboxes = 1;
+  boxlist[0].c0min = 0;
+  boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT;
+  boxlist[0].c1min = 0;
+  boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT;
+  boxlist[0].c2min = 0;
+  boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT;
+  /* Shrink it to actually-used volume and set its statistics */
+  update_box(cinfo, & boxlist[0]);
+  /* Perform median-cut to produce final box list */
+  numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors);
+  /* Compute the representative color for each box, fill colormap */
+  for (i = 0; i < numboxes; i++)
+    compute_color(cinfo, & boxlist[i], i);
+  cinfo->actual_number_of_colors = numboxes;
+  TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes);
+}
+
+
+/*
+ * These routines are concerned with the time-critical task of mapping input
+ * colors to the nearest color in the selected colormap.
+ *
+ * We re-use the histogram space as an "inverse color map", essentially a
+ * cache for the results of nearest-color searches.  All colors within a
+ * histogram cell will be mapped to the same colormap entry, namely the one
+ * closest to the cell's center.  This may not be quite the closest entry to
+ * the actual input color, but it's almost as good.  A zero in the cache
+ * indicates we haven't found the nearest color for that cell yet; the array
+ * is cleared to zeroes before starting the mapping pass.  When we find the
+ * nearest color for a cell, its colormap index plus one is recorded in the
+ * cache for future use.  The pass2 scanning routines call fill_inverse_cmap
+ * when they need to use an unfilled entry in the cache.
+ *
+ * Our method of efficiently finding nearest colors is based on the "locally
+ * sorted search" idea described by Heckbert and on the incremental distance
+ * calculation described by Spencer W. Thomas in chapter III.1 of Graphics
+ * Gems II (James Arvo, ed.  Academic Press, 1991).  Thomas points out that
+ * the distances from a given colormap entry to each cell of the histogram can
+ * be computed quickly using an incremental method: the differences between
+ * distances to adjacent cells themselves differ by a constant.  This allows a
+ * fairly fast implementation of the "brute force" approach of computing the
+ * distance from every colormap entry to every histogram cell.  Unfortunately,
+ * it needs a work array to hold the best-distance-so-far for each histogram
+ * cell (because the inner loop has to be over cells, not colormap entries).
+ * The work array elements have to be INT32s, so the work array would need
+ * 256Kb at our recommended precision.  This is not feasible in DOS machines.
+ *
+ * To get around these problems, we apply Thomas' method to compute the
+ * nearest colors for only the cells within a small subbox of the histogram.
+ * The work array need be only as big as the subbox, so the memory usage
+ * problem is solved.  Furthermore, we need not fill subboxes that are never
+ * referenced in pass2; many images use only part of the color gamut, so a
+ * fair amount of work is saved.  An additional advantage of this
+ * approach is that we can apply Heckbert's locality criterion to quickly
+ * eliminate colormap entries that are far away from the subbox; typically
+ * three-fourths of the colormap entries are rejected by Heckbert's criterion,
+ * and we need not compute their distances to individual cells in the subbox.
+ * The speed of this approach is heavily influenced by the subbox size: too
+ * small means too much overhead, too big loses because Heckbert's criterion
+ * can't eliminate as many colormap entries.  Empirically the best subbox
+ * size seems to be about 1/512th of the histogram (1/8th in each direction).
+ *
+ * Thomas' article also describes a refined method which is asymptotically
+ * faster than the brute-force method, but it is also far more complex and
+ * cannot efficiently be applied to small subboxes.  It is therefore not
+ * useful for programs intended to be portable to DOS machines.  On machines
+ * with plenty of memory, filling the whole histogram in one shot with Thomas'
+ * refined method might be faster than the present code --- but then again,
+ * it might not be any faster, and it's certainly more complicated.
+ */
+
+
+/* log2(histogram cells in update box) for each axis; this can be adjusted */
+#define BOX_C0_LOG  (HIST_C0_BITS-3)
+#define BOX_C1_LOG  (HIST_C1_BITS-3)
+#define BOX_C2_LOG  (HIST_C2_BITS-3)
+
+#define BOX_C0_ELEMS  (1<<BOX_C0_LOG) /* # of hist cells in update box */
+#define BOX_C1_ELEMS  (1<<BOX_C1_LOG)
+#define BOX_C2_ELEMS  (1<<BOX_C2_LOG)
+
+#define BOX_C0_SHIFT  (C0_SHIFT + BOX_C0_LOG)
+#define BOX_C1_SHIFT  (C1_SHIFT + BOX_C1_LOG)
+#define BOX_C2_SHIFT  (C2_SHIFT + BOX_C2_LOG)
+
+
+/*
+ * The next three routines implement inverse colormap filling.  They could
+ * all be folded into one big routine, but splitting them up this way saves
+ * some stack space (the mindist[] and bestdist[] arrays need not coexist)
+ * and may allow some compilers to produce better code by registerizing more
+ * inner-loop variables.
+ */
+
+LOCAL(int)
+find_nearby_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
+                    JSAMPLE colorlist[])
+/* Locate the colormap entries close enough to an update box to be candidates
+ * for the nearest entry to some cell(s) in the update box.  The update box
+ * is specified by the center coordinates of its first cell.  The number of
+ * candidate colormap entries is returned, and their colormap indexes are
+ * placed in colorlist[].
+ * This routine uses Heckbert's "locally sorted search" criterion to select
+ * the colors that need further consideration.
+ */
+{
+  int numcolors = cinfo->actual_number_of_colors;
+  int maxc0, maxc1, maxc2;
+  int centerc0, centerc1, centerc2;
+  int i, x, ncolors;
+  INT32 minmaxdist, min_dist, max_dist, tdist;
+  INT32 mindist[MAXNUMCOLORS];  /* min distance to colormap entry i */
+
+  /* Compute true coordinates of update box's upper corner and center.
+   * Actually we compute the coordinates of the center of the upper-corner
+   * histogram cell, which are the upper bounds of the volume we care about.
+   * Note that since ">>" rounds down, the "center" values may be closer to
+   * min than to max; hence comparisons to them must be "<=", not "<".
+   */
+  maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT));
+  centerc0 = (minc0 + maxc0) >> 1;
+  maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT));
+  centerc1 = (minc1 + maxc1) >> 1;
+  maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT));
+  centerc2 = (minc2 + maxc2) >> 1;
+
+  /* For each color in colormap, find:
+   *  1. its minimum squared-distance to any point in the update box
+   *     (zero if color is within update box);
+   *  2. its maximum squared-distance to any point in the update box.
+   * Both of these can be found by considering only the corners of the box.
+   * We save the minimum distance for each color in mindist[];
+   * only the smallest maximum distance is of interest.
+   */
+  minmaxdist = 0x7FFFFFFFL;
+
+  for (i = 0; i < numcolors; i++) {
+    /* We compute the squared-c0-distance term, then add in the other two. */
+    x = GETJSAMPLE(cinfo->colormap[0][i]);
+    if (x < minc0) {
+      tdist = (x - minc0) * C0_SCALE;
+      min_dist = tdist*tdist;
+      tdist = (x - maxc0) * C0_SCALE;
+      max_dist = tdist*tdist;
+    } else if (x > maxc0) {
+      tdist = (x - maxc0) * C0_SCALE;
+      min_dist = tdist*tdist;
+      tdist = (x - minc0) * C0_SCALE;
+      max_dist = tdist*tdist;
+    } else {
+      /* within cell range so no contribution to min_dist */
+      min_dist = 0;
+      if (x <= centerc0) {
+        tdist = (x - maxc0) * C0_SCALE;
+        max_dist = tdist*tdist;
+      } else {
+        tdist = (x - minc0) * C0_SCALE;
+        max_dist = tdist*tdist;
+      }
+    }
+
+    x = GETJSAMPLE(cinfo->colormap[1][i]);
+    if (x < minc1) {
+      tdist = (x - minc1) * C1_SCALE;
+      min_dist += tdist*tdist;
+      tdist = (x - maxc1) * C1_SCALE;
+      max_dist += tdist*tdist;
+    } else if (x > maxc1) {
+      tdist = (x - maxc1) * C1_SCALE;
+      min_dist += tdist*tdist;
+      tdist = (x - minc1) * C1_SCALE;
+      max_dist += tdist*tdist;
+    } else {
+      /* within cell range so no contribution to min_dist */
+      if (x <= centerc1) {
+        tdist = (x - maxc1) * C1_SCALE;
+        max_dist += tdist*tdist;
+      } else {
+        tdist = (x - minc1) * C1_SCALE;
+        max_dist += tdist*tdist;
+      }
+    }
+
+    x = GETJSAMPLE(cinfo->colormap[2][i]);
+    if (x < minc2) {
+      tdist = (x - minc2) * C2_SCALE;
+      min_dist += tdist*tdist;
+      tdist = (x - maxc2) * C2_SCALE;
+      max_dist += tdist*tdist;
+    } else if (x > maxc2) {
+      tdist = (x - maxc2) * C2_SCALE;
+      min_dist += tdist*tdist;
+      tdist = (x - minc2) * C2_SCALE;
+      max_dist += tdist*tdist;
+    } else {
+      /* within cell range so no contribution to min_dist */
+      if (x <= centerc2) {
+        tdist = (x - maxc2) * C2_SCALE;
+        max_dist += tdist*tdist;
+      } else {
+        tdist = (x - minc2) * C2_SCALE;
+        max_dist += tdist*tdist;
+      }
+    }
+
+    mindist[i] = min_dist;      /* save away the results */
+    if (max_dist < minmaxdist)
+      minmaxdist = max_dist;
+  }
+
+  /* Now we know that no cell in the update box is more than minmaxdist
+   * away from some colormap entry.  Therefore, only colors that are
+   * within minmaxdist of some part of the box need be considered.
+   */
+  ncolors = 0;
+  for (i = 0; i < numcolors; i++) {
+    if (mindist[i] <= minmaxdist)
+      colorlist[ncolors++] = (JSAMPLE) i;
+  }
+  return ncolors;
+}
+
+
+LOCAL(void)
+find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
+                  int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[])
+/* Find the closest colormap entry for each cell in the update box,
+ * given the list of candidate colors prepared by find_nearby_colors.
+ * Return the indexes of the closest entries in the bestcolor[] array.
+ * This routine uses Thomas' incremental distance calculation method to
+ * find the distance from a colormap entry to successive cells in the box.
+ */
+{
+  int ic0, ic1, ic2;
+  int i, icolor;
+  register INT32 * bptr;        /* pointer into bestdist[] array */
+  JSAMPLE * cptr;               /* pointer into bestcolor[] array */
+  INT32 dist0, dist1;           /* initial distance values */
+  register INT32 dist2;         /* current distance in inner loop */
+  INT32 xx0, xx1;               /* distance increments */
+  register INT32 xx2;
+  INT32 inc0, inc1, inc2;       /* initial values for increments */
+  /* This array holds the distance to the nearest-so-far color for each cell */
+  INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
+
+  /* Initialize best-distance for each cell of the update box */
+  bptr = bestdist;
+  for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--)
+    *bptr++ = 0x7FFFFFFFL;
+
+  /* For each color selected by find_nearby_colors,
+   * compute its distance to the center of each cell in the box.
+   * If that's less than best-so-far, update best distance and color number.
+   */
+
+  /* Nominal steps between cell centers ("x" in Thomas article) */
+#define STEP_C0  ((1 << C0_SHIFT) * C0_SCALE)
+#define STEP_C1  ((1 << C1_SHIFT) * C1_SCALE)
+#define STEP_C2  ((1 << C2_SHIFT) * C2_SCALE)
+
+  for (i = 0; i < numcolors; i++) {
+    icolor = GETJSAMPLE(colorlist[i]);
+    /* Compute (square of) distance from minc0/c1/c2 to this color */
+    inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE;
+    dist0 = inc0*inc0;
+    inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE;
+    dist0 += inc1*inc1;
+    inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE;
+    dist0 += inc2*inc2;
+    /* Form the initial difference increments */
+    inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;
+    inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1;
+    inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2;
+    /* Now loop over all cells in box, updating distance per Thomas method */
+    bptr = bestdist;
+    cptr = bestcolor;
+    xx0 = inc0;
+    for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) {
+      dist1 = dist0;
+      xx1 = inc1;
+      for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) {
+        dist2 = dist1;
+        xx2 = inc2;
+        for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) {
+          if (dist2 < *bptr) {
+            *bptr = dist2;
+            *cptr = (JSAMPLE) icolor;
+          }
+          dist2 += xx2;
+          xx2 += 2 * STEP_C2 * STEP_C2;
+          bptr++;
+          cptr++;
+        }
+        dist1 += xx1;
+        xx1 += 2 * STEP_C1 * STEP_C1;
+      }
+      dist0 += xx0;
+      xx0 += 2 * STEP_C0 * STEP_C0;
+    }
+  }
+}
+
+
+LOCAL(void)
+fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2)
+/* Fill the inverse-colormap entries in the update box that contains */
+/* histogram cell c0/c1/c2.  (Only that one cell MUST be filled, but */
+/* we can fill as many others as we wish.) */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  hist3d histogram = cquantize->histogram;
+  int minc0, minc1, minc2;      /* lower left corner of update box */
+  int ic0, ic1, ic2;
+  register JSAMPLE * cptr;      /* pointer into bestcolor[] array */
+  register histptr cachep;      /* pointer into main cache array */
+  /* This array lists the candidate colormap indexes. */
+  JSAMPLE colorlist[MAXNUMCOLORS];
+  int numcolors;                /* number of candidate colors */
+  /* This array holds the actually closest colormap index for each cell. */
+  JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
+
+  /* Convert cell coordinates to update box ID */
+  c0 >>= BOX_C0_LOG;
+  c1 >>= BOX_C1_LOG;
+  c2 >>= BOX_C2_LOG;
+
+  /* Compute true coordinates of update box's origin corner.
+   * Actually we compute the coordinates of the center of the corner
+   * histogram cell, which are the lower bounds of the volume we care about.
+   */
+  minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1);
+  minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1);
+  minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1);
+
+  /* Determine which colormap entries are close enough to be candidates
+   * for the nearest entry to some cell in the update box.
+   */
+  numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist);
+
+  /* Determine the actually nearest colors. */
+  find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist,
+                   bestcolor);
+
+  /* Save the best color numbers (plus 1) in the main cache array */
+  c0 <<= BOX_C0_LOG;            /* convert ID back to base cell indexes */
+  c1 <<= BOX_C1_LOG;
+  c2 <<= BOX_C2_LOG;
+  cptr = bestcolor;
+  for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) {
+    for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) {
+      cachep = & histogram[c0+ic0][c1+ic1][c2];
+      for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) {
+        *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1);
+      }
+    }
+  }
+}
+
+
+/*
+ * Map some rows of pixels to the output colormapped representation.
+ */
+
+METHODDEF(void)
+pass2_no_dither (j_decompress_ptr cinfo,
+                 JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
+/* This version performs no dithering */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  hist3d histogram = cquantize->histogram;
+  register JSAMPROW inptr, outptr;
+  register histptr cachep;
+  register int c0, c1, c2;
+  int row;
+  JDIMENSION col;
+  JDIMENSION width = cinfo->output_width;
+
+  for (row = 0; row < num_rows; row++) {
+    inptr = input_buf[row];
+    outptr = output_buf[row];
+    for (col = width; col > 0; col--) {
+      /* get pixel value and index into the cache */
+      c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT;
+      c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT;
+      c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT;
+      cachep = & histogram[c0][c1][c2];
+      /* If we have not seen this color before, find nearest colormap entry */
+      /* and update the cache */
+      if (*cachep == 0)
+        fill_inverse_cmap(cinfo, c0,c1,c2);
+      /* Now emit the colormap index for this cell */
+      *outptr++ = (JSAMPLE) (*cachep - 1);
+    }
+  }
+}
+
+
+METHODDEF(void)
+pass2_fs_dither (j_decompress_ptr cinfo,
+                 JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
+/* This version performs Floyd-Steinberg dithering */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  hist3d histogram = cquantize->histogram;
+  register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */
+  LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */
+  LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */
+  register FSERRPTR errorptr;   /* => fserrors[] at column before current */
+  JSAMPROW inptr;               /* => current input pixel */
+  JSAMPROW outptr;              /* => current output pixel */
+  histptr cachep;
+  int dir;                      /* +1 or -1 depending on direction */
+  int dir3;                     /* 3*dir, for advancing inptr & errorptr */
+  int row;
+  JDIMENSION col;
+  JDIMENSION width = cinfo->output_width;
+  JSAMPLE *range_limit = cinfo->sample_range_limit;
+  int *error_limit = cquantize->error_limiter;
+  JSAMPROW colormap0 = cinfo->colormap[0];
+  JSAMPROW colormap1 = cinfo->colormap[1];
+  JSAMPROW colormap2 = cinfo->colormap[2];
+  SHIFT_TEMPS
+
+  for (row = 0; row < num_rows; row++) {
+    inptr = input_buf[row];
+    outptr = output_buf[row];
+    if (cquantize->on_odd_row) {
+      /* work right to left in this row */
+      inptr += (width-1) * 3;   /* so point to rightmost pixel */
+      outptr += width-1;
+      dir = -1;
+      dir3 = -3;
+      errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */
+      cquantize->on_odd_row = FALSE; /* flip for next time */
+    } else {
+      /* work left to right in this row */
+      dir = 1;
+      dir3 = 3;
+      errorptr = cquantize->fserrors; /* => entry before first real column */
+      cquantize->on_odd_row = TRUE; /* flip for next time */
+    }
+    /* Preset error values: no error propagated to first pixel from left */
+    cur0 = cur1 = cur2 = 0;
+    /* and no error propagated to row below yet */
+    belowerr0 = belowerr1 = belowerr2 = 0;
+    bpreverr0 = bpreverr1 = bpreverr2 = 0;
+
+    for (col = width; col > 0; col--) {
+      /* curN holds the error propagated from the previous pixel on the
+       * current line.  Add the error propagated from the previous line
+       * to form the complete error correction term for this pixel, and
+       * round the error term (which is expressed * 16) to an integer.
+       * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
+       * for either sign of the error value.
+       * Note: errorptr points to *previous* column's array entry.
+       */
+      cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4);
+      cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4);
+      cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4);
+      /* Limit the error using transfer function set by init_error_limit.
+       * See comments with init_error_limit for rationale.
+       */
+      cur0 = error_limit[cur0];
+      cur1 = error_limit[cur1];
+      cur2 = error_limit[cur2];
+      /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
+       * The maximum error is +- MAXJSAMPLE (or less with error limiting);
+       * this sets the required size of the range_limit array.
+       */
+      cur0 += GETJSAMPLE(inptr[0]);
+      cur1 += GETJSAMPLE(inptr[1]);
+      cur2 += GETJSAMPLE(inptr[2]);
+      cur0 = GETJSAMPLE(range_limit[cur0]);
+      cur1 = GETJSAMPLE(range_limit[cur1]);
+      cur2 = GETJSAMPLE(range_limit[cur2]);
+      /* Index into the cache with adjusted pixel value */
+      cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT];
+      /* If we have not seen this color before, find nearest colormap */
+      /* entry and update the cache */
+      if (*cachep == 0)
+        fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT);
+      /* Now emit the colormap index for this cell */
+      { register int pixcode = *cachep - 1;
+        *outptr = (JSAMPLE) pixcode;
+        /* Compute representation error for this pixel */
+        cur0 -= GETJSAMPLE(colormap0[pixcode]);
+        cur1 -= GETJSAMPLE(colormap1[pixcode]);
+        cur2 -= GETJSAMPLE(colormap2[pixcode]);
+      }
+      /* Compute error fractions to be propagated to adjacent pixels.
+       * Add these into the running sums, and simultaneously shift the
+       * next-line error sums left by 1 column.
+       */
+      { register LOCFSERROR bnexterr, delta;
+
+        bnexterr = cur0;        /* Process component 0 */
+        delta = cur0 * 2;
+        cur0 += delta;          /* form error * 3 */
+        errorptr[0] = (FSERROR) (bpreverr0 + cur0);
+        cur0 += delta;          /* form error * 5 */
+        bpreverr0 = belowerr0 + cur0;
+        belowerr0 = bnexterr;
+        cur0 += delta;          /* form error * 7 */
+        bnexterr = cur1;        /* Process component 1 */
+        delta = cur1 * 2;
+        cur1 += delta;          /* form error * 3 */
+        errorptr[1] = (FSERROR) (bpreverr1 + cur1);
+        cur1 += delta;          /* form error * 5 */
+        bpreverr1 = belowerr1 + cur1;
+        belowerr1 = bnexterr;
+        cur1 += delta;          /* form error * 7 */
+        bnexterr = cur2;        /* Process component 2 */
+        delta = cur2 * 2;
+        cur2 += delta;          /* form error * 3 */
+        errorptr[2] = (FSERROR) (bpreverr2 + cur2);
+        cur2 += delta;          /* form error * 5 */
+        bpreverr2 = belowerr2 + cur2;
+        belowerr2 = bnexterr;
+        cur2 += delta;          /* form error * 7 */
+      }
+      /* At this point curN contains the 7/16 error value to be propagated
+       * to the next pixel on the current line, and all the errors for the
+       * next line have been shifted over.  We are therefore ready to move on.
+       */
+      inptr += dir3;            /* Advance pixel pointers to next column */
+      outptr += dir;
+      errorptr += dir3;         /* advance errorptr to current column */
+    }
+    /* Post-loop cleanup: we must unload the final error values into the
+     * final fserrors[] entry.  Note we need not unload belowerrN because
+     * it is for the dummy column before or after the actual array.
+     */
+    errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */
+    errorptr[1] = (FSERROR) bpreverr1;
+    errorptr[2] = (FSERROR) bpreverr2;
+  }
+}
+
+
+/*
+ * Initialize the error-limiting transfer function (lookup table).
+ * The raw F-S error computation can potentially compute error values of up to
+ * +- MAXJSAMPLE.  But we want the maximum correction applied to a pixel to be
+ * much less, otherwise obviously wrong pixels will be created.  (Typical
+ * effects include weird fringes at color-area boundaries, isolated bright
+ * pixels in a dark area, etc.)  The standard advice for avoiding this problem
+ * is to ensure that the "corners" of the color cube are allocated as output
+ * colors; then repeated errors in the same direction cannot cause cascading
+ * error buildup.  However, that only prevents the error from getting
+ * completely out of hand; Aaron Giles reports that error limiting improves
+ * the results even with corner colors allocated.
+ * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty
+ * well, but the smoother transfer function used below is even better.  Thanks
+ * to Aaron Giles for this idea.
+ */
+
+LOCAL(void)
+init_error_limit (j_decompress_ptr cinfo)
+/* Allocate and fill in the error_limiter table */
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  int * table;
+  int in, out;
+
+  table = (int *) (*cinfo->mem->alloc_small)
+    ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int));
+  table += MAXJSAMPLE;          /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */
+  cquantize->error_limiter = table;
+
+#define STEPSIZE ((MAXJSAMPLE+1)/16)
+  /* Map errors 1:1 up to +- MAXJSAMPLE/16 */
+  out = 0;
+  for (in = 0; in < STEPSIZE; in++, out++) {
+    table[in] = out; table[-in] = -out;
+  }
+  /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */
+  for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) {
+    table[in] = out; table[-in] = -out;
+  }
+  /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */
+  for (; in <= MAXJSAMPLE; in++) {
+    table[in] = out; table[-in] = -out;
+  }
+#undef STEPSIZE
+}
+
+
+/*
+ * Finish up at the end of each pass.
+ */
+
+METHODDEF(void)
+finish_pass1 (j_decompress_ptr cinfo)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+
+  /* Select the representative colors and fill in cinfo->colormap */
+  cinfo->colormap = cquantize->sv_colormap;
+  select_colors(cinfo, cquantize->desired);
+  /* Force next pass to zero the color index table */
+  cquantize->needs_zeroed = TRUE;
+}
+
+
+METHODDEF(void)
+finish_pass2 (j_decompress_ptr cinfo)
+{
+  /* no work */
+}
+
+
+/*
+ * Initialize for each processing pass.
+ */
+
+METHODDEF(void)
+start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+  hist3d histogram = cquantize->histogram;
+  int i;
+
+  /* Only F-S dithering or no dithering is supported. */
+  /* If user asks for ordered dither, give him F-S. */
+  if (cinfo->dither_mode != JDITHER_NONE)
+    cinfo->dither_mode = JDITHER_FS;
+
+  if (is_pre_scan) {
+    /* Set up method pointers */
+    cquantize->pub.color_quantize = prescan_quantize;
+    cquantize->pub.finish_pass = finish_pass1;
+    cquantize->needs_zeroed = TRUE; /* Always zero histogram */
+  } else {
+    /* Set up method pointers */
+    if (cinfo->dither_mode == JDITHER_FS)
+      cquantize->pub.color_quantize = pass2_fs_dither;
+    else
+      cquantize->pub.color_quantize = pass2_no_dither;
+    cquantize->pub.finish_pass = finish_pass2;
+
+    /* Make sure color count is acceptable */
+    i = cinfo->actual_number_of_colors;
+    if (i < 1)
+      ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1);
+    if (i > MAXNUMCOLORS)
+      ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
+
+    if (cinfo->dither_mode == JDITHER_FS) {
+      size_t arraysize = (size_t) ((cinfo->output_width + 2) *
+                                   (3 * SIZEOF(FSERROR)));
+      /* Allocate Floyd-Steinberg workspace if we didn't already. */
+      if (cquantize->fserrors == NULL)
+        cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
+          ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
+      /* Initialize the propagated errors to zero. */
+      jzero_far((void FAR *) cquantize->fserrors, arraysize);
+      /* Make the error-limit table if we didn't already. */
+      if (cquantize->error_limiter == NULL)
+        init_error_limit(cinfo);
+      cquantize->on_odd_row = FALSE;
+    }
+
+  }
+  /* Zero the histogram or inverse color map, if necessary */
+  if (cquantize->needs_zeroed) {
+    for (i = 0; i < HIST_C0_ELEMS; i++) {
+      jzero_far((void FAR *) histogram[i],
+                HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
+    }
+    cquantize->needs_zeroed = FALSE;
+  }
+}
+
+
+/*
+ * Switch to a new external colormap between output passes.
+ */
+
+METHODDEF(void)
+new_color_map_2_quant (j_decompress_ptr cinfo)
+{
+  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
+
+  /* Reset the inverse color map */
+  cquantize->needs_zeroed = TRUE;
+}
+
+
+/*
+ * Module initialization routine for 2-pass color quantization.
+ */
+
+GLOBAL(void)
+jinit_2pass_quantizer (j_decompress_ptr cinfo)
+{
+  my_cquantize_ptr cquantize;
+  int i;
+
+  cquantize = (my_cquantize_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                SIZEOF(my_cquantizer));
+  cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
+  cquantize->pub.start_pass = start_pass_2_quant;
+  cquantize->pub.new_color_map = new_color_map_2_quant;
+  cquantize->fserrors = NULL;   /* flag optional arrays not allocated */
+  cquantize->error_limiter = NULL;
+
+  /* Make sure jdmaster didn't give me a case I can't handle */
+  if (cinfo->out_color_components != 3)
+    ERREXIT(cinfo, JERR_NOTIMPL);
+
+  /* Allocate the histogram/inverse colormap storage */
+  cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small)
+    ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d));
+  for (i = 0; i < HIST_C0_ELEMS; i++) {
+    cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large)
+      ((j_common_ptr) cinfo, JPOOL_IMAGE,
+       HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
+  }
+  cquantize->needs_zeroed = TRUE; /* histogram is garbage now */
+
+  /* Allocate storage for the completed colormap, if required.
+   * We do this now since it is FAR storage and may affect
+   * the memory manager's space calculations.
+   */
+  if (cinfo->enable_2pass_quant) {
+    /* Make sure color count is acceptable */
+    int desired = cinfo->desired_number_of_colors;
+    /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */
+    if (desired < 8)
+      ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8);
+    /* Make sure colormap indexes can be represented by JSAMPLEs */
+    if (desired > MAXNUMCOLORS)
+      ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
+    cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
+      ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3);
+    cquantize->desired = desired;
+  } else
+    cquantize->sv_colormap = NULL;
+
+  /* Only F-S dithering or no dithering is supported. */
+  /* If user asks for ordered dither, give him F-S. */
+  if (cinfo->dither_mode != JDITHER_NONE)
+    cinfo->dither_mode = JDITHER_FS;
+
+  /* Allocate Floyd-Steinberg workspace if necessary.
+   * This isn't really needed until pass 2, but again it is FAR storage.
+   * Although we will cope with a later change in dither_mode,
+   * we do not promise to honor max_memory_to_use if dither_mode changes.
+   */
+  if (cinfo->dither_mode == JDITHER_FS) {
+    cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
+      ((j_common_ptr) cinfo, JPOOL_IMAGE,
+       (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR))));
+    /* Might as well create the error-limiting table too. */
+    init_error_limit(cinfo);
+  }
+}
+
+#endif /* QUANT_2PASS_SUPPORTED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jutils.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,183 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jutils.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains tables and miscellaneous utility routines needed
+ * for both compression and decompression.
+ * Note we prefix all global names with "j" to minimize conflicts with
+ * a surrounding application.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element
+ * of a DCT block read in natural order (left to right, top to bottom).
+ */
+
+#if 0                           /* This table is not actually needed in v6a */
+
+const int jpeg_zigzag_order[DCTSIZE2] = {
+   0,  1,  5,  6, 14, 15, 27, 28,
+   2,  4,  7, 13, 16, 26, 29, 42,
+   3,  8, 12, 17, 25, 30, 41, 43,
+   9, 11, 18, 24, 31, 40, 44, 53,
+  10, 19, 23, 32, 39, 45, 52, 54,
+  20, 22, 33, 38, 46, 51, 55, 60,
+  21, 34, 37, 47, 50, 56, 59, 61,
+  35, 36, 48, 49, 57, 58, 62, 63
+};
+
+#endif
+
+/*
+ * jpeg_natural_order[i] is the natural-order position of the i'th element
+ * of zigzag order.
+ *
+ * When reading corrupted data, the Huffman decoders could attempt
+ * to reference an entry beyond the end of this array (if the decoded
+ * zero run length reaches past the end of the block).  To prevent
+ * wild stores without adding an inner-loop test, we put some extra
+ * "63"s after the real entries.  This will cause the extra coefficient
+ * to be stored in location 63 of the block, not somewhere random.
+ * The worst case would be a run-length of 15, which means we need 16
+ * fake entries.
+ */
+
+const int jpeg_natural_order[DCTSIZE2+16] = {
+  0,  1,  8, 16,  9,  2,  3, 10,
+ 17, 24, 32, 25, 18, 11,  4,  5,
+ 12, 19, 26, 33, 40, 48, 41, 34,
+ 27, 20, 13,  6,  7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36,
+ 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46,
+ 53, 60, 61, 54, 47, 55, 62, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
+ 63, 63, 63, 63, 63, 63, 63, 63
+};
+
+
+/*
+ * Arithmetic utilities
+ */
+
+GLOBAL(long)
+jdiv_round_up (long a, long b)
+/* Compute a/b rounded up to next integer, ie, ceil(a/b) */
+/* Assumes a >= 0, b > 0 */
+{
+  return (a + b - 1L) / b;
+}
+
+
+GLOBAL(long)
+jround_up (long a, long b)
+/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */
+/* Assumes a >= 0, b > 0 */
+{
+  a += b - 1L;
+  return a - (a % b);
+}
+
+
+/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
+ * and coefficient-block arrays.  This won't work on 80x86 because the arrays
+ * are FAR and we're assuming a small-pointer memory model.  However, some
+ * DOS compilers provide far-pointer versions of memcpy() and memset() even
+ * in the small-model libraries.  These will be used if USE_FMEM is defined.
+ * Otherwise, the routines below do it the hard way.  (The performance cost
+ * is not all that great, because these routines aren't very heavily used.)
+ */
+
+#ifndef NEED_FAR_POINTERS       /* normal case, same as regular macros */
+#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size)
+#define FMEMZERO(target,size)   MEMZERO(target,size)
+#else                           /* 80x86 case, define if we can */
+#ifdef USE_FMEM
+#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
+#define FMEMZERO(target,size)   _fmemset((void FAR *)(target), 0, (size_t)(size))
+#endif
+#endif
+
+
+GLOBAL(void)
+jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
+                   JSAMPARRAY output_array, int dest_row,
+                   int num_rows, JDIMENSION num_cols)
+/* Copy some rows of samples from one place to another.
+ * num_rows rows are copied from input_array[source_row++]
+ * to output_array[dest_row++]; these areas may overlap for duplication.
+ * The source and destination arrays must be at least as wide as num_cols.
+ */
+{
+  register JSAMPROW inptr, outptr;
+#ifdef FMEMCOPY
+  register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));
+#else
+  register JDIMENSION count;
+#endif
+  register int row;
+
+  input_array += source_row;
+  output_array += dest_row;
+
+  for (row = num_rows; row > 0; row--) {
+    inptr = *input_array++;
+    outptr = *output_array++;
+#ifdef FMEMCOPY
+    FMEMCOPY(outptr, inptr, count);
+#else
+    for (count = num_cols; count > 0; count--)
+      *outptr++ = *inptr++;     /* needn't bother with GETJSAMPLE() here */
+#endif
+  }
+}
+
+
+GLOBAL(void)
+jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
+                 JDIMENSION num_blocks)
+/* Copy a row of coefficient blocks from one place to another. */
+{
+#ifdef FMEMCOPY
+  FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
+#else
+  register JCOEFPTR inptr, outptr;
+  register long count;
+
+  inptr = (JCOEFPTR) input_row;
+  outptr = (JCOEFPTR) output_row;
+  for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {
+    *outptr++ = *inptr++;
+  }
+#endif
+}
+
+
+GLOBAL(void)
+jzero_far (void FAR * target, size_t bytestozero)
+/* Zero out a chunk of FAR memory. */
+/* This might be sample-array data, block-array data, or alloc_large data. */
+{
+#ifdef FMEMZERO
+  FMEMZERO(target, bytestozero);
+#else
+  register char FAR * ptr = (char FAR *) target;
+  register size_t count;
+
+  for (count = bytestozero; count > 0; count--) {
+    *ptr++ = 0;
+  }
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/awt/image/jpeg/jpeg-6b/jversion.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,18 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * jversion.h
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains software version identification.
+ */
+
+
+#define JVERSION        "6b  27-Mar-1998"
+
+#define JCOPYRIGHT      "Copyright (C) 1998, Thomas G. Lane"
--- a/src/share/native/sun/awt/image/jpeg/jpegdecoder.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/awt/image/jpeg/jpegdecoder.c	Tue Aug 22 02:03:52 2017 +0100
@@ -45,7 +45,7 @@
 #undef boolean
 #undef FAR
 #include <jpeglib.h>
-#include "jerror.h"
+#include <jerror.h>
 
 /* The method IDs we cache. Note that the last two belongs to the
  * java.io.InputStream class.
--- a/src/share/native/sun/awt/image/jpeg/jpegint.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,396 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jpegint.h
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file provides common declarations for the various JPEG modules.
- * These declarations are considered internal to the JPEG library; most
- * applications using the library shouldn't need to include this file.
- */
-
-
-/* Declarations for both compression & decompression */
-
-typedef enum {                  /* Operating modes for buffer controllers */
-        JBUF_PASS_THRU,         /* Plain stripwise operation */
-        /* Remaining modes require a full-image buffer to have been created */
-        JBUF_SAVE_SOURCE,       /* Run source subobject only, save output */
-        JBUF_CRANK_DEST,        /* Run dest subobject only, using saved data */
-        JBUF_SAVE_AND_PASS      /* Run both subobjects, save output */
-} J_BUF_MODE;
-
-/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
-#define CSTATE_START    100     /* after create_compress */
-#define CSTATE_SCANNING 101     /* start_compress done, write_scanlines OK */
-#define CSTATE_RAW_OK   102     /* start_compress done, write_raw_data OK */
-#define CSTATE_WRCOEFS  103     /* jpeg_write_coefficients done */
-#define DSTATE_START    200     /* after create_decompress */
-#define DSTATE_INHEADER 201     /* reading header markers, no SOS yet */
-#define DSTATE_READY    202     /* found SOS, ready for start_decompress */
-#define DSTATE_PRELOAD  203     /* reading multiscan file in start_decompress*/
-#define DSTATE_PRESCAN  204     /* performing dummy pass for 2-pass quant */
-#define DSTATE_SCANNING 205     /* start_decompress done, read_scanlines OK */
-#define DSTATE_RAW_OK   206     /* start_decompress done, read_raw_data OK */
-#define DSTATE_BUFIMAGE 207     /* expecting jpeg_start_output */
-#define DSTATE_BUFPOST  208     /* looking for SOS/EOI in jpeg_finish_output */
-#define DSTATE_RDCOEFS  209     /* reading file in jpeg_read_coefficients */
-#define DSTATE_STOPPING 210     /* looking for EOI in jpeg_finish_decompress */
-
-
-/* Declarations for compression modules */
-
-/* Master control module */
-struct jpeg_comp_master {
-  JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
-  JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
-  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
-
-  /* State variables made visible to other modules */
-  boolean call_pass_startup;    /* True if pass_startup must be called */
-  boolean is_last_pass;         /* True during last pass */
-};
-
-/* Main buffer control (downsampled-data buffer) */
-struct jpeg_c_main_controller {
-  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
-  JMETHOD(void, process_data, (j_compress_ptr cinfo,
-                               JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
-                               JDIMENSION in_rows_avail));
-};
-
-/* Compression preprocessing (downsampling input buffer control) */
-struct jpeg_c_prep_controller {
-  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
-  JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
-                                   JSAMPARRAY input_buf,
-                                   JDIMENSION *in_row_ctr,
-                                   JDIMENSION in_rows_avail,
-                                   JSAMPIMAGE output_buf,
-                                   JDIMENSION *out_row_group_ctr,
-                                   JDIMENSION out_row_groups_avail));
-};
-
-/* Coefficient buffer control */
-struct jpeg_c_coef_controller {
-  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
-  JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
-                                   JSAMPIMAGE input_buf));
-};
-
-/* Colorspace conversion */
-struct jpeg_color_converter {
-  JMETHOD(void, start_pass, (j_compress_ptr cinfo));
-  JMETHOD(void, color_convert, (j_compress_ptr cinfo,
-                                JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
-                                JDIMENSION output_row, int num_rows));
-};
-
-/* Downsampling */
-struct jpeg_downsampler {
-  JMETHOD(void, start_pass, (j_compress_ptr cinfo));
-  JMETHOD(void, downsample, (j_compress_ptr cinfo,
-                             JSAMPIMAGE input_buf, JDIMENSION in_row_index,
-                             JSAMPIMAGE output_buf,
-                             JDIMENSION out_row_group_index));
-
-  boolean need_context_rows;    /* TRUE if need rows above & below */
-};
-
-/* Forward DCT (also controls coefficient quantization) */
-struct jpeg_forward_dct {
-  JMETHOD(void, start_pass, (j_compress_ptr cinfo));
-  /* perhaps this should be an array??? */
-  JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
-                              jpeg_component_info * compptr,
-                              JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
-                              JDIMENSION start_row, JDIMENSION start_col,
-                              JDIMENSION num_blocks));
-};
-
-/* Entropy encoding */
-struct jpeg_entropy_encoder {
-  JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
-  JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
-  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
-};
-
-/* Marker writing */
-struct jpeg_marker_writer {
-  JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
-  JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
-  JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
-  JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
-  JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
-  /* These routines are exported to allow insertion of extra markers */
-  /* Probably only COM and APPn markers should be written this way */
-  JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
-                                      unsigned int datalen));
-  JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
-};
-
-
-/* Declarations for decompression modules */
-
-/* Master control module */
-struct jpeg_decomp_master {
-  JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
-  JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
-
-  /* State variables made visible to other modules */
-  boolean is_dummy_pass;        /* True during 1st pass for 2-pass quant */
-};
-
-/* Input control module */
-struct jpeg_input_controller {
-  JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
-  JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
-  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
-  JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
-
-  /* State variables made visible to other modules */
-  boolean has_multiple_scans;   /* True if file has multiple scans */
-  boolean eoi_reached;          /* True when EOI has been consumed */
-};
-
-/* Main buffer control (downsampled-data buffer) */
-struct jpeg_d_main_controller {
-  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
-  JMETHOD(void, process_data, (j_decompress_ptr cinfo,
-                               JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
-                               JDIMENSION out_rows_avail));
-};
-
-/* Coefficient buffer control */
-struct jpeg_d_coef_controller {
-  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
-  JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
-  JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
-  JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
-                                 JSAMPIMAGE output_buf));
-  /* Pointer to array of coefficient virtual arrays, or NULL if none */
-  jvirt_barray_ptr *coef_arrays;
-};
-
-/* Decompression postprocessing (color quantization buffer control) */
-struct jpeg_d_post_controller {
-  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
-  JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
-                                    JSAMPIMAGE input_buf,
-                                    JDIMENSION *in_row_group_ctr,
-                                    JDIMENSION in_row_groups_avail,
-                                    JSAMPARRAY output_buf,
-                                    JDIMENSION *out_row_ctr,
-                                    JDIMENSION out_rows_avail));
-};
-
-/* Marker reading & parsing */
-struct jpeg_marker_reader {
-  JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
-  /* Read markers until SOS or EOI.
-   * Returns same codes as are defined for jpeg_consume_input:
-   * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
-   */
-  JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
-  /* Read a restart marker --- exported for use by entropy decoder only */
-  jpeg_marker_parser_method read_restart_marker;
-
-  /* State of marker reader --- nominally internal, but applications
-   * supplying COM or APPn handlers might like to know the state.
-   */
-  boolean saw_SOI;              /* found SOI? */
-  boolean saw_SOF;              /* found SOF? */
-  int next_restart_num;         /* next restart number expected (0-7) */
-  unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
-};
-
-/* Entropy decoding */
-struct jpeg_entropy_decoder {
-  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
-  JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
-                                JBLOCKROW *MCU_data));
-
-  /* This is here to share code between baseline and progressive decoders; */
-  /* other modules probably should not use it */
-  boolean insufficient_data;    /* set TRUE after emitting warning */
-};
-
-/* Inverse DCT (also performs dequantization) */
-typedef JMETHOD(void, inverse_DCT_method_ptr,
-                (j_decompress_ptr cinfo, jpeg_component_info * compptr,
-                 JCOEFPTR coef_block,
-                 JSAMPARRAY output_buf, JDIMENSION output_col));
-
-struct jpeg_inverse_dct {
-  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
-  /* It is useful to allow each component to have a separate IDCT method. */
-  inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
-};
-
-/* Upsampling (note that upsampler must also call color converter) */
-struct jpeg_upsampler {
-  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
-  JMETHOD(void, upsample, (j_decompress_ptr cinfo,
-                           JSAMPIMAGE input_buf,
-                           JDIMENSION *in_row_group_ctr,
-                           JDIMENSION in_row_groups_avail,
-                           JSAMPARRAY output_buf,
-                           JDIMENSION *out_row_ctr,
-                           JDIMENSION out_rows_avail));
-
-  boolean need_context_rows;    /* TRUE if need rows above & below */
-};
-
-/* Colorspace conversion */
-struct jpeg_color_deconverter {
-  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
-  JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
-                                JSAMPIMAGE input_buf, JDIMENSION input_row,
-                                JSAMPARRAY output_buf, int num_rows));
-};
-
-/* Color quantization or color precision reduction */
-struct jpeg_color_quantizer {
-  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
-  JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
-                                 JSAMPARRAY input_buf, JSAMPARRAY output_buf,
-                                 int num_rows));
-  JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
-  JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
-};
-
-
-/* Miscellaneous useful macros */
-
-#undef MAX
-#define MAX(a,b)        ((a) > (b) ? (a) : (b))
-#undef MIN
-#define MIN(a,b)        ((a) < (b) ? (a) : (b))
-
-
-/* We assume that right shift corresponds to signed division by 2 with
- * rounding towards minus infinity.  This is correct for typical "arithmetic
- * shift" instructions that shift in copies of the sign bit.  But some
- * C compilers implement >> with an unsigned shift.  For these machines you
- * must define RIGHT_SHIFT_IS_UNSIGNED.
- * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
- * It is only applied with constant shift counts.  SHIFT_TEMPS must be
- * included in the variables of any routine using RIGHT_SHIFT.
- */
-
-#ifdef RIGHT_SHIFT_IS_UNSIGNED
-#define SHIFT_TEMPS     INT32 shift_temp;
-#define RIGHT_SHIFT(x,shft)  \
-        ((shift_temp = (x)) < 0 ? \
-         (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
-         (shift_temp >> (shft)))
-#else
-#define SHIFT_TEMPS
-#define RIGHT_SHIFT(x,shft)     ((x) >> (shft))
-#endif
-
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jinit_compress_master   jICompress
-#define jinit_c_master_control  jICMaster
-#define jinit_c_main_controller jICMainC
-#define jinit_c_prep_controller jICPrepC
-#define jinit_c_coef_controller jICCoefC
-#define jinit_color_converter   jICColor
-#define jinit_downsampler       jIDownsampler
-#define jinit_forward_dct       jIFDCT
-#define jinit_huff_encoder      jIHEncoder
-#define jinit_phuff_encoder     jIPHEncoder
-#define jinit_marker_writer     jIMWriter
-#define jinit_master_decompress jIDMaster
-#define jinit_d_main_controller jIDMainC
-#define jinit_d_coef_controller jIDCoefC
-#define jinit_d_post_controller jIDPostC
-#define jinit_input_controller  jIInCtlr
-#define jinit_marker_reader     jIMReader
-#define jinit_huff_decoder      jIHDecoder
-#define jinit_phuff_decoder     jIPHDecoder
-#define jinit_inverse_dct       jIIDCT
-#define jinit_upsampler         jIUpsampler
-#define jinit_color_deconverter jIDColor
-#define jinit_1pass_quantizer   jI1Quant
-#define jinit_2pass_quantizer   jI2Quant
-#define jinit_merged_upsampler  jIMUpsampler
-#define jinit_memory_mgr        jIMemMgr
-#define jdiv_round_up           jDivRound
-#define jround_up               jRound
-#define jcopy_sample_rows       jCopySamples
-#define jcopy_block_row         jCopyBlocks
-#define jzero_far               jZeroFar
-#define jpeg_zigzag_order       jZIGTable
-#define jpeg_natural_order      jZAGTable
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/* Compression module initialization routines */
-EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
-                                         boolean transcode_only));
-EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
-                                          boolean need_full_buffer));
-EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
-                                          boolean need_full_buffer));
-EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
-                                          boolean need_full_buffer));
-EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
-/* Decompression module initialization routines */
-EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
-                                          boolean need_full_buffer));
-EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
-                                          boolean need_full_buffer));
-EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
-                                          boolean need_full_buffer));
-EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
-/* Memory manager initialization */
-EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
-
-/* Utility routines in jutils.c */
-EXTERN(long) jdiv_round_up JPP((long a, long b));
-EXTERN(long) jround_up JPP((long a, long b));
-EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
-                                    JSAMPARRAY output_array, int dest_row,
-                                    int num_rows, JDIMENSION num_cols));
-EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
-                                  JDIMENSION num_blocks));
-EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
-/* Constant tables in jutils.c */
-#if 0                           /* This table is not actually needed in v6a */
-extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
-#endif
-extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
-
-/* Suppress undefined-structure complaints if necessary. */
-
-#ifdef INCOMPLETE_TYPES_BROKEN
-#ifndef AM_MEMORY_MANAGER       /* only jmemmgr.c defines these */
-struct jvirt_sarray_control { long dummy; };
-struct jvirt_barray_control { long dummy; };
-#endif
-#endif /* INCOMPLETE_TYPES_BROKEN */
--- a/src/share/native/sun/awt/image/jpeg/jpeglib.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1100 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jpeglib.h
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file defines the application interface for the JPEG library.
- * Most applications using the library need only include this file,
- * and perhaps jerror.h if they want to know the exact error codes.
- */
-
-#ifndef JPEGLIB_H
-#define JPEGLIB_H
-
-/*
- * First we include the configuration files that record how this
- * installation of the JPEG library is set up.  jconfig.h can be
- * generated automatically for many systems.  jmorecfg.h contains
- * manual configuration options that most people need not worry about.
- */
-
-#ifndef JCONFIG_INCLUDED        /* in case jinclude.h already did */
-#include "jconfig.h"            /* widely used configuration options */
-#endif
-#include "jmorecfg.h"           /* seldom changed options */
-
-
-/* Version ID for the JPEG library.
- * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".
- */
-
-#define JPEG_LIB_VERSION  62    /* Version 6b */
-
-
-/* Various constants determining the sizes of things.
- * All of these are specified by the JPEG standard, so don't change them
- * if you want to be compatible.
- */
-
-#define DCTSIZE             8   /* The basic DCT block is 8x8 samples */
-#define DCTSIZE2            64  /* DCTSIZE squared; # of elements in a block */
-#define NUM_QUANT_TBLS      4   /* Quantization tables are numbered 0..3 */
-#define NUM_HUFF_TBLS       4   /* Huffman tables are numbered 0..3 */
-#define NUM_ARITH_TBLS      16  /* Arith-coding tables are numbered 0..15 */
-#define MAX_COMPS_IN_SCAN   4   /* JPEG limit on # of components in one scan */
-#define MAX_SAMP_FACTOR     4   /* JPEG limit on sampling factors */
-/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;
- * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.
- * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU
- * to handle it.  We even let you do this from the jconfig.h file.  However,
- * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe
- * sometimes emits noncompliant files doesn't mean you should too.
- */
-#define C_MAX_BLOCKS_IN_MCU   10 /* compressor's limit on blocks per MCU */
-#ifndef D_MAX_BLOCKS_IN_MCU
-#define D_MAX_BLOCKS_IN_MCU   10 /* decompressor's limit on blocks per MCU */
-#endif
-
-
-/* Data structures for images (arrays of samples and of DCT coefficients).
- * On 80x86 machines, the image arrays are too big for near pointers,
- * but the pointer arrays can fit in near memory.
- */
-
-typedef JSAMPLE FAR *JSAMPROW;  /* ptr to one image row of pixel samples. */
-typedef JSAMPROW *JSAMPARRAY;   /* ptr to some rows (a 2-D sample array) */
-typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
-
-typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */
-typedef JBLOCK FAR *JBLOCKROW;  /* pointer to one row of coefficient blocks */
-typedef JBLOCKROW *JBLOCKARRAY;         /* a 2-D array of coefficient blocks */
-typedef JBLOCKARRAY *JBLOCKIMAGE;       /* a 3-D array of coefficient blocks */
-
-typedef JCOEF FAR *JCOEFPTR;    /* useful in a couple of places */
-
-
-/* Types for JPEG compression parameters and working tables. */
-
-
-/* DCT coefficient quantization tables. */
-
-typedef struct {
-  /* This array gives the coefficient quantizers in natural array order
-   * (not the zigzag order in which they are stored in a JPEG DQT marker).
-   * CAUTION: IJG versions prior to v6a kept this array in zigzag order.
-   */
-  UINT16 quantval[DCTSIZE2];    /* quantization step for each coefficient */
-  /* This field is used only during compression.  It's initialized FALSE when
-   * the table is created, and set TRUE when it's been output to the file.
-   * You could suppress output of a table by setting this to TRUE.
-   * (See jpeg_suppress_tables for an example.)
-   */
-  boolean sent_table;           /* TRUE when table has been output */
-} JQUANT_TBL;
-
-
-/* Huffman coding tables. */
-
-typedef struct {
-  /* These two fields directly represent the contents of a JPEG DHT marker */
-  UINT8 bits[17];               /* bits[k] = # of symbols with codes of */
-                                /* length k bits; bits[0] is unused */
-  UINT8 huffval[256];           /* The symbols, in order of incr code length */
-  /* This field is used only during compression.  It's initialized FALSE when
-   * the table is created, and set TRUE when it's been output to the file.
-   * You could suppress output of a table by setting this to TRUE.
-   * (See jpeg_suppress_tables for an example.)
-   */
-  boolean sent_table;           /* TRUE when table has been output */
-} JHUFF_TBL;
-
-
-/* Basic info about one component (color channel). */
-
-typedef struct {
-  /* These values are fixed over the whole image. */
-  /* For compression, they must be supplied by parameter setup; */
-  /* for decompression, they are read from the SOF marker. */
-  int component_id;             /* identifier for this component (0..255) */
-  int component_index;          /* its index in SOF or cinfo->comp_info[] */
-  int h_samp_factor;            /* horizontal sampling factor (1..4) */
-  int v_samp_factor;            /* vertical sampling factor (1..4) */
-  int quant_tbl_no;             /* quantization table selector (0..3) */
-  /* These values may vary between scans. */
-  /* For compression, they must be supplied by parameter setup; */
-  /* for decompression, they are read from the SOS marker. */
-  /* The decompressor output side may not use these variables. */
-  int dc_tbl_no;                /* DC entropy table selector (0..3) */
-  int ac_tbl_no;                /* AC entropy table selector (0..3) */
-
-  /* Remaining fields should be treated as private by applications. */
-
-  /* These values are computed during compression or decompression startup: */
-  /* Component's size in DCT blocks.
-   * Any dummy blocks added to complete an MCU are not counted; therefore
-   * these values do not depend on whether a scan is interleaved or not.
-   */
-  JDIMENSION width_in_blocks;
-  JDIMENSION height_in_blocks;
-  /* Size of a DCT block in samples.  Always DCTSIZE for compression.
-   * For decompression this is the size of the output from one DCT block,
-   * reflecting any scaling we choose to apply during the IDCT step.
-   * Values of 1,2,4,8 are likely to be supported.  Note that different
-   * components may receive different IDCT scalings.
-   */
-  int DCT_scaled_size;
-  /* The downsampled dimensions are the component's actual, unpadded number
-   * of samples at the main buffer (preprocessing/compression interface), thus
-   * downsampled_width = ceil(image_width * Hi/Hmax)
-   * and similarly for height.  For decompression, IDCT scaling is included, so
-   * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)
-   */
-  JDIMENSION downsampled_width;  /* actual width in samples */
-  JDIMENSION downsampled_height; /* actual height in samples */
-  /* This flag is used only for decompression.  In cases where some of the
-   * components will be ignored (eg grayscale output from YCbCr image),
-   * we can skip most computations for the unused components.
-   */
-  boolean component_needed;     /* do we need the value of this component? */
-
-  /* These values are computed before starting a scan of the component. */
-  /* The decompressor output side may not use these variables. */
-  int MCU_width;                /* number of blocks per MCU, horizontally */
-  int MCU_height;               /* number of blocks per MCU, vertically */
-  int MCU_blocks;               /* MCU_width * MCU_height */
-  int MCU_sample_width;         /* MCU width in samples, MCU_width*DCT_scaled_size */
-  int last_col_width;           /* # of non-dummy blocks across in last MCU */
-  int last_row_height;          /* # of non-dummy blocks down in last MCU */
-
-  /* Saved quantization table for component; NULL if none yet saved.
-   * See jdinput.c comments about the need for this information.
-   * This field is currently used only for decompression.
-   */
-  JQUANT_TBL * quant_table;
-
-  /* Private per-component storage for DCT or IDCT subsystem. */
-  void * dct_table;
-} jpeg_component_info;
-
-
-/* The script for encoding a multiple-scan file is an array of these: */
-
-typedef struct {
-  int comps_in_scan;            /* number of components encoded in this scan */
-  int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */
-  int Ss, Se;                   /* progressive JPEG spectral selection parms */
-  int Ah, Al;                   /* progressive JPEG successive approx. parms */
-} jpeg_scan_info;
-
-/* The decompressor can save APPn and COM markers in a list of these: */
-
-typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr;
-
-struct jpeg_marker_struct {
-  jpeg_saved_marker_ptr next;   /* next in list, or NULL */
-  UINT8 marker;                 /* marker code: JPEG_COM, or JPEG_APP0+n */
-  unsigned int original_length; /* # bytes of data in the file */
-  unsigned int data_length;     /* # bytes of data saved at data[] */
-  JOCTET FAR * data;            /* the data contained in the marker */
-  /* the marker length word is not counted in data_length or original_length */
-};
-
-/* Known color spaces. */
-
-typedef enum {
-        JCS_UNKNOWN,            /* error/unspecified */
-        JCS_GRAYSCALE,          /* monochrome */
-        JCS_RGB,                /* red/green/blue */
-        JCS_YCbCr,              /* Y/Cb/Cr (also known as YUV) */
-        JCS_CMYK,               /* C/M/Y/K */
-        JCS_YCCK                /* Y/Cb/Cr/K */
-} J_COLOR_SPACE;
-
-/* DCT/IDCT algorithm options. */
-
-typedef enum {
-        JDCT_ISLOW,             /* slow but accurate integer algorithm */
-        JDCT_IFAST,             /* faster, less accurate integer method */
-        JDCT_FLOAT              /* floating-point: accurate, fast on fast HW */
-} J_DCT_METHOD;
-
-#ifndef JDCT_DEFAULT            /* may be overridden in jconfig.h */
-#define JDCT_DEFAULT  JDCT_ISLOW
-#endif
-#ifndef JDCT_FASTEST            /* may be overridden in jconfig.h */
-#define JDCT_FASTEST  JDCT_IFAST
-#endif
-
-/* Dithering options for decompression. */
-
-typedef enum {
-        JDITHER_NONE,           /* no dithering */
-        JDITHER_ORDERED,        /* simple ordered dither */
-        JDITHER_FS              /* Floyd-Steinberg error diffusion dither */
-} J_DITHER_MODE;
-
-
-/* Common fields between JPEG compression and decompression master structs. */
-
-#define jpeg_common_fields \
-  struct jpeg_error_mgr * err;  /* Error handler module */\
-  struct jpeg_memory_mgr * mem; /* Memory manager module */\
-  struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\
-  void * client_data;           /* Available for use by application */\
-  boolean is_decompressor;      /* So common code can tell which is which */\
-  int global_state              /* For checking call sequence validity */
-
-/* Routines that are to be used by both halves of the library are declared
- * to receive a pointer to this structure.  There are no actual instances of
- * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.
- */
-struct jpeg_common_struct {
-  jpeg_common_fields;           /* Fields common to both master struct types */
-  /* Additional fields follow in an actual jpeg_compress_struct or
-   * jpeg_decompress_struct.  All three structs must agree on these
-   * initial fields!  (This would be a lot cleaner in C++.)
-   */
-};
-
-typedef struct jpeg_common_struct * j_common_ptr;
-typedef struct jpeg_compress_struct * j_compress_ptr;
-typedef struct jpeg_decompress_struct * j_decompress_ptr;
-
-
-/* Master record for a compression instance */
-
-struct jpeg_compress_struct {
-  jpeg_common_fields;           /* Fields shared with jpeg_decompress_struct */
-
-  /* Destination for compressed data */
-  struct jpeg_destination_mgr * dest;
-
-  /* Description of source image --- these fields must be filled in by
-   * outer application before starting compression.  in_color_space must
-   * be correct before you can even call jpeg_set_defaults().
-   */
-
-  JDIMENSION image_width;       /* input image width */
-  JDIMENSION image_height;      /* input image height */
-  int input_components;         /* # of color components in input image */
-  J_COLOR_SPACE in_color_space; /* colorspace of input image */
-
-  double input_gamma;           /* image gamma of input image */
-
-  /* Compression parameters --- these fields must be set before calling
-   * jpeg_start_compress().  We recommend calling jpeg_set_defaults() to
-   * initialize everything to reasonable defaults, then changing anything
-   * the application specifically wants to change.  That way you won't get
-   * burnt when new parameters are added.  Also note that there are several
-   * helper routines to simplify changing parameters.
-   */
-
-  int data_precision;           /* bits of precision in image data */
-
-  int num_components;           /* # of color components in JPEG image */
-  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
-
-  jpeg_component_info * comp_info;
-  /* comp_info[i] describes component that appears i'th in SOF */
-
-  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
-  /* ptrs to coefficient quantization tables, or NULL if not defined */
-
-  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
-  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
-  /* ptrs to Huffman coding tables, or NULL if not defined */
-
-  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
-  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
-  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
-
-  int num_scans;                /* # of entries in scan_info array */
-  const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */
-  /* The default value of scan_info is NULL, which causes a single-scan
-   * sequential JPEG file to be emitted.  To create a multi-scan file,
-   * set num_scans and scan_info to point to an array of scan definitions.
-   */
-
-  boolean raw_data_in;          /* TRUE=caller supplies downsampled data */
-  boolean arith_code;           /* TRUE=arithmetic coding, FALSE=Huffman */
-  boolean optimize_coding;      /* TRUE=optimize entropy encoding parms */
-  boolean CCIR601_sampling;     /* TRUE=first samples are cosited */
-  int smoothing_factor;         /* 1..100, or 0 for no input smoothing */
-  J_DCT_METHOD dct_method;      /* DCT algorithm selector */
-
-  /* The restart interval can be specified in absolute MCUs by setting
-   * restart_interval, or in MCU rows by setting restart_in_rows
-   * (in which case the correct restart_interval will be figured
-   * for each scan).
-   */
-  unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */
-  int restart_in_rows;          /* if > 0, MCU rows per restart interval */
-
-  /* Parameters controlling emission of special markers. */
-
-  boolean write_JFIF_header;    /* should a JFIF marker be written? */
-  UINT8 JFIF_major_version;     /* What to write for the JFIF version number */
-  UINT8 JFIF_minor_version;
-  /* These three values are not used by the JPEG code, merely copied */
-  /* into the JFIF APP0 marker.  density_unit can be 0 for unknown, */
-  /* 1 for dots/inch, or 2 for dots/cm.  Note that the pixel aspect */
-  /* ratio is defined by X_density/Y_density even when density_unit=0. */
-  UINT8 density_unit;           /* JFIF code for pixel size units */
-  UINT16 X_density;             /* Horizontal pixel density */
-  UINT16 Y_density;             /* Vertical pixel density */
-  boolean write_Adobe_marker;   /* should an Adobe marker be written? */
-
-  /* State variable: index of next scanline to be written to
-   * jpeg_write_scanlines().  Application may use this to control its
-   * processing loop, e.g., "while (next_scanline < image_height)".
-   */
-
-  JDIMENSION next_scanline;     /* 0 .. image_height-1  */
-
-  /* Remaining fields are known throughout compressor, but generally
-   * should not be touched by a surrounding application.
-   */
-
-  /*
-   * These fields are computed during compression startup
-   */
-  boolean progressive_mode;     /* TRUE if scan script uses progressive mode */
-  int max_h_samp_factor;        /* largest h_samp_factor */
-  int max_v_samp_factor;        /* largest v_samp_factor */
-
-  JDIMENSION total_iMCU_rows;   /* # of iMCU rows to be input to coef ctlr */
-  /* The coefficient controller receives data in units of MCU rows as defined
-   * for fully interleaved scans (whether the JPEG file is interleaved or not).
-   * There are v_samp_factor * DCTSIZE sample rows of each component in an
-   * "iMCU" (interleaved MCU) row.
-   */
-
-  /*
-   * These fields are valid during any one scan.
-   * They describe the components and MCUs actually appearing in the scan.
-   */
-  int comps_in_scan;            /* # of JPEG components in this scan */
-  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
-  /* *cur_comp_info[i] describes component that appears i'th in SOS */
-
-  JDIMENSION MCUs_per_row;      /* # of MCUs across the image */
-  JDIMENSION MCU_rows_in_scan;  /* # of MCU rows in the image */
-
-  int blocks_in_MCU;            /* # of DCT blocks per MCU */
-  int MCU_membership[C_MAX_BLOCKS_IN_MCU];
-  /* MCU_membership[i] is index in cur_comp_info of component owning */
-  /* i'th block in an MCU */
-
-  int Ss, Se, Ah, Al;           /* progressive JPEG parameters for scan */
-
-  /*
-   * Links to compression subobjects (methods and private variables of modules)
-   */
-  struct jpeg_comp_master * master;
-  struct jpeg_c_main_controller * main;
-  struct jpeg_c_prep_controller * prep;
-  struct jpeg_c_coef_controller * coef;
-  struct jpeg_marker_writer * marker;
-  struct jpeg_color_converter * cconvert;
-  struct jpeg_downsampler * downsample;
-  struct jpeg_forward_dct * fdct;
-  struct jpeg_entropy_encoder * entropy;
-  jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */
-  int script_space_size;
-};
-
-
-/* Master record for a decompression instance */
-
-struct jpeg_decompress_struct {
-  jpeg_common_fields;           /* Fields shared with jpeg_compress_struct */
-
-  /* Source of compressed data */
-  struct jpeg_source_mgr * src;
-
-  /* Basic description of image --- filled in by jpeg_read_header(). */
-  /* Application may inspect these values to decide how to process image. */
-
-  JDIMENSION image_width;       /* nominal image width (from SOF marker) */
-  JDIMENSION image_height;      /* nominal image height */
-  int num_components;           /* # of color components in JPEG image */
-  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
-
-  /* Decompression processing parameters --- these fields must be set before
-   * calling jpeg_start_decompress().  Note that jpeg_read_header() initializes
-   * them to default values.
-   */
-
-  J_COLOR_SPACE out_color_space; /* colorspace for output */
-
-  unsigned int scale_num, scale_denom; /* fraction by which to scale image */
-
-  double output_gamma;          /* image gamma wanted in output */
-
-  boolean buffered_image;       /* TRUE=multiple output passes */
-  boolean raw_data_out;         /* TRUE=downsampled data wanted */
-
-  J_DCT_METHOD dct_method;      /* IDCT algorithm selector */
-  boolean do_fancy_upsampling;  /* TRUE=apply fancy upsampling */
-  boolean do_block_smoothing;   /* TRUE=apply interblock smoothing */
-
-  boolean quantize_colors;      /* TRUE=colormapped output wanted */
-  /* the following are ignored if not quantize_colors: */
-  J_DITHER_MODE dither_mode;    /* type of color dithering to use */
-  boolean two_pass_quantize;    /* TRUE=use two-pass color quantization */
-  int desired_number_of_colors; /* max # colors to use in created colormap */
-  /* these are significant only in buffered-image mode: */
-  boolean enable_1pass_quant;   /* enable future use of 1-pass quantizer */
-  boolean enable_external_quant;/* enable future use of external colormap */
-  boolean enable_2pass_quant;   /* enable future use of 2-pass quantizer */
-
-  /* Description of actual output image that will be returned to application.
-   * These fields are computed by jpeg_start_decompress().
-   * You can also use jpeg_calc_output_dimensions() to determine these values
-   * in advance of calling jpeg_start_decompress().
-   */
-
-  JDIMENSION output_width;      /* scaled image width */
-  JDIMENSION output_height;     /* scaled image height */
-  int out_color_components;     /* # of color components in out_color_space */
-  int output_components;        /* # of color components returned */
-  /* output_components is 1 (a colormap index) when quantizing colors;
-   * otherwise it equals out_color_components.
-   */
-  int rec_outbuf_height;        /* min recommended height of scanline buffer */
-  /* If the buffer passed to jpeg_read_scanlines() is less than this many rows
-   * high, space and time will be wasted due to unnecessary data copying.
-   * Usually rec_outbuf_height will be 1 or 2, at most 4.
-   */
-
-  /* When quantizing colors, the output colormap is described by these fields.
-   * The application can supply a colormap by setting colormap non-NULL before
-   * calling jpeg_start_decompress; otherwise a colormap is created during
-   * jpeg_start_decompress or jpeg_start_output.
-   * The map has out_color_components rows and actual_number_of_colors columns.
-   */
-  int actual_number_of_colors;  /* number of entries in use */
-  JSAMPARRAY colormap;          /* The color map as a 2-D pixel array */
-
-  /* State variables: these variables indicate the progress of decompression.
-   * The application may examine these but must not modify them.
-   */
-
-  /* Row index of next scanline to be read from jpeg_read_scanlines().
-   * Application may use this to control its processing loop, e.g.,
-   * "while (output_scanline < output_height)".
-   */
-  JDIMENSION output_scanline;   /* 0 .. output_height-1  */
-
-  /* Current input scan number and number of iMCU rows completed in scan.
-   * These indicate the progress of the decompressor input side.
-   */
-  int input_scan_number;        /* Number of SOS markers seen so far */
-  JDIMENSION input_iMCU_row;    /* Number of iMCU rows completed */
-
-  /* The "output scan number" is the notional scan being displayed by the
-   * output side.  The decompressor will not allow output scan/row number
-   * to get ahead of input scan/row, but it can fall arbitrarily far behind.
-   */
-  int output_scan_number;       /* Nominal scan number being displayed */
-  JDIMENSION output_iMCU_row;   /* Number of iMCU rows read */
-
-  /* Current progression status.  coef_bits[c][i] indicates the precision
-   * with which component c's DCT coefficient i (in zigzag order) is known.
-   * It is -1 when no data has yet been received, otherwise it is the point
-   * transform (shift) value for the most recent scan of the coefficient
-   * (thus, 0 at completion of the progression).
-   * This pointer is NULL when reading a non-progressive file.
-   */
-  int (*coef_bits)[DCTSIZE2];   /* -1 or current Al value for each coef */
-
-  /* Internal JPEG parameters --- the application usually need not look at
-   * these fields.  Note that the decompressor output side may not use
-   * any parameters that can change between scans.
-   */
-
-  /* Quantization and Huffman tables are carried forward across input
-   * datastreams when processing abbreviated JPEG datastreams.
-   */
-
-  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
-  /* ptrs to coefficient quantization tables, or NULL if not defined */
-
-  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
-  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
-  /* ptrs to Huffman coding tables, or NULL if not defined */
-
-  /* These parameters are never carried across datastreams, since they
-   * are given in SOF/SOS markers or defined to be reset by SOI.
-   */
-
-  int data_precision;           /* bits of precision in image data */
-
-  jpeg_component_info * comp_info;
-  /* comp_info[i] describes component that appears i'th in SOF */
-
-  boolean progressive_mode;     /* TRUE if SOFn specifies progressive mode */
-  boolean arith_code;           /* TRUE=arithmetic coding, FALSE=Huffman */
-
-  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
-  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
-  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
-
-  unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */
-
-  /* These fields record data obtained from optional markers recognized by
-   * the JPEG library.
-   */
-  boolean saw_JFIF_marker;      /* TRUE iff a JFIF APP0 marker was found */
-  /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */
-  UINT8 JFIF_major_version;     /* JFIF version number */
-  UINT8 JFIF_minor_version;
-  UINT8 density_unit;           /* JFIF code for pixel size units */
-  UINT16 X_density;             /* Horizontal pixel density */
-  UINT16 Y_density;             /* Vertical pixel density */
-  boolean saw_Adobe_marker;     /* TRUE iff an Adobe APP14 marker was found */
-  UINT8 Adobe_transform;        /* Color transform code from Adobe marker */
-
-  boolean CCIR601_sampling;     /* TRUE=first samples are cosited */
-
-  /* Aside from the specific data retained from APPn markers known to the
-   * library, the uninterpreted contents of any or all APPn and COM markers
-   * can be saved in a list for examination by the application.
-   */
-  jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */
-
-  /* Remaining fields are known throughout decompressor, but generally
-   * should not be touched by a surrounding application.
-   */
-
-  /*
-   * These fields are computed during decompression startup
-   */
-  int max_h_samp_factor;        /* largest h_samp_factor */
-  int max_v_samp_factor;        /* largest v_samp_factor */
-
-  int min_DCT_scaled_size;      /* smallest DCT_scaled_size of any component */
-
-  JDIMENSION total_iMCU_rows;   /* # of iMCU rows in image */
-  /* The coefficient controller's input and output progress is measured in
-   * units of "iMCU" (interleaved MCU) rows.  These are the same as MCU rows
-   * in fully interleaved JPEG scans, but are used whether the scan is
-   * interleaved or not.  We define an iMCU row as v_samp_factor DCT block
-   * rows of each component.  Therefore, the IDCT output contains
-   * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.
-   */
-
-  JSAMPLE * sample_range_limit; /* table for fast range-limiting */
-
-  /*
-   * These fields are valid during any one scan.
-   * They describe the components and MCUs actually appearing in the scan.
-   * Note that the decompressor output side must not use these fields.
-   */
-  int comps_in_scan;            /* # of JPEG components in this scan */
-  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
-  /* *cur_comp_info[i] describes component that appears i'th in SOS */
-
-  JDIMENSION MCUs_per_row;      /* # of MCUs across the image */
-  JDIMENSION MCU_rows_in_scan;  /* # of MCU rows in the image */
-
-  int blocks_in_MCU;            /* # of DCT blocks per MCU */
-  int MCU_membership[D_MAX_BLOCKS_IN_MCU];
-  /* MCU_membership[i] is index in cur_comp_info of component owning */
-  /* i'th block in an MCU */
-
-  int Ss, Se, Ah, Al;           /* progressive JPEG parameters for scan */
-
-  /* This field is shared between entropy decoder and marker parser.
-   * It is either zero or the code of a JPEG marker that has been
-   * read from the data source, but has not yet been processed.
-   */
-  int unread_marker;
-
-  /*
-   * Links to decompression subobjects (methods, private variables of modules)
-   */
-  struct jpeg_decomp_master * master;
-  struct jpeg_d_main_controller * main;
-  struct jpeg_d_coef_controller * coef;
-  struct jpeg_d_post_controller * post;
-  struct jpeg_input_controller * inputctl;
-  struct jpeg_marker_reader * marker;
-  struct jpeg_entropy_decoder * entropy;
-  struct jpeg_inverse_dct * idct;
-  struct jpeg_upsampler * upsample;
-  struct jpeg_color_deconverter * cconvert;
-  struct jpeg_color_quantizer * cquantize;
-};
-
-
-/* "Object" declarations for JPEG modules that may be supplied or called
- * directly by the surrounding application.
- * As with all objects in the JPEG library, these structs only define the
- * publicly visible methods and state variables of a module.  Additional
- * private fields may exist after the public ones.
- */
-
-
-/* Error handler object */
-
-struct jpeg_error_mgr {
-  /* Error exit handler: does not return to caller */
-  JMETHOD(void, error_exit, (j_common_ptr cinfo));
-  /* Conditionally emit a trace or warning message */
-  JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
-  /* Routine that actually outputs a trace or error message */
-  JMETHOD(void, output_message, (j_common_ptr cinfo));
-  /* Format a message string for the most recent JPEG error or message */
-  JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
-#define JMSG_LENGTH_MAX  200    /* recommended size of format_message buffer */
-  /* Reset error state variables at start of a new image */
-  JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
-
-  /* The message ID code and any parameters are saved here.
-   * A message can have one string parameter or up to 8 int parameters.
-   */
-  int msg_code;
-#define JMSG_STR_PARM_MAX  80
-  union {
-    int i[8];
-    char s[JMSG_STR_PARM_MAX];
-  } msg_parm;
-
-  /* Standard state variables for error facility */
-
-  int trace_level;              /* max msg_level that will be displayed */
-
-  /* For recoverable corrupt-data errors, we emit a warning message,
-   * but keep going unless emit_message chooses to abort.  emit_message
-   * should count warnings in num_warnings.  The surrounding application
-   * can check for bad data by seeing if num_warnings is nonzero at the
-   * end of processing.
-   */
-  long num_warnings;            /* number of corrupt-data warnings */
-
-  /* These fields point to the table(s) of error message strings.
-   * An application can change the table pointer to switch to a different
-   * message list (typically, to change the language in which errors are
-   * reported).  Some applications may wish to add additional error codes
-   * that will be handled by the JPEG library error mechanism; the second
-   * table pointer is used for this purpose.
-   *
-   * First table includes all errors generated by JPEG library itself.
-   * Error code 0 is reserved for a "no such error string" message.
-   */
-  const char * const * jpeg_message_table; /* Library errors */
-  int last_jpeg_message;    /* Table contains strings 0..last_jpeg_message */
-  /* Second table can be added by application (see cjpeg/djpeg for example).
-   * It contains strings numbered first_addon_message..last_addon_message.
-   */
-  const char * const * addon_message_table; /* Non-library errors */
-  int first_addon_message;      /* code for first string in addon table */
-  int last_addon_message;       /* code for last string in addon table */
-};
-
-
-/* Progress monitor object */
-
-struct jpeg_progress_mgr {
-  JMETHOD(void, progress_monitor, (j_common_ptr cinfo));
-
-  long pass_counter;            /* work units completed in this pass */
-  long pass_limit;              /* total number of work units in this pass */
-  int completed_passes;         /* passes completed so far */
-  int total_passes;             /* total number of passes expected */
-};
-
-
-/* Data destination object for compression */
-
-struct jpeg_destination_mgr {
-  JOCTET * next_output_byte;    /* => next byte to write in buffer */
-  size_t free_in_buffer;        /* # of byte spaces remaining in buffer */
-
-  JMETHOD(void, init_destination, (j_compress_ptr cinfo));
-  JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));
-  JMETHOD(void, term_destination, (j_compress_ptr cinfo));
-};
-
-
-/* Data source object for decompression */
-
-struct jpeg_source_mgr {
-  const JOCTET * next_input_byte; /* => next byte to read from buffer */
-  size_t bytes_in_buffer;       /* # of bytes remaining in buffer */
-
-  JMETHOD(void, init_source, (j_decompress_ptr cinfo));
-  JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
-  JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
-  JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
-  JMETHOD(void, term_source, (j_decompress_ptr cinfo));
-};
-
-
-/* Memory manager object.
- * Allocates "small" objects (a few K total), "large" objects (tens of K),
- * and "really big" objects (virtual arrays with backing store if needed).
- * The memory manager does not allow individual objects to be freed; rather,
- * each created object is assigned to a pool, and whole pools can be freed
- * at once.  This is faster and more convenient than remembering exactly what
- * to free, especially where malloc()/free() are not too speedy.
- * NB: alloc routines never return NULL.  They exit to error_exit if not
- * successful.
- */
-
-#define JPOOL_PERMANENT 0       /* lasts until master record is destroyed */
-#define JPOOL_IMAGE     1       /* lasts until done with image/datastream */
-#define JPOOL_NUMPOOLS  2
-
-typedef struct jvirt_sarray_control * jvirt_sarray_ptr;
-typedef struct jvirt_barray_control * jvirt_barray_ptr;
-
-
-struct jpeg_memory_mgr {
-  /* Method pointers */
-  JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,
-                                size_t sizeofobject));
-  JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id,
-                                     size_t sizeofobject));
-  JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,
-                                     JDIMENSION samplesperrow,
-                                     JDIMENSION numrows));
-  JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,
-                                      JDIMENSION blocksperrow,
-                                      JDIMENSION numrows));
-  JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,
-                                                  int pool_id,
-                                                  boolean pre_zero,
-                                                  JDIMENSION samplesperrow,
-                                                  JDIMENSION numrows,
-                                                  JDIMENSION maxaccess));
-  JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,
-                                                  int pool_id,
-                                                  boolean pre_zero,
-                                                  JDIMENSION blocksperrow,
-                                                  JDIMENSION numrows,
-                                                  JDIMENSION maxaccess));
-  JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));
-  JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,
-                                           jvirt_sarray_ptr ptr,
-                                           JDIMENSION start_row,
-                                           JDIMENSION num_rows,
-                                           boolean writable));
-  JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,
-                                            jvirt_barray_ptr ptr,
-                                            JDIMENSION start_row,
-                                            JDIMENSION num_rows,
-                                            boolean writable));
-  JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));
-  JMETHOD(void, self_destruct, (j_common_ptr cinfo));
-
-  /* Limit on memory allocation for this JPEG object.  (Note that this is
-   * merely advisory, not a guaranteed maximum; it only affects the space
-   * used for virtual-array buffers.)  May be changed by outer application
-   * after creating the JPEG object.
-   */
-  size_t max_memory_to_use;
-
-  /* Maximum allocation request accepted by alloc_large. */
-  size_t max_alloc_chunk;
-};
-
-
-/* Routine signature for application-supplied marker processing methods.
- * Need not pass marker code since it is stored in cinfo->unread_marker.
- */
-typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
-
-
-/* Declarations for routines called by application.
- * The JPP macro hides prototype parameters from compilers that can't cope.
- * Note JPP requires double parentheses.
- */
-
-#ifdef HAVE_PROTOTYPES
-#define JPP(arglist)    arglist
-#else
-#define JPP(arglist)    ()
-#endif
-
-
-/* Short forms of external names for systems with brain-damaged linkers.
- * We shorten external names to be unique in the first six letters, which
- * is good enough for all known systems.
- * (If your compiler itself needs names to be unique in less than 15
- * characters, you are out of luck.  Get a better compiler.)
- */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_std_error          jStdError
-#define jpeg_CreateCompress     jCreaCompress
-#define jpeg_CreateDecompress   jCreaDecompress
-#define jpeg_destroy_compress   jDestCompress
-#define jpeg_destroy_decompress jDestDecompress
-#define jpeg_stdio_dest         jStdDest
-#define jpeg_stdio_src          jStdSrc
-#define jpeg_set_defaults       jSetDefaults
-#define jpeg_set_colorspace     jSetColorspace
-#define jpeg_default_colorspace jDefColorspace
-#define jpeg_set_quality        jSetQuality
-#define jpeg_set_linear_quality jSetLQuality
-#define jpeg_add_quant_table    jAddQuantTable
-#define jpeg_quality_scaling    jQualityScaling
-#define jpeg_simple_progression jSimProgress
-#define jpeg_suppress_tables    jSuppressTables
-#define jpeg_alloc_quant_table  jAlcQTable
-#define jpeg_alloc_huff_table   jAlcHTable
-#define jpeg_start_compress     jStrtCompress
-#define jpeg_write_scanlines    jWrtScanlines
-#define jpeg_finish_compress    jFinCompress
-#define jpeg_write_raw_data     jWrtRawData
-#define jpeg_write_marker       jWrtMarker
-#define jpeg_write_m_header     jWrtMHeader
-#define jpeg_write_m_byte       jWrtMByte
-#define jpeg_write_tables       jWrtTables
-#define jpeg_read_header        jReadHeader
-#define jpeg_start_decompress   jStrtDecompress
-#define jpeg_read_scanlines     jReadScanlines
-#define jpeg_finish_decompress  jFinDecompress
-#define jpeg_read_raw_data      jReadRawData
-#define jpeg_has_multiple_scans jHasMultScn
-#define jpeg_start_output       jStrtOutput
-#define jpeg_finish_output      jFinOutput
-#define jpeg_input_complete     jInComplete
-#define jpeg_new_colormap       jNewCMap
-#define jpeg_consume_input      jConsumeInput
-#define jpeg_calc_output_dimensions     jCalcDimensions
-#define jpeg_save_markers       jSaveMarkers
-#define jpeg_set_marker_processor       jSetMarker
-#define jpeg_read_coefficients  jReadCoefs
-#define jpeg_write_coefficients jWrtCoefs
-#define jpeg_copy_critical_parameters   jCopyCrit
-#define jpeg_abort_compress     jAbrtCompress
-#define jpeg_abort_decompress   jAbrtDecompress
-#define jpeg_abort              jAbort
-#define jpeg_destroy            jDestroy
-#define jpeg_resync_to_restart  jResyncRestart
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/* Default error-management setup */
-EXTERN(struct jpeg_error_mgr *) jpeg_std_error
-        JPP((struct jpeg_error_mgr * err));
-
-/* Initialization of JPEG compression objects.
- * jpeg_create_compress() and jpeg_create_decompress() are the exported
- * names that applications should call.  These expand to calls on
- * jpeg_CreateCompress and jpeg_CreateDecompress with additional information
- * passed for version mismatch checking.
- * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.
- */
-#define jpeg_create_compress(cinfo) \
-    jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \
-                        (size_t) sizeof(struct jpeg_compress_struct))
-#define jpeg_create_decompress(cinfo) \
-    jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
-                          (size_t) sizeof(struct jpeg_decompress_struct))
-EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,
-                                      int version, size_t structsize));
-EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,
-                                        int version, size_t structsize));
-/* Destruction of JPEG compression objects */
-EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));
-EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));
-
-/* Standard data source and destination managers: stdio streams. */
-/* Caller is responsible for opening the file before and closing after. */
-EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
-EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
-
-/* Default parameter setup for compression */
-EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
-/* Compression parameter setup aids */
-EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,
-                                      J_COLOR_SPACE colorspace));
-EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));
-EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,
-                                   boolean force_baseline));
-EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,
-                                          int scale_factor,
-                                          boolean force_baseline));
-EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,
-                                       const unsigned int *basic_table,
-                                       int scale_factor,
-                                       boolean force_baseline));
-EXTERN(int) jpeg_quality_scaling JPP((int quality));
-EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));
-EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
-                                       boolean suppress));
-EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
-EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
-
-/* Main entry points for compression */
-EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
-                                      boolean write_all_tables));
-EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,
-                                             JSAMPARRAY scanlines,
-                                             JDIMENSION num_lines));
-EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));
-
-/* Replaces jpeg_write_scanlines when writing raw downsampled data. */
-EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,
-                                            JSAMPIMAGE data,
-                                            JDIMENSION num_lines));
-
-/* Write a special marker.  See libjpeg.doc concerning safe usage. */
-EXTERN(void) jpeg_write_marker
-        JPP((j_compress_ptr cinfo, int marker,
-             const JOCTET * dataptr, unsigned int datalen));
-/* Same, but piecemeal. */
-EXTERN(void) jpeg_write_m_header
-        JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));
-EXTERN(void) jpeg_write_m_byte
-        JPP((j_compress_ptr cinfo, int val));
-
-/* Alternate compression function: just write an abbreviated table file */
-EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));
-
-/* Decompression startup: read start of JPEG datastream to see what's there */
-EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
-                                  boolean require_image));
-/* Return value is one of: */
-#define JPEG_SUSPENDED          0 /* Suspended due to lack of input data */
-#define JPEG_HEADER_OK          1 /* Found valid image datastream */
-#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */
-/* If you pass require_image = TRUE (normal case), you need not check for
- * a TABLES_ONLY return code; an abbreviated file will cause an error exit.
- * JPEG_SUSPENDED is only possible if you use a data source module that can
- * give a suspension return (the stdio source module doesn't).
- */
-
-/* Main entry points for decompression */
-EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));
-EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,
-                                            JSAMPARRAY scanlines,
-                                            JDIMENSION max_lines));
-EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));
-
-/* Replaces jpeg_read_scanlines when reading raw downsampled data. */
-EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,
-                                           JSAMPIMAGE data,
-                                           JDIMENSION max_lines));
-
-/* Additional entry points for buffered-image mode. */
-EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));
-EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,
-                                       int scan_number));
-EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));
-EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));
-EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));
-EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));
-/* Return value is one of: */
-/* #define JPEG_SUSPENDED       0    Suspended due to lack of input data */
-#define JPEG_REACHED_SOS        1 /* Reached start of new scan */
-#define JPEG_REACHED_EOI        2 /* Reached end of image */
-#define JPEG_ROW_COMPLETED      3 /* Completed one iMCU row */
-#define JPEG_SCAN_COMPLETED     4 /* Completed last iMCU row of a scan */
-
-/* Precalculate output dimensions for current decompression parameters. */
-EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));
-
-/* Control saving of COM and APPn markers into marker_list. */
-EXTERN(void) jpeg_save_markers
-        JPP((j_decompress_ptr cinfo, int marker_code,
-             unsigned int length_limit));
-
-/* Install a special processing method for COM or APPn markers. */
-EXTERN(void) jpeg_set_marker_processor
-        JPP((j_decompress_ptr cinfo, int marker_code,
-             jpeg_marker_parser_method routine));
-
-/* Read or write raw DCT coefficients --- useful for lossless transcoding. */
-EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));
-EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,
-                                          jvirt_barray_ptr * coef_arrays));
-EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,
-                                                j_compress_ptr dstinfo));
-
-/* If you choose to abort compression or decompression before completing
- * jpeg_finish_(de)compress, then you need to clean up to release memory,
- * temporary files, etc.  You can just call jpeg_destroy_(de)compress
- * if you're done with the JPEG object, but if you want to clean it up and
- * reuse it, call this:
- */
-EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));
-EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));
-
-/* Generic versions of jpeg_abort and jpeg_destroy that work on either
- * flavor of JPEG object.  These may be more convenient in some places.
- */
-EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));
-EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));
-
-/* Default restart-marker-resync procedure for use by data source modules */
-EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,
-                                            int desired));
-
-
-/* These marker codes are exported since applications and data source modules
- * are likely to want to use them.
- */
-
-#define JPEG_RST0       0xD0    /* RST0 marker code */
-#define JPEG_EOI        0xD9    /* EOI marker code */
-#define JPEG_APP0       0xE0    /* APP0 marker code */
-#define JPEG_COM        0xFE    /* COM marker code */
-
-
-/* If we have a brain-damaged compiler that emits warnings (or worse, errors)
- * for structure definitions that are never filled in, keep it quiet by
- * supplying dummy definitions for the various substructures.
- */
-
-#ifdef INCOMPLETE_TYPES_BROKEN
-#ifndef JPEG_INTERNALS          /* will be defined in jpegint.h */
-struct jvirt_sarray_control { long dummy; };
-struct jvirt_barray_control { long dummy; };
-struct jpeg_comp_master { long dummy; };
-struct jpeg_c_main_controller { long dummy; };
-struct jpeg_c_prep_controller { long dummy; };
-struct jpeg_c_coef_controller { long dummy; };
-struct jpeg_marker_writer { long dummy; };
-struct jpeg_color_converter { long dummy; };
-struct jpeg_downsampler { long dummy; };
-struct jpeg_forward_dct { long dummy; };
-struct jpeg_entropy_encoder { long dummy; };
-struct jpeg_decomp_master { long dummy; };
-struct jpeg_d_main_controller { long dummy; };
-struct jpeg_d_coef_controller { long dummy; };
-struct jpeg_d_post_controller { long dummy; };
-struct jpeg_input_controller { long dummy; };
-struct jpeg_marker_reader { long dummy; };
-struct jpeg_entropy_decoder { long dummy; };
-struct jpeg_inverse_dct { long dummy; };
-struct jpeg_upsampler { long dummy; };
-struct jpeg_color_deconverter { long dummy; };
-struct jpeg_color_quantizer { long dummy; };
-#endif /* JPEG_INTERNALS */
-#endif /* INCOMPLETE_TYPES_BROKEN */
-
-
-/*
- * The JPEG library modules define JPEG_INTERNALS before including this file.
- * The internal structure declarations are read only when that is true.
- * Applications using the library should not include jpegint.h, but may wish
- * to include jerror.h.
- */
-
-#ifdef JPEG_INTERNALS
-#include "jpegint.h"            /* fetch private declarations */
-#include "jerror.h"             /* fetch error codes too */
-#endif
-
-#endif /* JPEGLIB_H */
--- a/src/share/native/sun/awt/image/jpeg/jquant1.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,860 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jquant1.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains 1-pass color quantization (color mapping) routines.
- * These routines provide mapping to a fixed color map using equally spaced
- * color values.  Optional Floyd-Steinberg or ordered dithering is available.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-#ifdef QUANT_1PASS_SUPPORTED
-
-
-/*
- * The main purpose of 1-pass quantization is to provide a fast, if not very
- * high quality, colormapped output capability.  A 2-pass quantizer usually
- * gives better visual quality; however, for quantized grayscale output this
- * quantizer is perfectly adequate.  Dithering is highly recommended with this
- * quantizer, though you can turn it off if you really want to.
- *
- * In 1-pass quantization the colormap must be chosen in advance of seeing the
- * image.  We use a map consisting of all combinations of Ncolors[i] color
- * values for the i'th component.  The Ncolors[] values are chosen so that
- * their product, the total number of colors, is no more than that requested.
- * (In most cases, the product will be somewhat less.)
- *
- * Since the colormap is orthogonal, the representative value for each color
- * component can be determined without considering the other components;
- * then these indexes can be combined into a colormap index by a standard
- * N-dimensional-array-subscript calculation.  Most of the arithmetic involved
- * can be precalculated and stored in the lookup table colorindex[].
- * colorindex[i][j] maps pixel value j in component i to the nearest
- * representative value (grid plane) for that component; this index is
- * multiplied by the array stride for component i, so that the
- * index of the colormap entry closest to a given pixel value is just
- *    sum( colorindex[component-number][pixel-component-value] )
- * Aside from being fast, this scheme allows for variable spacing between
- * representative values with no additional lookup cost.
- *
- * If gamma correction has been applied in color conversion, it might be wise
- * to adjust the color grid spacing so that the representative colors are
- * equidistant in linear space.  At this writing, gamma correction is not
- * implemented by jdcolor, so nothing is done here.
- */
-
-
-/* Declarations for ordered dithering.
- *
- * We use a standard 16x16 ordered dither array.  The basic concept of ordered
- * dithering is described in many references, for instance Dale Schumacher's
- * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991).
- * In place of Schumacher's comparisons against a "threshold" value, we add a
- * "dither" value to the input pixel and then round the result to the nearest
- * output value.  The dither value is equivalent to (0.5 - threshold) times
- * the distance between output values.  For ordered dithering, we assume that
- * the output colors are equally spaced; if not, results will probably be
- * worse, since the dither may be too much or too little at a given point.
- *
- * The normal calculation would be to form pixel value + dither, range-limit
- * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual.
- * We can skip the separate range-limiting step by extending the colorindex
- * table in both directions.
- */
-
-#define ODITHER_SIZE  16        /* dimension of dither matrix */
-/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */
-#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE)       /* # cells in matrix */
-#define ODITHER_MASK  (ODITHER_SIZE-1) /* mask for wrapping around counters */
-
-typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE];
-typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE];
-
-static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = {
-  /* Bayer's order-4 dither array.  Generated by the code given in
-   * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I.
-   * The values in this array must range from 0 to ODITHER_CELLS-1.
-   */
-  {   0,192, 48,240, 12,204, 60,252,  3,195, 51,243, 15,207, 63,255 },
-  { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 },
-  {  32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 },
-  { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 },
-  {   8,200, 56,248,  4,196, 52,244, 11,203, 59,251,  7,199, 55,247 },
-  { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 },
-  {  40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 },
-  { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 },
-  {   2,194, 50,242, 14,206, 62,254,  1,193, 49,241, 13,205, 61,253 },
-  { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 },
-  {  34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 },
-  { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 },
-  {  10,202, 58,250,  6,198, 54,246,  9,201, 57,249,  5,197, 53,245 },
-  { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 },
-  {  42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 },
-  { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 }
-};
-
-
-/* Declarations for Floyd-Steinberg dithering.
- *
- * Errors are accumulated into the array fserrors[], at a resolution of
- * 1/16th of a pixel count.  The error at a given pixel is propagated
- * to its not-yet-processed neighbors using the standard F-S fractions,
- *              ...     (here)  7/16
- *              3/16    5/16    1/16
- * We work left-to-right on even rows, right-to-left on odd rows.
- *
- * We can get away with a single array (holding one row's worth of errors)
- * by using it to store the current row's errors at pixel columns not yet
- * processed, but the next row's errors at columns already processed.  We
- * need only a few extra variables to hold the errors immediately around the
- * current column.  (If we are lucky, those variables are in registers, but
- * even if not, they're probably cheaper to access than array elements are.)
- *
- * The fserrors[] array is indexed [component#][position].
- * We provide (#columns + 2) entries per component; the extra entry at each
- * end saves us from special-casing the first and last pixels.
- *
- * Note: on a wide image, we might not have enough room in a PC's near data
- * segment to hold the error array; so it is allocated with alloc_large.
- */
-
-#if BITS_IN_JSAMPLE == 8
-typedef INT16 FSERROR;          /* 16 bits should be enough */
-typedef int LOCFSERROR;         /* use 'int' for calculation temps */
-#else
-typedef INT32 FSERROR;          /* may need more than 16 bits */
-typedef INT32 LOCFSERROR;       /* be sure calculation temps are big enough */
-#endif
-
-typedef FSERROR FAR *FSERRPTR;  /* pointer to error array (in FAR storage!) */
-
-
-/* Private subobject */
-
-#define MAX_Q_COMPS 4           /* max components I can handle */
-
-typedef struct {
-  struct jpeg_color_quantizer pub; /* public fields */
-
-  /* Initially allocated colormap is saved here */
-  JSAMPARRAY sv_colormap;       /* The color map as a 2-D pixel array */
-  int sv_actual;                /* number of entries in use */
-
-  JSAMPARRAY colorindex;        /* Precomputed mapping for speed */
-  /* colorindex[i][j] = index of color closest to pixel value j in component i,
-   * premultiplied as described above.  Since colormap indexes must fit into
-   * JSAMPLEs, the entries of this array will too.
-   */
-  boolean is_padded;            /* is the colorindex padded for odither? */
-
-  int Ncolors[MAX_Q_COMPS];     /* # of values alloced to each component */
-
-  /* Variables for ordered dithering */
-  int row_index;                /* cur row's vertical index in dither matrix */
-  ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */
-
-  /* Variables for Floyd-Steinberg dithering */
-  FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */
-  boolean on_odd_row;           /* flag to remember which row we are on */
-} my_cquantizer;
-
-typedef my_cquantizer * my_cquantize_ptr;
-
-
-/*
- * Policy-making subroutines for create_colormap and create_colorindex.
- * These routines determine the colormap to be used.  The rest of the module
- * only assumes that the colormap is orthogonal.
- *
- *  * select_ncolors decides how to divvy up the available colors
- *    among the components.
- *  * output_value defines the set of representative values for a component.
- *  * largest_input_value defines the mapping from input values to
- *    representative values for a component.
- * Note that the latter two routines may impose different policies for
- * different components, though this is not currently done.
- */
-
-
-LOCAL(int)
-select_ncolors (j_decompress_ptr cinfo, int Ncolors[])
-/* Determine allocation of desired colors to components, */
-/* and fill in Ncolors[] array to indicate choice. */
-/* Return value is total number of colors (product of Ncolors[] values). */
-{
-  int nc = cinfo->out_color_components; /* number of color components */
-  int max_colors = cinfo->desired_number_of_colors;
-  int total_colors, iroot, i, j;
-  boolean changed;
-  long temp;
-  static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE };
-
-  /* We can allocate at least the nc'th root of max_colors per component. */
-  /* Compute floor(nc'th root of max_colors). */
-  iroot = 1;
-  do {
-    iroot++;
-    temp = iroot;               /* set temp = iroot ** nc */
-    for (i = 1; i < nc; i++)
-      temp *= iroot;
-  } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */
-  iroot--;                      /* now iroot = floor(root) */
-
-  /* Must have at least 2 color values per component */
-  if (iroot < 2)
-    ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp);
-
-  /* Initialize to iroot color values for each component */
-  total_colors = 1;
-  for (i = 0; i < nc; i++) {
-    Ncolors[i] = iroot;
-    total_colors *= iroot;
-  }
-  /* We may be able to increment the count for one or more components without
-   * exceeding max_colors, though we know not all can be incremented.
-   * Sometimes, the first component can be incremented more than once!
-   * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.)
-   * In RGB colorspace, try to increment G first, then R, then B.
-   */
-  do {
-    changed = FALSE;
-    for (i = 0; i < nc; i++) {
-      j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i);
-      /* calculate new total_colors if Ncolors[j] is incremented */
-      temp = total_colors / Ncolors[j];
-      temp *= Ncolors[j]+1;     /* done in long arith to avoid oflo */
-      if (temp > (long) max_colors)
-        break;                  /* won't fit, done with this pass */
-      Ncolors[j]++;             /* OK, apply the increment */
-      total_colors = (int) temp;
-      changed = TRUE;
-    }
-  } while (changed);
-
-  return total_colors;
-}
-
-
-LOCAL(int)
-output_value (j_decompress_ptr cinfo, int ci, int j, int maxj)
-/* Return j'th output value, where j will range from 0 to maxj */
-/* The output values must fall in 0..MAXJSAMPLE in increasing order */
-{
-  /* We always provide values 0 and MAXJSAMPLE for each component;
-   * any additional values are equally spaced between these limits.
-   * (Forcing the upper and lower values to the limits ensures that
-   * dithering can't produce a color outside the selected gamut.)
-   */
-  return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj);
-}
-
-
-LOCAL(int)
-largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj)
-/* Return largest input value that should map to j'th output value */
-/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */
-{
-  /* Breakpoints are halfway between values returned by output_value */
-  return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj));
-}
-
-
-/*
- * Create the colormap.
- */
-
-LOCAL(void)
-create_colormap (j_decompress_ptr cinfo)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  JSAMPARRAY colormap;          /* Created colormap */
-  int total_colors;             /* Number of distinct output colors */
-  int i,j,k, nci, blksize, blkdist, ptr, val;
-
-  /* Select number of colors for each component */
-  total_colors = select_ncolors(cinfo, cquantize->Ncolors);
-
-  /* Report selected color counts */
-  if (cinfo->out_color_components == 3)
-    TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS,
-             total_colors, cquantize->Ncolors[0],
-             cquantize->Ncolors[1], cquantize->Ncolors[2]);
-  else
-    TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors);
-
-  /* Allocate and fill in the colormap. */
-  /* The colors are ordered in the map in standard row-major order, */
-  /* i.e. rightmost (highest-indexed) color changes most rapidly. */
-
-  colormap = (*cinfo->mem->alloc_sarray)
-    ((j_common_ptr) cinfo, JPOOL_IMAGE,
-     (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components);
-
-  /* blksize is number of adjacent repeated entries for a component */
-  /* blkdist is distance between groups of identical entries for a component */
-  blkdist = total_colors;
-
-  for (i = 0; i < cinfo->out_color_components; i++) {
-    /* fill in colormap entries for i'th color component */
-    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
-    blksize = blkdist / nci;
-    for (j = 0; j < nci; j++) {
-      /* Compute j'th output value (out of nci) for component */
-      val = output_value(cinfo, i, j, nci-1);
-      /* Fill in all colormap entries that have this value of this component */
-      for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) {
-        /* fill in blksize entries beginning at ptr */
-        for (k = 0; k < blksize; k++)
-          colormap[i][ptr+k] = (JSAMPLE) val;
-      }
-    }
-    blkdist = blksize;          /* blksize of this color is blkdist of next */
-  }
-
-  /* Save the colormap in private storage,
-   * where it will survive color quantization mode changes.
-   */
-  cquantize->sv_colormap = colormap;
-  cquantize->sv_actual = total_colors;
-}
-
-
-/*
- * Create the color index table.
- */
-
-LOCAL(void)
-create_colorindex (j_decompress_ptr cinfo)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  JSAMPROW indexptr;
-  int i,j,k, nci, blksize, val, pad;
-
-  /* For ordered dither, we pad the color index tables by MAXJSAMPLE in
-   * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE).
-   * This is not necessary in the other dithering modes.  However, we
-   * flag whether it was done in case user changes dithering mode.
-   */
-  if (cinfo->dither_mode == JDITHER_ORDERED) {
-    pad = MAXJSAMPLE*2;
-    cquantize->is_padded = TRUE;
-  } else {
-    pad = 0;
-    cquantize->is_padded = FALSE;
-  }
-
-  cquantize->colorindex = (*cinfo->mem->alloc_sarray)
-    ((j_common_ptr) cinfo, JPOOL_IMAGE,
-     (JDIMENSION) (MAXJSAMPLE+1 + pad),
-     (JDIMENSION) cinfo->out_color_components);
-
-  /* blksize is number of adjacent repeated entries for a component */
-  blksize = cquantize->sv_actual;
-
-  for (i = 0; i < cinfo->out_color_components; i++) {
-    /* fill in colorindex entries for i'th color component */
-    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
-    blksize = blksize / nci;
-
-    /* adjust colorindex pointers to provide padding at negative indexes. */
-    if (pad)
-      cquantize->colorindex[i] += MAXJSAMPLE;
-
-    /* in loop, val = index of current output value, */
-    /* and k = largest j that maps to current val */
-    indexptr = cquantize->colorindex[i];
-    val = 0;
-    k = largest_input_value(cinfo, i, 0, nci-1);
-    for (j = 0; j <= MAXJSAMPLE; j++) {
-      while (j > k)             /* advance val if past boundary */
-        k = largest_input_value(cinfo, i, ++val, nci-1);
-      /* premultiply so that no multiplication needed in main processing */
-      indexptr[j] = (JSAMPLE) (val * blksize);
-    }
-    /* Pad at both ends if necessary */
-    if (pad)
-      for (j = 1; j <= MAXJSAMPLE; j++) {
-        indexptr[-j] = indexptr[0];
-        indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE];
-      }
-  }
-}
-
-
-/*
- * Create an ordered-dither array for a component having ncolors
- * distinct output values.
- */
-
-LOCAL(ODITHER_MATRIX_PTR)
-make_odither_array (j_decompress_ptr cinfo, int ncolors)
-{
-  ODITHER_MATRIX_PTR odither;
-  int j,k;
-  INT32 num,den;
-
-  odither = (ODITHER_MATRIX_PTR)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(ODITHER_MATRIX));
-  /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1).
-   * Hence the dither value for the matrix cell with fill order f
-   * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1).
-   * On 16-bit-int machine, be careful to avoid overflow.
-   */
-  den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1));
-  for (j = 0; j < ODITHER_SIZE; j++) {
-    for (k = 0; k < ODITHER_SIZE; k++) {
-      num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k])))
-            * MAXJSAMPLE;
-      /* Ensure round towards zero despite C's lack of consistency
-       * about rounding negative values in integer division...
-       */
-      odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den);
-    }
-  }
-  return odither;
-}
-
-
-/*
- * Create the ordered-dither tables.
- * Components having the same number of representative colors may
- * share a dither table.
- */
-
-LOCAL(void)
-create_odither_tables (j_decompress_ptr cinfo)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  ODITHER_MATRIX_PTR odither;
-  int i, j, nci;
-
-  for (i = 0; i < cinfo->out_color_components; i++) {
-    nci = cquantize->Ncolors[i]; /* # of distinct values for this color */
-    odither = NULL;             /* search for matching prior component */
-    for (j = 0; j < i; j++) {
-      if (nci == cquantize->Ncolors[j]) {
-        odither = cquantize->odither[j];
-        break;
-      }
-    }
-    if (odither == NULL)        /* need a new table? */
-      odither = make_odither_array(cinfo, nci);
-    cquantize->odither[i] = odither;
-  }
-}
-
-
-/*
- * Map some rows of pixels to the output colormapped representation.
- */
-
-METHODDEF(void)
-color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
-                JSAMPARRAY output_buf, int num_rows)
-/* General case, no dithering */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  JSAMPARRAY colorindex = cquantize->colorindex;
-  register int pixcode, ci;
-  register JSAMPROW ptrin, ptrout;
-  int row;
-  JDIMENSION col;
-  JDIMENSION width = cinfo->output_width;
-  register int nc = cinfo->out_color_components;
-
-  for (row = 0; row < num_rows; row++) {
-    ptrin = input_buf[row];
-    ptrout = output_buf[row];
-    for (col = width; col > 0; col--) {
-      pixcode = 0;
-      for (ci = 0; ci < nc; ci++) {
-        pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]);
-      }
-      *ptrout++ = (JSAMPLE) pixcode;
-    }
-  }
-}
-
-
-METHODDEF(void)
-color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
-                 JSAMPARRAY output_buf, int num_rows)
-/* Fast path for out_color_components==3, no dithering */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  register int pixcode;
-  register JSAMPROW ptrin, ptrout;
-  JSAMPROW colorindex0 = cquantize->colorindex[0];
-  JSAMPROW colorindex1 = cquantize->colorindex[1];
-  JSAMPROW colorindex2 = cquantize->colorindex[2];
-  int row;
-  JDIMENSION col;
-  JDIMENSION width = cinfo->output_width;
-
-  for (row = 0; row < num_rows; row++) {
-    ptrin = input_buf[row];
-    ptrout = output_buf[row];
-    for (col = width; col > 0; col--) {
-      pixcode  = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]);
-      pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]);
-      pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]);
-      *ptrout++ = (JSAMPLE) pixcode;
-    }
-  }
-}
-
-
-METHODDEF(void)
-quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
-                     JSAMPARRAY output_buf, int num_rows)
-/* General case, with ordered dithering */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  register JSAMPROW input_ptr;
-  register JSAMPROW output_ptr;
-  JSAMPROW colorindex_ci;
-  int * dither;                 /* points to active row of dither matrix */
-  int row_index, col_index;     /* current indexes into dither matrix */
-  int nc = cinfo->out_color_components;
-  int ci;
-  int row;
-  JDIMENSION col;
-  JDIMENSION width = cinfo->output_width;
-
-  for (row = 0; row < num_rows; row++) {
-    /* Initialize output values to 0 so can process components separately */
-    jzero_far((void FAR *) output_buf[row],
-              (size_t) (width * SIZEOF(JSAMPLE)));
-    row_index = cquantize->row_index;
-    for (ci = 0; ci < nc; ci++) {
-      input_ptr = input_buf[row] + ci;
-      output_ptr = output_buf[row];
-      colorindex_ci = cquantize->colorindex[ci];
-      dither = cquantize->odither[ci][row_index];
-      col_index = 0;
-
-      for (col = width; col > 0; col--) {
-        /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE,
-         * select output value, accumulate into output code for this pixel.
-         * Range-limiting need not be done explicitly, as we have extended
-         * the colorindex table to produce the right answers for out-of-range
-         * inputs.  The maximum dither is +- MAXJSAMPLE; this sets the
-         * required amount of padding.
-         */
-        *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]];
-        input_ptr += nc;
-        output_ptr++;
-        col_index = (col_index + 1) & ODITHER_MASK;
-      }
-    }
-    /* Advance row index for next row */
-    row_index = (row_index + 1) & ODITHER_MASK;
-    cquantize->row_index = row_index;
-  }
-}
-
-
-METHODDEF(void)
-quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
-                      JSAMPARRAY output_buf, int num_rows)
-/* Fast path for out_color_components==3, with ordered dithering */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  register int pixcode;
-  register JSAMPROW input_ptr;
-  register JSAMPROW output_ptr;
-  JSAMPROW colorindex0 = cquantize->colorindex[0];
-  JSAMPROW colorindex1 = cquantize->colorindex[1];
-  JSAMPROW colorindex2 = cquantize->colorindex[2];
-  int * dither0;                /* points to active row of dither matrix */
-  int * dither1;
-  int * dither2;
-  int row_index, col_index;     /* current indexes into dither matrix */
-  int row;
-  JDIMENSION col;
-  JDIMENSION width = cinfo->output_width;
-
-  for (row = 0; row < num_rows; row++) {
-    row_index = cquantize->row_index;
-    input_ptr = input_buf[row];
-    output_ptr = output_buf[row];
-    dither0 = cquantize->odither[0][row_index];
-    dither1 = cquantize->odither[1][row_index];
-    dither2 = cquantize->odither[2][row_index];
-    col_index = 0;
-
-    for (col = width; col > 0; col--) {
-      pixcode  = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) +
-                                        dither0[col_index]]);
-      pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) +
-                                        dither1[col_index]]);
-      pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) +
-                                        dither2[col_index]]);
-      *output_ptr++ = (JSAMPLE) pixcode;
-      col_index = (col_index + 1) & ODITHER_MASK;
-    }
-    row_index = (row_index + 1) & ODITHER_MASK;
-    cquantize->row_index = row_index;
-  }
-}
-
-
-METHODDEF(void)
-quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
-                    JSAMPARRAY output_buf, int num_rows)
-/* General case, with Floyd-Steinberg dithering */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  register LOCFSERROR cur;      /* current error or pixel value */
-  LOCFSERROR belowerr;          /* error for pixel below cur */
-  LOCFSERROR bpreverr;          /* error for below/prev col */
-  LOCFSERROR bnexterr;          /* error for below/next col */
-  LOCFSERROR delta;
-  register FSERRPTR errorptr;   /* => fserrors[] at column before current */
-  register JSAMPROW input_ptr;
-  register JSAMPROW output_ptr;
-  JSAMPROW colorindex_ci;
-  JSAMPROW colormap_ci;
-  int pixcode;
-  int nc = cinfo->out_color_components;
-  int dir;                      /* 1 for left-to-right, -1 for right-to-left */
-  int dirnc;                    /* dir * nc */
-  int ci;
-  int row;
-  JDIMENSION col;
-  JDIMENSION width = cinfo->output_width;
-  JSAMPLE *range_limit = cinfo->sample_range_limit;
-  SHIFT_TEMPS
-
-  for (row = 0; row < num_rows; row++) {
-    /* Initialize output values to 0 so can process components separately */
-    jzero_far((void FAR *) output_buf[row],
-              (size_t) (width * SIZEOF(JSAMPLE)));
-    for (ci = 0; ci < nc; ci++) {
-      input_ptr = input_buf[row] + ci;
-      output_ptr = output_buf[row];
-      if (cquantize->on_odd_row) {
-        /* work right to left in this row */
-        input_ptr += (width-1) * nc; /* so point to rightmost pixel */
-        output_ptr += width-1;
-        dir = -1;
-        dirnc = -nc;
-        errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */
-      } else {
-        /* work left to right in this row */
-        dir = 1;
-        dirnc = nc;
-        errorptr = cquantize->fserrors[ci]; /* => entry before first column */
-      }
-      colorindex_ci = cquantize->colorindex[ci];
-      colormap_ci = cquantize->sv_colormap[ci];
-      /* Preset error values: no error propagated to first pixel from left */
-      cur = 0;
-      /* and no error propagated to row below yet */
-      belowerr = bpreverr = 0;
-
-      for (col = width; col > 0; col--) {
-        /* cur holds the error propagated from the previous pixel on the
-         * current line.  Add the error propagated from the previous line
-         * to form the complete error correction term for this pixel, and
-         * round the error term (which is expressed * 16) to an integer.
-         * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
-         * for either sign of the error value.
-         * Note: errorptr points to *previous* column's array entry.
-         */
-        cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4);
-        /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
-         * The maximum error is +- MAXJSAMPLE; this sets the required size
-         * of the range_limit array.
-         */
-        cur += GETJSAMPLE(*input_ptr);
-        cur = GETJSAMPLE(range_limit[cur]);
-        /* Select output value, accumulate into output code for this pixel */
-        pixcode = GETJSAMPLE(colorindex_ci[cur]);
-        *output_ptr += (JSAMPLE) pixcode;
-        /* Compute actual representation error at this pixel */
-        /* Note: we can do this even though we don't have the final */
-        /* pixel code, because the colormap is orthogonal. */
-        cur -= GETJSAMPLE(colormap_ci[pixcode]);
-        /* Compute error fractions to be propagated to adjacent pixels.
-         * Add these into the running sums, and simultaneously shift the
-         * next-line error sums left by 1 column.
-         */
-        bnexterr = cur;
-        delta = cur * 2;
-        cur += delta;           /* form error * 3 */
-        errorptr[0] = (FSERROR) (bpreverr + cur);
-        cur += delta;           /* form error * 5 */
-        bpreverr = belowerr + cur;
-        belowerr = bnexterr;
-        cur += delta;           /* form error * 7 */
-        /* At this point cur contains the 7/16 error value to be propagated
-         * to the next pixel on the current line, and all the errors for the
-         * next line have been shifted over. We are therefore ready to move on.
-         */
-        input_ptr += dirnc;     /* advance input ptr to next column */
-        output_ptr += dir;      /* advance output ptr to next column */
-        errorptr += dir;        /* advance errorptr to current column */
-      }
-      /* Post-loop cleanup: we must unload the final error value into the
-       * final fserrors[] entry.  Note we need not unload belowerr because
-       * it is for the dummy column before or after the actual array.
-       */
-      errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */
-    }
-    cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE);
-  }
-}
-
-
-/*
- * Allocate workspace for Floyd-Steinberg errors.
- */
-
-LOCAL(void)
-alloc_fs_workspace (j_decompress_ptr cinfo)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  size_t arraysize;
-  int i;
-
-  arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
-  for (i = 0; i < cinfo->out_color_components; i++) {
-    cquantize->fserrors[i] = (FSERRPTR)
-      (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
-  }
-}
-
-
-/*
- * Initialize for one-pass color quantization.
- */
-
-METHODDEF(void)
-start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  size_t arraysize;
-  int i;
-
-  /* Install my colormap. */
-  cinfo->colormap = cquantize->sv_colormap;
-  cinfo->actual_number_of_colors = cquantize->sv_actual;
-
-  /* Initialize for desired dithering mode. */
-  switch (cinfo->dither_mode) {
-  case JDITHER_NONE:
-    if (cinfo->out_color_components == 3)
-      cquantize->pub.color_quantize = color_quantize3;
-    else
-      cquantize->pub.color_quantize = color_quantize;
-    break;
-  case JDITHER_ORDERED:
-    if (cinfo->out_color_components == 3)
-      cquantize->pub.color_quantize = quantize3_ord_dither;
-    else
-      cquantize->pub.color_quantize = quantize_ord_dither;
-    cquantize->row_index = 0;   /* initialize state for ordered dither */
-    /* If user changed to ordered dither from another mode,
-     * we must recreate the color index table with padding.
-     * This will cost extra space, but probably isn't very likely.
-     */
-    if (! cquantize->is_padded)
-      create_colorindex(cinfo);
-    /* Create ordered-dither tables if we didn't already. */
-    if (cquantize->odither[0] == NULL)
-      create_odither_tables(cinfo);
-    break;
-  case JDITHER_FS:
-    cquantize->pub.color_quantize = quantize_fs_dither;
-    cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */
-    /* Allocate Floyd-Steinberg workspace if didn't already. */
-    if (cquantize->fserrors[0] == NULL)
-      alloc_fs_workspace(cinfo);
-    /* Initialize the propagated errors to zero. */
-    arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
-    for (i = 0; i < cinfo->out_color_components; i++)
-      jzero_far((void FAR *) cquantize->fserrors[i], arraysize);
-    break;
-  default:
-    ERREXIT(cinfo, JERR_NOT_COMPILED);
-    break;
-  }
-}
-
-
-/*
- * Finish up at the end of the pass.
- */
-
-METHODDEF(void)
-finish_pass_1_quant (j_decompress_ptr cinfo)
-{
-  /* no work in 1-pass case */
-}
-
-
-/*
- * Switch to a new external colormap between output passes.
- * Shouldn't get to this module!
- */
-
-METHODDEF(void)
-new_color_map_1_quant (j_decompress_ptr cinfo)
-{
-  ERREXIT(cinfo, JERR_MODE_CHANGE);
-}
-
-
-/*
- * Module initialization routine for 1-pass color quantization.
- */
-
-GLOBAL(void)
-jinit_1pass_quantizer (j_decompress_ptr cinfo)
-{
-  my_cquantize_ptr cquantize;
-
-  cquantize = (my_cquantize_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_cquantizer));
-  cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
-  cquantize->pub.start_pass = start_pass_1_quant;
-  cquantize->pub.finish_pass = finish_pass_1_quant;
-  cquantize->pub.new_color_map = new_color_map_1_quant;
-  cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */
-  cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */
-
-  /* Make sure my internal arrays won't overflow */
-  if (cinfo->out_color_components > MAX_Q_COMPS)
-    ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS);
-  /* Make sure colormap indexes can be represented by JSAMPLEs */
-  if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1))
-    ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1);
-
-  /* Create the colormap and color index table. */
-  create_colormap(cinfo);
-  create_colorindex(cinfo);
-
-  /* Allocate Floyd-Steinberg workspace now if requested.
-   * We do this now since it is FAR storage and may affect the memory
-   * manager's space calculations.  If the user changes to FS dither
-   * mode in a later pass, we will allocate the space then, and will
-   * possibly overrun the max_memory_to_use setting.
-   */
-  if (cinfo->dither_mode == JDITHER_FS)
-    alloc_fs_workspace(cinfo);
-}
-
-#endif /* QUANT_1PASS_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jquant2.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1314 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jquant2.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains 2-pass color quantization (color mapping) routines.
- * These routines provide selection of a custom color map for an image,
- * followed by mapping of the image to that color map, with optional
- * Floyd-Steinberg dithering.
- * It is also possible to use just the second pass to map to an arbitrary
- * externally-given color map.
- *
- * Note: ordered dithering is not supported, since there isn't any fast
- * way to compute intercolor distances; it's unclear that ordered dither's
- * fundamental assumptions even hold with an irregularly spaced color map.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-#ifdef QUANT_2PASS_SUPPORTED
-
-
-/*
- * This module implements the well-known Heckbert paradigm for color
- * quantization.  Most of the ideas used here can be traced back to
- * Heckbert's seminal paper
- *   Heckbert, Paul.  "Color Image Quantization for Frame Buffer Display",
- *   Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304.
- *
- * In the first pass over the image, we accumulate a histogram showing the
- * usage count of each possible color.  To keep the histogram to a reasonable
- * size, we reduce the precision of the input; typical practice is to retain
- * 5 or 6 bits per color, so that 8 or 4 different input values are counted
- * in the same histogram cell.
- *
- * Next, the color-selection step begins with a box representing the whole
- * color space, and repeatedly splits the "largest" remaining box until we
- * have as many boxes as desired colors.  Then the mean color in each
- * remaining box becomes one of the possible output colors.
- *
- * The second pass over the image maps each input pixel to the closest output
- * color (optionally after applying a Floyd-Steinberg dithering correction).
- * This mapping is logically trivial, but making it go fast enough requires
- * considerable care.
- *
- * Heckbert-style quantizers vary a good deal in their policies for choosing
- * the "largest" box and deciding where to cut it.  The particular policies
- * used here have proved out well in experimental comparisons, but better ones
- * may yet be found.
- *
- * In earlier versions of the IJG code, this module quantized in YCbCr color
- * space, processing the raw upsampled data without a color conversion step.
- * This allowed the color conversion math to be done only once per colormap
- * entry, not once per pixel.  However, that optimization precluded other
- * useful optimizations (such as merging color conversion with upsampling)
- * and it also interfered with desired capabilities such as quantizing to an
- * externally-supplied colormap.  We have therefore abandoned that approach.
- * The present code works in the post-conversion color space, typically RGB.
- *
- * To improve the visual quality of the results, we actually work in scaled
- * RGB space, giving G distances more weight than R, and R in turn more than
- * B.  To do everything in integer math, we must use integer scale factors.
- * The 2/3/1 scale factors used here correspond loosely to the relative
- * weights of the colors in the NTSC grayscale equation.
- * If you want to use this code to quantize a non-RGB color space, you'll
- * probably need to change these scale factors.
- */
-
-#define R_SCALE 2               /* scale R distances by this much */
-#define G_SCALE 3               /* scale G distances by this much */
-#define B_SCALE 1               /* and B by this much */
-
-/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined
- * in jmorecfg.h.  As the code stands, it will do the right thing for R,G,B
- * and B,G,R orders.  If you define some other weird order in jmorecfg.h,
- * you'll get compile errors until you extend this logic.  In that case
- * you'll probably want to tweak the histogram sizes too.
- */
-
-#if RGB_RED == 0
-#define C0_SCALE R_SCALE
-#endif
-#if RGB_BLUE == 0
-#define C0_SCALE B_SCALE
-#endif
-#if RGB_GREEN == 1
-#define C1_SCALE G_SCALE
-#endif
-#if RGB_RED == 2
-#define C2_SCALE R_SCALE
-#endif
-#if RGB_BLUE == 2
-#define C2_SCALE B_SCALE
-#endif
-
-
-/*
- * First we have the histogram data structure and routines for creating it.
- *
- * The number of bits of precision can be adjusted by changing these symbols.
- * We recommend keeping 6 bits for G and 5 each for R and B.
- * If you have plenty of memory and cycles, 6 bits all around gives marginally
- * better results; if you are short of memory, 5 bits all around will save
- * some space but degrade the results.
- * To maintain a fully accurate histogram, we'd need to allocate a "long"
- * (preferably unsigned long) for each cell.  In practice this is overkill;
- * we can get by with 16 bits per cell.  Few of the cell counts will overflow,
- * and clamping those that do overflow to the maximum value will give close-
- * enough results.  This reduces the recommended histogram size from 256Kb
- * to 128Kb, which is a useful savings on PC-class machines.
- * (In the second pass the histogram space is re-used for pixel mapping data;
- * in that capacity, each cell must be able to store zero to the number of
- * desired colors.  16 bits/cell is plenty for that too.)
- * Since the JPEG code is intended to run in small memory model on 80x86
- * machines, we can't just allocate the histogram in one chunk.  Instead
- * of a true 3-D array, we use a row of pointers to 2-D arrays.  Each
- * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and
- * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries.  Note that
- * on 80x86 machines, the pointer row is in near memory but the actual
- * arrays are in far memory (same arrangement as we use for image arrays).
- */
-
-#define MAXNUMCOLORS  (MAXJSAMPLE+1) /* maximum size of colormap */
-
-/* These will do the right thing for either R,G,B or B,G,R color order,
- * but you may not like the results for other color orders.
- */
-#define HIST_C0_BITS  5         /* bits of precision in R/B histogram */
-#define HIST_C1_BITS  6         /* bits of precision in G histogram */
-#define HIST_C2_BITS  5         /* bits of precision in B/R histogram */
-
-/* Number of elements along histogram axes. */
-#define HIST_C0_ELEMS  (1<<HIST_C0_BITS)
-#define HIST_C1_ELEMS  (1<<HIST_C1_BITS)
-#define HIST_C2_ELEMS  (1<<HIST_C2_BITS)
-
-/* These are the amounts to shift an input value to get a histogram index. */
-#define C0_SHIFT  (BITS_IN_JSAMPLE-HIST_C0_BITS)
-#define C1_SHIFT  (BITS_IN_JSAMPLE-HIST_C1_BITS)
-#define C2_SHIFT  (BITS_IN_JSAMPLE-HIST_C2_BITS)
-
-
-typedef UINT16 histcell;        /* histogram cell; prefer an unsigned type */
-
-typedef histcell FAR * histptr; /* for pointers to histogram cells */
-
-typedef histcell hist1d[HIST_C2_ELEMS]; /* typedefs for the array */
-typedef hist1d FAR * hist2d;    /* type for the 2nd-level pointers */
-typedef hist2d * hist3d;        /* type for top-level pointer */
-
-
-/* Declarations for Floyd-Steinberg dithering.
- *
- * Errors are accumulated into the array fserrors[], at a resolution of
- * 1/16th of a pixel count.  The error at a given pixel is propagated
- * to its not-yet-processed neighbors using the standard F-S fractions,
- *              ...     (here)  7/16
- *              3/16    5/16    1/16
- * We work left-to-right on even rows, right-to-left on odd rows.
- *
- * We can get away with a single array (holding one row's worth of errors)
- * by using it to store the current row's errors at pixel columns not yet
- * processed, but the next row's errors at columns already processed.  We
- * need only a few extra variables to hold the errors immediately around the
- * current column.  (If we are lucky, those variables are in registers, but
- * even if not, they're probably cheaper to access than array elements are.)
- *
- * The fserrors[] array has (#columns + 2) entries; the extra entry at
- * each end saves us from special-casing the first and last pixels.
- * Each entry is three values long, one value for each color component.
- *
- * Note: on a wide image, we might not have enough room in a PC's near data
- * segment to hold the error array; so it is allocated with alloc_large.
- */
-
-#if BITS_IN_JSAMPLE == 8
-typedef INT16 FSERROR;          /* 16 bits should be enough */
-typedef int LOCFSERROR;         /* use 'int' for calculation temps */
-#else
-typedef INT32 FSERROR;          /* may need more than 16 bits */
-typedef INT32 LOCFSERROR;       /* be sure calculation temps are big enough */
-#endif
-
-typedef FSERROR FAR *FSERRPTR;  /* pointer to error array (in FAR storage!) */
-
-
-/* Private subobject */
-
-typedef struct {
-  struct jpeg_color_quantizer pub; /* public fields */
-
-  /* Space for the eventually created colormap is stashed here */
-  JSAMPARRAY sv_colormap;       /* colormap allocated at init time */
-  int desired;                  /* desired # of colors = size of colormap */
-
-  /* Variables for accumulating image statistics */
-  hist3d histogram;             /* pointer to the histogram */
-
-  boolean needs_zeroed;         /* TRUE if next pass must zero histogram */
-
-  /* Variables for Floyd-Steinberg dithering */
-  FSERRPTR fserrors;            /* accumulated errors */
-  boolean on_odd_row;           /* flag to remember which row we are on */
-  int * error_limiter;          /* table for clamping the applied error */
-} my_cquantizer;
-
-typedef my_cquantizer * my_cquantize_ptr;
-
-
-/*
- * Prescan some rows of pixels.
- * In this module the prescan simply updates the histogram, which has been
- * initialized to zeroes by start_pass.
- * An output_buf parameter is required by the method signature, but no data
- * is actually output (in fact the buffer controller is probably passing a
- * NULL pointer).
- */
-
-METHODDEF(void)
-prescan_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
-                  JSAMPARRAY output_buf, int num_rows)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  register JSAMPROW ptr;
-  register histptr histp;
-  register hist3d histogram = cquantize->histogram;
-  int row;
-  JDIMENSION col;
-  JDIMENSION width = cinfo->output_width;
-
-  for (row = 0; row < num_rows; row++) {
-    ptr = input_buf[row];
-    for (col = width; col > 0; col--) {
-      /* get pixel value and index into the histogram */
-      histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT]
-                         [GETJSAMPLE(ptr[1]) >> C1_SHIFT]
-                         [GETJSAMPLE(ptr[2]) >> C2_SHIFT];
-      /* increment, check for overflow and undo increment if so. */
-      if (++(*histp) <= 0)
-        (*histp)--;
-      ptr += 3;
-    }
-  }
-}
-
-
-/*
- * Next we have the really interesting routines: selection of a colormap
- * given the completed histogram.
- * These routines work with a list of "boxes", each representing a rectangular
- * subset of the input color space (to histogram precision).
- */
-
-typedef struct {
-  /* The bounds of the box (inclusive); expressed as histogram indexes */
-  int c0min, c0max;
-  int c1min, c1max;
-  int c2min, c2max;
-  /* The volume (actually 2-norm) of the box */
-  INT32 volume;
-  /* The number of nonzero histogram cells within this box */
-  long colorcount;
-} box;
-
-typedef box * boxptr;
-
-
-LOCAL(boxptr)
-find_biggest_color_pop (boxptr boxlist, int numboxes)
-/* Find the splittable box with the largest color population */
-/* Returns NULL if no splittable boxes remain */
-{
-  register boxptr boxp;
-  register int i;
-  register long maxc = 0;
-  boxptr which = NULL;
-
-  for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
-    if (boxp->colorcount > maxc && boxp->volume > 0) {
-      which = boxp;
-      maxc = boxp->colorcount;
-    }
-  }
-  return which;
-}
-
-
-LOCAL(boxptr)
-find_biggest_volume (boxptr boxlist, int numboxes)
-/* Find the splittable box with the largest (scaled) volume */
-/* Returns NULL if no splittable boxes remain */
-{
-  register boxptr boxp;
-  register int i;
-  register INT32 maxv = 0;
-  boxptr which = NULL;
-
-  for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
-    if (boxp->volume > maxv) {
-      which = boxp;
-      maxv = boxp->volume;
-    }
-  }
-  return which;
-}
-
-
-LOCAL(void)
-update_box (j_decompress_ptr cinfo, boxptr boxp)
-/* Shrink the min/max bounds of a box to enclose only nonzero elements, */
-/* and recompute its volume and population */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  hist3d histogram = cquantize->histogram;
-  histptr histp;
-  int c0,c1,c2;
-  int c0min,c0max,c1min,c1max,c2min,c2max;
-  INT32 dist0,dist1,dist2;
-  long ccount;
-
-  c0min = boxp->c0min;  c0max = boxp->c0max;
-  c1min = boxp->c1min;  c1max = boxp->c1max;
-  c2min = boxp->c2min;  c2max = boxp->c2max;
-
-  if (c0max > c0min)
-    for (c0 = c0min; c0 <= c0max; c0++)
-      for (c1 = c1min; c1 <= c1max; c1++) {
-        histp = & histogram[c0][c1][c2min];
-        for (c2 = c2min; c2 <= c2max; c2++)
-          if (*histp++ != 0) {
-            boxp->c0min = c0min = c0;
-            goto have_c0min;
-          }
-      }
- have_c0min:
-  if (c0max > c0min)
-    for (c0 = c0max; c0 >= c0min; c0--)
-      for (c1 = c1min; c1 <= c1max; c1++) {
-        histp = & histogram[c0][c1][c2min];
-        for (c2 = c2min; c2 <= c2max; c2++)
-          if (*histp++ != 0) {
-            boxp->c0max = c0max = c0;
-            goto have_c0max;
-          }
-      }
- have_c0max:
-  if (c1max > c1min)
-    for (c1 = c1min; c1 <= c1max; c1++)
-      for (c0 = c0min; c0 <= c0max; c0++) {
-        histp = & histogram[c0][c1][c2min];
-        for (c2 = c2min; c2 <= c2max; c2++)
-          if (*histp++ != 0) {
-            boxp->c1min = c1min = c1;
-            goto have_c1min;
-          }
-      }
- have_c1min:
-  if (c1max > c1min)
-    for (c1 = c1max; c1 >= c1min; c1--)
-      for (c0 = c0min; c0 <= c0max; c0++) {
-        histp = & histogram[c0][c1][c2min];
-        for (c2 = c2min; c2 <= c2max; c2++)
-          if (*histp++ != 0) {
-            boxp->c1max = c1max = c1;
-            goto have_c1max;
-          }
-      }
- have_c1max:
-  if (c2max > c2min)
-    for (c2 = c2min; c2 <= c2max; c2++)
-      for (c0 = c0min; c0 <= c0max; c0++) {
-        histp = & histogram[c0][c1min][c2];
-        for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
-          if (*histp != 0) {
-            boxp->c2min = c2min = c2;
-            goto have_c2min;
-          }
-      }
- have_c2min:
-  if (c2max > c2min)
-    for (c2 = c2max; c2 >= c2min; c2--)
-      for (c0 = c0min; c0 <= c0max; c0++) {
-        histp = & histogram[c0][c1min][c2];
-        for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
-          if (*histp != 0) {
-            boxp->c2max = c2max = c2;
-            goto have_c2max;
-          }
-      }
- have_c2max:
-
-  /* Update box volume.
-   * We use 2-norm rather than real volume here; this biases the method
-   * against making long narrow boxes, and it has the side benefit that
-   * a box is splittable iff norm > 0.
-   * Since the differences are expressed in histogram-cell units,
-   * we have to shift back to JSAMPLE units to get consistent distances;
-   * after which, we scale according to the selected distance scale factors.
-   */
-  dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE;
-  dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE;
-  dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE;
-  boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2;
-
-  /* Now scan remaining volume of box and compute population */
-  ccount = 0;
-  for (c0 = c0min; c0 <= c0max; c0++)
-    for (c1 = c1min; c1 <= c1max; c1++) {
-      histp = & histogram[c0][c1][c2min];
-      for (c2 = c2min; c2 <= c2max; c2++, histp++)
-        if (*histp != 0) {
-          ccount++;
-        }
-    }
-  boxp->colorcount = ccount;
-}
-
-
-LOCAL(int)
-median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes,
-            int desired_colors)
-/* Repeatedly select and split the largest box until we have enough boxes */
-{
-  int n,lb;
-  int c0,c1,c2,cmax;
-  register boxptr b1,b2;
-
-  while (numboxes < desired_colors) {
-    /* Select box to split.
-     * Current algorithm: by population for first half, then by volume.
-     */
-    if (numboxes*2 <= desired_colors) {
-      b1 = find_biggest_color_pop(boxlist, numboxes);
-    } else {
-      b1 = find_biggest_volume(boxlist, numboxes);
-    }
-    if (b1 == NULL)             /* no splittable boxes left! */
-      break;
-    b2 = &boxlist[numboxes];    /* where new box will go */
-    /* Copy the color bounds to the new box. */
-    b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max;
-    b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min;
-    /* Choose which axis to split the box on.
-     * Current algorithm: longest scaled axis.
-     * See notes in update_box about scaling distances.
-     */
-    c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE;
-    c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE;
-    c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE;
-    /* We want to break any ties in favor of green, then red, blue last.
-     * This code does the right thing for R,G,B or B,G,R color orders only.
-     */
-#if RGB_RED == 0
-    cmax = c1; n = 1;
-    if (c0 > cmax) { cmax = c0; n = 0; }
-    if (c2 > cmax) { n = 2; }
-#else
-    cmax = c1; n = 1;
-    if (c2 > cmax) { cmax = c2; n = 2; }
-    if (c0 > cmax) { n = 0; }
-#endif
-    /* Choose split point along selected axis, and update box bounds.
-     * Current algorithm: split at halfway point.
-     * (Since the box has been shrunk to minimum volume,
-     * any split will produce two nonempty subboxes.)
-     * Note that lb value is max for lower box, so must be < old max.
-     */
-    switch (n) {
-    case 0:
-      lb = (b1->c0max + b1->c0min) / 2;
-      b1->c0max = lb;
-      b2->c0min = lb+1;
-      break;
-    case 1:
-      lb = (b1->c1max + b1->c1min) / 2;
-      b1->c1max = lb;
-      b2->c1min = lb+1;
-      break;
-    case 2:
-      lb = (b1->c2max + b1->c2min) / 2;
-      b1->c2max = lb;
-      b2->c2min = lb+1;
-      break;
-    }
-    /* Update stats for boxes */
-    update_box(cinfo, b1);
-    update_box(cinfo, b2);
-    numboxes++;
-  }
-  return numboxes;
-}
-
-
-LOCAL(void)
-compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor)
-/* Compute representative color for a box, put it in colormap[icolor] */
-{
-  /* Current algorithm: mean weighted by pixels (not colors) */
-  /* Note it is important to get the rounding correct! */
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  hist3d histogram = cquantize->histogram;
-  histptr histp;
-  int c0,c1,c2;
-  int c0min,c0max,c1min,c1max,c2min,c2max;
-  long count;
-  long total = 0;
-  long c0total = 0;
-  long c1total = 0;
-  long c2total = 0;
-
-  c0min = boxp->c0min;  c0max = boxp->c0max;
-  c1min = boxp->c1min;  c1max = boxp->c1max;
-  c2min = boxp->c2min;  c2max = boxp->c2max;
-
-  for (c0 = c0min; c0 <= c0max; c0++)
-    for (c1 = c1min; c1 <= c1max; c1++) {
-      histp = & histogram[c0][c1][c2min];
-      for (c2 = c2min; c2 <= c2max; c2++) {
-        if ((count = *histp++) != 0) {
-          total += count;
-          c0total += ((c0 << C0_SHIFT) + ((1<<C0_SHIFT)>>1)) * count;
-          c1total += ((c1 << C1_SHIFT) + ((1<<C1_SHIFT)>>1)) * count;
-          c2total += ((c2 << C2_SHIFT) + ((1<<C2_SHIFT)>>1)) * count;
-        }
-      }
-    }
-
-  cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total);
-  cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total);
-  cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total);
-}
-
-
-LOCAL(void)
-select_colors (j_decompress_ptr cinfo, int desired_colors)
-/* Master routine for color selection */
-{
-  boxptr boxlist;
-  int numboxes;
-  int i;
-
-  /* Allocate workspace for box list */
-  boxlist = (boxptr) (*cinfo->mem->alloc_small)
-    ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box));
-  /* Initialize one box containing whole space */
-  numboxes = 1;
-  boxlist[0].c0min = 0;
-  boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT;
-  boxlist[0].c1min = 0;
-  boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT;
-  boxlist[0].c2min = 0;
-  boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT;
-  /* Shrink it to actually-used volume and set its statistics */
-  update_box(cinfo, & boxlist[0]);
-  /* Perform median-cut to produce final box list */
-  numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors);
-  /* Compute the representative color for each box, fill colormap */
-  for (i = 0; i < numboxes; i++)
-    compute_color(cinfo, & boxlist[i], i);
-  cinfo->actual_number_of_colors = numboxes;
-  TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes);
-}
-
-
-/*
- * These routines are concerned with the time-critical task of mapping input
- * colors to the nearest color in the selected colormap.
- *
- * We re-use the histogram space as an "inverse color map", essentially a
- * cache for the results of nearest-color searches.  All colors within a
- * histogram cell will be mapped to the same colormap entry, namely the one
- * closest to the cell's center.  This may not be quite the closest entry to
- * the actual input color, but it's almost as good.  A zero in the cache
- * indicates we haven't found the nearest color for that cell yet; the array
- * is cleared to zeroes before starting the mapping pass.  When we find the
- * nearest color for a cell, its colormap index plus one is recorded in the
- * cache for future use.  The pass2 scanning routines call fill_inverse_cmap
- * when they need to use an unfilled entry in the cache.
- *
- * Our method of efficiently finding nearest colors is based on the "locally
- * sorted search" idea described by Heckbert and on the incremental distance
- * calculation described by Spencer W. Thomas in chapter III.1 of Graphics
- * Gems II (James Arvo, ed.  Academic Press, 1991).  Thomas points out that
- * the distances from a given colormap entry to each cell of the histogram can
- * be computed quickly using an incremental method: the differences between
- * distances to adjacent cells themselves differ by a constant.  This allows a
- * fairly fast implementation of the "brute force" approach of computing the
- * distance from every colormap entry to every histogram cell.  Unfortunately,
- * it needs a work array to hold the best-distance-so-far for each histogram
- * cell (because the inner loop has to be over cells, not colormap entries).
- * The work array elements have to be INT32s, so the work array would need
- * 256Kb at our recommended precision.  This is not feasible in DOS machines.
- *
- * To get around these problems, we apply Thomas' method to compute the
- * nearest colors for only the cells within a small subbox of the histogram.
- * The work array need be only as big as the subbox, so the memory usage
- * problem is solved.  Furthermore, we need not fill subboxes that are never
- * referenced in pass2; many images use only part of the color gamut, so a
- * fair amount of work is saved.  An additional advantage of this
- * approach is that we can apply Heckbert's locality criterion to quickly
- * eliminate colormap entries that are far away from the subbox; typically
- * three-fourths of the colormap entries are rejected by Heckbert's criterion,
- * and we need not compute their distances to individual cells in the subbox.
- * The speed of this approach is heavily influenced by the subbox size: too
- * small means too much overhead, too big loses because Heckbert's criterion
- * can't eliminate as many colormap entries.  Empirically the best subbox
- * size seems to be about 1/512th of the histogram (1/8th in each direction).
- *
- * Thomas' article also describes a refined method which is asymptotically
- * faster than the brute-force method, but it is also far more complex and
- * cannot efficiently be applied to small subboxes.  It is therefore not
- * useful for programs intended to be portable to DOS machines.  On machines
- * with plenty of memory, filling the whole histogram in one shot with Thomas'
- * refined method might be faster than the present code --- but then again,
- * it might not be any faster, and it's certainly more complicated.
- */
-
-
-/* log2(histogram cells in update box) for each axis; this can be adjusted */
-#define BOX_C0_LOG  (HIST_C0_BITS-3)
-#define BOX_C1_LOG  (HIST_C1_BITS-3)
-#define BOX_C2_LOG  (HIST_C2_BITS-3)
-
-#define BOX_C0_ELEMS  (1<<BOX_C0_LOG) /* # of hist cells in update box */
-#define BOX_C1_ELEMS  (1<<BOX_C1_LOG)
-#define BOX_C2_ELEMS  (1<<BOX_C2_LOG)
-
-#define BOX_C0_SHIFT  (C0_SHIFT + BOX_C0_LOG)
-#define BOX_C1_SHIFT  (C1_SHIFT + BOX_C1_LOG)
-#define BOX_C2_SHIFT  (C2_SHIFT + BOX_C2_LOG)
-
-
-/*
- * The next three routines implement inverse colormap filling.  They could
- * all be folded into one big routine, but splitting them up this way saves
- * some stack space (the mindist[] and bestdist[] arrays need not coexist)
- * and may allow some compilers to produce better code by registerizing more
- * inner-loop variables.
- */
-
-LOCAL(int)
-find_nearby_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
-                    JSAMPLE colorlist[])
-/* Locate the colormap entries close enough to an update box to be candidates
- * for the nearest entry to some cell(s) in the update box.  The update box
- * is specified by the center coordinates of its first cell.  The number of
- * candidate colormap entries is returned, and their colormap indexes are
- * placed in colorlist[].
- * This routine uses Heckbert's "locally sorted search" criterion to select
- * the colors that need further consideration.
- */
-{
-  int numcolors = cinfo->actual_number_of_colors;
-  int maxc0, maxc1, maxc2;
-  int centerc0, centerc1, centerc2;
-  int i, x, ncolors;
-  INT32 minmaxdist, min_dist, max_dist, tdist;
-  INT32 mindist[MAXNUMCOLORS];  /* min distance to colormap entry i */
-
-  /* Compute true coordinates of update box's upper corner and center.
-   * Actually we compute the coordinates of the center of the upper-corner
-   * histogram cell, which are the upper bounds of the volume we care about.
-   * Note that since ">>" rounds down, the "center" values may be closer to
-   * min than to max; hence comparisons to them must be "<=", not "<".
-   */
-  maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT));
-  centerc0 = (minc0 + maxc0) >> 1;
-  maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT));
-  centerc1 = (minc1 + maxc1) >> 1;
-  maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT));
-  centerc2 = (minc2 + maxc2) >> 1;
-
-  /* For each color in colormap, find:
-   *  1. its minimum squared-distance to any point in the update box
-   *     (zero if color is within update box);
-   *  2. its maximum squared-distance to any point in the update box.
-   * Both of these can be found by considering only the corners of the box.
-   * We save the minimum distance for each color in mindist[];
-   * only the smallest maximum distance is of interest.
-   */
-  minmaxdist = 0x7FFFFFFFL;
-
-  for (i = 0; i < numcolors; i++) {
-    /* We compute the squared-c0-distance term, then add in the other two. */
-    x = GETJSAMPLE(cinfo->colormap[0][i]);
-    if (x < minc0) {
-      tdist = (x - minc0) * C0_SCALE;
-      min_dist = tdist*tdist;
-      tdist = (x - maxc0) * C0_SCALE;
-      max_dist = tdist*tdist;
-    } else if (x > maxc0) {
-      tdist = (x - maxc0) * C0_SCALE;
-      min_dist = tdist*tdist;
-      tdist = (x - minc0) * C0_SCALE;
-      max_dist = tdist*tdist;
-    } else {
-      /* within cell range so no contribution to min_dist */
-      min_dist = 0;
-      if (x <= centerc0) {
-        tdist = (x - maxc0) * C0_SCALE;
-        max_dist = tdist*tdist;
-      } else {
-        tdist = (x - minc0) * C0_SCALE;
-        max_dist = tdist*tdist;
-      }
-    }
-
-    x = GETJSAMPLE(cinfo->colormap[1][i]);
-    if (x < minc1) {
-      tdist = (x - minc1) * C1_SCALE;
-      min_dist += tdist*tdist;
-      tdist = (x - maxc1) * C1_SCALE;
-      max_dist += tdist*tdist;
-    } else if (x > maxc1) {
-      tdist = (x - maxc1) * C1_SCALE;
-      min_dist += tdist*tdist;
-      tdist = (x - minc1) * C1_SCALE;
-      max_dist += tdist*tdist;
-    } else {
-      /* within cell range so no contribution to min_dist */
-      if (x <= centerc1) {
-        tdist = (x - maxc1) * C1_SCALE;
-        max_dist += tdist*tdist;
-      } else {
-        tdist = (x - minc1) * C1_SCALE;
-        max_dist += tdist*tdist;
-      }
-    }
-
-    x = GETJSAMPLE(cinfo->colormap[2][i]);
-    if (x < minc2) {
-      tdist = (x - minc2) * C2_SCALE;
-      min_dist += tdist*tdist;
-      tdist = (x - maxc2) * C2_SCALE;
-      max_dist += tdist*tdist;
-    } else if (x > maxc2) {
-      tdist = (x - maxc2) * C2_SCALE;
-      min_dist += tdist*tdist;
-      tdist = (x - minc2) * C2_SCALE;
-      max_dist += tdist*tdist;
-    } else {
-      /* within cell range so no contribution to min_dist */
-      if (x <= centerc2) {
-        tdist = (x - maxc2) * C2_SCALE;
-        max_dist += tdist*tdist;
-      } else {
-        tdist = (x - minc2) * C2_SCALE;
-        max_dist += tdist*tdist;
-      }
-    }
-
-    mindist[i] = min_dist;      /* save away the results */
-    if (max_dist < minmaxdist)
-      minmaxdist = max_dist;
-  }
-
-  /* Now we know that no cell in the update box is more than minmaxdist
-   * away from some colormap entry.  Therefore, only colors that are
-   * within minmaxdist of some part of the box need be considered.
-   */
-  ncolors = 0;
-  for (i = 0; i < numcolors; i++) {
-    if (mindist[i] <= minmaxdist)
-      colorlist[ncolors++] = (JSAMPLE) i;
-  }
-  return ncolors;
-}
-
-
-LOCAL(void)
-find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
-                  int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[])
-/* Find the closest colormap entry for each cell in the update box,
- * given the list of candidate colors prepared by find_nearby_colors.
- * Return the indexes of the closest entries in the bestcolor[] array.
- * This routine uses Thomas' incremental distance calculation method to
- * find the distance from a colormap entry to successive cells in the box.
- */
-{
-  int ic0, ic1, ic2;
-  int i, icolor;
-  register INT32 * bptr;        /* pointer into bestdist[] array */
-  JSAMPLE * cptr;               /* pointer into bestcolor[] array */
-  INT32 dist0, dist1;           /* initial distance values */
-  register INT32 dist2;         /* current distance in inner loop */
-  INT32 xx0, xx1;               /* distance increments */
-  register INT32 xx2;
-  INT32 inc0, inc1, inc2;       /* initial values for increments */
-  /* This array holds the distance to the nearest-so-far color for each cell */
-  INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
-
-  /* Initialize best-distance for each cell of the update box */
-  bptr = bestdist;
-  for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--)
-    *bptr++ = 0x7FFFFFFFL;
-
-  /* For each color selected by find_nearby_colors,
-   * compute its distance to the center of each cell in the box.
-   * If that's less than best-so-far, update best distance and color number.
-   */
-
-  /* Nominal steps between cell centers ("x" in Thomas article) */
-#define STEP_C0  ((1 << C0_SHIFT) * C0_SCALE)
-#define STEP_C1  ((1 << C1_SHIFT) * C1_SCALE)
-#define STEP_C2  ((1 << C2_SHIFT) * C2_SCALE)
-
-  for (i = 0; i < numcolors; i++) {
-    icolor = GETJSAMPLE(colorlist[i]);
-    /* Compute (square of) distance from minc0/c1/c2 to this color */
-    inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE;
-    dist0 = inc0*inc0;
-    inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE;
-    dist0 += inc1*inc1;
-    inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE;
-    dist0 += inc2*inc2;
-    /* Form the initial difference increments */
-    inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;
-    inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1;
-    inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2;
-    /* Now loop over all cells in box, updating distance per Thomas method */
-    bptr = bestdist;
-    cptr = bestcolor;
-    xx0 = inc0;
-    for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) {
-      dist1 = dist0;
-      xx1 = inc1;
-      for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) {
-        dist2 = dist1;
-        xx2 = inc2;
-        for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) {
-          if (dist2 < *bptr) {
-            *bptr = dist2;
-            *cptr = (JSAMPLE) icolor;
-          }
-          dist2 += xx2;
-          xx2 += 2 * STEP_C2 * STEP_C2;
-          bptr++;
-          cptr++;
-        }
-        dist1 += xx1;
-        xx1 += 2 * STEP_C1 * STEP_C1;
-      }
-      dist0 += xx0;
-      xx0 += 2 * STEP_C0 * STEP_C0;
-    }
-  }
-}
-
-
-LOCAL(void)
-fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2)
-/* Fill the inverse-colormap entries in the update box that contains */
-/* histogram cell c0/c1/c2.  (Only that one cell MUST be filled, but */
-/* we can fill as many others as we wish.) */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  hist3d histogram = cquantize->histogram;
-  int minc0, minc1, minc2;      /* lower left corner of update box */
-  int ic0, ic1, ic2;
-  register JSAMPLE * cptr;      /* pointer into bestcolor[] array */
-  register histptr cachep;      /* pointer into main cache array */
-  /* This array lists the candidate colormap indexes. */
-  JSAMPLE colorlist[MAXNUMCOLORS];
-  int numcolors;                /* number of candidate colors */
-  /* This array holds the actually closest colormap index for each cell. */
-  JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
-
-  /* Convert cell coordinates to update box ID */
-  c0 >>= BOX_C0_LOG;
-  c1 >>= BOX_C1_LOG;
-  c2 >>= BOX_C2_LOG;
-
-  /* Compute true coordinates of update box's origin corner.
-   * Actually we compute the coordinates of the center of the corner
-   * histogram cell, which are the lower bounds of the volume we care about.
-   */
-  minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1);
-  minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1);
-  minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1);
-
-  /* Determine which colormap entries are close enough to be candidates
-   * for the nearest entry to some cell in the update box.
-   */
-  numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist);
-
-  /* Determine the actually nearest colors. */
-  find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist,
-                   bestcolor);
-
-  /* Save the best color numbers (plus 1) in the main cache array */
-  c0 <<= BOX_C0_LOG;            /* convert ID back to base cell indexes */
-  c1 <<= BOX_C1_LOG;
-  c2 <<= BOX_C2_LOG;
-  cptr = bestcolor;
-  for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) {
-    for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) {
-      cachep = & histogram[c0+ic0][c1+ic1][c2];
-      for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) {
-        *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1);
-      }
-    }
-  }
-}
-
-
-/*
- * Map some rows of pixels to the output colormapped representation.
- */
-
-METHODDEF(void)
-pass2_no_dither (j_decompress_ptr cinfo,
-                 JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
-/* This version performs no dithering */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  hist3d histogram = cquantize->histogram;
-  register JSAMPROW inptr, outptr;
-  register histptr cachep;
-  register int c0, c1, c2;
-  int row;
-  JDIMENSION col;
-  JDIMENSION width = cinfo->output_width;
-
-  for (row = 0; row < num_rows; row++) {
-    inptr = input_buf[row];
-    outptr = output_buf[row];
-    for (col = width; col > 0; col--) {
-      /* get pixel value and index into the cache */
-      c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT;
-      c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT;
-      c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT;
-      cachep = & histogram[c0][c1][c2];
-      /* If we have not seen this color before, find nearest colormap entry */
-      /* and update the cache */
-      if (*cachep == 0)
-        fill_inverse_cmap(cinfo, c0,c1,c2);
-      /* Now emit the colormap index for this cell */
-      *outptr++ = (JSAMPLE) (*cachep - 1);
-    }
-  }
-}
-
-
-METHODDEF(void)
-pass2_fs_dither (j_decompress_ptr cinfo,
-                 JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
-/* This version performs Floyd-Steinberg dithering */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  hist3d histogram = cquantize->histogram;
-  register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */
-  LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */
-  LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */
-  register FSERRPTR errorptr;   /* => fserrors[] at column before current */
-  JSAMPROW inptr;               /* => current input pixel */
-  JSAMPROW outptr;              /* => current output pixel */
-  histptr cachep;
-  int dir;                      /* +1 or -1 depending on direction */
-  int dir3;                     /* 3*dir, for advancing inptr & errorptr */
-  int row;
-  JDIMENSION col;
-  JDIMENSION width = cinfo->output_width;
-  JSAMPLE *range_limit = cinfo->sample_range_limit;
-  int *error_limit = cquantize->error_limiter;
-  JSAMPROW colormap0 = cinfo->colormap[0];
-  JSAMPROW colormap1 = cinfo->colormap[1];
-  JSAMPROW colormap2 = cinfo->colormap[2];
-  SHIFT_TEMPS
-
-  for (row = 0; row < num_rows; row++) {
-    inptr = input_buf[row];
-    outptr = output_buf[row];
-    if (cquantize->on_odd_row) {
-      /* work right to left in this row */
-      inptr += (width-1) * 3;   /* so point to rightmost pixel */
-      outptr += width-1;
-      dir = -1;
-      dir3 = -3;
-      errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */
-      cquantize->on_odd_row = FALSE; /* flip for next time */
-    } else {
-      /* work left to right in this row */
-      dir = 1;
-      dir3 = 3;
-      errorptr = cquantize->fserrors; /* => entry before first real column */
-      cquantize->on_odd_row = TRUE; /* flip for next time */
-    }
-    /* Preset error values: no error propagated to first pixel from left */
-    cur0 = cur1 = cur2 = 0;
-    /* and no error propagated to row below yet */
-    belowerr0 = belowerr1 = belowerr2 = 0;
-    bpreverr0 = bpreverr1 = bpreverr2 = 0;
-
-    for (col = width; col > 0; col--) {
-      /* curN holds the error propagated from the previous pixel on the
-       * current line.  Add the error propagated from the previous line
-       * to form the complete error correction term for this pixel, and
-       * round the error term (which is expressed * 16) to an integer.
-       * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
-       * for either sign of the error value.
-       * Note: errorptr points to *previous* column's array entry.
-       */
-      cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4);
-      cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4);
-      cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4);
-      /* Limit the error using transfer function set by init_error_limit.
-       * See comments with init_error_limit for rationale.
-       */
-      cur0 = error_limit[cur0];
-      cur1 = error_limit[cur1];
-      cur2 = error_limit[cur2];
-      /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
-       * The maximum error is +- MAXJSAMPLE (or less with error limiting);
-       * this sets the required size of the range_limit array.
-       */
-      cur0 += GETJSAMPLE(inptr[0]);
-      cur1 += GETJSAMPLE(inptr[1]);
-      cur2 += GETJSAMPLE(inptr[2]);
-      cur0 = GETJSAMPLE(range_limit[cur0]);
-      cur1 = GETJSAMPLE(range_limit[cur1]);
-      cur2 = GETJSAMPLE(range_limit[cur2]);
-      /* Index into the cache with adjusted pixel value */
-      cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT];
-      /* If we have not seen this color before, find nearest colormap */
-      /* entry and update the cache */
-      if (*cachep == 0)
-        fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT);
-      /* Now emit the colormap index for this cell */
-      { register int pixcode = *cachep - 1;
-        *outptr = (JSAMPLE) pixcode;
-        /* Compute representation error for this pixel */
-        cur0 -= GETJSAMPLE(colormap0[pixcode]);
-        cur1 -= GETJSAMPLE(colormap1[pixcode]);
-        cur2 -= GETJSAMPLE(colormap2[pixcode]);
-      }
-      /* Compute error fractions to be propagated to adjacent pixels.
-       * Add these into the running sums, and simultaneously shift the
-       * next-line error sums left by 1 column.
-       */
-      { register LOCFSERROR bnexterr, delta;
-
-        bnexterr = cur0;        /* Process component 0 */
-        delta = cur0 * 2;
-        cur0 += delta;          /* form error * 3 */
-        errorptr[0] = (FSERROR) (bpreverr0 + cur0);
-        cur0 += delta;          /* form error * 5 */
-        bpreverr0 = belowerr0 + cur0;
-        belowerr0 = bnexterr;
-        cur0 += delta;          /* form error * 7 */
-        bnexterr = cur1;        /* Process component 1 */
-        delta = cur1 * 2;
-        cur1 += delta;          /* form error * 3 */
-        errorptr[1] = (FSERROR) (bpreverr1 + cur1);
-        cur1 += delta;          /* form error * 5 */
-        bpreverr1 = belowerr1 + cur1;
-        belowerr1 = bnexterr;
-        cur1 += delta;          /* form error * 7 */
-        bnexterr = cur2;        /* Process component 2 */
-        delta = cur2 * 2;
-        cur2 += delta;          /* form error * 3 */
-        errorptr[2] = (FSERROR) (bpreverr2 + cur2);
-        cur2 += delta;          /* form error * 5 */
-        bpreverr2 = belowerr2 + cur2;
-        belowerr2 = bnexterr;
-        cur2 += delta;          /* form error * 7 */
-      }
-      /* At this point curN contains the 7/16 error value to be propagated
-       * to the next pixel on the current line, and all the errors for the
-       * next line have been shifted over.  We are therefore ready to move on.
-       */
-      inptr += dir3;            /* Advance pixel pointers to next column */
-      outptr += dir;
-      errorptr += dir3;         /* advance errorptr to current column */
-    }
-    /* Post-loop cleanup: we must unload the final error values into the
-     * final fserrors[] entry.  Note we need not unload belowerrN because
-     * it is for the dummy column before or after the actual array.
-     */
-    errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */
-    errorptr[1] = (FSERROR) bpreverr1;
-    errorptr[2] = (FSERROR) bpreverr2;
-  }
-}
-
-
-/*
- * Initialize the error-limiting transfer function (lookup table).
- * The raw F-S error computation can potentially compute error values of up to
- * +- MAXJSAMPLE.  But we want the maximum correction applied to a pixel to be
- * much less, otherwise obviously wrong pixels will be created.  (Typical
- * effects include weird fringes at color-area boundaries, isolated bright
- * pixels in a dark area, etc.)  The standard advice for avoiding this problem
- * is to ensure that the "corners" of the color cube are allocated as output
- * colors; then repeated errors in the same direction cannot cause cascading
- * error buildup.  However, that only prevents the error from getting
- * completely out of hand; Aaron Giles reports that error limiting improves
- * the results even with corner colors allocated.
- * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty
- * well, but the smoother transfer function used below is even better.  Thanks
- * to Aaron Giles for this idea.
- */
-
-LOCAL(void)
-init_error_limit (j_decompress_ptr cinfo)
-/* Allocate and fill in the error_limiter table */
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  int * table;
-  int in, out;
-
-  table = (int *) (*cinfo->mem->alloc_small)
-    ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int));
-  table += MAXJSAMPLE;          /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */
-  cquantize->error_limiter = table;
-
-#define STEPSIZE ((MAXJSAMPLE+1)/16)
-  /* Map errors 1:1 up to +- MAXJSAMPLE/16 */
-  out = 0;
-  for (in = 0; in < STEPSIZE; in++, out++) {
-    table[in] = out; table[-in] = -out;
-  }
-  /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */
-  for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) {
-    table[in] = out; table[-in] = -out;
-  }
-  /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */
-  for (; in <= MAXJSAMPLE; in++) {
-    table[in] = out; table[-in] = -out;
-  }
-#undef STEPSIZE
-}
-
-
-/*
- * Finish up at the end of each pass.
- */
-
-METHODDEF(void)
-finish_pass1 (j_decompress_ptr cinfo)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-
-  /* Select the representative colors and fill in cinfo->colormap */
-  cinfo->colormap = cquantize->sv_colormap;
-  select_colors(cinfo, cquantize->desired);
-  /* Force next pass to zero the color index table */
-  cquantize->needs_zeroed = TRUE;
-}
-
-
-METHODDEF(void)
-finish_pass2 (j_decompress_ptr cinfo)
-{
-  /* no work */
-}
-
-
-/*
- * Initialize for each processing pass.
- */
-
-METHODDEF(void)
-start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-  hist3d histogram = cquantize->histogram;
-  int i;
-
-  /* Only F-S dithering or no dithering is supported. */
-  /* If user asks for ordered dither, give him F-S. */
-  if (cinfo->dither_mode != JDITHER_NONE)
-    cinfo->dither_mode = JDITHER_FS;
-
-  if (is_pre_scan) {
-    /* Set up method pointers */
-    cquantize->pub.color_quantize = prescan_quantize;
-    cquantize->pub.finish_pass = finish_pass1;
-    cquantize->needs_zeroed = TRUE; /* Always zero histogram */
-  } else {
-    /* Set up method pointers */
-    if (cinfo->dither_mode == JDITHER_FS)
-      cquantize->pub.color_quantize = pass2_fs_dither;
-    else
-      cquantize->pub.color_quantize = pass2_no_dither;
-    cquantize->pub.finish_pass = finish_pass2;
-
-    /* Make sure color count is acceptable */
-    i = cinfo->actual_number_of_colors;
-    if (i < 1)
-      ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1);
-    if (i > MAXNUMCOLORS)
-      ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
-
-    if (cinfo->dither_mode == JDITHER_FS) {
-      size_t arraysize = (size_t) ((cinfo->output_width + 2) *
-                                   (3 * SIZEOF(FSERROR)));
-      /* Allocate Floyd-Steinberg workspace if we didn't already. */
-      if (cquantize->fserrors == NULL)
-        cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
-          ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
-      /* Initialize the propagated errors to zero. */
-      jzero_far((void FAR *) cquantize->fserrors, arraysize);
-      /* Make the error-limit table if we didn't already. */
-      if (cquantize->error_limiter == NULL)
-        init_error_limit(cinfo);
-      cquantize->on_odd_row = FALSE;
-    }
-
-  }
-  /* Zero the histogram or inverse color map, if necessary */
-  if (cquantize->needs_zeroed) {
-    for (i = 0; i < HIST_C0_ELEMS; i++) {
-      jzero_far((void FAR *) histogram[i],
-                HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
-    }
-    cquantize->needs_zeroed = FALSE;
-  }
-}
-
-
-/*
- * Switch to a new external colormap between output passes.
- */
-
-METHODDEF(void)
-new_color_map_2_quant (j_decompress_ptr cinfo)
-{
-  my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
-
-  /* Reset the inverse color map */
-  cquantize->needs_zeroed = TRUE;
-}
-
-
-/*
- * Module initialization routine for 2-pass color quantization.
- */
-
-GLOBAL(void)
-jinit_2pass_quantizer (j_decompress_ptr cinfo)
-{
-  my_cquantize_ptr cquantize;
-  int i;
-
-  cquantize = (my_cquantize_ptr)
-    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                SIZEOF(my_cquantizer));
-  cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
-  cquantize->pub.start_pass = start_pass_2_quant;
-  cquantize->pub.new_color_map = new_color_map_2_quant;
-  cquantize->fserrors = NULL;   /* flag optional arrays not allocated */
-  cquantize->error_limiter = NULL;
-
-  /* Make sure jdmaster didn't give me a case I can't handle */
-  if (cinfo->out_color_components != 3)
-    ERREXIT(cinfo, JERR_NOTIMPL);
-
-  /* Allocate the histogram/inverse colormap storage */
-  cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small)
-    ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d));
-  for (i = 0; i < HIST_C0_ELEMS; i++) {
-    cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large)
-      ((j_common_ptr) cinfo, JPOOL_IMAGE,
-       HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
-  }
-  cquantize->needs_zeroed = TRUE; /* histogram is garbage now */
-
-  /* Allocate storage for the completed colormap, if required.
-   * We do this now since it is FAR storage and may affect
-   * the memory manager's space calculations.
-   */
-  if (cinfo->enable_2pass_quant) {
-    /* Make sure color count is acceptable */
-    int desired = cinfo->desired_number_of_colors;
-    /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */
-    if (desired < 8)
-      ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8);
-    /* Make sure colormap indexes can be represented by JSAMPLEs */
-    if (desired > MAXNUMCOLORS)
-      ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
-    cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
-      ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3);
-    cquantize->desired = desired;
-  } else
-    cquantize->sv_colormap = NULL;
-
-  /* Only F-S dithering or no dithering is supported. */
-  /* If user asks for ordered dither, give him F-S. */
-  if (cinfo->dither_mode != JDITHER_NONE)
-    cinfo->dither_mode = JDITHER_FS;
-
-  /* Allocate Floyd-Steinberg workspace if necessary.
-   * This isn't really needed until pass 2, but again it is FAR storage.
-   * Although we will cope with a later change in dither_mode,
-   * we do not promise to honor max_memory_to_use if dither_mode changes.
-   */
-  if (cinfo->dither_mode == JDITHER_FS) {
-    cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
-      ((j_common_ptr) cinfo, JPOOL_IMAGE,
-       (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR))));
-    /* Might as well create the error-limiting table too. */
-    init_error_limit(cinfo);
-  }
-}
-
-#endif /* QUANT_2PASS_SUPPORTED */
--- a/src/share/native/sun/awt/image/jpeg/jutils.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jutils.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains tables and miscellaneous utility routines needed
- * for both compression and decompression.
- * Note we prefix all global names with "j" to minimize conflicts with
- * a surrounding application.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element
- * of a DCT block read in natural order (left to right, top to bottom).
- */
-
-#if 0                           /* This table is not actually needed in v6a */
-
-const int jpeg_zigzag_order[DCTSIZE2] = {
-   0,  1,  5,  6, 14, 15, 27, 28,
-   2,  4,  7, 13, 16, 26, 29, 42,
-   3,  8, 12, 17, 25, 30, 41, 43,
-   9, 11, 18, 24, 31, 40, 44, 53,
-  10, 19, 23, 32, 39, 45, 52, 54,
-  20, 22, 33, 38, 46, 51, 55, 60,
-  21, 34, 37, 47, 50, 56, 59, 61,
-  35, 36, 48, 49, 57, 58, 62, 63
-};
-
-#endif
-
-/*
- * jpeg_natural_order[i] is the natural-order position of the i'th element
- * of zigzag order.
- *
- * When reading corrupted data, the Huffman decoders could attempt
- * to reference an entry beyond the end of this array (if the decoded
- * zero run length reaches past the end of the block).  To prevent
- * wild stores without adding an inner-loop test, we put some extra
- * "63"s after the real entries.  This will cause the extra coefficient
- * to be stored in location 63 of the block, not somewhere random.
- * The worst case would be a run-length of 15, which means we need 16
- * fake entries.
- */
-
-const int jpeg_natural_order[DCTSIZE2+16] = {
-  0,  1,  8, 16,  9,  2,  3, 10,
- 17, 24, 32, 25, 18, 11,  4,  5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13,  6,  7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63,
- 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
- 63, 63, 63, 63, 63, 63, 63, 63
-};
-
-
-/*
- * Arithmetic utilities
- */
-
-GLOBAL(long)
-jdiv_round_up (long a, long b)
-/* Compute a/b rounded up to next integer, ie, ceil(a/b) */
-/* Assumes a >= 0, b > 0 */
-{
-  return (a + b - 1L) / b;
-}
-
-
-GLOBAL(long)
-jround_up (long a, long b)
-/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */
-/* Assumes a >= 0, b > 0 */
-{
-  a += b - 1L;
-  return a - (a % b);
-}
-
-
-/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
- * and coefficient-block arrays.  This won't work on 80x86 because the arrays
- * are FAR and we're assuming a small-pointer memory model.  However, some
- * DOS compilers provide far-pointer versions of memcpy() and memset() even
- * in the small-model libraries.  These will be used if USE_FMEM is defined.
- * Otherwise, the routines below do it the hard way.  (The performance cost
- * is not all that great, because these routines aren't very heavily used.)
- */
-
-#ifndef NEED_FAR_POINTERS       /* normal case, same as regular macros */
-#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size)
-#define FMEMZERO(target,size)   MEMZERO(target,size)
-#else                           /* 80x86 case, define if we can */
-#ifdef USE_FMEM
-#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
-#define FMEMZERO(target,size)   _fmemset((void FAR *)(target), 0, (size_t)(size))
-#endif
-#endif
-
-
-GLOBAL(void)
-jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
-                   JSAMPARRAY output_array, int dest_row,
-                   int num_rows, JDIMENSION num_cols)
-/* Copy some rows of samples from one place to another.
- * num_rows rows are copied from input_array[source_row++]
- * to output_array[dest_row++]; these areas may overlap for duplication.
- * The source and destination arrays must be at least as wide as num_cols.
- */
-{
-  register JSAMPROW inptr, outptr;
-#ifdef FMEMCOPY
-  register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));
-#else
-  register JDIMENSION count;
-#endif
-  register int row;
-
-  input_array += source_row;
-  output_array += dest_row;
-
-  for (row = num_rows; row > 0; row--) {
-    inptr = *input_array++;
-    outptr = *output_array++;
-#ifdef FMEMCOPY
-    FMEMCOPY(outptr, inptr, count);
-#else
-    for (count = num_cols; count > 0; count--)
-      *outptr++ = *inptr++;     /* needn't bother with GETJSAMPLE() here */
-#endif
-  }
-}
-
-
-GLOBAL(void)
-jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
-                 JDIMENSION num_blocks)
-/* Copy a row of coefficient blocks from one place to another. */
-{
-#ifdef FMEMCOPY
-  FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
-#else
-  register JCOEFPTR inptr, outptr;
-  register long count;
-
-  inptr = (JCOEFPTR) input_row;
-  outptr = (JCOEFPTR) output_row;
-  for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {
-    *outptr++ = *inptr++;
-  }
-#endif
-}
-
-
-GLOBAL(void)
-jzero_far (void FAR * target, size_t bytestozero)
-/* Zero out a chunk of FAR memory. */
-/* This might be sample-array data, block-array data, or alloc_large data. */
-{
-#ifdef FMEMZERO
-  FMEMZERO(target, bytestozero);
-#else
-  register char FAR * ptr = (char FAR *) target;
-  register size_t count;
-
-  for (count = bytestozero; count > 0; count--) {
-    *ptr++ = 0;
-  }
-#endif
-}
--- a/src/share/native/sun/awt/image/jpeg/jversion.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * jversion.h
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains software version identification.
- */
-
-
-#define JVERSION        "6b  27-Mar-1998"
-
-#define JCOPYRIGHT      "Copyright (C) 1998, Thomas G. Lane"
--- a/src/share/native/sun/awt/splashscreen/splashscreen_gif.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/awt/splashscreen/splashscreen_gif.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -26,7 +26,7 @@
 #include "splashscreen_impl.h"
 #include "splashscreen_gfx.h"
 
-#include "../giflib/gif_lib.h"
+#include <gif_lib.h>
 
 #include "sizecalc.h"
 
@@ -213,16 +213,16 @@
             byte_t *pSrc = image->RasterBits;
             ImageFormat srcFormat;
             ImageRect srcRect, dstRect;
-            int pass, npass;
+            int pass = 4, npass = 5;
 
+#if GIFLIB_MAJOR < 5
+            /* Interlaced gif support is broken in giflib < 5
+               so we need to work around this */
             if (desc->Interlace) {
                 pass = 0;
                 npass = 4;
             }
-            else {
-                pass = 4;
-                npass = 5;
-            }
+#endif
 
             srcFormat.colorMap = colorMapBuf;
             srcFormat.depthBytes = 1;
@@ -310,7 +310,13 @@
     free(pBitmapBits);
     free(pOldBitmapBits);
 
+#if GIFLIB_MAJOR > 5 || (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1)
+    if (DGifCloseFile(gif, NULL) == GIF_ERROR) {
+        return 0;
+    }
+#else
     DGifCloseFile(gif);
+#endif
 
     return 1;
 }
@@ -318,7 +324,11 @@
 int
 SplashDecodeGifStream(Splash * splash, SplashStream * stream)
 {
+#if GIFLIB_MAJOR >= 5
+    GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc, NULL);
+#else
     GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc);
+#endif
 
     if (!gif)
         return 0;
--- a/src/share/native/sun/awt/splashscreen/splashscreen_jpeg.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/awt/splashscreen/splashscreen_jpeg.c	Tue Aug 22 02:03:52 2017 +0100
@@ -25,12 +25,13 @@
 
 #include "splashscreen_impl.h"
 
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jerror.h"
+#include <jpeglib.h>
+#include <jerror.h>
 
 #include <setjmp.h>
 
+#define SIZEOF(object)  ((size_t) sizeof(object))
+
 /* stream input handling */
 
 typedef struct
--- a/src/share/native/sun/awt/splashscreen/splashscreen_png.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/awt/splashscreen/splashscreen_png.c	Tue Aug 22 02:03:52 2017 +0100
@@ -25,7 +25,7 @@
 
 #include "splashscreen_impl.h"
 
-#include "../libpng/png.h"
+#include <png.h>
 
 #include <setjmp.h>
 
--- a/src/share/native/sun/font/freetypeScaler.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/font/freetypeScaler.c	Tue Aug 22 02:03:52 2017 +0100
@@ -38,6 +38,10 @@
 #include FT_SIZES_H
 #include FT_OUTLINE_H
 #include FT_SYNTHESIS_H
+#ifdef IMPROVED_FONT_RENDERING
+#include FT_LCD_FILTER_H
+#include <fontconfig/fontconfig.h>
+#endif
 
 #include "fontscaler.h"
 
@@ -45,7 +49,7 @@
 #define  FloatToFTFixed(f) (FT_Fixed)((f) * (float)(ftFixed1))
 #define  FTFixedToFloat(x) ((x) / (float)(ftFixed1))
 #define  FT26Dot6ToFloat(x)  ((x) / ((float) (1<<6)))
-#define  ROUND(x) ((int) (x+0.5))
+#define  ROUND26Dot6(x) ((x + 63) & -64)
 
 typedef struct {
     /* Important note:
@@ -147,20 +151,6 @@
 
 #define FILEDATACACHESIZE 1024
 
-/* NB: is it ever called? */
-static void CloseTTFontFileFunc(FT_Stream stream) {
-    FTScalerInfo *scalerInfo = (FTScalerInfo *) stream->pathname.pointer;
-    JNIEnv* env = scalerInfo->env;
-    jclass tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont");
-    jfieldID platNameField =
-         (*env)->GetFieldID(env, tmpClass, "platName", "Ljava/lang/String;");
-    jstring platName = (*env)->GetObjectField(env,
-                                              scalerInfo->font2D,
-                                              platNameField);
-    const char *name = JNU_GetStringPlatformChars(env, platName, NULL);
-    JNU_ReleaseStringPlatformChars(env, platName, name);
-}
-
 static unsigned long ReadTTFontFileFunc(FT_Stream stream,
                                         unsigned long offset,
                                         unsigned char* destBuffer,
@@ -305,7 +295,7 @@
                 ftstream->size = filesize;
                 ftstream->pos = 0;
                 ftstream->read = (FT_Stream_IoFunc) ReadTTFontFileFunc;
-                ftstream->close = (FT_Stream_CloseFunc) CloseTTFontFileFunc;
+                ftstream->close = NULL;
                 ftstream->pathname.pointer = (void *) scalerInfo;
 
                 memset(&ft_open_args, 0, sizeof(FT_Open_Args));
@@ -424,7 +414,6 @@
     jobject metrics;
     jfloat ax, ay, dx, dy, bx, by, lx, ly, mx, my;
     jfloat f0 = 0.0;
-    FT_Pos bmodifier = 0;
     FTScalerContext *context =
         (FTScalerContext*) jlong_to_ptr(pScalerContext);
     FTScalerInfo *scalerInfo =
@@ -457,43 +446,34 @@
        So, we have to do adust them explicitly and stay consistent with what
        freetype does to outlines. */
 
-    /* For bolding glyphs are not just widened. Height is also changed
-       (see ftsynth.c).
-
-       TODO: In vertical direction we could do better job and adjust metrics
-       proportionally to glyoh shape. */
-    if (context->doBold) {
-        bmodifier = FT_MulFix(
-                       scalerInfo->face->units_per_EM,
-                       scalerInfo->face->size->metrics.y_scale)/24;
-    }
-
 
     /**** Note: only some metrics are affected by styling ***/
 
+#define FT_MulFixFloatShift6(a, b) (((float) (a)) * ((float) (b)) / 65536.0 / 64.0)
+
+    /* See FreeType source code: src/base/ftobjs.c ft_recompute_scaled_metrics() */
     /* ascent */
     ax = 0;
-    ay = -(jfloat) FT26Dot6ToFloat(FT_MulFix(
-                       ((jlong) scalerInfo->face->ascender + bmodifier/2),
+    ay = -(jfloat) (FT_MulFixFloatShift6(
+                       ((jlong) scalerInfo->face->ascender),
                        (jlong) scalerInfo->face->size->metrics.y_scale));
     /* descent */
     dx = 0;
-    dy = -(jfloat) FT26Dot6ToFloat(FT_MulFix(
-                       ((jlong) scalerInfo->face->descender + bmodifier/2),
+    dy = -(jfloat) (FT_MulFixFloatShift6(
+                       ((jlong) scalerInfo->face->descender),
                        (jlong) scalerInfo->face->size->metrics.y_scale));
     /* baseline */
     bx = by = 0;
 
     /* leading */
     lx = 0;
-    ly = (jfloat) FT26Dot6ToFloat(FT_MulFix(
-                      (jlong) scalerInfo->face->height + bmodifier,
+    ly = (jfloat) (FT_MulFixFloatShift6(
+                      (jlong) scalerInfo->face->height,
                       (jlong) scalerInfo->face->size->metrics.y_scale))
                   + ay - dy;
     /* max advance */
     mx = (jfloat) FT26Dot6ToFloat(
                      scalerInfo->face->size->metrics.max_advance +
-                     2*bmodifier +
                      OBLIQUE_MODIFIER(scalerInfo->face->size->metrics.height));
     my = 0;
 
@@ -675,6 +655,162 @@
     }
 }
 
+#ifdef IMPROVED_FONT_RENDERING
+typedef struct {
+    FT_Render_Mode ftRenderMode;
+    int ftLoadFlags;
+    FT_LcdFilter ftLcdFilter;
+} RenderingProperties;
+
+static FcPattern* matchedPattern(const FcChar8* family, double ptSize) {
+    /*
+      we will create pattern to find our family and size in
+      fontconfig configuration, and then will return it's
+      properties:
+    */
+    FcPattern* fcPattern = 0;
+    fcPattern = FcPatternCreate();
+    FcValue fcValue;
+    fcValue.type = FcTypeString;
+    fcValue.u.s = family;
+    FcPatternAdd(fcPattern, FC_FAMILY, fcValue, FcTrue);
+    FcPatternAddBool(fcPattern, FC_SCALABLE, FcTrue);
+    FcPatternAddDouble(fcPattern, FC_SIZE, ptSize);
+    // TODO FcPatternAddInteger(pattern, FC_WEIGHT, weight_value);
+    // TODO FcPatternAddInteger(pattern, FC_SLANT, slant_value);
+    // TODO FcPatternAddDouble(pattern, FC_PIXEL_SIZE, size_value);
+    // TODO FcPatternAddInteger(pattern, FC_WIDTH, stretch); 100 in most cases
+    FcConfigSubstitute(0, fcPattern, FcMatchPattern);
+    FcConfigSubstitute(0, fcPattern, FcMatchFont);
+    FcDefaultSubstitute(fcPattern);
+    FcResult res;
+
+    FcPattern *pattern = 0;
+    pattern = FcFontMatch(0, fcPattern, &res);
+    FcPatternDestroy(fcPattern);
+    return pattern;
+}
+
+static void readFontconfig(const FcChar8* family, FTScalerContext *context, RenderingProperties* rp) {
+
+    FcPattern *pattern = matchedPattern(family, context->ptsz);
+
+    int ftLoadFalgs = FT_LOAD_DEFAULT;
+    FT_Render_Mode ftRenderMode;
+    FT_LcdFilter ftLcdFilter;
+    char horizontal = 1;
+    FcBool fcAntialias = false, fcBool;
+
+    // If the user has no antialias information set in their fontconfig directory
+    // and the font itself does not provide any hints either (which is common),
+    // Fontconfig may not return any antialias hint about the selected font since
+    // it does not set any default for this key internally.
+    // Use the antialias hint when it is available but only if antialiasing was
+    // actually requested by the caller.
+    // If antialiasing was requested but Fontconfig states to use no antialiasing,
+    // that takes precedence and also modifies the supplied context to account for
+    // the change (sets context->aaType to TEXT_AA_OFF as a side-effect in the render
+    // mode conditional block down below).
+    if (context->aaType != TEXT_AA_OFF) {
+        if (FcPatternGetBool(pattern, FC_ANTIALIAS, 0, &fcAntialias) != FcResultMatch)
+            fcAntialias = true;
+    }
+
+    // render mode:
+    if (fcAntialias) {
+        if (context->aaType == TEXT_AA_ON)
+            ftRenderMode = FT_RENDER_MODE_NORMAL;
+        else {
+            // subpixel order:
+            int subpixel = FC_RGBA_UNKNOWN;
+            FcPatternGetInteger(pattern, FC_RGBA, 0, &subpixel);
+            if (subpixel == FC_RGBA_UNKNOWN)
+                subpixel = FC_RGBA_NONE;
+            switch (subpixel) {
+            case FC_RGBA_NONE:
+                ftRenderMode = FT_RENDER_MODE_NORMAL;
+                break;
+            case FC_RGBA_RGB:
+            case FC_RGBA_BGR:
+                ftRenderMode = FT_RENDER_MODE_LCD;
+                horizontal = 1;
+                break;
+            case FC_RGBA_VRGB:
+            case FC_RGBA_VBGR:
+                ftRenderMode = FT_RENDER_MODE_LCD_V;
+                horizontal = 0;
+                break;
+            default:
+                break;
+            }
+        }
+    } else {
+        ftRenderMode = FT_RENDER_MODE_MONO;
+        context->aaType = TEXT_AA_OFF; // if this was forced through Fontconfig
+   }
+
+    // loading mode:
+    if (!fcAntialias)
+        ftLoadFalgs |= FT_LOAD_TARGET_MONO;
+    else {
+        int hint_style = FC_HINT_NONE;
+        FcPatternGetInteger(pattern, FC_HINT_STYLE, 0, &hint_style);
+        switch (hint_style) {
+        case FC_HINT_NONE:
+            ftLoadFalgs |= FT_LOAD_NO_HINTING;
+            break;
+        case FC_HINT_SLIGHT:
+            ftLoadFalgs |= FT_LOAD_TARGET_LIGHT;
+            break;
+        case FC_HINT_MEDIUM:
+            ftLoadFalgs |= FT_LOAD_TARGET_NORMAL;
+            break;
+        case FC_HINT_FULL:
+            if (fcAntialias)
+                ftLoadFalgs |= FT_LOAD_TARGET_NORMAL;
+            else
+                ftLoadFalgs |= horizontal ? FT_LOAD_TARGET_LCD : FT_LOAD_TARGET_LCD_V;
+            break;
+        default:
+            // what else to use as default?
+            ftLoadFalgs |= FT_LOAD_TARGET_NORMAL;
+            break;
+        }
+    }
+
+    // autohinting:
+    if (FcPatternGetBool(pattern, FC_AUTOHINT, 0, &fcBool) == FcResultMatch && fcBool)
+        ftLoadFalgs |= FT_LOAD_FORCE_AUTOHINT;
+
+    // LCD filter:
+    int filter = FC_LCD_DEFAULT;
+    FcPatternGetInteger(pattern, FC_LCD_FILTER, 0, &filter);
+    switch (filter) {
+    case FC_LCD_NONE:
+        ftLcdFilter = FT_LCD_FILTER_NONE;
+        break;
+    case FC_LCD_DEFAULT:
+        ftLcdFilter = FT_LCD_FILTER_DEFAULT;
+        break;
+    case FC_LCD_LIGHT:
+        ftLcdFilter = FT_LCD_FILTER_LIGHT;
+        break;
+    case FC_LCD_LEGACY:
+        ftLcdFilter = FT_LCD_FILTER_LEGACY;
+        break;
+    default:
+        // new unknown lcd filter type?! will use default one:
+        ftLcdFilter = FT_LCD_FILTER_DEFAULT;
+        break;
+    }
+
+    FcPatternDestroy(pattern);
+
+    rp->ftRenderMode = ftRenderMode;
+    rp->ftLoadFlags = ftLoadFalgs;
+    rp->ftLcdFilter = ftLcdFilter;
+}
+#endif
 
 /*
  * Class:     sun_font_FreetypeFontScaler
@@ -690,8 +826,10 @@
     UInt16 width, height;
     GlyphInfo *glyphInfo;
     int glyph_index;
+    FT_GlyphSlot ftglyph;
+#ifndef IMPROVED_FONT_RENDERING
     int renderFlags = FT_LOAD_RENDER, target;
-    FT_GlyphSlot ftglyph;
+#endif
 
     FTScalerContext* context =
         (FTScalerContext*) jlong_to_ptr(pScalerContext);
@@ -708,6 +846,11 @@
         return ptr_to_jlong(getNullGlyphImage());
     }
 
+#ifdef IMPROVED_FONT_RENDERING
+    RenderingProperties renderingProperties;
+    readFontconfig((const FcChar8 *) scalerInfo->face->family_name,
+                   context, &renderingProperties);
+#else
     /* if algorithmic styling is required then we do not request bitmap */
     if (context->doBold || context->doItalize) {
         renderFlags =  FT_LOAD_DEFAULT;
@@ -730,10 +873,17 @@
         target = FT_LOAD_TARGET_LCD_V;
     }
     renderFlags |= target;
+#endif
 
     glyph_index = FT_Get_Char_Index(scalerInfo->face, glyphCode);
 
+#ifdef IMPROVED_FONT_RENDERING
+    FT_Library_SetLcdFilter(scalerInfo->library, renderingProperties.ftLcdFilter);
+    error = FT_Load_Glyph(scalerInfo->face, glyphCode, renderingProperties.ftLoadFlags);
+#else
     error = FT_Load_Glyph(scalerInfo->face, glyphCode, renderFlags);
+#endif
+
     if (error) {
         //do not destroy scaler yet.
         //this can be problem of particular context (e.g. with bad transform)
@@ -752,9 +902,13 @@
 
     /* generate bitmap if it is not done yet
      e.g. if algorithmic styling is performed and style was added to outline */
+#ifdef IMPROVED_FONT_RENDERING
+    FT_Render_Glyph(ftglyph, renderingProperties.ftRenderMode);
+#else
     if (ftglyph->format == FT_GLYPH_FORMAT_OUTLINE) {
         FT_Render_Glyph(ftglyph, FT_LOAD_TARGET_MODE(target));
     }
+#endif
 
     width  = (UInt16) ftglyph->bitmap.width;
     height = (UInt16) ftglyph->bitmap.rows;
@@ -786,18 +940,10 @@
         glyphInfo->advanceY =
             (float) (advh * FTFixedToFloat(context->transform.xy));
     } else {
-        if (!ftglyph->advance.y) {
-            glyphInfo->advanceX =
-                (float) ROUND(FT26Dot6ToFloat(ftglyph->advance.x));
-            glyphInfo->advanceY = 0;
-        } else if (!ftglyph->advance.x) {
-            glyphInfo->advanceX = 0;
-            glyphInfo->advanceY =
-                (float) ROUND(FT26Dot6ToFloat(-ftglyph->advance.y));
-        } else {
-            glyphInfo->advanceX = FT26Dot6ToFloat(ftglyph->advance.x);
-            glyphInfo->advanceY = FT26Dot6ToFloat(-ftglyph->advance.y);
-        }
+        glyphInfo->advanceX =
+            (float) FT26Dot6ToFloat(ROUND26Dot6(ftglyph->advance.x));
+        glyphInfo->advanceY =
+            (float) -FT26Dot6ToFloat(ROUND26Dot6(ftglyph->advance.y));
     }
 
     if (imageSize == 0) {
@@ -968,7 +1114,9 @@
 static FT_Outline* getFTOutline(JNIEnv* env, jobject font2D,
         FTScalerContext *context, FTScalerInfo* scalerInfo,
         jint glyphCode, jfloat xpos, jfloat ypos) {
+#ifndef IMPROVED_FONT_RENDERING
     int renderFlags;
+#endif
     int glyph_index;
     FT_Error error;
     FT_GlyphSlot ftglyph;
@@ -983,11 +1131,22 @@
         return NULL;
     }
 
+#ifdef IMPROVED_FONT_RENDERING
+    RenderingProperties renderingProperties;
+    readFontconfig((const FcChar8 *) scalerInfo->face->family_name,
+                   context, &renderingProperties);
+#else
     renderFlags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP;
+#endif
 
     glyph_index = FT_Get_Char_Index(scalerInfo->face, glyphCode);
 
+#ifdef IMPROVED_FONT_RENDERING
+    error = FT_Load_Glyph(scalerInfo->face, glyphCode, renderingProperties.ftLoadFlags);
+#else
     error = FT_Load_Glyph(scalerInfo->face, glyphCode, renderFlags);
+#endif
+
     if (error) {
         return NULL;
     }
--- a/src/share/native/sun/font/layout/CanonShaping.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/font/layout/CanonShaping.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -66,6 +66,16 @@
     le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount);
     le_int32 i;
 
+    if (combiningClasses == NULL || indices == NULL) {
+        if (combiningClasses != NULL) {
+            LE_DELETE_ARRAY(combiningClasses);
+        }
+        if (indices != NULL) {
+            LE_DELETE_ARRAY(indices);
+        }
+        return;
+    }
+
     for (i = 0; i < charCount; i += 1) {
       combiningClasses[i] = classTable->getGlyphClass(classTable, (LEGlyphID) inChars[i], success);
         indices[i] = i;
--- a/src/share/native/sun/font/layout/IndicLayoutEngine.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/font/layout/IndicLayoutEngine.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -151,7 +151,7 @@
     le_int32 outCharCount;
     if (fVersion2) {
         _LETRACE("v2process");
-        outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage);
+        outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage, success);
     } else {
         _LETRACE("reorder");
         outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, success);
--- a/src/share/native/sun/font/layout/IndicReordering.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/font/layout/IndicReordering.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -1096,9 +1096,13 @@
 
 
 le_int32 IndicReordering::v2process(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode,
-                                  LEUnicode *outChars, LEGlyphStorage &glyphStorage)
+                                  LEUnicode *outChars, LEGlyphStorage &glyphStorage, LEErrorCode& success)
 {
     const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode);
+    if (classTable == NULL) {
+        success = LE_MEMORY_ALLOCATION_ERROR;
+        return 0;
+    }
 
     DynamicProperties dynProps[INDIC_BLOCK_SIZE];
     IndicReordering::getDynamicProperties(dynProps,classTable);
--- a/src/share/native/sun/font/layout/IndicReordering.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/font/layout/IndicReordering.h	Tue Aug 22 02:03:52 2017 +0100
@@ -181,7 +181,7 @@
     static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success);
 
     static le_int32 v2process(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode,
-        LEUnicode *outChars, LEGlyphStorage &glyphStorage);
+        LEUnicode *outChars, LEGlyphStorage &glyphStorage, LEErrorCode& success);
 
     static const FeatureMap *getFeatureMap(le_int32 &count);
 
--- a/src/share/native/sun/font/layout/LayoutEngine.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/font/layout/LayoutEngine.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -672,12 +672,20 @@
             break;
         }
     } else {
+        if (LE_FAILURE(success)) {
+	    // Reset if gsubTable failed
+            success = LE_NO_ERROR;
+        }
         LEReferenceTo<MorphTableHeader2> morxTable(fontInstance, morxTableTag, success);
         if (LE_SUCCESS(success) &&
             morxTable.isValid() &&
             SWAPL(morxTable->version)==0x00020000) {
             result = new GXLayoutEngine2(fontInstance, scriptCode, languageCode, morxTable, typoFlags, success);
         } else {
+          if (LE_FAILURE(success)) {
+	    // Reset if morxTable failed
+            success = LE_NO_ERROR;
+          }
           LEReferenceTo<MorphTableHeader> mortTable(fontInstance, mortTableTag, success);
           if (LE_SUCCESS(success) && mortTable.isValid() && SWAPL(mortTable->version)==0x00010000) { // mort
             result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, mortTable, success);
--- a/src/share/native/sun/font/layout/SunLayoutEngine.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/font/layout/SunLayoutEngine.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -183,6 +183,10 @@
   FontInstanceAdapter fia(env, font2d, strike, mat, 72, 72, (le_int32) upem, (TTLayoutTableCache *) layoutTables);
   LEErrorCode success = LE_NO_ERROR;
   LayoutEngine *engine = LayoutEngine::layoutEngineFactory(&fia, script, lang, typo_flags & TYPO_MASK, success);
+  if (engine == NULL) {
+    env->SetIntField(gvdata, gvdCountFID, -1); // flag failure
+    return;
+  }
 
   if (min < 0) min = 0; if (max < min) max = min; /* defensive coding */
   // have to copy, yuck, since code does upcalls now.  this will be soooo slow
--- a/src/share/native/sun/java2d/cmm/lcms/LCMS.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/LCMS.c	Tue Aug 22 02:03:52 2017 +0100
@@ -31,6 +31,7 @@
 #include "Trace.h"
 #include "Disposer.h"
 #include "lcms2.h"
+#include "jlong.h"
 
 
 #define ALIGNLONG(x) (((x)+3) & ~(3))         // Aligns to DWORD boundary
@@ -94,19 +95,15 @@
 # endif
 #endif
 
-typedef union storeID_s {    /* store SProfile stuff in a Java Long */
+typedef struct lcmsProfile_s {
     cmsHPROFILE pf;
-    cmsHTRANSFORM xf;
-    jobject jobj;
-    jlong j;
-} storeID_t, *storeID_p;
+} lcmsProfile_t, *lcmsProfile_p;
 
 typedef union {
     cmsTagSignature cms;
     jint j;
 } TagSignature_t, *TagSignature_p;
 
-static jfieldID Trans_profileIDs_fID;
 static jfieldID Trans_renderType_fID;
 static jfieldID Trans_ID_fID;
 static jfieldID IL_isIntPacked_fID;
@@ -117,7 +114,7 @@
 static jfieldID IL_nextRowOffset_fID;
 static jfieldID IL_width_fID;
 static jfieldID IL_height_fID;
-static jfieldID PF_ID_fID;
+static jfieldID IL_imageAtOnce_fID;
 
 JavaVM *javaVM;
 
@@ -144,12 +141,22 @@
     return JNI_VERSION_1_6;
 }
 
+void LCMS_freeProfile(JNIEnv *env, jlong ptr) {
+    lcmsProfile_p p = (lcmsProfile_p)jlong_to_ptr(ptr);
+
+    if (p != NULL) {
+        if (p->pf != NULL) {
+            cmsCloseProfile(p->pf);
+        }
+        free(p);
+    }
+}
+
 void LCMS_freeTransform(JNIEnv *env, jlong ID)
 {
-    storeID_t sTrans;
-    sTrans.j = ID;
+    cmsHTRANSFORM sTrans = jlong_to_ptr(ID);
     /* Passed ID is always valid native ref so there is no check for zero */
-    cmsDeleteTransform(sTrans.xf);
+    cmsDeleteTransform(sTrans);
 }
 
 /*
@@ -159,21 +166,38 @@
  */
 JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform
   (JNIEnv *env, jclass cls, jlongArray profileIDs, jint renderType,
-   jint inFormatter, jint outFormatter, jobject disposerRef)
+   jint inFormatter, jboolean isInIntPacked,
+   jint outFormatter, jboolean isOutIntPacked, jobject disposerRef)
 {
     cmsHPROFILE _iccArray[DF_ICC_BUF_SIZE];
     cmsHPROFILE *iccArray = &_iccArray[0];
-    storeID_t sTrans;
+    cmsHTRANSFORM sTrans = NULL;
     int i, j, size;
     jlong* ids;
 
     size = (*env)->GetArrayLength (env, profileIDs);
-    ids = (*env)->GetPrimitiveArrayCritical(env, profileIDs, 0);
+    ids = (*env)->GetLongArrayElements(env, profileIDs, 0);
+    if (ids == NULL) {
+        // An exception should have already been thrown.
+        return 0L;
+    }
+
+#ifdef _LITTLE_ENDIAN
+    /* Reversing data packed into int for LE archs */
+    if (isInIntPacked) {
+        inFormatter ^= DOSWAP_SH(1);
+    }
+    if (isOutIntPacked) {
+        outFormatter ^= DOSWAP_SH(1);
+    }
+#endif
 
     if (DF_ICC_BUF_SIZE < size*2) {
         iccArray = (cmsHPROFILE*) malloc(
             size*2*sizeof(cmsHPROFILE));
         if (iccArray == NULL) {
+            (*env)->ReleaseLongArrayElements(env, profileIDs, ids, 0);
+
             J2dRlsTraceLn(J2D_TRACE_ERROR, "getXForm: iccArray == NULL");
             return 0L;
         }
@@ -181,11 +205,10 @@
 
     j = 0;
     for (i = 0; i < size; i++) {
-        cmsHPROFILE icc;
         cmsColorSpaceSignature cs;
+        lcmsProfile_p profilePtr = (lcmsProfile_p)jlong_to_ptr(ids[i]);
+        cmsHPROFILE icc = profilePtr->pf;
 
-        sTrans.j = ids[i];
-        icc = sTrans.pf;
         iccArray[j++] = icc;
 
         /* Middle non-abstract profiles should be doubled before passing to
@@ -200,38 +223,41 @@
         }
     }
 
-    sTrans.xf = cmsCreateMultiprofileTransform(iccArray, j,
+    sTrans = cmsCreateMultiprofileTransform(iccArray, j,
         inFormatter, outFormatter, renderType, 0);
 
-    (*env)->ReleasePrimitiveArrayCritical(env, profileIDs, ids, 0);
+    (*env)->ReleaseLongArrayElements(env, profileIDs, ids, 0);
 
-    if (sTrans.xf == NULL) {
+    if (sTrans == NULL) {
         J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_createNativeTransform: "
-                                       "sTrans.xf == NULL");
-        JNU_ThrowByName(env, "java/awt/color/CMMException",
-                        "Cannot get color transform");
+                                       "sTrans == NULL");
+        if ((*env)->ExceptionOccurred(env) == NULL) {
+            JNU_ThrowByName(env, "java/awt/color/CMMException",
+                            "Cannot get color transform");
+        }
     } else {
-        Disposer_AddRecord(env, disposerRef, LCMS_freeTransform, sTrans.j);
+        Disposer_AddRecord(env, disposerRef, LCMS_freeTransform, ptr_to_jlong(sTrans));
     }
 
     if (iccArray != &_iccArray[0]) {
         free(iccArray);
     }
-    return sTrans.j;
+    return ptr_to_jlong(sTrans);
 }
 
 
 /*
  * Class:     sun_java2d_cmm_lcms_LCMS
  * Method:    loadProfile
- * Signature: ([B)J
+ * Signature: ([B,Lsun/java2d/cmm/lcms/LCMSProfile;)V
  */
-JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfile
-  (JNIEnv *env, jobject obj, jbyteArray data)
+JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative
+  (JNIEnv *env, jobject obj, jbyteArray data, jobject disposerRef)
 {
     jbyte* dataArray;
     jint dataSize;
-    storeID_t sProf;
+    lcmsProfile_p sProf = NULL;
+    cmsHPROFILE pf;
 
     if (JNU_IsNull(env, data)) {
         JNU_ThrowIllegalArgumentException(env, "Invalid profile data");
@@ -239,58 +265,62 @@
     }
 
     dataArray = (*env)->GetByteArrayElements (env, data, 0);
-    dataSize = (*env)->GetArrayLength (env, data);
-
     if (dataArray == NULL) {
-        JNU_ThrowIllegalArgumentException(env, "Invalid profile data");
+        // An exception should have already been thrown.
         return 0L;
     }
 
-    sProf.pf = cmsOpenProfileFromMem((const void *)dataArray,
+    dataSize = (*env)->GetArrayLength (env, data);
+
+    pf = cmsOpenProfileFromMem((const void *)dataArray,
                                      (cmsUInt32Number) dataSize);
 
     (*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
 
-    if (sProf.pf == NULL) {
+    if (pf == NULL) {
         JNU_ThrowIllegalArgumentException(env, "Invalid profile data");
+    } else {
+        /* Sanity check: try to save the profile in order
+         * to force basic validation.
+         */
+        cmsUInt32Number pfSize = 0;
+        if (!cmsSaveProfileToMem(pf, NULL, &pfSize) ||
+            pfSize < sizeof(cmsICCHeader))
+        {
+            JNU_ThrowIllegalArgumentException(env, "Invalid profile data");
+
+            cmsCloseProfile(pf);
+            pf = NULL;
+        }
     }
 
-    return sProf.j;
+    if (pf != NULL) {
+        // create profile holder
+        sProf = (lcmsProfile_p)malloc(sizeof(lcmsProfile_t));
+        if (sProf != NULL) {
+            // register the disposer record
+            sProf->pf = pf;
+            Disposer_AddRecord(env, disposerRef, LCMS_freeProfile, ptr_to_jlong(sProf));
+        } else {
+            cmsCloseProfile(pf);
+        }
+    }
+
+    return ptr_to_jlong(sProf);
 }
 
 /*
  * Class:     sun_java2d_cmm_lcms_LCMS
- * Method:    freeProfile
- * Signature: (J)V
+ * Method:    getProfileSizeNative
+ * Signature: (J)I
  */
-JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_freeProfile
+JNIEXPORT jint JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileSizeNative
   (JNIEnv *env, jobject obj, jlong id)
 {
-    storeID_t sProf;
-
-    sProf.j = id;
-    if (cmsCloseProfile(sProf.pf) == 0) {
-        J2dRlsTraceLn1(J2D_TRACE_ERROR, "LCMS_freeProfile: cmsCloseProfile(%d)"
-                       "== 0", id);
-        JNU_ThrowByName(env, "java/awt/color/CMMException",
-                        "Cannot close profile");
-    }
-
-}
+    lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
+    cmsUInt32Number pfSize = 0;
 
-/*
- * Class:     sun_java2d_cmm_lcms_LCMS
- * Method:    getProfileSize
- * Signature: (J)I
- */
-JNIEXPORT jint JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileSize
-  (JNIEnv *env, jobject obj, jlong id)
-{
-    storeID_t sProf;
-    cmsUInt32Number pfSize = 0;
-    sProf.j = id;
-
-    if (cmsSaveProfileToMem(sProf.pf, NULL, &pfSize) && ((jint)pfSize > 0)) {
+    if (cmsSaveProfileToMem(sProf->pf, NULL, &pfSize) && ((jint)pfSize > 0)) {
         return (jint)pfSize;
     } else {
       JNU_ThrowByName(env, "java/awt/color/CMMException",
@@ -301,22 +331,20 @@
 
 /*
  * Class:     sun_java2d_cmm_lcms_LCMS
- * Method:    getProfileData
+ * Method:    getProfileDataNative
  * Signature: (J[B)V
  */
-JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileData
+JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileDataNative
   (JNIEnv *env, jobject obj, jlong id, jbyteArray data)
 {
-    storeID_t sProf;
+    lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
     jint size;
     jbyte* dataArray;
     cmsUInt32Number pfSize = 0;
     cmsBool status;
 
-    sProf.j = id;
-
     // determine actual profile size
-    if (!cmsSaveProfileToMem(sProf.pf, NULL, &pfSize)) {
+    if (!cmsSaveProfileToMem(sProf->pf, NULL, &pfSize)) {
         JNU_ThrowByName(env, "java/awt/color/CMMException",
                         "Can not access specified profile.");
         return;
@@ -331,8 +359,12 @@
     }
 
     dataArray = (*env)->GetByteArrayElements (env, data, 0);
+    if (dataArray == NULL) {
+        // An exception should have already been thrown.
+        return;
+    }
 
-    status = cmsSaveProfileToMem(sProf.pf, dataArray, &pfSize);
+    status = cmsSaveProfileToMem(sProf->pf, dataArray, &pfSize);
 
     (*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
 
@@ -346,120 +378,92 @@
 /* Get profile header info */
 static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize);
 static cmsBool _setHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize);
-static cmsBool _writeCookedTag(cmsHPROFILE pfTarget, cmsTagSignature sig, jbyte *pData, jint size);
-
-/*
- * Class:     sun_java2d_cmm_lcms_LCMS
- * Method:    getTagSize
- * Signature: (JI)I
- */
-JNIEXPORT jint JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagSize
-  (JNIEnv *env, jobject obj, jlong id, jint tagSig)
-{
-    storeID_t sProf;
-    TagSignature_t sig;
-    jint result = -1;
+static cmsHPROFILE _writeCookedTag(cmsHPROFILE pfTarget, cmsTagSignature sig, jbyte *pData, jint size);
 
-    sProf.j = id;
-    sig.j = tagSig;
-
-    if (tagSig == SigHead) {
-        result = sizeof(cmsICCHeader);
-    } else {
-      if (cmsIsTag(sProf.pf, sig.cms)) {
-          result = cmsReadRawTag(sProf.pf, sig.cms, NULL, 0);
-        } else {
-            JNU_ThrowByName(env, "java/awt/color/CMMException",
-                            "ICC profile tag not found");
-        }
-    }
-
-    return result;
-}
 
 /*
  * Class:     sun_java2d_cmm_lcms_LCMS
  * Method:    getTagData
  * Signature: (JI[B)V
  */
-JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagData
-  (JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data)
+JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
+  (JNIEnv *env, jobject obj, jlong id, jint tagSig)
 {
-    storeID_t sProf;
+    lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
     TagSignature_t sig;
     cmsInt32Number tagSize;
 
-    jbyte* dataArray;
+    jbyte* dataArray = NULL;
+    jbyteArray data = NULL;
+
     jint bufSize;
 
-    sProf.j = id;
     sig.j = tagSig;
 
     if (tagSig == SigHead) {
         cmsBool status;
 
-        bufSize =(*env)->GetArrayLength(env, data);
+        // allocate java array
+        bufSize = sizeof(cmsICCHeader);
+        data = (*env)->NewByteArray(env, bufSize);
 
-        if (bufSize < sizeof(cmsICCHeader)) {
-           JNU_ThrowByName(env, "java/awt/color/CMMException",
-                            "Insufficient buffer capacity");
-           return;
+        if (data == NULL) {
+            // An exception should have already been thrown.
+            return NULL;
         }
 
         dataArray = (*env)->GetByteArrayElements (env, data, 0);
 
         if (dataArray == NULL) {
-           JNU_ThrowByName(env, "java/awt/color/CMMException",
-                            "Unable to get buffer");
-           return;
+            // An exception should have already been thrown.
+            return NULL;
         }
 
-        status = _getHeaderInfo(sProf.pf, dataArray, bufSize);
+        status = _getHeaderInfo(sProf->pf, dataArray, bufSize);
 
         (*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
 
         if (!status) {
             JNU_ThrowByName(env, "java/awt/color/CMMException",
                             "ICC Profile header not found");
+            return NULL;
         }
 
-        return;
+        return data;
     }
 
-    if (cmsIsTag(sProf.pf, sig.cms)) {
-        tagSize = cmsReadRawTag(sProf.pf, sig.cms, NULL, 0);
+    if (cmsIsTag(sProf->pf, sig.cms)) {
+        tagSize = cmsReadRawTag(sProf->pf, sig.cms, NULL, 0);
     } else {
         JNU_ThrowByName(env, "java/awt/color/CMMException",
                         "ICC profile tag not found");
-        return;
+        return NULL;
     }
 
-    // verify data buffer capacity
-    bufSize = (*env)->GetArrayLength(env, data);
-
-    if (tagSize < 0 || 0 > bufSize || tagSize > bufSize) {
-        JNU_ThrowByName(env, "java/awt/color/CMMException",
-                        "Insufficient buffer capacity.");
-        return;
+    // allocate java array
+    data = (*env)->NewByteArray(env, tagSize);
+    if (data == NULL) {
+        // An exception should have already been thrown.
+        return NULL;
     }
 
     dataArray = (*env)->GetByteArrayElements (env, data, 0);
 
     if (dataArray == NULL) {
-        JNU_ThrowByName(env, "java/awt/color/CMMException",
-                        "Unable to get buffer");
-        return;
+        // An exception should have already been thrown.
+        return NULL;
     }
 
-    bufSize = cmsReadRawTag(sProf.pf, sig.cms, dataArray, tagSize);
+    bufSize = cmsReadRawTag(sProf->pf, sig.cms, dataArray, tagSize);
 
     (*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
 
     if (bufSize != tagSize) {
         JNU_ThrowByName(env, "java/awt/color/CMMException",
                         "Can not get tag data.");
+        return NULL;
     }
-    return;
+    return data;
 }
 
 /*
@@ -467,16 +471,17 @@
  * Method:    setTagData
  * Signature: (JI[B)V
  */
-JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagData
+JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative
   (JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data)
 {
-    storeID_t sProf;
+    lcmsProfile_p sProf = (lcmsProfile_p)jlong_to_ptr(id);
+    cmsHPROFILE pfReplace = NULL;
+
     TagSignature_t sig;
-    cmsBool status;
+    cmsBool status = FALSE;
     jbyte* dataArray;
     int tagSize;
 
-    sProf.j = id;
     sig.j = tagSig;
 
     if (JNU_IsNull(env, data)) {
@@ -489,20 +494,29 @@
     dataArray = (*env)->GetByteArrayElements(env, data, 0);
 
     if (dataArray == NULL) {
-        JNU_ThrowIllegalArgumentException(env, "Can not write tag data.");
+        // An exception should have already been thrown.
         return;
     }
 
     if (tagSig == SigHead) {
-        status = _setHeaderInfo(sProf.pf, dataArray, tagSize);
+        status  = _setHeaderInfo(sProf->pf, dataArray, tagSize);
     } else {
-        status = _writeCookedTag(sProf.pf, sig.cms, dataArray, tagSize);
+        /*
+        * New strategy for generic tags: create a place holder,
+        * dump all existing tags there, dump externally supplied
+        * tag, and return the new profile to the java.
+        */
+        pfReplace = _writeCookedTag(sProf->pf, sig.cms, dataArray, tagSize);
+        status = (pfReplace != NULL);
     }
 
     (*env)->ReleaseByteArrayElements(env, data, dataArray, 0);
 
     if (!status) {
         JNU_ThrowIllegalArgumentException(env, "Can not write tag data.");
+    } else if (pfReplace != NULL) {
+        cmsCloseProfile(sProf->pf);
+        sProf->pf = pfReplace;
     }
 }
 
@@ -556,8 +570,8 @@
 JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
   (JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst)
 {
-    storeID_t sTrans;
-    int inFmt, outFmt, srcDType, dstDType;
+    cmsHTRANSFORM sTrans = NULL;
+    int srcDType, dstDType;
     int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset;
     int width, height, i;
     void* inputBuffer;
@@ -565,27 +579,21 @@
     char* inputRow;
     char* outputRow;
     jobject srcData, dstData;
+    jboolean srcAtOnce = JNI_FALSE, dstAtOnce = JNI_FALSE;
 
-    inFmt = (*env)->GetIntField (env, src, IL_pixelType_fID);
-    outFmt = (*env)->GetIntField (env, dst, IL_pixelType_fID);
     srcOffset = (*env)->GetIntField (env, src, IL_offset_fID);
     srcNextRowOffset = (*env)->GetIntField (env, src, IL_nextRowOffset_fID);
     dstOffset = (*env)->GetIntField (env, dst, IL_offset_fID);
     dstNextRowOffset = (*env)->GetIntField (env, dst, IL_nextRowOffset_fID);
     width = (*env)->GetIntField (env, src, IL_width_fID);
     height = (*env)->GetIntField (env, src, IL_height_fID);
-#ifdef _LITTLE_ENDIAN
-    /* Reversing data packed into int for LE archs */
-    if ((*env)->GetBooleanField (env, src, IL_isIntPacked_fID) == JNI_TRUE) {
-        inFmt ^= DOSWAP_SH(1);
-    }
-    if ((*env)->GetBooleanField (env, dst, IL_isIntPacked_fID) == JNI_TRUE) {
-        outFmt ^= DOSWAP_SH(1);
-    }
-#endif
-    sTrans.j = (*env)->GetLongField (env, trans, Trans_ID_fID);
+
+    srcAtOnce = (*env)->GetBooleanField(env, src, IL_imageAtOnce_fID);
+    dstAtOnce = (*env)->GetBooleanField(env, dst, IL_imageAtOnce_fID);
 
-    if (sTrans.xf == NULL) {
+    sTrans = jlong_to_ptr((*env)->GetLongField (env, trans, Trans_ID_fID));
+
+    if (sTrans == NULL) {
         J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_colorConvert: transform == NULL");
         JNU_ThrowByName(env, "java/awt/color/CMMException",
                         "Cannot get color transform");
@@ -597,8 +605,7 @@
 
     if (inputBuffer == NULL) {
         J2dRlsTraceLn(J2D_TRACE_ERROR, "");
-        JNU_ThrowByName(env, "java/awt/color/CMMException",
-                        "Cannot get input data");
+        // An exception should have already been thrown.
         return;
     }
 
@@ -606,18 +613,21 @@
 
     if (outputBuffer == NULL) {
         releaseILData(env, inputBuffer, srcDType, srcData);
-        JNU_ThrowByName(env, "java/awt/color/CMMException",
-                        "Cannot get output data");
+        // An exception should have already been thrown.
         return;
     }
 
     inputRow = (char*)inputBuffer + srcOffset;
     outputRow = (char*)outputBuffer + dstOffset;
 
-    for (i = 0; i < height; i++) {
-        cmsDoTransform(sTrans.xf, inputRow, outputRow, width);
-        inputRow += srcNextRowOffset;
-        outputRow += dstNextRowOffset;
+    if (srcAtOnce && dstAtOnce) {
+        cmsDoTransform(sTrans, inputRow, outputRow, width * height);
+    } else {
+        for (i = 0; i < height; i++) {
+            cmsDoTransform(sTrans, inputRow, outputRow, width);
+            inputRow += srcNextRowOffset;
+            outputRow += dstNextRowOffset;
+        }
     }
 
     releaseILData(env, inputBuffer, srcDType, srcData);
@@ -627,12 +637,35 @@
 /*
  * Class:     sun_java2d_cmm_lcms_LCMS
  * Method:    getProfileID
- * Signature: (Ljava/awt/color/ICC_Profile;)J
+ * Signature: (Ljava/awt/color/ICC_Profile;)Lsun/java2d/cmm/lcms/LCMSProfile
  */
-JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileID
+JNIEXPORT jobject JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileID
   (JNIEnv *env, jclass cls, jobject pf)
 {
-    return (*env)->GetLongField (env, pf, PF_ID_fID);
+    jclass clsLcmsProfile;
+    jobject cmmProfile;
+    jfieldID fid = (*env)->GetFieldID (env,
+        (*env)->GetObjectClass(env, pf),
+        "cmmProfile", "Lsun/java2d/cmm/Profile;");
+    if (fid == NULL) {
+        return NULL;
+    }
+
+    clsLcmsProfile = (*env)->FindClass(env,
+            "sun/java2d/cmm/lcms/LCMSProfile");
+    if (clsLcmsProfile == NULL) {
+        return NULL;
+    }
+
+    cmmProfile = (*env)->GetObjectField (env, pf, fid);
+
+    if (JNU_IsNull(env, cmmProfile)) {
+        return NULL;
+    }
+    if ((*env)->IsInstanceOf(env, cmmProfile, clsLcmsProfile)) {
+        return cmmProfile;
+    }
+    return NULL;
 }
 
 /*
@@ -647,21 +680,52 @@
      * corresponding classes to avoid problems with invalidating ids by class
      * unloading
      */
-    Trans_profileIDs_fID = (*env)->GetFieldID (env, Trans, "profileIDs", "[J");
     Trans_renderType_fID = (*env)->GetFieldID (env, Trans, "renderType", "I");
+    if (Trans_renderType_fID == NULL) {
+        return;
+    }
     Trans_ID_fID = (*env)->GetFieldID (env, Trans, "ID", "J");
+    if (Trans_ID_fID == NULL) {
+        return;
+    }
 
     IL_isIntPacked_fID = (*env)->GetFieldID (env, IL, "isIntPacked", "Z");
+    if (IL_isIntPacked_fID == NULL) {
+        return;
+    }
     IL_dataType_fID = (*env)->GetFieldID (env, IL, "dataType", "I");
+    if (IL_dataType_fID == NULL) {
+        return;
+    }
     IL_pixelType_fID = (*env)->GetFieldID (env, IL, "pixelType", "I");
+    if (IL_pixelType_fID == NULL) {
+        return;
+    }
     IL_dataArray_fID = (*env)->GetFieldID(env, IL, "dataArray",
                                           "Ljava/lang/Object;");
+    if (IL_dataArray_fID == NULL) {
+        return;
+    }
     IL_width_fID = (*env)->GetFieldID (env, IL, "width", "I");
+    if (IL_width_fID == NULL) {
+        return;
+    }
     IL_height_fID = (*env)->GetFieldID (env, IL, "height", "I");
+    if (IL_height_fID == NULL) {
+        return;
+    }
     IL_offset_fID = (*env)->GetFieldID (env, IL, "offset", "I");
+    if (IL_offset_fID == NULL) {
+        return;
+    }
+    IL_imageAtOnce_fID = (*env)->GetFieldID (env, IL, "imageAtOnce", "Z");
+    if (IL_imageAtOnce_fID == NULL) {
+        return;
+    }
     IL_nextRowOffset_fID = (*env)->GetFieldID (env, IL, "nextRowOffset", "I");
-
-    PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J");
+    if (IL_nextRowOffset_fID == NULL) {
+        return;
+    }
 }
 
 static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
@@ -672,7 +736,7 @@
 
   if (!cmsSaveProfileToMem(pf, NULL, &pfSize) ||
       pfSize < sizeof(cmsICCHeader) ||
-      bufferSize < sizeof(cmsICCHeader))
+      bufferSize < (jint)sizeof(cmsICCHeader))
   {
     return FALSE;
   }
@@ -693,9 +757,9 @@
 
 static cmsBool _setHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
 {
-  cmsICCHeader pfHeader = { 0 };
+  cmsICCHeader pfHeader;
 
-  if (pBuffer == NULL || bufferSize < sizeof(cmsICCHeader)) {
+  if (pBuffer == NULL || bufferSize < (jint)sizeof(cmsICCHeader)) {
     return FALSE;
   }
 
@@ -716,76 +780,115 @@
   return TRUE;
 }
 
-static cmsBool _writeCookedTag(cmsHPROFILE pfTarget,
-                               cmsTagSignature sig,
+/* Returns new profile handler, if it was created successfully,
+   NULL otherwise.
+   */
+static cmsHPROFILE _writeCookedTag(const cmsHPROFILE pfTarget,
+                               const cmsTagSignature sig,
                                jbyte *pData, jint size)
 {
-    cmsBool status;
     cmsUInt32Number pfSize = 0;
-    cmsUInt8Number* pfBuffer = NULL;
+    const cmsInt32Number tagCount = cmsGetTagCount(pfTarget);
+    cmsInt32Number i;
+    cmsHPROFILE pfSanity = NULL;
+
+    cmsICCHeader hdr;
 
     cmsHPROFILE p = cmsCreateProfilePlaceholder(NULL);
-    if (NULL != p) {
-        cmsICCHeader hdr = { 0 };
+
+    if (NULL == p) {
+        return NULL;
+    }
+    memset(&hdr, 0, sizeof(cmsICCHeader));
 
-        /* Populate the placeholder's header according to target profile */
-        hdr.flags = cmsGetHeaderFlags(pfTarget);
-        hdr.renderingIntent = cmsGetHeaderRenderingIntent(pfTarget);
-        hdr.manufacturer = cmsGetHeaderManufacturer(pfTarget);
-        hdr.model = cmsGetHeaderModel(pfTarget);
-        hdr.pcs = cmsGetPCS(pfTarget);
-        hdr.colorSpace = cmsGetColorSpace(pfTarget);
-        hdr.deviceClass = cmsGetDeviceClass(pfTarget);
-        hdr.version = cmsGetEncodedICCversion(pfTarget);
-        cmsGetHeaderAttributes(pfTarget, &hdr.attributes);
-        cmsGetHeaderProfileID(pfTarget, (cmsUInt8Number*)&hdr.profileID);
+    // Populate the placeholder's header according to target profile
+    hdr.flags = cmsGetHeaderFlags(pfTarget);
+    hdr.renderingIntent = cmsGetHeaderRenderingIntent(pfTarget);
+    hdr.manufacturer = cmsGetHeaderManufacturer(pfTarget);
+    hdr.model = cmsGetHeaderModel(pfTarget);
+    hdr.pcs = cmsGetPCS(pfTarget);
+    hdr.colorSpace = cmsGetColorSpace(pfTarget);
+    hdr.deviceClass = cmsGetDeviceClass(pfTarget);
+    hdr.version = cmsGetEncodedICCversion(pfTarget);
+    cmsGetHeaderAttributes(pfTarget, &hdr.attributes);
+    cmsGetHeaderProfileID(pfTarget, (cmsUInt8Number*)&hdr.profileID);
 
-        cmsSetHeaderFlags(p, hdr.flags);
-        cmsSetHeaderManufacturer(p, hdr.manufacturer);
-        cmsSetHeaderModel(p, hdr.model);
-        cmsSetHeaderAttributes(p, hdr.attributes);
-        cmsSetHeaderProfileID(p, (cmsUInt8Number*)&(hdr.profileID));
-        cmsSetHeaderRenderingIntent(p, hdr.renderingIntent);
-        cmsSetPCS(p, hdr.pcs);
-        cmsSetColorSpace(p, hdr.colorSpace);
-        cmsSetDeviceClass(p, hdr.deviceClass);
-        cmsSetEncodedICCversion(p, hdr.version);
+    cmsSetHeaderFlags(p, hdr.flags);
+    cmsSetHeaderManufacturer(p, hdr.manufacturer);
+    cmsSetHeaderModel(p, hdr.model);
+    cmsSetHeaderAttributes(p, hdr.attributes);
+    cmsSetHeaderProfileID(p, (cmsUInt8Number*)&(hdr.profileID));
+    cmsSetHeaderRenderingIntent(p, hdr.renderingIntent);
+    cmsSetPCS(p, hdr.pcs);
+    cmsSetColorSpace(p, hdr.colorSpace);
+    cmsSetDeviceClass(p, hdr.deviceClass);
+    cmsSetEncodedICCversion(p, hdr.version);
+
+    // now write the user supplied tag
+    if (size <= 0 || !cmsWriteRawTag(p, sig, pData, size)) {
+        cmsCloseProfile(p);
+        return NULL;
+    }
 
+    // copy tags from the original profile
+    for (i = 0; i < tagCount; i++) {
+        cmsBool isTagReady = FALSE;
+        const cmsTagSignature s = cmsGetTagSignature(pfTarget, i);
+        const cmsInt32Number tagSize = cmsReadRawTag(pfTarget, s, NULL, 0);
 
-        if (cmsWriteRawTag(p, sig, pData, size)) {
-            if (cmsSaveProfileToMem(p, NULL, &pfSize)) {
-                pfBuffer = malloc(pfSize);
-                if (pfBuffer != NULL) {
-                    /* load raw profile data into the buffer */
-                    if (!cmsSaveProfileToMem(p, pfBuffer, &pfSize)) {
-                        free(pfBuffer);
-                        pfBuffer = NULL;
-                    }
+        if (s == sig) {
+            // skip the user supplied tag
+            continue;
+        }
+
+        // read raw tag from the original profile
+        if (tagSize > 0) {
+            cmsUInt8Number* buf = (cmsUInt8Number*)malloc(tagSize);
+            if (buf != NULL) {
+                if (tagSize ==  cmsReadRawTag(pfTarget, s, buf, tagSize)) {
+                    // now we are ready to write the tag
+                    isTagReady = cmsWriteRawTag(p, s, buf, tagSize);
                 }
+                free(buf);
             }
         }
-        cmsCloseProfile(p);
+
+        if (!isTagReady) {
+            cmsCloseProfile(p);
+            return NULL;
+        }
     }
 
-    if (pfBuffer == NULL) {
-        return FALSE;
+    // now we have all tags moved to the new profile.
+    // do some sanity checks: write it to a memory buffer and read again.
+    if (cmsSaveProfileToMem(p, NULL, &pfSize)) {
+        void* buf = malloc(pfSize);
+        if (buf != NULL) {
+            // load raw profile data into the buffer
+            if (cmsSaveProfileToMem(p, buf, &pfSize)) {
+                pfSanity = cmsOpenProfileFromMem(buf, pfSize);
+            }
+            free(buf);
+        }
     }
 
-    /* re-open the placeholder profile */
-    p = cmsOpenProfileFromMem(pfBuffer, pfSize);
-    free(pfBuffer);
-    status = FALSE;
+    if (pfSanity == NULL) {
+        // for some reason, we failed to save and read the updated profile
+        // It likely indicates that the profile is not correct, so we report
+        // a failure here.
+        cmsCloseProfile(p);
+        p =  NULL;
+    } else {
+        // do final check whether we can read and handle the the target tag.
+        const void* pTag = cmsReadTag(pfSanity, sig);
+        if (pTag == NULL) {
+            // the tag can not be cooked
+            cmsCloseProfile(p);
+            p = NULL;
+        }
+        cmsCloseProfile(pfSanity);
+        pfSanity = NULL;
+    }
 
-    if (p != NULL) {
-        /* Note that pCookedTag points to internal structures of the placeholder,
-         * so this data is valid only while the placeholder is open.
-         */
-        void *pCookedTag = cmsReadTag(p, sig);
-        if (pCookedTag != NULL) {
-            status = cmsWriteTag(pfTarget, sig, pCookedTag);
-        }
-        pCookedTag = NULL;
-        cmsCloseProfile(p);
-    }
-    return status;
+    return p;
 }
--- a/src/share/native/sun/java2d/cmm/lcms/cmscgats.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmscgats.c	Tue Aug 22 02:03:52 2017 +0100
@@ -353,7 +353,7 @@
         "XYZ_X",          // X component of tristimulus data
         "XYZ_Y",          // Y component of tristimulus data
         "XYZ_Z",          // Z component of tristimulus data
-        "XYY_X"           // x component of chromaticity data
+        "XYY_X",          // x component of chromaticity data
         "XYY_Y",          // y component of chromaticity data
         "XYY_CAPY",       // Y component of tristimulus data
         "LAB_L",          // L* component of Lab data
--- a/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c	Tue Aug 22 02:03:52 2017 +0100
@@ -298,6 +298,8 @@
 {
     cmsMAT3 Scale, m1, m2, m3, m4;
 
+    // TODO: Follow Marc Mahy's recommendation to check if CHAD is same by using M1*M2 == M2*M1. If so, do nothing.
+
     // Adaptation state
     if (AdaptationState == 1.0) {
 
@@ -559,7 +561,7 @@
     cmsHPROFILE hProfile;
     cmsMAT3 m;
     cmsVEC3 off;
-    cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut, CurrentColorSpace;
+    cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut = cmsSigLabData, CurrentColorSpace;
     cmsProfileClassSignature ClassSig;
     cmsUInt32Number  i, Intent;
 
@@ -661,6 +663,22 @@
         CurrentColorSpace = ColorSpaceOut;
     }
 
+    // Check for non-negatives clip
+    if (dwFlags & cmsFLAGS_NONEGATIVES) {
+
+           if (ColorSpaceOut == cmsSigGrayData ||
+                  ColorSpaceOut == cmsSigRgbData ||
+                  ColorSpaceOut == cmsSigCmykData) {
+
+                  cmsStage* clip = _cmsStageClipNegatives(Result->ContextID, cmsChannelsOf(ColorSpaceOut));
+                  if (clip == NULL) goto Error;
+
+                  if (!cmsPipelineInsertStage(Result, cmsAT_END, clip))
+                         goto Error;
+           }
+
+    }
+
     return Result;
 
 Error:
@@ -1074,7 +1092,7 @@
         if (TheIntents[i] == INTENT_PERCEPTUAL || TheIntents[i] == INTENT_SATURATION) {
 
             // Force BPC for V4 profiles in perceptual and saturation
-            if (cmsGetProfileVersion(hProfiles[i]) >= 4.0)
+            if (cmsGetEncodedICCversion(hProfiles[i]) >= 0x4000000)
                 BPC[i] = TRUE;
         }
     }
--- a/src/share/native/sun/java2d/cmm/lcms/cmserr.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmserr.c	Tue Aug 22 02:03:52 2017 +0100
@@ -30,7 +30,7 @@
 //---------------------------------------------------------------------------------
 //
 //  Little Color Management System
-//  Copyright (c) 1998-2012 Marti Maria Saguer
+//  Copyright (c) 1998-2015 Marti Maria Saguer
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the "Software"),
@@ -54,6 +54,13 @@
 
 #include "lcms2_internal.h"
 
+
+// This function is here to help applications to prevent mixing lcms versions on header and shared objects.
+int CMSEXPORT cmsGetEncodedCMMversion(void)
+{
+       return LCMS_VERSION;
+}
+
 // I am so tired about incompatibilities on those functions that here are some replacements
 // that hopefully would be fully portable.
 
--- a/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c	Tue Aug 22 02:03:52 2017 +0100
@@ -958,7 +958,7 @@
 
                             Rest = c1 * rx + c2 * ry + c3 * rz;
 
-                            Tmp1[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));
+                            Tmp1[OutChan] = (cmsUInt16Number) ( c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)));
     }
 
 
@@ -1022,7 +1022,7 @@
 
                             Rest = c1 * rx + c2 * ry + c3 * rz;
 
-                            Tmp2[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));
+                            Tmp2[OutChan] = (cmsUInt16Number) (c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)));
     }
 
 
--- a/src/share/native/sun/java2d/cmm/lcms/cmsio0.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmsio0.c	Tue Aug 22 02:03:52 2017 +0100
@@ -482,6 +482,14 @@
 
 // -------------------------------------------------------------------------------------------------------
 
+cmsIOHANDLER* CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile)
+{
+        _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile;
+
+        if (Icc == NULL) return NULL;
+        return Icc->IOhandler;
+}
+
 // Creates an empty structure holding all required parameters
 cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID)
 {
@@ -651,25 +659,26 @@
        return _cmsSearchTag(Icc, sig, FALSE) >= 0;
 }
 
-/*
- * Enforces that the profile version is per. spec.
- * Operates on the big endian bytes from the profile.
- * Called before converting to platform endianness.
- * Byte 0 is BCD major version, so max 9.
- * Byte 1 is 2 BCD digits, one per nibble.
- * Reserved bytes 2 & 3 must be 0.
- */
-static cmsUInt32Number _validatedVersion(cmsUInt32Number DWord)
+
+
+// Enforces that the profile version is per. spec.
+// Operates on the big endian bytes from the profile.
+// Called before converting to platform endianness.
+// Byte 0 is BCD major version, so max 9.
+// Byte 1 is 2 BCD digits, one per nibble.
+// Reserved bytes 2 & 3 must be 0.
+static
+cmsUInt32Number _validatedVersion(cmsUInt32Number DWord)
 {
-    cmsUInt8Number* pByte = (cmsUInt8Number*)&DWord;
+    cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord;
     cmsUInt8Number temp1;
     cmsUInt8Number temp2;
 
-    if (*pByte > 0x09) *pByte = (cmsUInt8Number)9;
+    if (*pByte > 0x09) *pByte = (cmsUInt8Number) 0x09;
     temp1 = *(pByte+1) & 0xf0;
     temp2 = *(pByte+1) & 0x0f;
     if (temp1 > 0x90) temp1 = 0x90;
-    if (temp2 > 9) temp2 = 0x09;
+    if (temp2 > 0x09) temp2 = 0x09;
     *(pByte+1) = (cmsUInt8Number)(temp1 | temp2);
     *(pByte+2) = (cmsUInt8Number)0;
     *(pByte+3) = (cmsUInt8Number)0;
@@ -1167,33 +1176,7 @@
     return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
 }
 
-static
-cmsBool SanityCheck(_cmsICCPROFILE* profile)
-{
-    cmsIOHANDLER* io;
 
-    if (!profile) {
-        return FALSE;
-    }
-
-    io = profile->IOhandler;
-    if (!io) {
-        return FALSE;
-    }
-
-    if (!io->Seek ||
-        !(io->Seek==NULLSeek || io->Seek==MemorySeek || io->Seek==FileSeek))
-    {
-        return FALSE;
-    }
-    if (!io->Read ||
-        !(io->Read==NULLRead || io->Read==MemoryRead || io->Read==FileRead))
-    {
-        return FALSE;
-    }
-
-    return TRUE;
-}
 
 // Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig
 static
@@ -1225,7 +1208,7 @@
 
             // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.
             // In this case a blind copy of the block data is performed
-            if (SanityCheck(FileOrig) && Icc -> TagOffsets[i]) {
+            if (FileOrig != NULL && Icc -> TagOffsets[i]) {
 
                 cmsUInt32Number TagSize   = FileOrig -> TagSizes[i];
                 cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];
@@ -1881,7 +1864,7 @@
 
 // Similar to the anterior. This function allows to write directly to the ICC profile any data, without
 // checking anything. As a rule, mixing Raw with cooked doesn't work, so writting a tag as raw and then reading
-// it as cooked without serializing does result into an error. If that is wha you want, you will need to dump
+// it as cooked without serializing does result into an error. If that is what you want, you will need to dump
 // the profile to memry or disk and then reopen it.
 cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size)
 {
@@ -1905,6 +1888,11 @@
     Icc ->TagSizes[i] = Size;
 
     _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+
+    if (Icc->TagPtrs[i] == NULL) {
+           Icc->TagNames[i] = 0;
+           return FALSE;
+    }
     return TRUE;
 }
 
--- a/src/share/native/sun/java2d/cmm/lcms/cmsio1.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmsio1.c	Tue Aug 22 02:03:52 2017 +0100
@@ -339,8 +339,8 @@
 cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
 {
     cmsTagTypeSignature OriginalType;
-    cmsTagSignature tag16    = Device2PCS16[Intent];
-    cmsTagSignature tagFloat = Device2PCSFloat[Intent];
+    cmsTagSignature tag16;
+    cmsTagSignature tagFloat;
     cmsContext ContextID = cmsGetProfileContextID(hProfile);
 
     // On named color, take the appropiate tag
@@ -369,6 +369,9 @@
     // matter other LUT are present and have precedence. Intent = -1 means just this.
     if (Intent != -1) {
 
+        tag16 = Device2PCS16[Intent];
+        tagFloat = Device2PCSFloat[Intent];
+
         if (cmsIsTag(hProfile, tagFloat)) {  // Float tag takes precedence
 
             // Floating point LUT are always V4, but the encoding range is no
@@ -611,13 +614,16 @@
 cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
 {
     cmsTagTypeSignature OriginalType;
-    cmsTagSignature tag16    = PCS2Device16[Intent];
-    cmsTagSignature tagFloat = PCS2DeviceFloat[Intent];
-    cmsContext ContextID     = cmsGetProfileContextID(hProfile);
+    cmsTagSignature tag16;
+    cmsTagSignature tagFloat;
+    cmsContext ContextID  = cmsGetProfileContextID(hProfile);
 
 
     if (Intent != -1) {
 
+        tag16 = PCS2Device16[Intent];
+        tagFloat = PCS2DeviceFloat[Intent];
+
         if (cmsIsTag(hProfile, tagFloat)) {  // Float tag takes precedence
 
             // Floating point LUT are always V4
@@ -935,7 +941,7 @@
 {
     if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, seq)) return FALSE;
 
-    if (cmsGetProfileVersion(hProfile) >= 4.0) {
+    if (cmsGetEncodedICCversion(hProfile) >= 0x4000000) {
 
             if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, seq)) return FALSE;
     }
--- a/src/share/native/sun/java2d/cmm/lcms/cmslut.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmslut.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1154,7 +1154,23 @@
     return mpe;
 }
 
+// Clips values smaller than zero
+static
+void Clipper(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+       cmsUInt32Number i;
+       for (i = 0; i < mpe->InputChannels; i++) {
 
+              cmsFloat32Number n = In[i];
+              Out[i] = n < 0 ? 0 : n;
+       }
+}
+
+cmsStage*  _cmsStageClipNegatives(cmsContext ContextID, int nChannels)
+{
+       return _cmsStageAllocPlaceholder(ContextID, cmsSigClipNegativesElemType,
+              nChannels, nChannels, Clipper, NULL, NULL, NULL);
+}
 
 // ********************************************************************************
 // Type cmsSigXYZ2LabElemType
--- a/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c	Tue Aug 22 02:03:52 2017 +0100
@@ -543,8 +543,9 @@
     v ->nColors   = 0;
     v ->ContextID  = ContextID;
 
-    while (v -> Allocated < n)
-        GrowNamedColorList(v);
+    while (v -> Allocated < n){
+        if (!GrowNamedColorList(v)) return NULL;
+    }
 
     strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);
     strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);
@@ -573,8 +574,9 @@
     if (NewNC == NULL) return NULL;
 
     // For really large tables we need this
-    while (NewNC ->Allocated < v ->Allocated)
-        GrowNamedColorList(NewNC);
+    while (NewNC ->Allocated < v ->Allocated){
+        if (!GrowNamedColorList(NewNC)) return NULL;
+    }
 
     memmove(NewNC ->Prefix, v ->Prefix, sizeof(v ->Prefix));
     memmove(NewNC ->Suffix, v ->Suffix, sizeof(v ->Suffix));
--- a/src/share/native/sun/java2d/cmm/lcms/cmsopt.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmsopt.c	Tue Aug 22 02:03:52 2017 +0100
@@ -192,6 +192,90 @@
     return AnyOpt;
 }
 
+
+static
+cmsBool CloseEnoughFloat(cmsFloat64Number a, cmsFloat64Number b)
+{
+       return fabs(b - a) < 0.00001f;
+}
+
+static
+cmsBool  isFloatMatrixIdentity(const cmsMAT3* a)
+{
+       cmsMAT3 Identity;
+       int i, j;
+
+       _cmsMAT3identity(&Identity);
+
+       for (i = 0; i < 3; i++)
+              for (j = 0; j < 3; j++)
+                     if (!CloseEnoughFloat(a->v[i].n[j], Identity.v[i].n[j])) return FALSE;
+
+       return TRUE;
+}
+// if two adjacent matrices are found, multiply them.
+static
+cmsBool _MultiplyMatrix(cmsPipeline* Lut)
+{
+       cmsStage** pt1;
+       cmsStage** pt2;
+       cmsStage*  chain;
+       cmsBool AnyOpt = FALSE;
+
+       pt1 = &Lut->Elements;
+       if (*pt1 == NULL) return AnyOpt;
+
+       while (*pt1 != NULL) {
+
+              pt2 = &((*pt1)->Next);
+              if (*pt2 == NULL) return AnyOpt;
+
+              if ((*pt1)->Implements == cmsSigMatrixElemType && (*pt2)->Implements == cmsSigMatrixElemType) {
+
+                     // Get both matrices
+                     _cmsStageMatrixData* m1 = (_cmsStageMatrixData*) cmsStageData(*pt1);
+                     _cmsStageMatrixData* m2 = (_cmsStageMatrixData*) cmsStageData(*pt2);
+                     cmsMAT3 res;
+
+                     // Input offset and output offset should be zero to use this optimization
+                     if (m1->Offset != NULL || m2 ->Offset != NULL ||
+                            cmsStageInputChannels(*pt1) != 3 || cmsStageOutputChannels(*pt1) != 3 ||
+                            cmsStageInputChannels(*pt2) != 3 || cmsStageOutputChannels(*pt2) != 3)
+                            return FALSE;
+
+                     // Multiply both matrices to get the result
+                     _cmsMAT3per(&res, (cmsMAT3*)m2->Double, (cmsMAT3*)m1->Double);
+
+                     // Get the next in chain afer the matrices
+                     chain = (*pt2)->Next;
+
+                     // Remove both matrices
+                     _RemoveElement(pt2);
+                     _RemoveElement(pt1);
+
+                     // Now what if the result is a plain identity?
+                     if (!isFloatMatrixIdentity(&res)) {
+
+                            // We can not get rid of full matrix
+                            cmsStage* Multmat = cmsStageAllocMatrix(Lut->ContextID, 3, 3, (const cmsFloat64Number*) &res, NULL);
+
+                            // Recover the chain
+                            if (Multmat != NULL) {
+                            Multmat->Next = chain;
+                            }
+                            *pt1 = Multmat;
+                     }
+
+                     AnyOpt = TRUE;
+              }
+              else
+                     pt1 = &((*pt1)->Next);
+       }
+
+       return AnyOpt;
+}
+
+
 // Preoptimize just gets rif of no-ops coming paired. Conversion from v2 to v4 followed
 // by a v4 to v2 and vice-versa. The elements are then discarded.
 static
@@ -224,6 +308,9 @@
         // Remove float pcs Lab conversions
         Opt |= _Remove2Op(Lut, cmsSigXYZ2FloatPCS, cmsSigFloatPCS2XYZ);
 
+        // Simplify matrix.
+        Opt |= _MultiplyMatrix(Lut);
+
         if (Opt) AnyOpt = TRUE;
 
     } while (Opt);
@@ -280,12 +367,12 @@
 void* Prelin16dup(cmsContext ContextID, const void* ptr)
 {
     Prelin16Data* p16 = (Prelin16Data*) ptr;
-    Prelin16Data* Duped = _cmsDupMem(ContextID, p16, sizeof(Prelin16Data));
+    Prelin16Data* Duped = (Prelin16Data*) _cmsDupMem(ContextID, p16, sizeof(Prelin16Data));
 
     if (Duped == NULL) return NULL;
 
-    Duped ->EvalCurveOut16   = _cmsDupMem(ContextID, p16 ->EvalCurveOut16, p16 ->nOutputs * sizeof(_cmsInterpFn16));
-    Duped ->ParamsCurveOut16 = _cmsDupMem(ContextID, p16 ->ParamsCurveOut16, p16 ->nOutputs * sizeof(cmsInterpParams* ));
+    Duped->EvalCurveOut16 = (_cmsInterpFn16*) _cmsDupMem(ContextID, p16->EvalCurveOut16, p16->nOutputs * sizeof(_cmsInterpFn16));
+    Duped->ParamsCurveOut16 = (cmsInterpParams**)_cmsDupMem(ContextID, p16->ParamsCurveOut16, p16->nOutputs * sizeof(cmsInterpParams*));
 
     return Duped;
 }
@@ -298,7 +385,7 @@
                                int nOutputs, cmsToneCurve** Out )
 {
     int i;
-    Prelin16Data* p16 = _cmsMallocZero(ContextID, sizeof(Prelin16Data));
+    Prelin16Data* p16 = (Prelin16Data*)_cmsMallocZero(ContextID, sizeof(Prelin16Data));
     if (p16 == NULL) return NULL;
 
     p16 ->nInputs = nInputs;
@@ -787,7 +874,7 @@
     cmsS15Fixed16Number v1, v2, v3;
     Prelin8Data* p8;
 
-    p8 = _cmsMallocZero(ContextID, sizeof(Prelin8Data));
+    p8 = (Prelin8Data*)_cmsMallocZero(ContextID, sizeof(Prelin8Data));
     if (p8 == NULL) return NULL;
 
     // Since this only works for 8 bit input, values comes always as x * 257,
@@ -861,7 +948,7 @@
     Prelin8Data* p8 = (Prelin8Data*) D;
     register const cmsInterpParams* p = p8 ->p;
     int                    TotalOut = p -> nOutputs;
-    const cmsUInt16Number* LutTable = p -> Table;
+    const cmsUInt16Number* LutTable = (const cmsUInt16Number*) p->Table;
 
     r = Input[0] >> 8;
     g = Input[1] >> 8;
@@ -1180,15 +1267,15 @@
 static
 void* CurvesDup(cmsContext ContextID, const void* ptr)
 {
-    Curves16Data* Data = _cmsDupMem(ContextID, ptr, sizeof(Curves16Data));
+    Curves16Data* Data = (Curves16Data*)_cmsDupMem(ContextID, ptr, sizeof(Curves16Data));
     int i;
 
     if (Data == NULL) return NULL;
 
-    Data ->Curves = _cmsDupMem(ContextID, Data ->Curves, Data ->nCurves * sizeof(cmsUInt16Number*));
+    Data->Curves = (cmsUInt16Number**) _cmsDupMem(ContextID, Data->Curves, Data->nCurves * sizeof(cmsUInt16Number*));
 
     for (i=0; i < Data -> nCurves; i++) {
-        Data ->Curves[i] = _cmsDupMem(ContextID, Data ->Curves[i], Data -> nElements * sizeof(cmsUInt16Number));
+        Data->Curves[i] = (cmsUInt16Number*) _cmsDupMem(ContextID, Data->Curves[i], Data->nElements * sizeof(cmsUInt16Number));
     }
 
     return (void*) Data;
@@ -1201,18 +1288,18 @@
     int i, j;
     Curves16Data* c16;
 
-    c16 = _cmsMallocZero(ContextID, sizeof(Curves16Data));
+    c16 = (Curves16Data*)_cmsMallocZero(ContextID, sizeof(Curves16Data));
     if (c16 == NULL) return NULL;
 
     c16 ->nCurves = nCurves;
     c16 ->nElements = nElements;
 
-    c16 ->Curves = _cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*));
+    c16->Curves = (cmsUInt16Number**) _cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*));
     if (c16 ->Curves == NULL) return NULL;
 
     for (i=0; i < nCurves; i++) {
 
-        c16->Curves[i] = _cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number));
+        c16->Curves[i] = (cmsUInt16Number*) _cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number));
 
         if (c16->Curves[i] == NULL) {
 
@@ -1560,49 +1647,83 @@
 }
 
 //  8 bits on input allows matrix-shaper boot up to 25 Mpixels per second on RGB. That's fast!
-// TODO: Allow a third matrix for abs. colorimetric
 static
 cmsBool OptimizeMatrixShaper(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
 {
-    cmsStage* Curve1, *Curve2;
-    cmsStage* Matrix1, *Matrix2;
-    _cmsStageMatrixData* Data1;
-    _cmsStageMatrixData* Data2;
-    cmsMAT3 res;
-    cmsBool IdentityMat;
-    cmsPipeline* Dest, *Src;
+       cmsStage* Curve1, *Curve2;
+       cmsStage* Matrix1, *Matrix2;
+       cmsMAT3 res;
+       cmsBool IdentityMat;
+       cmsPipeline* Dest, *Src;
+       cmsFloat64Number* Offset;
+
+       // Only works on RGB to RGB
+       if (T_CHANNELS(*InputFormat) != 3 || T_CHANNELS(*OutputFormat) != 3) return FALSE;
+
+       // Only works on 8 bit input
+       if (!_cmsFormatterIs8bit(*InputFormat)) return FALSE;
+
+       // Seems suitable, proceed
+       Src = *Lut;
 
-    // Only works on RGB to RGB
-    if (T_CHANNELS(*InputFormat) != 3 || T_CHANNELS(*OutputFormat) != 3) return FALSE;
+       // Check for:
+       //
+       //    shaper-matrix-matrix-shaper
+       //    shaper-matrix-shaper
+       //
+       // Both of those constructs are possible (first because abs. colorimetric).
+       // additionally, In the first case, the input matrix offset should be zero.
 
-    // Only works on 8 bit input
-    if (!_cmsFormatterIs8bit(*InputFormat)) return FALSE;
+       IdentityMat = FALSE;
+       if (cmsPipelineCheckAndRetreiveStages(Src, 4,
+              cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,
+              &Curve1, &Matrix1, &Matrix2, &Curve2)) {
 
-    // Seems suitable, proceed
-    Src = *Lut;
+              // Get both matrices
+              _cmsStageMatrixData* Data1 = (_cmsStageMatrixData*)cmsStageData(Matrix1);
+              _cmsStageMatrixData* Data2 = (_cmsStageMatrixData*)cmsStageData(Matrix2);
+
+              // Input offset should be zero
+              if (Data1->Offset != NULL) return FALSE;
 
-    // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for
-    if (!cmsPipelineCheckAndRetreiveStages(Src, 4,
-        cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,
-        &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE;
+              // Multiply both matrices to get the result
+              _cmsMAT3per(&res, (cmsMAT3*)Data2->Double, (cmsMAT3*)Data1->Double);
+
+              // Only 2nd matrix has offset, or it is zero
+              Offset = Data2->Offset;
 
-    // Get both matrices
-    Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1);
-    Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2);
+              // Now the result is in res + Data2 -> Offset. Maybe is a plain identity?
+              if (_cmsMAT3isIdentity(&res) && Offset == NULL) {
+
+                     // We can get rid of full matrix
+                     IdentityMat = TRUE;
+              }
+
+       }
+       else {
 
-    // Input offset should be zero
-    if (Data1 ->Offset != NULL) return FALSE;
+              if (cmsPipelineCheckAndRetreiveStages(Src, 3,
+                     cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,
+                     &Curve1, &Matrix1, &Curve2)) {
 
-    // Multiply both matrices to get the result
-    _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double);
+                     _cmsStageMatrixData* Data = (_cmsStageMatrixData*)cmsStageData(Matrix1);
+
+                     // Copy the matrix to our result
+                     memcpy(&res, Data->Double, sizeof(res));
 
-    // Now the result is in res + Data2 -> Offset. Maybe is a plain identity?
-    IdentityMat = FALSE;
-    if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) {
+                     // Preserve the Odffset (may be NULL as a zero offset)
+                     Offset = Data->Offset;
+
+                     if (_cmsMAT3isIdentity(&res) && Offset == NULL) {
 
-        // We can get rid of full matrix
-        IdentityMat = TRUE;
-    }
+                            // We can get rid of full matrix
+                            IdentityMat = TRUE;
+                     }
+              }
+              else
+                     return FALSE; // Not optimizeable this time
+
+       }
 
       // Allocate an empty LUT
     Dest =  cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);
@@ -1612,9 +1733,12 @@
     if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)))
         goto Error;
 
-    if (!IdentityMat)
-        if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)))
-            goto Error;
+    if (!IdentityMat) {
+
+           if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest->ContextID, 3, 3, (const cmsFloat64Number*)&res, Offset)))
+                  goto Error;
+    }
+
     if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)))
         goto Error;
 
@@ -1632,7 +1756,7 @@
         *dwFlags |= cmsFLAGS_NOCACHE;
 
         // Setup the optimizarion routines
-        SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves, OutputFormat);
+        SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Offset, mpeC2->TheCurves, OutputFormat);
     }
 
     cmsPipelineFree(Src);
--- a/src/share/native/sun/java2d/cmm/lcms/cmspack.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmspack.c	Tue Aug 22 02:03:52 2017 +0100
@@ -2438,9 +2438,6 @@
             ((cmsFloat64Number*) output)[i + start] = v;
     }
 
-    if (!ExtraFirst) {
-        output += Extra * sizeof(cmsFloat64Number);
-    }
 
     if (Extra == 0 && SwapFirst) {
 
@@ -2451,7 +2448,7 @@
     if (T_PLANAR(info -> OutputFormat))
         return output + sizeof(cmsFloat64Number);
     else
-        return output + nChan * sizeof(cmsFloat64Number);
+        return output + (nChan + Extra) * sizeof(cmsFloat64Number);
 
 }
 
@@ -2462,50 +2459,47 @@
                                 register cmsUInt8Number* output,
                                 register cmsUInt32Number Stride)
 {
-    int nChan      = T_CHANNELS(info -> OutputFormat);
-    int DoSwap     = T_DOSWAP(info ->OutputFormat);
-    int Reverse    = T_FLAVOR(info ->OutputFormat);
-    int Extra      = T_EXTRA(info -> OutputFormat);
-    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
-    int Planar     = T_PLANAR(info -> OutputFormat);
-    int ExtraFirst = DoSwap ^ SwapFirst;
-    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0;
-    cmsFloat64Number v = 0;
-    cmsFloat32Number* swap1 = (cmsFloat32Number*) output;
-    int i, start = 0;
-
-    if (ExtraFirst)
-        start = Extra;
-
-    for (i=0; i < nChan; i++) {
-
-        int index = DoSwap ? (nChan - i - 1) : i;
-
-        v = (cmsFloat64Number) wOut[index] / maximum;
-
-        if (Reverse)
-            v = maximum - v;
-
-        if (Planar)
-            ((cmsFloat32Number*) output)[(i + start ) * Stride]= (cmsFloat32Number) v;
-        else
-            ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v;
-    }
-
-    if (!ExtraFirst) {
-        output += Extra * sizeof(cmsFloat32Number);
-    }
-
-  if (Extra == 0 && SwapFirst) {
-
-         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number));
-        *swap1 = (cmsFloat32Number) v;
-    }
-
-    if (T_PLANAR(info -> OutputFormat))
-        return output + sizeof(cmsFloat32Number);
-    else
-        return output + nChan * sizeof(cmsFloat32Number);
+       int nChan = T_CHANNELS(info->OutputFormat);
+       int DoSwap = T_DOSWAP(info->OutputFormat);
+       int Reverse = T_FLAVOR(info->OutputFormat);
+       int Extra = T_EXTRA(info->OutputFormat);
+       int SwapFirst = T_SWAPFIRST(info->OutputFormat);
+       int Planar = T_PLANAR(info->OutputFormat);
+       int ExtraFirst = DoSwap ^ SwapFirst;
+       cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 655.35 : 65535.0;
+       cmsFloat64Number v = 0;
+       cmsFloat32Number* swap1 = (cmsFloat32Number*)output;
+       int i, start = 0;
+
+       if (ExtraFirst)
+              start = Extra;
+
+       for (i = 0; i < nChan; i++) {
+
+              int index = DoSwap ? (nChan - i - 1) : i;
+
+              v = (cmsFloat64Number)wOut[index] / maximum;
+
+              if (Reverse)
+                     v = maximum - v;
+
+              if (Planar)
+                     ((cmsFloat32Number*)output)[(i + start) * Stride] = (cmsFloat32Number)v;
+              else
+                     ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v;
+       }
+
+
+       if (Extra == 0 && SwapFirst) {
+
+              memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat32Number));
+              *swap1 = (cmsFloat32Number)v;
+       }
+
+       if (T_PLANAR(info->OutputFormat))
+              return output + sizeof(cmsFloat32Number);
+       else
+              return output + (nChan + Extra) * sizeof(cmsFloat32Number);
 }
 
 
@@ -2518,50 +2512,47 @@
                                     cmsUInt8Number* output,
                                     cmsUInt32Number Stride)
 {
-    int nChan      = T_CHANNELS(info -> OutputFormat);
-    int DoSwap     = T_DOSWAP(info ->OutputFormat);
-    int Reverse    = T_FLAVOR(info ->OutputFormat);
-    int Extra      = T_EXTRA(info -> OutputFormat);
-    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
-    int Planar     = T_PLANAR(info -> OutputFormat);
-    int ExtraFirst = DoSwap ^ SwapFirst;
-    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0;
-    cmsFloat32Number* swap1 = (cmsFloat32Number*) output;
-    cmsFloat64Number v = 0;
-    int i, start = 0;
-
-    if (ExtraFirst)
-        start = Extra;
-
-    for (i=0; i < nChan; i++) {
-
-        int index = DoSwap ? (nChan - i - 1) : i;
-
-        v = wOut[index] * maximum;
-
-        if (Reverse)
-            v = maximum - v;
-
-        if (Planar)
-            ((cmsFloat32Number*) output)[(i + start)* Stride]= (cmsFloat32Number) v;
-        else
-            ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v;
-    }
-
-    if (!ExtraFirst) {
-        output += Extra * sizeof(cmsFloat32Number);
-    }
-
-   if (Extra == 0 && SwapFirst) {
-
-         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number));
-        *swap1 = (cmsFloat32Number) v;
-    }
-
-    if (T_PLANAR(info -> OutputFormat))
-        return output + sizeof(cmsFloat32Number);
-    else
-        return output + nChan * sizeof(cmsFloat32Number);
+       int nChan = T_CHANNELS(info->OutputFormat);
+       int DoSwap = T_DOSWAP(info->OutputFormat);
+       int Reverse = T_FLAVOR(info->OutputFormat);
+       int Extra = T_EXTRA(info->OutputFormat);
+       int SwapFirst = T_SWAPFIRST(info->OutputFormat);
+       int Planar = T_PLANAR(info->OutputFormat);
+       int ExtraFirst = DoSwap ^ SwapFirst;
+       cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 100.0 : 1.0;
+       cmsFloat32Number* swap1 = (cmsFloat32Number*)output;
+       cmsFloat64Number v = 0;
+       int i, start = 0;
+
+       if (ExtraFirst)
+              start = Extra;
+
+       for (i = 0; i < nChan; i++) {
+
+              int index = DoSwap ? (nChan - i - 1) : i;
+
+              v = wOut[index] * maximum;
+
+              if (Reverse)
+                     v = maximum - v;
+
+              if (Planar)
+                     ((cmsFloat32Number*)output)[(i + start)* Stride] = (cmsFloat32Number)v;
+              else
+                     ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v;
+       }
+
+
+       if (Extra == 0 && SwapFirst) {
+
+              memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat32Number));
+              *swap1 = (cmsFloat32Number)v;
+       }
+
+       if (T_PLANAR(info->OutputFormat))
+              return output + sizeof(cmsFloat32Number);
+       else
+              return output + (nChan + Extra) * sizeof(cmsFloat32Number);
 }
 
 static
@@ -2570,51 +2561,47 @@
                                     cmsUInt8Number* output,
                                     cmsUInt32Number Stride)
 {
-    int nChan      = T_CHANNELS(info -> OutputFormat);
-    int DoSwap     = T_DOSWAP(info ->OutputFormat);
-    int Reverse    = T_FLAVOR(info ->OutputFormat);
-    int Extra      = T_EXTRA(info -> OutputFormat);
-    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
-    int Planar     = T_PLANAR(info -> OutputFormat);
-    int ExtraFirst = DoSwap ^ SwapFirst;
-    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0;
-    cmsFloat64Number v = 0;
-    cmsFloat64Number* swap1 = (cmsFloat64Number*) output;
-    int i, start = 0;
-
-    if (ExtraFirst)
-        start = Extra;
-
-    for (i=0; i < nChan; i++) {
-
-        int index = DoSwap ? (nChan - i - 1) : i;
-
-        v = wOut[index] * maximum;
-
-        if (Reverse)
-            v = maximum - v;
-
-        if (Planar)
-            ((cmsFloat64Number*) output)[(i + start) * Stride] =  v;
-        else
-            ((cmsFloat64Number*) output)[i + start] =  v;
-    }
-
-    if (!ExtraFirst) {
-        output += Extra * sizeof(cmsFloat64Number);
-    }
-
-   if (Extra == 0 && SwapFirst) {
-
-         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number));
-        *swap1 = v;
-    }
-
-
-    if (T_PLANAR(info -> OutputFormat))
-        return output + sizeof(cmsFloat64Number);
-    else
-        return output + nChan * sizeof(cmsFloat64Number);
+       int nChan = T_CHANNELS(info->OutputFormat);
+       int DoSwap = T_DOSWAP(info->OutputFormat);
+       int Reverse = T_FLAVOR(info->OutputFormat);
+       int Extra = T_EXTRA(info->OutputFormat);
+       int SwapFirst = T_SWAPFIRST(info->OutputFormat);
+       int Planar = T_PLANAR(info->OutputFormat);
+       int ExtraFirst = DoSwap ^ SwapFirst;
+       cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 100.0 : 1.0;
+       cmsFloat64Number v = 0;
+       cmsFloat64Number* swap1 = (cmsFloat64Number*)output;
+       int i, start = 0;
+
+       if (ExtraFirst)
+              start = Extra;
+
+       for (i = 0; i < nChan; i++) {
+
+              int index = DoSwap ? (nChan - i - 1) : i;
+
+              v = wOut[index] * maximum;
+
+              if (Reverse)
+                     v = maximum - v;
+
+              if (Planar)
+                     ((cmsFloat64Number*)output)[(i + start) * Stride] = v;
+              else
+                     ((cmsFloat64Number*)output)[i + start] = v;
+       }
+
+       if (Extra == 0 && SwapFirst) {
+
+              memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat64Number));
+              *swap1 = v;
+       }
+
+
+       if (T_PLANAR(info->OutputFormat))
+              return output + sizeof(cmsFloat64Number);
+       else
+              return output + (nChan + Extra) * sizeof(cmsFloat64Number);
 
 }
 
@@ -2850,50 +2837,47 @@
                                 register cmsUInt8Number* output,
                                 register cmsUInt32Number Stride)
 {
-    int nChan      = T_CHANNELS(info -> OutputFormat);
-    int DoSwap     = T_DOSWAP(info ->OutputFormat);
-    int Reverse    = T_FLAVOR(info ->OutputFormat);
-    int Extra      = T_EXTRA(info -> OutputFormat);
-    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
-    int Planar     = T_PLANAR(info -> OutputFormat);
-    int ExtraFirst = DoSwap ^ SwapFirst;
-    cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35F : 65535.0F;
-    cmsFloat32Number v = 0;
-    cmsUInt16Number* swap1 = (cmsUInt16Number*) output;
-    int i, start = 0;
-
-    if (ExtraFirst)
-        start = Extra;
-
-    for (i=0; i < nChan; i++) {
-
-        int index = DoSwap ? (nChan - i - 1) : i;
-
-        v = (cmsFloat32Number) wOut[index] / maximum;
-
-        if (Reverse)
-            v = maximum - v;
-
-        if (Planar)
-            ((cmsUInt16Number*) output)[(i + start ) * Stride]= _cmsFloat2Half(v);
-        else
-            ((cmsUInt16Number*) output)[i + start] =  _cmsFloat2Half(v);
-    }
-
-    if (!ExtraFirst) {
-        output += Extra * sizeof(cmsUInt16Number);
-    }
-
-  if (Extra == 0 && SwapFirst) {
-
-         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
-        *swap1 = _cmsFloat2Half(v);
-    }
-
-    if (T_PLANAR(info -> OutputFormat))
-        return output + sizeof(cmsUInt16Number);
-    else
-        return output + nChan * sizeof(cmsUInt16Number);
+       int nChan = T_CHANNELS(info->OutputFormat);
+       int DoSwap = T_DOSWAP(info->OutputFormat);
+       int Reverse = T_FLAVOR(info->OutputFormat);
+       int Extra = T_EXTRA(info->OutputFormat);
+       int SwapFirst = T_SWAPFIRST(info->OutputFormat);
+       int Planar = T_PLANAR(info->OutputFormat);
+       int ExtraFirst = DoSwap ^ SwapFirst;
+       cmsFloat32Number maximum = IsInkSpace(info->OutputFormat) ? 655.35F : 65535.0F;
+       cmsFloat32Number v = 0;
+       cmsUInt16Number* swap1 = (cmsUInt16Number*)output;
+       int i, start = 0;
+
+       if (ExtraFirst)
+              start = Extra;
+
+       for (i = 0; i < nChan; i++) {
+
+              int index = DoSwap ? (nChan - i - 1) : i;
+
+              v = (cmsFloat32Number)wOut[index] / maximum;
+
+              if (Reverse)
+                     v = maximum - v;
+
+              if (Planar)
+                     ((cmsUInt16Number*)output)[(i + start) * Stride] = _cmsFloat2Half(v);
+              else
+                     ((cmsUInt16Number*)output)[i + start] = _cmsFloat2Half(v);
+       }
+
+
+       if (Extra == 0 && SwapFirst) {
+
+              memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsUInt16Number));
+              *swap1 = _cmsFloat2Half(v);
+       }
+
+       if (T_PLANAR(info->OutputFormat))
+              return output + sizeof(cmsUInt16Number);
+       else
+              return output + (nChan + Extra) * sizeof(cmsUInt16Number);
 }
 
 
@@ -2904,50 +2888,47 @@
                                     cmsUInt8Number* output,
                                     cmsUInt32Number Stride)
 {
-    int nChan      = T_CHANNELS(info -> OutputFormat);
-    int DoSwap     = T_DOSWAP(info ->OutputFormat);
-    int Reverse    = T_FLAVOR(info ->OutputFormat);
-    int Extra      = T_EXTRA(info -> OutputFormat);
-    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
-    int Planar     = T_PLANAR(info -> OutputFormat);
-    int ExtraFirst = DoSwap ^ SwapFirst;
-    cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0F : 1.0F;
-    cmsUInt16Number* swap1 = (cmsUInt16Number*) output;
-    cmsFloat32Number v = 0;
-    int i, start = 0;
-
-    if (ExtraFirst)
-        start = Extra;
-
-    for (i=0; i < nChan; i++) {
-
-        int index = DoSwap ? (nChan - i - 1) : i;
-
-        v = wOut[index] * maximum;
-
-        if (Reverse)
-            v = maximum - v;
-
-        if (Planar)
-            ((cmsUInt16Number*) output)[(i + start)* Stride]= _cmsFloat2Half( v );
-        else
-            ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half( v );
-    }
-
-    if (!ExtraFirst) {
-        output += Extra * sizeof(cmsUInt16Number);
-    }
-
-   if (Extra == 0 && SwapFirst) {
-
-         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
-        *swap1 = (cmsUInt16Number)  _cmsFloat2Half( v );
-    }
-
-    if (T_PLANAR(info -> OutputFormat))
-        return output + sizeof(cmsUInt16Number);
-    else
-        return output + nChan * sizeof(cmsUInt16Number);
+       int nChan = T_CHANNELS(info->OutputFormat);
+       int DoSwap = T_DOSWAP(info->OutputFormat);
+       int Reverse = T_FLAVOR(info->OutputFormat);
+       int Extra = T_EXTRA(info->OutputFormat);
+       int SwapFirst = T_SWAPFIRST(info->OutputFormat);
+       int Planar = T_PLANAR(info->OutputFormat);
+       int ExtraFirst = DoSwap ^ SwapFirst;
+       cmsFloat32Number maximum = IsInkSpace(info->OutputFormat) ? 100.0F : 1.0F;
+       cmsUInt16Number* swap1 = (cmsUInt16Number*)output;
+       cmsFloat32Number v = 0;
+       int i, start = 0;
+
+       if (ExtraFirst)
+              start = Extra;
+
+       for (i = 0; i < nChan; i++) {
+
+              int index = DoSwap ? (nChan - i - 1) : i;
+
+              v = wOut[index] * maximum;
+
+              if (Reverse)
+                     v = maximum - v;
+
+              if (Planar)
+                     ((cmsUInt16Number*)output)[(i + start)* Stride] = _cmsFloat2Half(v);
+              else
+                     ((cmsUInt16Number*)output)[i + start] = _cmsFloat2Half(v);
+       }
+
+
+       if (Extra == 0 && SwapFirst) {
+
+              memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsUInt16Number));
+              *swap1 = (cmsUInt16Number)_cmsFloat2Half(v);
+       }
+
+       if (T_PLANAR(info->OutputFormat))
+              return output + sizeof(cmsUInt16Number);
+       else
+              return output + (nChan + Extra)* sizeof(cmsUInt16Number);
 }
 
 #endif
--- a/src/share/native/sun/java2d/cmm/lcms/cmspcs.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmspcs.c	Tue Aug 22 02:03:52 2017 +0100
@@ -135,6 +135,15 @@
     Dest -> Z = ((1 - Source -> x - Source -> y) / Source -> y) * Source -> Y;
 }
 
+/*
+       The break point (24/116)^3 = (6/29)^3 is a very small amount of tristimulus
+       primary (0.008856).  Generally, this only happens for
+       nearly ideal blacks and for some orange / amber colors in transmission mode.
+       For example, the Z value of the orange turn indicator lamp lens on an
+       automobile will often be below this value.  But the Z does not
+       contribute to the perceived color directly.
+*/
+
 static
 cmsFloat64Number f(cmsFloat64Number t)
 {
--- a/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c	Tue Aug 22 02:03:52 2017 +0100
@@ -712,15 +712,21 @@
 
 
 // Internal: get the memory area associanted with each context client
-// Returns the block assigned to the specific zone.
+// Returns the block assigned to the specific zone. Never return NULL.
 void* _cmsContextGetClientChunk(cmsContext ContextID, _cmsMemoryClient mc)
 {
     struct _cmsContext_struct* ctx;
     void *ptr;
 
-    if (mc < 0 || mc >= MemoryClientMax) {
-        cmsSignalError(ContextID, cmsERROR_RANGE, "Bad context client");
-        return NULL;
+    if ((int) mc < 0 || mc >= MemoryClientMax) {
+
+           cmsSignalError(ContextID, cmsERROR_INTERNAL, "Bad context client -- possible corruption");
+
+           // This is catastrophic. Should never reach here
+           _cmsAssert(0);
+
+           // Reverts to global context
+           return globalContext.chunks[UserPtr];
     }
 
     ctx = _cmsGetContext(ContextID);
@@ -909,7 +915,7 @@
 }
 
 
-
+/*
 static
 struct _cmsContext_struct* FindPrev(struct _cmsContext_struct* id)
 {
@@ -926,6 +932,7 @@
 
     return NULL;  // List is empty or only one element!
 }
+*/
 
 // Frees any resources associated with the given context,
 // and destroys the context placeholder.
@@ -961,8 +968,8 @@
 
             // Search for previous
             for (prev = _cmsContextPoolHead;
-                prev != NULL;
-                prev = prev ->Next)
+                 prev != NULL;
+                 prev = prev ->Next)
             {
                 if (prev -> Next == ctx) {
                     prev -> Next = ctx ->Next;
--- a/src/share/native/sun/java2d/cmm/lcms/cmssamp.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmssamp.c	Tue Aug 22 02:03:52 2017 +0100
@@ -30,7 +30,7 @@
 //---------------------------------------------------------------------------------
 //
 //  Little Color Management System
-//  Copyright (c) 1998-2010 Marti Maria Saguer
+//  Copyright (c) 1998-2014 Marti Maria Saguer
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the "Software"),
@@ -369,28 +369,7 @@
 
 }
 
-/*
-static
-cmsBool IsMonotonic(int n, const cmsFloat64Number Table[])
-{
-    int i;
-    cmsFloat64Number last;
 
-    last = Table[n-1];
-
-    for (i = n-2; i >= 0; --i) {
-
-        if (Table[i] > last)
-
-            return FALSE;
-        else
-            last = Table[i];
-
-    }
-
-    return TRUE;
-}
-*/
 
 // Calculates the black point of a destination profile.
 // This algorithm comes from the Adobe paper disclosing its black point compensation method.
@@ -515,7 +494,6 @@
 
 
     // Test for mid range straight (only on relative colorimetric)
-
     NearlyStraightMidrange = TRUE;
     MinL = outRamp[0]; MaxL = outRamp[255];
     if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
@@ -531,7 +509,6 @@
         // DestinationBlackPoint shall be the same as initialLab.
         // Otherwise, the DestinationBlackPoint shall be determined
         // using curve fitting.
-
         if (NearlyStraightMidrange) {
 
             cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
@@ -543,14 +520,12 @@
 
     // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point,
     // with a corner and a nearly straight line to the white point.
-
     for (l=0; l < 256; l++) {
 
         yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL);
     }
 
     // find the black point using the least squares error quadratic curve fitting
-
     if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
         lo = 0.1;
         hi = 0.5;
--- a/src/share/native/sun/java2d/cmm/lcms/cmstypes.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmstypes.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1484,6 +1484,7 @@
 
         // Check for overflow
         if (Offset < (SizeOfHeader + 8)) goto Error;
+        if ((Offset + Len) > SizeOfTag + 8) goto Error;
 
         // True begin of the string
         BeginOfThisString = Offset - SizeOfHeader - 8;
@@ -1718,10 +1719,7 @@
                 else
                     for (j=0; j < 256; j++) {
 
-                        if (Tables != NULL)
-                            val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
-                        else
-                            val = (cmsUInt8Number) j;
+                        val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
 
                         if (!_cmsWriteUInt8Number(io, val)) return FALSE;
                     }
--- a/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c	Tue Aug 22 02:03:52 2017 +0100
@@ -671,7 +671,7 @@
 // Create the ICC virtual profile for sRGB space
 cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID)
 {
-       cmsCIExyY       D65;
+       cmsCIExyY       D65 = { 0.3127, 0.3290, 1.0 };
        cmsCIExyYTRIPLE Rec709Primaries = {
                                    {0.6400, 0.3300, 1.0},
                                    {0.3000, 0.6000, 1.0},
@@ -680,7 +680,7 @@
        cmsToneCurve* Gamma22[3];
        cmsHPROFILE  hsRGB;
 
-       cmsWhitePointFromTemp(&D65, 6504);
+      // cmsWhitePointFromTemp(&D65, 6504);
        Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma(ContextID);
        if (Gamma22[0] == NULL) return NULL;
 
@@ -708,6 +708,7 @@
                 cmsFloat64Number Contrast;
                 cmsFloat64Number Hue;
                 cmsFloat64Number Saturation;
+                cmsBool          lAdjustWP;
                 cmsCIEXYZ WPsrc, WPdest;
 
 } BCHSWADJUSTS, *LPBCHSWADJUSTS;
@@ -737,9 +738,10 @@
     cmsLCh2Lab(&LabOut, &LChOut);
 
     // Move white point in Lab
-
-    cmsLab2XYZ(&bchsw ->WPsrc,  &XYZ, &LabOut);
-    cmsXYZ2Lab(&bchsw ->WPdest, &LabOut, &XYZ);
+    if (bchsw->lAdjustWP) {
+           cmsLab2XYZ(&bchsw->WPsrc, &XYZ, &LabOut);
+           cmsXYZ2Lab(&bchsw->WPdest, &LabOut, &XYZ);
+    }
 
     // Back to encoded
 
@@ -773,18 +775,23 @@
     bchsw.Contrast   = Contrast;
     bchsw.Hue        = Hue;
     bchsw.Saturation = Saturation;
+    if (TempSrc == TempDest) {
 
-    cmsWhitePointFromTemp(&WhitePnt, TempSrc );
-    cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+           bchsw.lAdjustWP = FALSE;
+    }
+    else {
+           bchsw.lAdjustWP = TRUE;
+           cmsWhitePointFromTemp(&WhitePnt, TempSrc);
+           cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+           cmsWhitePointFromTemp(&WhitePnt, TempDest);
+           cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
 
-    cmsWhitePointFromTemp(&WhitePnt, TempDest);
-    cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
+    }
 
     hICC = cmsCreateProfilePlaceholder(ContextID);
     if (!hICC)                          // can't allocate
         return NULL;
 
-
     cmsSetDeviceClass(hICC,      cmsSigAbstractClass);
     cmsSetColorSpace(hICC,       cmsSigLabData);
     cmsSetPCS(hICC,              cmsSigLabData);
@@ -1017,12 +1024,14 @@
 
 } cmsAllowedLUT;
 
+#define cmsSig0 ((cmsTagSignature) 0)
+
 static const cmsAllowedLUT AllowedLUTTypes[] = {
 
-    { FALSE, 0,              cmsSigLut16Type,    4,  { cmsSigMatrixElemType,   cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
-    { FALSE, 0,              cmsSigLut16Type,    3,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
-    { FALSE, 0,              cmsSigLut16Type,    2,  { cmsSigCurveSetElemType, cmsSigCLutElemType}},
-    { TRUE , 0,              cmsSigLutAtoBType,  1,  { cmsSigCurveSetElemType }},
+    { FALSE, cmsSig0,        cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } },
+    { FALSE, cmsSig0,        cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } },
+    { FALSE, cmsSig0,        cmsSigLut16Type, 2, { cmsSigCurveSetElemType, cmsSigCLutElemType } },
+    { TRUE,  cmsSig0,        cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType } },
     { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  3,  { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } },
     { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  3,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType   } },
     { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  5,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }},
--- a/src/share/native/sun/java2d/cmm/lcms/cmsxform.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/cmsxform.c	Tue Aug 22 02:03:52 2017 +0100
@@ -621,46 +621,48 @@
      _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID, TransformPlugin);
      _cmsTransformCollection* Plugin;
 
-    // Allocate needed memory
-    _cmsTRANSFORM* p = (_cmsTRANSFORM*) _cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM));
-    if (!p) return NULL;
+       // Allocate needed memory
+       _cmsTRANSFORM* p = (_cmsTRANSFORM*)_cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM));
+       if (!p) return NULL;
 
-    // Store the proposed pipeline
-    p ->Lut = lut;
+       // Store the proposed pipeline
+       p->Lut = lut;
 
-    // Let's see if any plug-in want to do the transform by itself
-    for (Plugin = ctx ->TransformCollection;
-        Plugin != NULL;
-        Plugin = Plugin ->Next) {
+       // Let's see if any plug-in want to do the transform by itself
+       if (p->Lut != NULL) {
 
-            if (Plugin ->Factory(&p->xform, &p->UserData, &p ->FreeUserData, &p ->Lut, InputFormat, OutputFormat, dwFlags)) {
+              for (Plugin = ctx->TransformCollection;
+                     Plugin != NULL;
+                     Plugin = Plugin->Next) {
 
-                // Last plugin in the declaration order takes control. We just keep
-                // the original parameters as a logging.
-                // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default
-                // an optimized transform is not reusable. The plug-in can, however, change
-                // the flags and make it suitable.
+                     if (Plugin->Factory(&p->xform, &p->UserData, &p->FreeUserData, &p->Lut, InputFormat, OutputFormat, dwFlags)) {
 
-                p ->ContextID       = ContextID;
-                p ->InputFormat     = *InputFormat;
-                p ->OutputFormat    = *OutputFormat;
-                p ->dwOriginalFlags = *dwFlags;
+                            // Last plugin in the declaration order takes control. We just keep
+                            // the original parameters as a logging.
+                            // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default
+                            // an optimized transform is not reusable. The plug-in can, however, change
+                            // the flags and make it suitable.
+
+                            p->ContextID = ContextID;
+                            p->InputFormat = *InputFormat;
+                            p->OutputFormat = *OutputFormat;
+                            p->dwOriginalFlags = *dwFlags;
 
-                // Fill the formatters just in case the optimized routine is interested.
-                // No error is thrown if the formatter doesn't exist. It is up to the optimization
-                // factory to decide what to do in those cases.
-                p ->FromInput      = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;
-                p ->ToOutput       = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;
-                p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
-                p ->ToOutputFloat  = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+                            // Fill the formatters just in case the optimized routine is interested.
+                            // No error is thrown if the formatter doesn't exist. It is up to the optimization
+                            // factory to decide what to do in those cases.
+                            p->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;
+                            p->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;
+                            p->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+                            p->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
 
-                return p;
-            }
-    }
+                            return p;
+                     }
+              }
 
-    // Not suitable for the transform plug-in, let's check  the pipeline plug-in
-    if (p ->Lut != NULL)
-        _cmsOptimizePipeline(ContextID, &p->Lut, Intent, InputFormat, OutputFormat, dwFlags);
+              // Not suitable for the transform plug-in, let's check  the pipeline plug-in
+              _cmsOptimizePipeline(ContextID, &p->Lut, Intent, InputFormat, OutputFormat, dwFlags);
+       }
 
     // Check whatever this is a true floating point transform
     if (_cmsFormatterIsFloat(*InputFormat) && _cmsFormatterIsFloat(*OutputFormat)) {
--- a/src/share/native/sun/java2d/cmm/lcms/lcms2.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/lcms2.h	Tue Aug 22 02:03:52 2017 +0100
@@ -52,7 +52,7 @@
 //
 //---------------------------------------------------------------------------------
 //
-// Version 2.6
+// Version 2.7
 //
 
 #ifndef _lcms2_H
@@ -104,7 +104,7 @@
 #endif
 
 // Version/release
-#define LCMS_VERSION        2060
+#define LCMS_VERSION        2070
 
 // I will give the chance of redefining basic types for compilers that are not fully C99 compliant
 #ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
@@ -213,27 +213,19 @@
 #   define CMS_USE_BIG_ENDIAN   1
 #endif
 
-#  ifdef TARGET_CPU_PPC
-#    if TARGET_CPU_PPC
-#      define CMS_USE_BIG_ENDIAN   1
-#    endif
-#  endif
 
 #if defined(__powerpc__) || defined(__ppc__) || defined(TARGET_CPU_PPC)
+#  if __powerpc__ || __ppc__ || TARGET_CPU_PPC
 #   define CMS_USE_BIG_ENDIAN   1
-#   if defined (__GNUC__) && defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN)
-#       if __BYTE_ORDER  == __LITTLE_ENDIAN
-//               // Don't use big endian for PowerPC little endian mode
+#   if defined (__GNUC__) && defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__)
+#       if __BYTE_ORDER__  == __ORDER_LITTLE_ENDIAN__
+                // Don't use big endian for PowerPC little endian mode
 #                undef CMS_USE_BIG_ENDIAN
 #       endif
+#     endif
 #   endif
 #endif
 
-// WORDS_BIGENDIAN takes precedence
-#if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN)
-#   define CMS_USE_BIG_ENDIAN      1
-#endif
-
 #ifdef macintosh
 # ifdef __BIG_ENDIAN__
 #   define CMS_USE_BIG_ENDIAN      1
@@ -243,6 +235,12 @@
 # endif
 #endif
 
+// WORDS_BIGENDIAN takes precedence
+#if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN)
+#   define CMS_USE_BIG_ENDIAN      1
+#endif
+
+
 // Calling convention -- this is hardly platform and compiler dependent
 #ifdef CMS_IS_WINDOWS_
 #  if defined(CMS_DLL) || defined(CMS_DLL_BUILD)
@@ -553,7 +551,8 @@
     cmsSigLab2FloatPCS                  = 0x64326C20,  // 'd2l '
     cmsSigFloatPCS2Lab                  = 0x6C326420,  // 'l2d '
     cmsSigXYZ2FloatPCS                  = 0x64327820,  // 'd2x '
-    cmsSigFloatPCS2XYZ                  = 0x78326420   // 'x2d '
+    cmsSigFloatPCS2XYZ                  = 0x78326420,  // 'x2d '
+    cmsSigClipNegativesElemType         = 0x636c7020   // 'clp '
 
 } cmsStageSignature;
 
@@ -1031,6 +1030,10 @@
 
     } cmsICCViewingConditions;
 
+// Get LittleCMS version (for shared objects) -----------------------------------------------------------------------------
+
+CMSAPI int               CMSEXPORT cmsGetEncodedCMMversion(void);
+
 // Support of non-standard functions --------------------------------------------------------------------------------------
 
 CMSAPI int               CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2);
@@ -1509,7 +1512,7 @@
 
 CMSAPI cmsUInt32Number   CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace);
 
-// Build a suitable formatter for the colorspace of this profile
+// Build a suitable formatter for the colorspace of this profile. nBytes=1 means 8 bits, nBytes=2 means 16 bits.
 CMSAPI cmsUInt32Number   CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);
 CMSAPI cmsUInt32Number   CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);
 
@@ -1538,6 +1541,7 @@
 CMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream);
 CMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode);
 CMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID);
+CMSAPI cmsIOHANDLER*     CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile);
 CMSAPI cmsBool           CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io);
 
 // MD5 message digest --------------------------------------------------------------------------------------------------
@@ -1672,6 +1676,10 @@
 #define cmsFLAGS_CLUT_POST_LINEARIZATION  0x0001    // create postlinearization tables if possible
 #define cmsFLAGS_CLUT_PRE_LINEARIZATION   0x0010    // create prelinearization tables if possible
 
+// Specific to unbounded mode
+#define cmsFLAGS_NONEGATIVES              0x8000    // Prevent negative numbers in floating point transforms
+
+
 // Fine-tune control over number of gridpoints
 #define cmsFLAGS_GRIDPOINTS(n)           (((n) & 0xFF) << 16)
 
--- a/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h	Tue Aug 22 02:03:52 2017 +0100
@@ -223,11 +223,17 @@
 // Microsoft felt that it was necessary to keep it set at -1 for an unlocked critical
 // section, even when they changed the underlying algorithm to be more scalable.
 // The final parts of the critical section object are unimportant, and can be set
-// to zero for their defaults. This yields an initialization macro:
+// to zero for their defaults. This yields to an initialization macro:
 
 typedef CRITICAL_SECTION _cmsMutex;
 
-#define CMS_MUTEX_INITIALIZER {(void*) -1,-1,0,0,0,0}
+#define CMS_MUTEX_INITIALIZER {(PRTL_CRITICAL_SECTION_DEBUG) -1,-1,0,0,0,0}
+
+#ifdef _MSC_VER
+#    if (_MSC_VER >= 1800)
+#          pragma warning(disable : 26135)
+#    endif
+#endif
 
 cmsINLINE int _cmsLockPrimitive(_cmsMutex *m)
 {
@@ -313,38 +319,38 @@
 
 cmsINLINE int _cmsLockPrimitive(_cmsMutex *m)
 {
+    cmsUNUSED_PARAMETER(m);
         return 0;
-    cmsUNUSED_PARAMETER(m);
 }
 
 cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)
 {
+    cmsUNUSED_PARAMETER(m);
         return 0;
-    cmsUNUSED_PARAMETER(m);
 }
 
 cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)
 {
+    cmsUNUSED_PARAMETER(m);
         return 0;
-    cmsUNUSED_PARAMETER(m);
 }
 
 cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)
 {
+    cmsUNUSED_PARAMETER(m);
         return 0;
-    cmsUNUSED_PARAMETER(m);
 }
 
 cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)
 {
+    cmsUNUSED_PARAMETER(m);
         return 0;
-    cmsUNUSED_PARAMETER(m);
 }
 
 cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)
 {
+    cmsUNUSED_PARAMETER(m);
         return 0;
-    cmsUNUSED_PARAMETER(m);
 }
 #endif
 
@@ -852,6 +858,8 @@
 cmsStage*        _cmsStageNormalizeFromXyzFloat(cmsContext ContextID);
 cmsStage*        _cmsStageNormalizeToLabFloat(cmsContext ContextID);
 cmsStage*        _cmsStageNormalizeToXyzFloat(cmsContext ContextID);
+cmsStage*        _cmsStageClipNegatives(cmsContext ContextID, int nChannels);
+
 
 // For curve set only
 cmsToneCurve**     _cmsStageGetPtrToCurveSet(const cmsStage* mpe);
--- a/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h	Tue Aug 22 02:03:52 2017 +0100
@@ -143,9 +143,9 @@
  * structure from the information present in a given Java Composite
  * object.
  */
-typedef JNIEXPORT void (JNICALL CompInfoFunc)(JNIEnv *env,
-                                              CompositeInfo *pCompInfo,
-                                              jobject Composite);
+typedef void (JNICALL CompInfoFunc)(JNIEnv *env,
+                                    CompositeInfo *pCompInfo,
+                                    jobject Composite);
 
 /*
  * The additional information needed to implement a primitive that
--- a/src/share/native/sun/java2d/loops/TransformHelper.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/loops/TransformHelper.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 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
@@ -406,6 +406,15 @@
     } else {
         pEdges = edgebuf;
     }
+    if (pEdges == NULL) {
+        if (numedges > 0) {
+            JNU_ThrowInternalError(env, "Unable to allocate edge list");
+        }
+        SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
+        SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
+        /* edgeArray should already contain zeros for min/maxy */
+        return;
+    }
 
     if (pEdges == NULL) {
         if (numedges > 0) {
--- a/src/share/native/sun/java2d/opengl/OGLContext.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/java2d/opengl/OGLContext.c	Tue Aug 22 02:03:52 2017 +0100
@@ -38,6 +38,8 @@
 #include "GraphicsPrimitiveMgr.h"
 #include "Region.h"
 
+#include <jvm.h>
+
 /**
  * The following methods are implemented in the windowing system (i.e. GLX
  * and WGL) source files.
--- a/src/share/native/sun/security/ec/ECC_JNI.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/ec/ECC_JNI.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -24,7 +24,7 @@
  */
 
 #include <jni.h>
-#include "impl/ecc_impl.h"
+#include "ecc_impl.h"
 
 #define ILLEGAL_STATE_EXCEPTION "java/lang/IllegalStateException"
 #define INVALID_ALGORITHM_PARAMETER_EXCEPTION \
@@ -32,6 +32,13 @@
 #define INVALID_PARAMETER_EXCEPTION \
         "java/security/InvalidParameterException"
 #define KEY_EXCEPTION   "java/security/KeyException"
+#define INTERNAL_ERROR "java/lang/InternalError"
+
+#ifdef SYSTEM_NSS
+#define SYSTEM_UNUSED(x) UNUSED(x)
+#else
+#define SYSTEM_UNUSED(x) x
+#endif
 
 extern "C" {
 
@@ -41,14 +48,21 @@
 void ThrowException(JNIEnv *env, const char *exceptionName)
 {
     jclass exceptionClazz = env->FindClass(exceptionName);
-    env->ThrowNew(exceptionClazz, NULL);
+    if (exceptionClazz != NULL) {
+        env->ThrowNew(exceptionClazz, NULL);
+    }
 }
 
 /*
  * Deep free of the ECParams struct
  */
-void FreeECParams(ECParams *ecparams, jboolean freeStruct)
+void FreeECParams(ECParams *ecparams, jboolean SYSTEM_UNUSED(freeStruct))
 {
+#ifdef SYSTEM_NSS
+    // Needs to be freed using the matching method to the one
+    // that allocated it. PR_TRUE means the memory is zeroed.
+    PORT_FreeArena(ecparams->arena, PR_TRUE);
+#else
     // Use B_FALSE to free the SECItem->data element, but not the SECItem itself
     // Use B_TRUE to free both
 
@@ -62,7 +76,7 @@
     SECITEM_FreeItem(&ecparams->curveOID, B_FALSE);
     if (freeStruct)
         free(ecparams);
-
+#endif
 }
 
 jbyteArray getEncodedBytes(JNIEnv *env, SECItem *hSECItem)
@@ -88,7 +102,7 @@
  */
 JNIEXPORT jobjectArray
 JNICALL Java_sun_security_ec_ECKeyPairGenerator_generateECKeyPair
-  (JNIEnv *env, jclass clazz, jint keySize, jbyteArray encodedParams, jbyteArray seed)
+  (JNIEnv *env, jclass UNUSED(clazz), jint UNUSED(keySize), jbyteArray encodedParams, jbyteArray seed)
 {
     ECPrivateKey *privKey = NULL;      /* contains both public and private values */
     ECParams *ecparams = NULL;
@@ -103,6 +117,9 @@
     params_item.len = env->GetArrayLength(encodedParams);
     params_item.data =
         (unsigned char *) env->GetByteArrayElements(encodedParams, 0);
+    if (params_item.data == NULL) {
+        goto cleanup;
+    }
 
     // Fill a new ECParams using the supplied OID
     if (EC_DecodeParams(&params_item, &ecparams, 0) != SECSuccess) {
@@ -117,8 +134,17 @@
     env->GetByteArrayRegion(seed, 0, jSeedLength, pSeedBuffer);
 
     // Generate the new keypair (using the supplied seed)
+#ifdef SYSTEM_NSS
+    if (RNG_RandomUpdate((unsigned char *) pSeedBuffer, jSeedLength)
+	!= SECSuccess) {
+	ThrowException(env, KEY_EXCEPTION);
+	goto cleanup;
+    }
+    if (EC_NewKey(ecparams, &privKey) != SECSuccess) {
+#else
     if (EC_NewKey(ecparams, &privKey, (unsigned char *) pSeedBuffer,
         jSeedLength, 0) != SECSuccess) {
+#endif
         ThrowException(env, KEY_EXCEPTION);
         goto cleanup;
     }
@@ -167,10 +193,15 @@
 
         if (privKey) {
             FreeECParams(&privKey->ecParams, false);
+#ifndef SYSTEM_NSS
+	    // The entire ECPrivateKey is allocated in the arena
+	    // when using system NSS, so only the in-tree version
+	    // needs to clear these manually.
             SECITEM_FreeItem(&privKey->version, B_FALSE);
             SECITEM_FreeItem(&privKey->privateValue, B_FALSE);
             SECITEM_FreeItem(&privKey->publicValue, B_FALSE);
             free(privKey);
+#endif
         }
 
         if (pSeedBuffer) {
@@ -188,7 +219,7 @@
  */
 JNIEXPORT jbyteArray
 JNICALL Java_sun_security_ec_ECDSASignature_signDigest
-  (JNIEnv *env, jclass clazz, jbyteArray digest, jbyteArray privateKey, jbyteArray encodedParams, jbyteArray seed, jint timing)
+  (JNIEnv *env, jclass UNUSED(clazz), jbyteArray digest, jbyteArray privateKey, jbyteArray encodedParams, jbyteArray seed, jint timing)
 {
     jbyte* pDigestBuffer = NULL;
     jint jDigestLength = env->GetArrayLength(digest);
@@ -209,6 +240,7 @@
     digest_item.len = jDigestLength;
 
     ECPrivateKey privKey;
+    privKey.privateValue.data = NULL;
 
     // Initialize the ECParams struct
     ECParams *ecparams = NULL;
@@ -216,6 +248,9 @@
     params_item.len = env->GetArrayLength(encodedParams);
     params_item.data =
         (unsigned char *) env->GetByteArrayElements(encodedParams, 0);
+    if (params_item.data == NULL) {
+        goto cleanup;
+    }
 
     // Fill a new ECParams using the supplied OID
     if (EC_DecodeParams(&params_item, &ecparams, 0) != SECSuccess) {
@@ -229,6 +264,9 @@
     privKey.privateValue.len = env->GetArrayLength(privateKey);
     privKey.privateValue.data =
         (unsigned char *) env->GetByteArrayElements(privateKey, 0);
+    if (privKey.privateValue.data == NULL) {
+        goto cleanup;
+    }
 
     // Prepare a buffer for the signature (twice the key length)
     pSignedDigestBuffer = new jbyte[ecparams->order.len * 2];
@@ -240,14 +278,27 @@
     env->GetByteArrayRegion(seed, 0, jSeedLength, pSeedBuffer);
 
     // Sign the digest (using the supplied seed)
+#ifdef SYSTEM_NSS
+    if (RNG_RandomUpdate((unsigned char *) pSeedBuffer, jSeedLength)
+	!= SECSuccess) {
+	ThrowException(env, KEY_EXCEPTION);
+	goto cleanup;
+    }
+    if (ECDSA_SignDigest(&privKey, &signature_item, &digest_item)
+	!= SECSuccess) {
+#else
     if (ECDSA_SignDigest(&privKey, &signature_item, &digest_item,
         (unsigned char *) pSeedBuffer, jSeedLength, 0, timing) != SECSuccess) {
+#endif
         ThrowException(env, KEY_EXCEPTION);
         goto cleanup;
     }
 
     // Create new byte array
     temp = env->NewByteArray(signature_item.len);
+    if (temp == NULL) {
+        goto cleanup;
+    }
 
     // Copy data from native buffer
     env->SetByteArrayRegion(temp, 0, signature_item.len, pSignedDigestBuffer);
@@ -292,7 +343,7 @@
  */
 JNIEXPORT jboolean
 JNICALL Java_sun_security_ec_ECDSASignature_verifySignedDigest
-  (JNIEnv *env, jclass clazz, jbyteArray signedDigest, jbyteArray digest, jbyteArray publicKey, jbyteArray encodedParams)
+  (JNIEnv *env, jclass UNUSED(clazz), jbyteArray signedDigest, jbyteArray digest, jbyteArray publicKey, jbyteArray encodedParams)
 {
     jboolean isValid = false;
 
@@ -325,6 +376,9 @@
     params_item.len = env->GetArrayLength(encodedParams);
     params_item.data =
         (unsigned char *) env->GetByteArrayElements(encodedParams, 0);
+    if (params_item.data == NULL) {
+        goto cleanup;
+    }
 
     // Fill a new ECParams using the supplied OID
     if (EC_DecodeParams(&params_item, &ecparams, 0) != SECSuccess) {
@@ -346,9 +400,10 @@
 
 cleanup:
     {
-        if (params_item.data)
+        if (params_item.data) {
             env->ReleaseByteArrayElements(encodedParams,
                 (jbyte *) params_item.data, JNI_ABORT);
+	}
 
         if (pubKey.publicValue.data)
             env->ReleaseByteArrayElements(publicKey,
@@ -374,28 +429,40 @@
  */
 JNIEXPORT jbyteArray
 JNICALL Java_sun_security_ec_ECDHKeyAgreement_deriveKey
-  (JNIEnv *env, jclass clazz, jbyteArray privateKey, jbyteArray publicKey, jbyteArray encodedParams)
+  (JNIEnv *env, jclass UNUSED(clazz), jbyteArray privateKey, jbyteArray publicKey, jbyteArray encodedParams)
 {
     jbyteArray jSecret = NULL;
+    ECParams *ecparams = NULL;
+    SECItem privateValue_item;
+    privateValue_item.data = NULL;
+    SECItem publicValue_item;
+    publicValue_item.data = NULL;
+    SECKEYECParams params_item;
+    params_item.data = NULL;
 
     // Extract private key value
-    SECItem privateValue_item;
     privateValue_item.len = env->GetArrayLength(privateKey);
     privateValue_item.data =
             (unsigned char *) env->GetByteArrayElements(privateKey, 0);
+    if (privateValue_item.data == NULL) {
+        goto cleanup;
+    }
 
     // Extract public key value
-    SECItem publicValue_item;
     publicValue_item.len = env->GetArrayLength(publicKey);
     publicValue_item.data =
         (unsigned char *) env->GetByteArrayElements(publicKey, 0);
+    if (publicValue_item.data == NULL) {
+        goto cleanup;
+    }
 
     // Initialize the ECParams struct
-    ECParams *ecparams = NULL;
-    SECKEYECParams params_item;
     params_item.len = env->GetArrayLength(encodedParams);
     params_item.data =
         (unsigned char *) env->GetByteArrayElements(encodedParams, 0);
+    if (params_item.data == NULL) {
+        goto cleanup;
+    }
 
     // Fill a new ECParams using the supplied OID
     if (EC_DecodeParams(&params_item, &ecparams, 0) != SECSuccess) {
@@ -417,6 +484,9 @@
 
     // Create new byte array
     jSecret = env->NewByteArray(secret_item.len);
+    if (jSecret == NULL) {
+        goto cleanup;
+    }
 
     // Copy bytes from the SECItem buffer to a Java byte array
     env->SetByteArrayRegion(jSecret, 0, secret_item.len,
@@ -435,9 +505,10 @@
             env->ReleaseByteArrayElements(publicKey,
                 (jbyte *) publicValue_item.data, JNI_ABORT);
 
-        if (params_item.data)
+        if (params_item.data) {
             env->ReleaseByteArrayElements(encodedParams,
                 (jbyte *) params_item.data, JNI_ABORT);
+	}
 
         if (ecparams)
             FreeECParams(ecparams, true);
@@ -446,4 +517,30 @@
     return jSecret;
 }
 
+JNIEXPORT void
+JNICALL Java_sun_security_ec_SunEC_initialize
+  (JNIEnv *env, jclass UNUSED(clazz))
+{
+#ifdef SYSTEM_NSS
+    if (SECOID_Init() != SECSuccess) {
+	ThrowException(env, INTERNAL_ERROR);
+    }
+    if (RNG_RNGInit() != SECSuccess) {
+	ThrowException(env, INTERNAL_ERROR);
+    }
+#endif
+}
+
+JNIEXPORT void
+JNICALL Java_sun_security_ec_SunEC_cleanup
+  (JNIEnv *env, jclass UNUSED(clazz))
+{
+#ifdef SYSTEM_NSS
+    RNG_RNGShutdown();
+    if (SECOID_Shutdown() != SECSuccess) {
+	ThrowException(env, INTERNAL_ERROR);
+    }
+#endif
+}
+
 } /* extern "C" */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/native/sun/security/ec/ecc_impl.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,298 @@
+/*
+ * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Use is subject to license terms.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, 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.
+ */
+
+/* *********************************************************************
+ *
+ * The Original Code is the Netscape security libraries.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1994-2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Dr Vipul Gupta <vipul.gupta@sun.com> and
+ *   Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories
+ *
+ * Last Modified Date from the Original Code: May 2017
+ *********************************************************************** */
+
+#ifndef _ECC_IMPL_H
+#define _ECC_IMPL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+
+#ifdef SYSTEM_NSS
+#include <secitem.h>
+#include <secerr.h>
+#include <keythi.h>
+#ifdef LEGACY_NSS
+#include <softoken.h>
+#else
+#include <blapi.h>
+#endif
+#else
+#include "ecl-exp.h"
+#endif
+
+/*
+ * Multi-platform definitions
+ */
+#ifdef __linux__
+#define B_FALSE FALSE
+#define B_TRUE TRUE
+typedef unsigned char uint8_t;
+typedef unsigned long ulong_t;
+typedef enum { B_FALSE, B_TRUE } boolean_t;
+#endif /* __linux__ */
+
+#ifdef _ALLBSD_SOURCE
+#include <stdint.h>
+#define B_FALSE FALSE
+#define B_TRUE TRUE
+typedef unsigned long ulong_t;
+typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
+#endif /* _ALLBSD_SOURCE */
+
+#ifdef AIX
+#define B_FALSE FALSE
+#define B_TRUE TRUE
+typedef unsigned char uint8_t;
+typedef unsigned long ulong_t;
+#endif /* AIX */
+
+#ifdef _WIN32
+typedef unsigned char uint8_t;
+typedef unsigned long ulong_t;
+typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
+#define strdup _strdup          /* Replace POSIX name with ISO C++ name */
+#endif /* _WIN32 */
+
+#ifndef _KERNEL
+#include <stdlib.h>
+#endif  /* _KERNEL */
+
+#define EC_MAX_DIGEST_LEN 1024  /* max digest that can be signed */
+#define EC_MAX_POINT_LEN 145    /* max len of DER encoded Q */
+#define EC_MAX_VALUE_LEN 72     /* max len of ANSI X9.62 private value d */
+#define EC_MAX_SIG_LEN 144      /* max signature len for supported curves */
+#define EC_MIN_KEY_LEN  112     /* min key length in bits */
+#define EC_MAX_KEY_LEN  571     /* max key length in bits */
+#define EC_MAX_OID_LEN 10       /* max length of OID buffer */
+
+/*
+ * Various structures and definitions from NSS are here.
+ */
+
+#ifndef SYSTEM_NSS
+#ifdef _KERNEL
+#define PORT_ArenaAlloc(a, n, f)        kmem_alloc((n), (f))
+#define PORT_ArenaZAlloc(a, n, f)       kmem_zalloc((n), (f))
+#define PORT_ArenaGrow(a, b, c, d)      NULL
+#define PORT_ZAlloc(n, f)               kmem_zalloc((n), (f))
+#define PORT_Alloc(n, f)                kmem_alloc((n), (f))
+#else
+#define PORT_ArenaAlloc(a, n, f)        malloc((n))
+#define PORT_ArenaZAlloc(a, n, f)       calloc(1, (n))
+#define PORT_ArenaGrow(a, b, c, d)      NULL
+#define PORT_ZAlloc(n, f)               calloc(1, (n))
+#define PORT_Alloc(n, f)                malloc((n))
+#endif
+
+#define PORT_NewArena(b)                (char *)12345
+#define PORT_ArenaMark(a)               NULL
+#define PORT_ArenaUnmark(a, b)
+#define PORT_ArenaRelease(a, m)
+#define PORT_FreeArena(a, b)
+#define PORT_Strlen(s)                  strlen((s))
+#define PORT_SetError(e)
+
+#define PRBool                          boolean_t
+#define PR_TRUE                         B_TRUE
+#define PR_FALSE                        B_FALSE
+
+#ifdef _KERNEL
+#define PORT_Assert                     ASSERT
+#define PORT_Memcpy(t, f, l)            bcopy((f), (t), (l))
+#else
+#define PORT_Assert                     assert
+#define PORT_Memcpy(t, f, l)            memcpy((t), (f), (l))
+#endif
+
+#endif
+
+#define CHECK_OK(func) if (func == NULL) goto cleanup
+#define CHECK_SEC_OK(func) if (SECSuccess != (rv = func)) goto cleanup
+
+#ifndef SYSTEM_NSS
+typedef enum {
+        siBuffer = 0,
+        siClearDataBuffer = 1,
+        siCipherDataBuffer = 2,
+        siDERCertBuffer = 3,
+        siEncodedCertBuffer = 4,
+        siDERNameBuffer = 5,
+        siEncodedNameBuffer = 6,
+        siAsciiNameString = 7,
+        siAsciiString = 8,
+        siDEROID = 9,
+        siUnsignedInteger = 10,
+        siUTCTime = 11,
+        siGeneralizedTime = 12
+} SECItemType;
+
+typedef struct SECItemStr SECItem;
+
+struct SECItemStr {
+        SECItemType type;
+        unsigned char *data;
+        unsigned int len;
+};
+
+typedef SECItem SECKEYECParams;
+
+typedef enum { ec_params_explicit,
+               ec_params_named
+} ECParamsType;
+
+typedef enum { ec_field_GFp = 1,
+               ec_field_GF2m
+} ECFieldType;
+
+struct ECFieldIDStr {
+    int         size;   /* field size in bits */
+    ECFieldType type;
+    union {
+        SECItem  prime; /* prime p for (GFp) */
+        SECItem  poly;  /* irreducible binary polynomial for (GF2m) */
+    } u;
+    int         k1;     /* first coefficient of pentanomial or
+                         * the only coefficient of trinomial
+                         */
+    int         k2;     /* two remaining coefficients of pentanomial */
+    int         k3;
+};
+typedef struct ECFieldIDStr ECFieldID;
+
+struct ECCurveStr {
+        SECItem a;      /* contains octet stream encoding of
+                         * field element (X9.62 section 4.3.3)
+                         */
+        SECItem b;
+        SECItem seed;
+};
+typedef struct ECCurveStr ECCurve;
+
+typedef void PRArenaPool;
+
+struct ECParamsStr {
+    PRArenaPool * arena;
+    ECParamsType  type;
+    ECFieldID     fieldID;
+    ECCurve       curve;
+    SECItem       base;
+    SECItem       order;
+    int           cofactor;
+    SECItem       DEREncoding;
+    ECCurveName   name;
+    SECItem       curveOID;
+};
+typedef struct ECParamsStr ECParams;
+
+struct ECPublicKeyStr {
+    ECParams ecParams;
+    SECItem publicValue;   /* elliptic curve point encoded as
+                            * octet stream.
+                            */
+};
+typedef struct ECPublicKeyStr ECPublicKey;
+
+struct ECPrivateKeyStr {
+    ECParams ecParams;
+    SECItem publicValue;   /* encoded ec point */
+    SECItem privateValue;  /* private big integer */
+    SECItem version;       /* As per SEC 1, Appendix C, Section C.4 */
+};
+typedef struct ECPrivateKeyStr ECPrivateKey;
+
+typedef enum _SECStatus {
+        SECBufferTooSmall = -3,
+        SECWouldBlock = -2,
+        SECFailure = -1,
+        SECSuccess = 0
+} SECStatus;
+#endif
+
+#ifdef _KERNEL
+#define RNG_GenerateGlobalRandomBytes(p,l) ecc_knzero_random_generator((p), (l))
+#else
+/*
+ This function is no longer required because the random bytes are now
+ supplied by the caller. Force a failure.
+*/
+#ifndef SYSTEM_NSS
+#define RNG_GenerateGlobalRandomBytes(p,l) SECFailure
+#endif
+#endif
+#define CHECK_MPI_OK(func) if (MP_OKAY > (err = func)) goto cleanup
+#define MP_TO_SEC_ERROR(err)
+
+#define SECITEM_TO_MPINT(it, mp)                                        \
+        CHECK_MPI_OK(mp_read_unsigned_octets((mp), (it).data, (it).len))
+
+extern int ecc_knzero_random_generator(uint8_t *, size_t);
+extern ulong_t soft_nzero_random_generator(uint8_t *, ulong_t);
+
+#ifdef SYSTEM_NSS
+#define EC_DecodeParams(a,b,c) EC_DecodeParams(a,b)
+#define ECDSA_VerifyDigest(a,b,c,d) ECDSA_VerifyDigest(a,b,c)
+#define ECDH_Derive(a,b,c,d,e,f) ECDH_Derive(a,b,c,d,e)
+#else
+extern SECStatus EC_DecodeParams(const SECItem *, ECParams **, int);
+
+extern SECItem * SECITEM_AllocItem(PRArenaPool *, SECItem *, unsigned int, int);
+extern SECStatus SECITEM_CopyItem(PRArenaPool *, SECItem *, const SECItem *,
+    int);
+extern void SECITEM_FreeItem(SECItem *, boolean_t);
+
+/* This function has been modified to accept an array of random bytes */
+extern SECStatus EC_NewKey(ECParams *ecParams, ECPrivateKey **privKey,
+    const unsigned char* random, int randomlen, int);
+/* This function has been modified to accept an array of random bytes */
+extern SECStatus ECDSA_SignDigest(ECPrivateKey *, SECItem *, const SECItem *,
+    const unsigned char* random, int randomlen, int, int timing);
+extern SECStatus ECDSA_VerifyDigest(ECPublicKey *, const SECItem *,
+    const SECItem *, int);
+extern SECStatus ECDH_Derive(SECItem *, ECParams *, SECItem *, boolean_t,
+    SECItem *, int);
+#endif
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* _ECC_IMPL_H */
--- a/src/share/native/sun/security/ec/impl/ecc_impl.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,271 +0,0 @@
-/*
- * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, 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.
- */
-
-/* *********************************************************************
- *
- * The Original Code is the Netscape security libraries.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1994-2000
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Dr Vipul Gupta <vipul.gupta@sun.com> and
- *   Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories
- *
- * Last Modified Date from the Original Code: May 2017
- *********************************************************************** */
-
-#ifndef _ECC_IMPL_H
-#define _ECC_IMPL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/types.h>
-#include "ecl-exp.h"
-
-/*
- * Multi-platform definitions
- */
-#ifdef __linux__
-#define B_FALSE FALSE
-#define B_TRUE TRUE
-typedef unsigned char uint8_t;
-typedef unsigned long ulong_t;
-typedef enum { B_FALSE, B_TRUE } boolean_t;
-#endif /* __linux__ */
-
-#ifdef _ALLBSD_SOURCE
-#include <stdint.h>
-#define B_FALSE FALSE
-#define B_TRUE TRUE
-typedef unsigned long ulong_t;
-typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
-#endif /* _ALLBSD_SOURCE */
-
-#ifdef AIX
-#define B_FALSE FALSE
-#define B_TRUE TRUE
-typedef unsigned char uint8_t;
-typedef unsigned long ulong_t;
-#endif /* AIX */
-
-#ifdef _WIN32
-typedef unsigned char uint8_t;
-typedef unsigned long ulong_t;
-typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
-#define strdup _strdup          /* Replace POSIX name with ISO C++ name */
-#endif /* _WIN32 */
-
-#ifndef _KERNEL
-#include <stdlib.h>
-#endif  /* _KERNEL */
-
-#define EC_MAX_DIGEST_LEN 1024  /* max digest that can be signed */
-#define EC_MAX_POINT_LEN 145    /* max len of DER encoded Q */
-#define EC_MAX_VALUE_LEN 72     /* max len of ANSI X9.62 private value d */
-#define EC_MAX_SIG_LEN 144      /* max signature len for supported curves */
-#define EC_MIN_KEY_LEN  112     /* min key length in bits */
-#define EC_MAX_KEY_LEN  571     /* max key length in bits */
-#define EC_MAX_OID_LEN 10       /* max length of OID buffer */
-
-/*
- * Various structures and definitions from NSS are here.
- */
-
-#ifdef _KERNEL
-#define PORT_ArenaAlloc(a, n, f)        kmem_alloc((n), (f))
-#define PORT_ArenaZAlloc(a, n, f)       kmem_zalloc((n), (f))
-#define PORT_ArenaGrow(a, b, c, d)      NULL
-#define PORT_ZAlloc(n, f)               kmem_zalloc((n), (f))
-#define PORT_Alloc(n, f)                kmem_alloc((n), (f))
-#else
-#define PORT_ArenaAlloc(a, n, f)        malloc((n))
-#define PORT_ArenaZAlloc(a, n, f)       calloc(1, (n))
-#define PORT_ArenaGrow(a, b, c, d)      NULL
-#define PORT_ZAlloc(n, f)               calloc(1, (n))
-#define PORT_Alloc(n, f)                malloc((n))
-#endif
-
-#define PORT_NewArena(b)                (char *)12345
-#define PORT_ArenaMark(a)               NULL
-#define PORT_ArenaUnmark(a, b)
-#define PORT_ArenaRelease(a, m)
-#define PORT_FreeArena(a, b)
-#define PORT_Strlen(s)                  strlen((s))
-#define PORT_SetError(e)
-
-#define PRBool                          boolean_t
-#define PR_TRUE                         B_TRUE
-#define PR_FALSE                        B_FALSE
-
-#ifdef _KERNEL
-#define PORT_Assert                     ASSERT
-#define PORT_Memcpy(t, f, l)            bcopy((f), (t), (l))
-#else
-#define PORT_Assert                     assert
-#define PORT_Memcpy(t, f, l)            memcpy((t), (f), (l))
-#endif
-
-#define CHECK_OK(func) if (func == NULL) goto cleanup
-#define CHECK_SEC_OK(func) if (SECSuccess != (rv = func)) goto cleanup
-
-typedef enum {
-        siBuffer = 0,
-        siClearDataBuffer = 1,
-        siCipherDataBuffer = 2,
-        siDERCertBuffer = 3,
-        siEncodedCertBuffer = 4,
-        siDERNameBuffer = 5,
-        siEncodedNameBuffer = 6,
-        siAsciiNameString = 7,
-        siAsciiString = 8,
-        siDEROID = 9,
-        siUnsignedInteger = 10,
-        siUTCTime = 11,
-        siGeneralizedTime = 12
-} SECItemType;
-
-typedef struct SECItemStr SECItem;
-
-struct SECItemStr {
-        SECItemType type;
-        unsigned char *data;
-        unsigned int len;
-};
-
-typedef SECItem SECKEYECParams;
-
-typedef enum { ec_params_explicit,
-               ec_params_named
-} ECParamsType;
-
-typedef enum { ec_field_GFp = 1,
-               ec_field_GF2m
-} ECFieldType;
-
-struct ECFieldIDStr {
-    int         size;   /* field size in bits */
-    ECFieldType type;
-    union {
-        SECItem  prime; /* prime p for (GFp) */
-        SECItem  poly;  /* irreducible binary polynomial for (GF2m) */
-    } u;
-    int         k1;     /* first coefficient of pentanomial or
-                         * the only coefficient of trinomial
-                         */
-    int         k2;     /* two remaining coefficients of pentanomial */
-    int         k3;
-};
-typedef struct ECFieldIDStr ECFieldID;
-
-struct ECCurveStr {
-        SECItem a;      /* contains octet stream encoding of
-                         * field element (X9.62 section 4.3.3)
-                         */
-        SECItem b;
-        SECItem seed;
-};
-typedef struct ECCurveStr ECCurve;
-
-typedef void PRArenaPool;
-
-struct ECParamsStr {
-    PRArenaPool * arena;
-    ECParamsType  type;
-    ECFieldID     fieldID;
-    ECCurve       curve;
-    SECItem       base;
-    SECItem       order;
-    int           cofactor;
-    SECItem       DEREncoding;
-    ECCurveName   name;
-    SECItem       curveOID;
-};
-typedef struct ECParamsStr ECParams;
-
-struct ECPublicKeyStr {
-    ECParams ecParams;
-    SECItem publicValue;   /* elliptic curve point encoded as
-                            * octet stream.
-                            */
-};
-typedef struct ECPublicKeyStr ECPublicKey;
-
-struct ECPrivateKeyStr {
-    ECParams ecParams;
-    SECItem publicValue;   /* encoded ec point */
-    SECItem privateValue;  /* private big integer */
-    SECItem version;       /* As per SEC 1, Appendix C, Section C.4 */
-};
-typedef struct ECPrivateKeyStr ECPrivateKey;
-
-typedef enum _SECStatus {
-        SECBufferTooSmall = -3,
-        SECWouldBlock = -2,
-        SECFailure = -1,
-        SECSuccess = 0
-} SECStatus;
-
-#ifdef _KERNEL
-#define RNG_GenerateGlobalRandomBytes(p,l) ecc_knzero_random_generator((p), (l))
-#else
-/*
- This function is no longer required because the random bytes are now
- supplied by the caller. Force a failure.
-*/
-#define RNG_GenerateGlobalRandomBytes(p,l) SECFailure
-#endif
-#define CHECK_MPI_OK(func) if (MP_OKAY > (err = func)) goto cleanup
-#define MP_TO_SEC_ERROR(err)
-
-#define SECITEM_TO_MPINT(it, mp)                                        \
-        CHECK_MPI_OK(mp_read_unsigned_octets((mp), (it).data, (it).len))
-
-extern int ecc_knzero_random_generator(uint8_t *, size_t);
-extern ulong_t soft_nzero_random_generator(uint8_t *, ulong_t);
-
-extern SECStatus EC_DecodeParams(const SECItem *, ECParams **, int);
-extern SECItem * SECITEM_AllocItem(PRArenaPool *, SECItem *, unsigned int, int);
-extern SECStatus SECITEM_CopyItem(PRArenaPool *, SECItem *, const SECItem *,
-    int);
-extern void SECITEM_FreeItem(SECItem *, boolean_t);
-/* This function has been modified to accept an array of random bytes */
-extern SECStatus EC_NewKey(ECParams *ecParams, ECPrivateKey **privKey,
-    const unsigned char* random, int randomlen, int);
-/* This function has been modified to accept an array of random bytes */
-extern SECStatus ECDSA_SignDigest(ECPrivateKey *, SECItem *, const SECItem *,
-    const unsigned char* random, int randomlen, int, int timing);
-extern SECStatus ECDSA_VerifyDigest(ECPublicKey *, const SECItem *,
-    const SECItem *, int);
-extern SECStatus ECDH_Derive(SECItem *, ECParams *, SECItem *, boolean_t,
-    SECItem *, int);
-
-#ifdef  __cplusplus
-}
-#endif
-
-#endif /* _ECC_IMPL_H */
--- a/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/jgss/wrapper/GSSLibStub.c	Tue Aug 22 02:03:52 2017 +0100
@@ -27,8 +27,22 @@
 #include "NativeUtil.h"
 #include "NativeFunc.h"
 #include "jlong.h"
+#include <jni.h>
 
-/* Constants for indicating what type of info is needed for inqueries */
+/* Throws a Java Exception by name */
+
+void throwByName(JNIEnv *env, const char *name, const char *msg) {
+    jclass cls = (*env)->FindClass(env, name);
+
+    if (cls != 0) /* Otherwise an exception has already been thrown */
+        (*env)->ThrowNew(env, cls, msg);
+}
+
+void throwOutOfMemoryError(JNIEnv *env, const char *message) {
+    throwByName(env, "java/lang/OutOfMemoryError", message);
+}
+
+/* Constants for indicating what type of info is needed for inquiries */
 const int TYPE_CRED_NAME = 10;
 const int TYPE_CRED_TIME = 11;
 const int TYPE_CRED_USAGE = 12;
@@ -117,7 +131,14 @@
   if (jcb == NULL) {
     return GSS_C_NO_CHANNEL_BINDINGS;
   }
+
   cb = malloc(sizeof(struct gss_channel_bindings_struct));
+
+  if (cb == NULL) {
+    throwOutOfMemoryError(env,NULL);
+    return NULL;
+  }
+
   /* set up initiator address */
   jinetAddr =
     (*env)->CallObjectMethod(env, jcb,
@@ -301,12 +322,17 @@
   gss_buffer_desc nameVal;
   gss_OID nameType;
   gss_name_t nameHdl;
+  nameHdl = GSS_C_NO_NAME;
 
   debug(env, "[GSSLibStub_importName]");
 
   initGSSBuffer(env, jnameVal, &nameVal);
   nameType = newGSSOID(env, jnameType);
-  nameHdl = GSS_C_NO_NAME;
+  if ((*env)->ExceptionCheck(env)) {
+    deleteGSSOID(nameType);
+    resetGSSBuffer(env, jnameVal, &nameVal);
+    return jlong_zero;
+  }
 
   /* gss_import_name(...) => GSS_S_BAD_NAMETYPE, GSS_S_BAD_NAME,
      GSS_S_BAD_MECH */
@@ -509,12 +535,16 @@
   gss_cred_usage_t credUsage;
   gss_name_t nameHdl;
   gss_cred_id_t credHdl;
+  credHdl = GSS_C_NO_CREDENTIAL;
 
   debug(env, "[GSSLibStub_acquireCred]");
 
 
   mech = (gss_OID) jlong_to_ptr((*env)->GetLongField(env, jobj, FID_GSSLibStub_pMech));
   mechs = newGSSOIDSet(env, mech);
+  if ((*env)->ExceptionCheck(env)) {
+    return jlong_zero;
+  }
   credUsage = (gss_cred_usage_t) usage;
   nameHdl = (gss_name_t) jlong_to_ptr(pName);
   credHdl = GSS_C_NO_CREDENTIAL;
@@ -628,7 +658,7 @@
 
   /* return immediately if an exception has occurred */
   if ((*env)->ExceptionCheck(env)) {
-    return 0;
+    return jlong_zero;
   }
 
   sprintf(debugBuf, "[GSSLibStub_getCredName] pName=%ld", (long) nameHdl);
@@ -795,6 +825,11 @@
   time = getGSSTime((*env)->GetIntField(env, jcontextSpi,
                                         FID_NativeGSSContext_lifetime));
   cb = getGSSCB(env, jcb);
+  if ((*env)->ExceptionCheck(env)) {
+    free(cb);
+    return NULL;
+  }
+
   initGSSBuffer(env, jinToken, &inToken);
 
   sprintf(debugBuf,
@@ -895,6 +930,11 @@
   credHdl = (gss_cred_id_t) jlong_to_ptr(pCred);
   initGSSBuffer(env, jinToken, &inToken);
   cb = getGSSCB(env, jcb);
+  if ((*env)->ExceptionCheck(env)) {
+    free(cb);
+    resetGSSBuffer(env, jinToken, &inToken);
+    return NULL;
+  }
   srcName = GSS_C_NO_NAME;
   delCred = GSS_C_NO_CREDENTIAL;
   setTarget = (credHdl == GSS_C_NO_CREDENTIAL);
@@ -945,6 +985,7 @@
 
       /* return immediately if an exception has occurred */
       if ((*env)->ExceptionCheck(env)) {
+        resetGSSBuffer(env, jinToken, &inToken);
         return NULL;
       }
       sprintf(debugBuf, "[GSSLibStub_acceptContext] set targetName=%ld",
@@ -959,6 +1000,7 @@
                                    ptr_to_jlong(srcName), jobj);
       /* return immediately if an exception has occurred */
       if ((*env)->ExceptionCheck(env)) {
+        resetGSSBuffer(env, jinToken, &inToken);
         return NULL;
       }
       sprintf(debugBuf, "[GSSLibStub_acceptContext] set srcName=%ld",
@@ -985,6 +1027,7 @@
                                      ptr_to_jlong(delCred), jsrcName, jMech);
         /* return immediately if an exception has occurred */
         if ((*env)->ExceptionCheck(env)) {
+          resetGSSBuffer(env, jinToken, &inToken);
           return NULL;
         }
         (*env)->SetObjectField(env, jcontextSpi,
--- a/src/share/native/sun/security/jgss/wrapper/NativeUtil.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/jgss/wrapper/NativeUtil.c	Tue Aug 22 02:03:52 2017 +0100
@@ -26,6 +26,9 @@
 #include "NativeUtil.h"
 #include "NativeFunc.h"
 #include "jlong.h"
+#include <jni.h>
+
+extern void throwOutOfMemoryError(JNIEnv *env, const char *message);
 
 const int JAVA_DUPLICATE_TOKEN_CODE = 19; /* DUPLICATE_TOKEN */
 const int JAVA_OLD_TOKEN_CODE = 20; /* OLD_TOKEN */
@@ -615,8 +618,17 @@
       (*env)->Throw(env, gssEx);
     }
     cOid = malloc(sizeof(struct gss_OID_desc_struct));
+    if (cOid == NULL) {
+      throwOutOfMemoryError(env,NULL);
+      return GSS_C_NO_OID;
+    }
     cOid->length = (*env)->GetArrayLength(env, jbytes) - 2;
     cOid->elements = malloc(cOid->length);
+    if (cOid->elements == NULL) {
+      throwOutOfMemoryError(env,NULL);
+      free(cOid);
+      return GSS_C_NO_OID;
+    }
     (*env)->GetByteArrayRegion(env, jbytes, 2, cOid->length,
                                cOid->elements);
     (*env)->DeleteLocalRef(env, jbytes);
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -273,7 +273,7 @@
     /* allocate memory for CK_VERSION pointer */
     ckpVersion = (CK_VERSION_PTR) malloc(sizeof(CK_VERSION));
     if (ckpVersion == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     ckpVersion->major = jByteToCKByte(jMajor);
@@ -326,7 +326,7 @@
     /* allocate memory for CK_DATE pointer */
     ckpDate = (CK_DATE *) malloc(sizeof(CK_DATE));
     if (ckpDate == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
@@ -340,7 +340,7 @@
         jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
         if (jTempChars == NULL) {
             free(ckpDate);
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return NULL;
         }
         (*env)->GetCharArrayRegion(env, jYear, 0, ckLength, jTempChars);
@@ -364,7 +364,7 @@
         jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
         if (jTempChars == NULL) {
             free(ckpDate);
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return NULL;
         }
         (*env)->GetCharArrayRegion(env, jMonth, 0, ckLength, jTempChars);
@@ -388,7 +388,7 @@
         jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
         if (jTempChars == NULL) {
             free(ckpDate);
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return NULL;
         }
         (*env)->GetCharArrayRegion(env, jDay, 0, ckLength, jTempChars);
@@ -474,6 +474,7 @@
     jfieldID fieldID;
     jclass jSsl3RandomDataClass;
     jobject jRandomInfo, jRIClientRandom, jRIServerRandom, jVersion;
+    memset(&ckParam, 0, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS));
 
     /* get RandomInfo */
     jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
@@ -527,6 +528,7 @@
     CK_TLS_PRF_PARAMS ckParam;
     jfieldID fieldID;
     jobject jSeed, jLabel, jOutput;
+    memset(&ckParam, 0, sizeof(CK_TLS_PRF_PARAMS));
 
     // TBD: what if jParam == NULL?!
 
@@ -559,7 +561,7 @@
     if (ckParam.pulOutputLen == NULL) {
         free(ckParam.pSeed);
         free(ckParam.pLabel);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return ckParam;
     }
     jByteArrayToCKByteArray(env, jOutput, &(ckParam.pOutput), ckParam.pulOutputLen);
@@ -592,6 +594,7 @@
     jobject jRandomInfo, jRIClientRandom, jRIServerRandom;
     jobject jReturnedKeyMaterial, jRMIvClient, jRMIvServer;
     CK_ULONG ckTemp;
+    memset(&ckParam, 0, sizeof(CK_SSL3_KEY_MAT_PARAMS));
 
     /* get ulMacSizeInBits */
     jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
@@ -666,7 +669,7 @@
     if (ckParam.pReturnedKeyMaterial == NULL) {
         free(ckParam.RandomInfo.pClientRandom);
         free(ckParam.RandomInfo.pServerRandom);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return ckParam;
     }
 
@@ -1014,7 +1017,7 @@
 
         ckpParam = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR) malloc(sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1041,7 +1044,7 @@
 
         ckpParam = (CK_SSL3_KEY_MAT_PARAMS_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1068,7 +1071,7 @@
 
         ckpParam = (CK_TLS_PRF_PARAMS_PTR) malloc(sizeof(CK_TLS_PRF_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1095,7 +1098,7 @@
 
         ckpParam = (CK_AES_CTR_PARAMS_PTR) malloc(sizeof(CK_AES_CTR_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1122,7 +1125,7 @@
 
         ckpParam = (CK_RSA_PKCS_OAEP_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_OAEP_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1149,7 +1152,7 @@
 
         ckpParam = (CK_PBE_PARAMS_PTR) malloc(sizeof(CK_PBE_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1176,7 +1179,7 @@
 
         ckpParam = (CK_PKCS5_PBKD2_PARAMS_PTR) malloc(sizeof(CK_PKCS5_PBKD2_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1203,7 +1206,7 @@
 
         ckpParam = (CK_RSA_PKCS_PSS_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_PSS_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1230,7 +1233,7 @@
 
         ckpParam = (CK_ECDH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH1_DERIVE_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1257,7 +1260,7 @@
 
         ckpParam = (CK_ECDH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH2_DERIVE_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1284,7 +1287,7 @@
 
         ckpParam = (CK_X9_42_DH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH1_DERIVE_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1311,7 +1314,7 @@
 
         ckpParam = (CK_X9_42_DH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH2_DERIVE_PARAMS));
         if (ckpParam == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
 
@@ -1355,6 +1358,7 @@
     jlong jHashAlg, jMgf, jSource;
     jobject jSourceData;
     CK_BYTE_PTR ckpByte;
+    memset(&ckParam, 0, sizeof(CK_RSA_PKCS_OAEP_PARAMS));
 
     /* get hashAlg */
     jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
@@ -1404,6 +1408,7 @@
     jlong jIteration;
     jobject jInitVector, jPassword, jSalt;
     CK_ULONG ckTemp;
+    memset(&ckParam, 0, sizeof(CK_PBE_PARAMS));
 
     /* get pInitVector */
     jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
@@ -1522,6 +1527,7 @@
     jfieldID fieldID;
     jlong jSaltSource, jIteration, jPrf;
     jobject jSaltSourceData, jPrfData;
+    memset(&ckParam, 0, sizeof(CK_PKCS5_PBKD2_PARAMS));
 
     /* get saltSource */
     jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
@@ -1734,6 +1740,7 @@
     jfieldID fieldID;
     jlong jKdf;
     jobject jOtherInfo, jPublicData;
+    memset(&ckParam, 0, sizeof(CK_X9_42_DH1_DERIVE_PARAMS));
 
     /* get kdf */
     jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
@@ -1779,6 +1786,7 @@
     jfieldID fieldID;
     jlong jKdf, jPrivateDataLen, jPrivateData;
     jobject jOtherInfo, jPublicData, jPublicData2;
+    memset(&ckParam, 0, sizeof(CK_X9_42_DH2_DERIVE_PARAMS));
 
     /* get kdf */
     jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c	Tue Aug 22 02:03:52 2017 +0100
@@ -132,7 +132,7 @@
         /* always use single part op, even for large data */
         bufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
         if (bufP == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return 0;
         }
     }
@@ -191,7 +191,7 @@
         bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
         bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
         if (bufP == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
     }
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_dual.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_dual.c	Tue Aug 22 02:03:52 2017 +0100
@@ -92,7 +92,7 @@
     ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
     if (ckpEncryptedPart == NULL) {
         free(ckpPart);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
@@ -144,7 +144,7 @@
     ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
     if (ckpPart == NULL) {
         free(ckpEncryptedPart);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
@@ -196,7 +196,7 @@
     ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
     if (ckpEncryptedPart == NULL) {
         free(ckpPart);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
@@ -248,7 +248,7 @@
     ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
     if (ckpPart == NULL) {
         free(ckpEncryptedPart);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_general.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_general.c	Tue Aug 22 02:03:52 2017 +0100
@@ -71,7 +71,10 @@
 jclass jByteArrayClass;
 jclass jLongClass;
 
+JavaVM* jvm = NULL;
+
 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
+    jvm = vm;
     return JNI_VERSION_1_4;
 }
 
@@ -353,7 +356,7 @@
 
     ckpSlotList = (CK_SLOT_ID_PTR) malloc(ckTokenNumber * sizeof(CK_SLOT_ID));
     if (ckpSlotList == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
@@ -654,7 +657,7 @@
     ckpMechanismList = (CK_MECHANISM_TYPE_PTR)
       malloc(ckMechanismNumber * sizeof(CK_MECHANISM_TYPE));
     if (ckpMechanismList == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c	Tue Aug 22 02:03:52 2017 +0100
@@ -165,7 +165,7 @@
         if (ckMechanism.pParameter != NULL_PTR) {
             free(ckMechanism.pParameter);
         }
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     ckpPublicKeyHandle = ckpKeyHandles;   /* first element of array is Public Key */
@@ -253,7 +253,7 @@
             if (ckMechanism.pParameter != NULL_PTR) {
                 free(ckMechanism.pParameter);
             }
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return NULL;
         }
 
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_mutex.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_mutex.c	Tue Aug 22 02:03:52 2017 +0100
@@ -92,7 +92,7 @@
     /* convert the Java InitArgs object to a pointer to a CK_C_INITIALIZE_ARGS structure */
     ckpInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
     if (ckpInitArgs == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL_PTR;
     }
 
@@ -112,22 +112,34 @@
     ckpInitArgs->UnlockMutex = NULL_PTR;
 #else
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
     ckpInitArgs->CreateMutex = (jMutexHandler != NULL) ? &callJCreateMutex : NULL_PTR;
 
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
     ckpInitArgs->DestroyMutex = (jMutexHandler != NULL) ? &callJDestroyMutex : NULL_PTR;
 
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
     ckpInitArgs->LockMutex = (jMutexHandler != NULL) ? &callJLockMutex : NULL_PTR;
 
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
     ckpInitArgs->UnlockMutex = (jMutexHandler != NULL) ? &callJUnlockMutex : NULL_PTR;
 
@@ -141,7 +153,7 @@
         ckpGlobalInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
         if (ckpGlobalInitArgs == NULL) {
             free(ckpInitArgs);
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return NULL_PTR;
         }
 
@@ -151,13 +163,19 @@
 
     /* convert and set the flags field */
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "flags", "J");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jFlags = (*env)->GetLongField(env, jInitArgs, fieldID);
     ckpInitArgs->flags = jLongToCKULong(jFlags);
 
     /* pReserved should be NULL_PTR in this version */
     fieldID = (*env)->GetFieldID(env, jInitArgsClass, "pReserved", "Ljava/lang/Object;");
-    if (fieldID == NULL) { return NULL; }
+    if (fieldID == NULL) {
+        free(ckpInitArgs);
+        return NULL;
+    }
     jReserved = (*env)->GetObjectField(env, jInitArgs, fieldID);
 
     /* we try to convert the reserved parameter also */
@@ -178,9 +196,8 @@
  */
 CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex)
 {
-    JavaVM *jvm;
+    extern JavaVM *jvm;
     JNIEnv *env;
-    jsize actualNumberVMs;
     jint returnValue;
     jthrowable pkcs11Exception;
     jclass pkcs11ExceptionClass;
@@ -196,8 +213,7 @@
 
 
     /* Get the currently running Java VM */
-    returnValue = JNI_GetCreatedJavaVMs(&jvm, (jsize) 1, &actualNumberVMs);
-    if ((returnValue != 0) || (actualNumberVMs <= 0)) { return rv ;} /* there is no VM running */
+    if (jvm == NULL) { return rv ;} /* there is no VM running */
 
     /* Determine, if current thread is already attached */
     returnValue = (*jvm)->GetEnv(jvm, (void **) &env, JNI_VERSION_1_2);
@@ -273,9 +289,8 @@
  */
 CK_RV callJDestroyMutex(CK_VOID_PTR pMutex)
 {
-    JavaVM *jvm;
+    extern JavaVM *jvm;
     JNIEnv *env;
-    jsize actualNumberVMs;
     jint returnValue;
     jthrowable pkcs11Exception;
     jclass pkcs11ExceptionClass;
@@ -291,8 +306,7 @@
 
 
     /* Get the currently running Java VM */
-    returnValue = JNI_GetCreatedJavaVMs(&jvm, (jsize) 1, &actualNumberVMs);
-    if ((returnValue != 0) || (actualNumberVMs <= 0)) { return rv ; } /* there is no VM running */
+    if (jvm == NULL) { return rv ; } /* there is no VM running */
 
     /* Determine, if current thread is already attached */
     returnValue = (*jvm)->GetEnv(jvm, (void **) &env, JNI_VERSION_1_2);
@@ -367,9 +381,8 @@
  */
 CK_RV callJLockMutex(CK_VOID_PTR pMutex)
 {
-    JavaVM *jvm;
+    extern JavaVM *jvm;
     JNIEnv *env;
-    jsize actualNumberVMs;
     jint returnValue;
     jthrowable pkcs11Exception;
     jclass pkcs11ExceptionClass;
@@ -385,8 +398,7 @@
 
 
     /* Get the currently running Java VM */
-    returnValue = JNI_GetCreatedJavaVMs(&jvm, (jsize) 1, &actualNumberVMs);
-    if ((returnValue != 0) || (actualNumberVMs <= 0)) { return rv ; } /* there is no VM running */
+    if (jvm == NULL) { return rv ; } /* there is no VM running */
 
     /* Determine, if current thread is already attached */
     returnValue = (*jvm)->GetEnv(jvm, (void **) &env, JNI_VERSION_1_2);
@@ -457,9 +469,8 @@
  */
 CK_RV callJUnlockMutex(CK_VOID_PTR pMutex)
 {
-    JavaVM *jvm;
+    extern JavaVM *jvm;
     JNIEnv *env;
-    jsize actualNumberVMs;
     jint returnValue;
     jthrowable pkcs11Exception;
     jclass pkcs11ExceptionClass;
@@ -475,8 +486,7 @@
 
 
     /* Get the currently running Java VM */
-    returnValue = JNI_GetCreatedJavaVMs(&jvm, (jsize) 1, &actualNumberVMs);
-    if ((returnValue != 0) || (actualNumberVMs <= 0)) { return rv ; } /* there is no VM running */
+    if (jvm == NULL) { return rv ; } /* there is no VM running */
 
     /* Determine, if current thread is already attached */
     returnValue = (*jvm)->GetEnv(jvm, (void **) &env, JNI_VERSION_1_2);
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c	Tue Aug 22 02:03:52 2017 +0100
@@ -258,7 +258,7 @@
         ckpAttributes[i].pValue = (void *) malloc(ckBufferLength);
         if (ckpAttributes[i].pValue == NULL) {
             freeCKAttributeArray(ckpAttributes, i);
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
         ckpAttributes[i].ulValueLen = ckBufferLength;
@@ -390,7 +390,7 @@
     ckMaxObjectLength = jLongToCKULong(jMaxObjectCount);
     ckpObjectHandleArray = (CK_OBJECT_HANDLE_PTR) malloc(sizeof(CK_OBJECT_HANDLE) * ckMaxObjectLength);
     if (ckpObjectHandleArray == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c	Tue Aug 22 02:03:52 2017 +0100
@@ -98,7 +98,7 @@
     if (jNotify != NULL) {
         notifyEncapsulation = (NotifyEncapsulation *) malloc(sizeof(NotifyEncapsulation));
         if (notifyEncapsulation == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return 0L;
         }
         notifyEncapsulation->jApplicationData = (jApplication != NULL)
@@ -301,7 +301,7 @@
 
     ckpState = (CK_BYTE_PTR) malloc(ckStateLength);
     if (ckpState == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
@@ -435,7 +435,7 @@
 
     newNode = (NotifyListNode *) malloc(sizeof(NotifyListNode));
     if (newNode == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     newNode->hSession = hSession;
@@ -558,9 +558,8 @@
 )
 {
     NotifyEncapsulation *notifyEncapsulation;
-    JavaVM *jvm;
+    extern JavaVM *jvm;
     JNIEnv *env;
-    jsize actualNumberVMs;
     jint returnValue;
     jlong jSessionHandle;
     jlong jEvent;
@@ -577,8 +576,7 @@
     notifyEncapsulation = (NotifyEncapsulation *) pApplication;
 
     /* Get the currently running Java VM */
-    returnValue = JNI_GetCreatedJavaVMs(&jvm, (jsize) 1, &actualNumberVMs);
-    if ((returnValue != 0) || (actualNumberVMs <= 0)) { return rv ; } /* there is no VM running */
+    if (jvm == NULL) { return rv ; } /* there is no VM running */
 
     /* Determine, if current thread is already attached */
     returnValue = (*jvm)->GetEnv(jvm, (void **) &env, JNI_VERSION_1_2);
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c	Tue Aug 22 02:03:52 2017 +0100
@@ -133,7 +133,7 @@
     ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
     if (ckpSignature == NULL) {
         free(ckpData);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
 
@@ -147,7 +147,7 @@
     ckpSignature = (CK_BYTE_PTR) malloc(256 * sizeof(CK_BYTE));
     if (ckpSignature == NULL) {
         free(ckpData);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
@@ -157,7 +157,7 @@
         ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
         if (ckpSignature == NULL) {
             free(ckpData);
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return NULL;
         }
         rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
@@ -211,7 +211,7 @@
         bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
         bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
         if (bufP == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
     }
@@ -271,7 +271,7 @@
     if (rv == CKR_BUFFER_TOO_SMALL) {
         bufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
         if (bufP == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return NULL;
         }
         rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
@@ -356,7 +356,7 @@
     } else {
         inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
         if (inBufP == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return 0;
         }
     }
@@ -374,7 +374,7 @@
             if (inBufP != INBUF) {
                 free(inBufP);
             }
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return 0;
         }
         rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
@@ -509,7 +509,7 @@
         bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
         bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
         if (bufP == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
     }
@@ -639,7 +639,7 @@
     } else {
         inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
         if (inBufP == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return 0;
         }
     }
@@ -657,7 +657,7 @@
         outBufP = (CK_BYTE_PTR) malloc(ckDataLength);
         if (outBufP == NULL) {
             if (inBufP != INBUF) { free(inBufP); }
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return 0;
         }
         rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
--- a/src/share/native/sun/security/pkcs11/wrapper/p11_util.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/p11_util.c	Tue Aug 22 02:03:52 2017 +0100
@@ -213,28 +213,52 @@
     return jErrorCode ;
 }
 
+
 /*
- * This function simply throws an IOException
- *
- * @param env Used to call JNI funktions and to get the Exception class.
- * @param message The message string of the Exception object.
+ * Throws a Java Exception by name
+ */
+void throwByName(JNIEnv *env, const char *name, const char *msg)
+{
+    jclass cls = (*env)->FindClass(env, name);
+
+    if (cls != 0) /* Otherwise an exception has already been thrown */
+        (*env)->ThrowNew(env, cls, msg);
+}
+
+/*
+ * Throws java.lang.OutOfMemoryError
  */
-void throwIOException(JNIEnv *env, const char *message)
+void throwOutOfMemoryError(JNIEnv *env, const char *msg)
+{
+    throwByName(env, "java/lang/OutOfMemoryError", msg);
+}
+
+/*
+ * Throws java.lang.NullPointerException
+ */
+void throwNullPointerException(JNIEnv *env, const char *msg)
 {
-    JNU_ThrowByName(env, CLASS_IO_EXCEPTION, message);
+    throwByName(env, "java/lang/NullPointerException", msg);
+}
+
+/*
+ * Throws java.io.IOException
+ */
+void throwIOException(JNIEnv *env, const char *msg)
+{
+    throwByName(env, "java/io/IOException", msg);
 }
 
 /*
  * This function simply throws a PKCS#11RuntimeException with the given
- * string as its message. If the message is NULL, the exception is created
- * using the default constructor.
+ * string as its message.
  *
  * @param env Used to call JNI funktions and to get the Exception class.
  * @param jmessage The message string of the Exception object.
  */
 void throwPKCS11RuntimeException(JNIEnv *env, const char *message)
 {
-    JNU_ThrowByName(env, CLASS_PKCS11RUNTIMEEXCEPTION, message);
+    throwByName(env, CLASS_PKCS11RUNTIMEEXCEPTION, message);
 }
 
 /*
@@ -318,7 +342,7 @@
     *ckpLength = (*env)->GetArrayLength(env, jArray);
     jpTemp = (jboolean*) malloc((*ckpLength) * sizeof(jboolean));
     if (jpTemp == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     (*env)->GetBooleanArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
@@ -330,7 +354,7 @@
     *ckpArray = (CK_BBOOL*) malloc ((*ckpLength) * sizeof(CK_BBOOL));
     if (*ckpArray == NULL) {
         free(jpTemp);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     for (i=0; i<(*ckpLength); i++) {
@@ -360,7 +384,7 @@
     *ckpLength = (*env)->GetArrayLength(env, jArray);
     jpTemp = (jbyte*) malloc((*ckpLength) * sizeof(jbyte));
     if (jpTemp == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     (*env)->GetByteArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
@@ -376,7 +400,7 @@
         *ckpArray = (CK_BYTE_PTR) malloc ((*ckpLength) * sizeof(CK_BYTE));
         if (*ckpArray == NULL) {
             free(jpTemp);
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return;
         }
         for (i=0; i<(*ckpLength); i++) {
@@ -407,7 +431,7 @@
     *ckpLength = (*env)->GetArrayLength(env, jArray);
     jTemp = (jlong*) malloc((*ckpLength) * sizeof(jlong));
     if (jTemp == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     (*env)->GetLongArrayRegion(env, jArray, 0, *ckpLength, jTemp);
@@ -419,7 +443,7 @@
     *ckpArray = (CK_ULONG_PTR) malloc (*ckpLength * sizeof(CK_ULONG));
     if (*ckpArray == NULL) {
         free(jTemp);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     for (i=0; i<(*ckpLength); i++) {
@@ -449,7 +473,7 @@
     *ckpLength = (*env)->GetArrayLength(env, jArray);
     jpTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
     if (jpTemp == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     (*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
@@ -461,7 +485,7 @@
     *ckpArray = (CK_CHAR_PTR) malloc (*ckpLength * sizeof(CK_CHAR));
     if (*ckpArray == NULL) {
         free(jpTemp);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     for (i=0; i<(*ckpLength); i++) {
@@ -491,7 +515,7 @@
     *ckpLength = (*env)->GetArrayLength(env, jArray);
     jTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
     if (jTemp == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     (*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jTemp);
@@ -503,7 +527,7 @@
     *ckpArray = (CK_UTF8CHAR_PTR) malloc (*ckpLength * sizeof(CK_UTF8CHAR));
     if (*ckpArray == NULL) {
         free(jTemp);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     for (i=0; i<(*ckpLength); i++) {
@@ -538,7 +562,7 @@
     *ckpArray = (CK_UTF8CHAR_PTR) malloc((*ckpLength + 1) * sizeof(CK_UTF8CHAR));
     if (*ckpArray == NULL) {
         (*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     strcpy((char*)*ckpArray, pCharArray);
@@ -571,7 +595,7 @@
     *ckpLength = jLongToCKULong(jLength);
     *ckpArray = (CK_ATTRIBUTE_PTR) malloc(*ckpLength * sizeof(CK_ATTRIBUTE));
     if (*ckpArray == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     TRACE1(", converting %d attibutes", jLength);
@@ -613,7 +637,7 @@
     } else {
         jpTemp = (jbyte*) malloc((ckLength) * sizeof(jbyte));
         if (jpTemp == NULL) {
-            JNU_ThrowOutOfMemoryError(env, 0);
+            throwOutOfMemoryError(env, 0);
             return NULL;
         }
         for (i=0; i<ckLength; i++) {
@@ -647,7 +671,7 @@
 
     jpTemp = (jlong*) malloc((ckLength) * sizeof(jlong));
     if (jpTemp == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     for (i=0; i<ckLength; i++) {
@@ -678,7 +702,7 @@
 
     jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
     if (jpTemp == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     for (i=0; i<ckLength; i++) {
@@ -709,7 +733,7 @@
 
     jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
     if (jpTemp == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     for (i=0; i<ckLength; i++) {
@@ -812,7 +836,7 @@
     jValue = (*env)->CallBooleanMethod(env, jObject, jValueMethod);
     ckpValue = (CK_BBOOL *) malloc(sizeof(CK_BBOOL));
     if (ckpValue == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     *ckpValue = jBooleanToCKBBool(jValue);
@@ -842,7 +866,7 @@
     jValue = (*env)->CallByteMethod(env, jObject, jValueMethod);
     ckpValue = (CK_BYTE_PTR) malloc(sizeof(CK_BYTE));
     if (ckpValue == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     *ckpValue = jByteToCKByte(jValue);
@@ -871,7 +895,7 @@
     jValue = (*env)->CallIntMethod(env, jObject, jValueMethod);
     ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
     if (ckpValue == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     *ckpValue = jLongToCKLong(jValue);
@@ -900,7 +924,7 @@
     jValue = (*env)->CallLongMethod(env, jObject, jValueMethod);
     ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
     if (ckpValue == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     *ckpValue = jLongToCKULong(jValue);
@@ -930,7 +954,7 @@
     jValue = (*env)->CallCharMethod(env, jObject, jValueMethod);
     ckpValue = (CK_CHAR_PTR) malloc(sizeof(CK_CHAR));
     if (ckpValue == NULL) {
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return NULL;
     }
     *ckpValue = jCharToCKChar(jValue);
@@ -1087,7 +1111,7 @@
         malloc((strlen(exceptionMsgPrefix) + strlen(classNameString) + 1));
     if (exceptionMsg == NULL) {
         (*env)->ReleaseStringUTFChars(env, jClassNameString, classNameString);
-        JNU_ThrowOutOfMemoryError(env, 0);
+        throwOutOfMemoryError(env, 0);
         return;
     }
     strcpy(exceptionMsg, exceptionMsgPrefix);
--- a/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Tue Aug 22 02:03:52 2017 +0100
@@ -228,7 +228,6 @@
 #define CLASS_PKCS11EXCEPTION "sun/security/pkcs11/wrapper/PKCS11Exception"
 #define CLASS_PKCS11RUNTIMEEXCEPTION "sun/security/pkcs11/wrapper/PKCS11RuntimeException"
 #define CLASS_FILE_NOT_FOUND_EXCEPTION "java/io/FileNotFoundException"
-#define CLASS_IO_EXCEPTION "java/io/IOException"
 #define CLASS_C_INITIALIZE_ARGS "sun/security/pkcs11/wrapper/CK_C_INITIALIZE_ARGS"
 #define CLASS_CREATEMUTEX "sun/security/pkcs11/wrapper/CK_CREATEMUTEX"
 #define CLASS_DESTROYMUTEX "sun/security/pkcs11/wrapper/CK_DESTROYMUTEX"
@@ -280,6 +279,8 @@
  */
 
 jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue);
+void throwOutOfMemoryError(JNIEnv *env, const char *message);
+void throwNullPointerException(JNIEnv *env, const char *message);
 void throwIOException(JNIEnv *env, const char *message);
 void throwPKCS11RuntimeException(JNIEnv *env, const char *message);
 void throwDisconnectedRuntimeException(JNIEnv *env);
--- a/src/share/npt/npt.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/share/npt/npt.h	Tue Aug 22 02:03:52 2017 +0100
@@ -94,13 +94,13 @@
 
 JNIEXPORT void JNICALL nptInitialize
                        (NptEnv **pnpt, char *nptVersion, char *options);
-typedef JNIEXPORT void (JNICALL *NptInitialize)
-                       (NptEnv **pnpt, char *nptVersion, char *options);
+typedef void (JNICALL *NptInitialize)
+             (NptEnv **pnpt, char *nptVersion, char *options);
 
 JNIEXPORT void JNICALL nptTerminate
                        (NptEnv* npt, char *options);
-typedef JNIEXPORT void (JNICALL *NptTerminate)
-                       (NptEnv* npt, char *options);
+typedef void (JNICALL *NptTerminate)
+             (NptEnv* npt, char *options);
 
 #ifdef __cplusplus
 } /* extern "C" */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/bin/aarch64/jvm.cfg	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,36 @@
+# Copyright (c) 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.
+#
+# List of JVMs that can be used as an option to java, javac, etc.
+# Order is important -- first in this list is the default JVM.
+# NOTE that this both this file and its format are UNSUPPORTED and
+# WILL GO AWAY in a future release.
+#
+# You may also select a JVM in an arbitrary location with the
+# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
+# and may not be available in a future release.
+#
+# n.b. server must be first so it is used as the default
+-server KNOWN
+-client ALIASED_TO -server
+-minimal ERROR
--- a/src/solaris/bin/java_md_solinux.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/bin/java_md_solinux.c	Tue Aug 22 02:03:52 2017 +0100
@@ -487,9 +487,11 @@
         JLI_TraceLauncher("mustsetenv: %s\n", mustsetenv ? "TRUE" : "FALSE");
 
         if (mustsetenv == JNI_FALSE) {
+            JLI_MemFree(newargv);
             return;
         }
 #else
+        JLI_MemFree(newargv);
         return;
 #endif /* SETENV_REQUIRED */
       } else {  /* do the same speculatively or exit */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/bin/ppc64le/jvm.cfg	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,33 @@
+# Copyright (c) 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.
+#
+# List of JVMs that can be used as an option to java, javac, etc.
+# Order is important -- first in this list is the default JVM.
+# NOTE that this both this file and its format are UNSUPPORTED and
+# WILL GO AWAY in a future release.
+#
+# You may also select a JVM in an arbitrary location with the
+# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
+# and may not be available in a future release.
+#
+-server KNOWN
--- a/src/solaris/classes/java/net/PlainDatagramSocketImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/java/net/PlainDatagramSocketImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007,2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -110,6 +110,8 @@
 
     protected native void disconnect0(int family);
 
+    native int dataAvailable();
+
     /**
      * Perform class load-time initializations.
      */
--- a/src/solaris/classes/sun/awt/UNIXToolkit.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/awt/UNIXToolkit.java	Tue Aug 22 02:03:52 2017 +0100
@@ -99,6 +99,12 @@
     public boolean loadGTK() {
         synchronized (GTK_LOCK) {
             if (nativeGTKLoaded == null) {
+                AccessController.doPrivileged(new PrivilegedAction<Void>() {
+                    public Void run() {
+                        System.loadLibrary("javagtk");
+                        return null;
+                    }
+                });
                 boolean success = load_gtk();
                 nativeGTKLoaded = Boolean.valueOf(success);
             }
--- a/src/solaris/classes/sun/awt/X11/XFramePeer.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/awt/X11/XFramePeer.java	Tue Aug 22 02:03:52 2017 +0100
@@ -284,6 +284,11 @@
             if (stateLog.isLoggable(PlatformLogger.Level.FINER)) {
                 stateLog.finer("DeIconifying " + this);
             }
+
+            XNETProtocol net_protocol = XWM.getWM().getNETProtocol();
+            if (net_protocol != null) {
+                net_protocol.setActiveWindow(this);
+            }
             xSetVisible(true);
         }
     }
--- a/src/solaris/classes/sun/awt/X11/XNETProtocol.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/awt/X11/XNETProtocol.java	Tue Aug 22 02:03:52 2017 +0100
@@ -213,7 +213,7 @@
      * If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list
      * @param window Window which NET_WM_STATE property is being modified
      * @param state State atom to be set/reset
-     * @param reset Indicates operation, 'set' if false, 'reset' if true
+     * @param set Indicates operation, 'set' if false, 'reset' if true
      */
     private void setStateHelper(XWindowPeer window, XAtom state, boolean set) {
         if (log.isLoggable(PlatformLogger.Level.FINER)) {
@@ -249,6 +249,7 @@
     XAtom XA_UTF8_STRING = XAtom.get("UTF8_STRING");   /* like STRING but encoding is UTF-8 */
     XAtom XA_NET_SUPPORTING_WM_CHECK = XAtom.get("_NET_SUPPORTING_WM_CHECK");
     XAtom XA_NET_SUPPORTED = XAtom.get("_NET_SUPPORTED");      /* list of protocols (property of root) */
+    XAtom XA_NET_ACTIVE_WINDOW = XAtom.get("_NET_ACTIVE_WINDOW");
     XAtom XA_NET_WM_NAME = XAtom.get("_NET_WM_NAME");  /* window property */
     XAtom XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");/* both window property and request */
 
@@ -325,6 +326,32 @@
         return res;
     }
 
+    public void setActiveWindow(XWindow window) {
+        if (!active() || !checkProtocol(XA_NET_SUPPORTED, XA_NET_ACTIVE_WINDOW)) {
+            return;
+        }
+
+        XClientMessageEvent msg = new XClientMessageEvent();
+        msg.zero();
+        msg.set_type(XConstants.ClientMessage);
+        msg.set_message_type(XA_NET_ACTIVE_WINDOW.getAtom());
+        msg.set_display(XToolkit.getDisplay());
+        msg.set_window(window.getWindow());
+        msg.set_format(32);
+        msg.set_data(0, 1);
+        msg.set_data(1, XToolkit.getCurrentServerTime());
+        msg.set_data(2, 0);
+
+        XToolkit.awtLock();
+        try {
+            XlibWrapper.XSendEvent(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), false,
+                    XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, msg.getPData());
+        } finally {
+            XToolkit.awtUnlock();
+            msg.dispose();
+        }
+    }
+
     boolean isWMName(String name) {
         if (!active()) {
             return false;
--- a/src/solaris/classes/sun/awt/X11/XToolkit.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/awt/X11/XToolkit.java	Tue Aug 22 02:03:52 2017 +0100
@@ -767,10 +767,32 @@
                     // managers don't set this hint correctly, so we just get intersection with windowBounds
                     if (windowBounds != null && windowBounds.intersects(screenBounds))
                     {
-                        insets.left = Math.max((int)Native.getLong(native_ptr, 0), insets.left);
-                        insets.right = Math.max((int)Native.getLong(native_ptr, 1), insets.right);
-                        insets.top = Math.max((int)Native.getLong(native_ptr, 2), insets.top);
-                        insets.bottom = Math.max((int)Native.getLong(native_ptr, 3), insets.bottom);
+                        int left = (int)Native.getLong(native_ptr, 0);
+                        int right = (int)Native.getLong(native_ptr, 1);
+                        int top = (int)Native.getLong(native_ptr, 2);
+                        int bottom = (int)Native.getLong(native_ptr, 3);
+
+                        /*
+                         * struts could be relative to root window bounds, so
+                         * make them relative to the screen bounds in this case
+                         */
+                        left = rootBounds.x + left > screenBounds.x ?
+                                rootBounds.x + left - screenBounds.x : 0;
+                        right = rootBounds.x + rootBounds.width - right <
+                                screenBounds.x + screenBounds.width ?
+                                screenBounds.x + screenBounds.width -
+                                (rootBounds.x + rootBounds.width - right) : 0;
+                        top = rootBounds.y + top > screenBounds.y ?
+                                rootBounds.y + top - screenBounds.y : 0;
+                        bottom = rootBounds.y + rootBounds.height - bottom <
+                                screenBounds.y + screenBounds.height ?
+                                screenBounds.y + screenBounds.height -
+                                (rootBounds.y + rootBounds.height - bottom) : 0;
+
+                        insets.left = Math.max(left, insets.left);
+                        insets.right = Math.max(right, insets.right);
+                        insets.top = Math.max(top, insets.top);
+                        insets.bottom = Math.max(bottom, insets.bottom);
                     }
                 }
             }
--- a/src/solaris/classes/sun/awt/X11/XWM.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/awt/X11/XWM.java	Tue Aug 22 02:03:52 2017 +0100
@@ -104,7 +104,8 @@
         COMPIZ_WM = 12,
         LG3D_WM = 13,
         CWM_WM = 14,
-        MUTTER_WM = 15;
+        MUTTER_WM = 15,
+        MARCO_WM = 16;
     public String toString() {
         switch  (WMID) {
           case NO_WM:
@@ -135,6 +136,8 @@
               return "CWM";
           case MUTTER_WM:
               return "Mutter";
+          case MARCO_WM:
+              return "Marco";
           case UNDETERMINED_WM:
           default:
               return "Undetermined WM";
@@ -592,9 +595,15 @@
     }
 
     static boolean isMutter() {
-        return isNetWMName("Mutter");
+        return isNetWMName("Mutter") || isNetWMName("GNOME Shell");
     }
 
+    static boolean isMarco() {
+        return isNetWMName("Marco");
+    }
+
+    // TODO: according to wikipedia, compiz is now reparenting. This should
+    // probably be updated.
     static boolean isNonReparentingWM() {
         return (XWM.getWMID() == XWM.COMPIZ_WM || XWM.getWMID() == XWM.LG3D_WM || XWM.getWMID() == XWM.CWM_WM);
     }
@@ -776,7 +785,7 @@
             } else if (isSawfish()) {
                 awt_wmgr = XWM.SAWFISH_WM;
             } else if (isKDE2()) {
-                awt_wmgr =XWM.KDE2_WM;
+                awt_wmgr = XWM.KDE2_WM;
             } else if (isCompiz()) {
                 awt_wmgr = XWM.COMPIZ_WM;
             } else if (isLookingGlass()) {
@@ -785,6 +794,8 @@
                 awt_wmgr = CWM_WM;
             } else if (doIsIceWM && isIceWM()) {
                 awt_wmgr = XWM.ICE_WM;
+            } else if (isMarco()) {
+                awt_wmgr = XWM.MARCO_WM;
             }
             /*
              * We don't check for legacy WM when we already know that WM
@@ -1088,12 +1099,15 @@
 
     boolean supportsDynamicLayout() {
         int wm = getWMID();
+        // TODO: does mutter support this? It's a fancy new WM, so it probably
+        // does. Confirm and fix this.
         switch (wm) {
           case XWM.ENLIGHTEN_WM:
           case XWM.KDE2_WM:
           case XWM.SAWFISH_WM:
           case XWM.ICE_WM:
           case XWM.METACITY_WM:
+          case XWM.MARCO_WM:
               return true;
           case XWM.OPENLOOK_WM:
           case XWM.MOTIF_WM:
@@ -1120,7 +1134,7 @@
                * WMs that talk NET/WIN protocol, but do not support
                * unidirectional maximization.
                */
-              if (getWMID() == METACITY_WM) {
+              if (getWMID() == METACITY_WM || getWMID() == MARCO_WM) {
                   /* "This is a deliberate policy decision." -hp */
                   return false;
               }
@@ -1420,6 +1434,7 @@
                 return insets;
             }
         }
+        // TODO: figure out if Mutter implements the insets property.
         switch(getWMID()) {
           case XWM.KDE2_WM:
               return getInsetsFromProp(window, XA_KDE_NET_WM_FRAME_STRUT);
@@ -1616,6 +1631,9 @@
                       correctWM.bottom = correctWM.left;
                       break;
                   }
+                  case XWM.MUTTER_WM:
+                      // TODO: Figure out if Mutter is double reparenting.
+                      // For now the fallback code is good enough.
                   case XWM.OTHER_WM:
                   default: {                /* this is very similar to the E! case above */
                       if (insLog.isLoggable(PlatformLogger.Level.FINEST)) {
--- a/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1162,6 +1162,8 @@
 
     boolean isOverrideRedirect() {
         return XWM.getWMID() == XWM.OPENLOOK_WM ||
+            (XWM.getWMID() == XWM.METACITY_WM ? true : false) ||
+            target.getName().equals("###overrideRedirect###") ||
             Window.Type.POPUP.equals(getWindowType());
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/awt/fontconfigs/linux.fontconfig.Fedora.10.properties	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,377 @@
+#
+# 
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# 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.
+#
+
+# Version
+
+# Uses Fedora 9 fonts and file paths.
+version=1
+
+# Component Font Mappings
+
+dialog.plain.latin-1=DejaVu Sans
+dialog.plain.japanese-x0208=Sazanami Gothic
+dialog.plain.korean=Baekmuk Gulim
+dialog.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialog.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.plain.bengali=Lohit Bengali
+dialog.plain.gujarati=Lohit Gujarati
+dialog.plain.hindi=Lohit Hindi
+dialog.plain.malayalam=Lohit Malayalam
+dialog.plain.oriya=Lohit Oriya
+dialog.plain.punjabi=Lohit Punjabi
+dialog.plain.tamil=Lohit Tamil
+dialog.plain.telugu=Lohit Telugu
+dialog.plain.sinhala=LKLUG
+
+dialog.bold.latin-1=DejaVu Sans Bold
+dialog.bold.japanese-x0208=Sazanami Gothic
+dialog.bold.korean=Baekmuk Gulim
+dialog.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bold.bengali=Lohit Bengali
+dialog.bold.gujarati=Lohit Gujarati
+dialog.bold.hindi=Lohit Hindi
+dialog.bold.malayalam=Lohit Malayalam
+dialog.bold.oriya=Lohit Oriya
+dialog.bold.punjabi=Lohit Punjabi
+dialog.bold.tamil=Lohit Tamil
+dialog.bold.telugu=Lohit Telugu
+dialog.bold.sinhala=LKLUG
+
+dialog.italic.latin-1=DejaVu Sans Oblique
+dialog.italic.japanese-x0208=Sazanami Gothic
+dialog.italic.korean=Baekmuk Gulim
+dialog.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.italic.bengali=Lohit Bengali
+dialog.italic.gujarati=Lohit Gujarati
+dialog.italic.hindi=Lohit Hindi
+dialog.italic.malayalam=Lohit Malayalam
+dialog.italic.oriya=Lohit Oriya
+dialog.italic.punjabi=Lohit Punjabi
+dialog.italic.tamil=Lohit Tamil
+dialog.italic.telugu=Lohit Telugu
+dialog.italic.sinhala=LKLUG
+
+dialog.bolditalic.latin-1=DejaVu Sans Bold Oblique
+dialog.bolditalic.japanese-x0208=Sazanami Gothic
+dialog.bolditalic.korean=Baekmuk Gulim
+dialog.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bolditalic.bengali=Lohit Bengali
+dialog.bolditalic.gujarati=Lohit Gujarati
+dialog.bolditalic.hindi=Lohit Hindi
+dialog.bolditalic.malayalam=Lohit Malayalam
+dialog.bolditalic.oriya=Lohit Oriya
+dialog.bolditalic.punjabi=Lohit Punjabi
+dialog.bolditalic.tamil=Lohit Tamil
+dialog.bolditalic.telugu=Lohit Telugu
+dialog.bolditalic.sinhala=LKLUG
+
+sansserif.plain.latin-1=DejaVu Sans
+sansserif.plain.japanese-x0208=Sazanami Gothic
+sansserif.plain.korean=Baekmuk Gulim
+sansserif.plain.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.plain.bengali=Lohit Bengali
+sansserif.plain.gujarati=Lohit Gujarati
+sansserif.plain.hindi=Lohit Hindi
+sansserif.plain.malayalam=Lohit Malayalam
+sansserif.plain.oriya=Lohit Oriya
+sansserif.plain.punjabi=Lohit Punjabi
+sansserif.plain.tamil=Lohit Tamil
+sansserif.plain.telugu=Lohit Telugu
+sansserif.plain.sinhala=LKLUG
+
+sansserif.bold.latin-1=DejaVu Sans Bold
+sansserif.bold.japanese-x0208=Sazanami Gothic
+sansserif.bold.korean=Baekmuk Gulim
+sansserif.bold.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bold.bengali=Lohit Bengali
+sansserif.bold.gujarati=Lohit Gujarati
+sansserif.bold.hindi=Lohit Hindi
+sansserif.bold.malayalam=Lohit Malayalam
+sansserif.bold.oriya=Lohit Oriya
+sansserif.bold.punjabi=Lohit Punjabi
+sansserif.bold.tamil=Lohit Tamil
+sansserif.bold.telugu=Lohit Telugu
+sansserif.bold.sinhala=LKLUG
+
+sansserif.italic.latin-1=DejaVu Sans Oblique
+sansserif.italic.japanese-x0208=Sazanami Gothic
+sansserif.italic.korean=Baekmuk Gulim
+sansserif.italic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.italic.bengali=Lohit Bengali
+sansserif.italic.gujarati=Lohit Gujarati
+sansserif.italic.hindi=Lohit Hindi
+sansserif.italic.malayalam=Lohit Malayalam
+sansserif.italic.oriya=Lohit Oriya
+sansserif.italic.punjabi=Lohit Punjabi
+sansserif.italic.tamil=Lohit Tamil
+sansserif.italic.telugu=Lohit Telugu
+sansserif.italic.sinhala=LKLUG
+
+sansserif.bolditalic.latin-1=DejaVu Sans Bold Oblique
+sansserif.bolditalic.japanese-x0208=Sazanami Gothic
+sansserif.bolditalic.korean=Baekmuk Gulim
+sansserif.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bolditalic.bengali=Lohit Bengali
+sansserif.bolditalic.gujarati=Lohit Gujarati
+sansserif.bolditalic.hindi=Lohit Hindi
+sansserif.bolditalic.malayalam=Lohit Malayalam
+sansserif.bolditalic.oriya=Lohit Oriya
+sansserif.bolditalic.punjabi=Lohit Punjabi
+sansserif.bolditalic.tamil=Lohit Tamil
+sansserif.bolditalic.telugu=Lohit Telugu
+sansserif.bolditalic.sinhala=LKLUG
+
+serif.plain.latin-1=DejaVu Serif
+serif.plain.japanese-x0208=Sazanami Mincho
+serif.plain.korean=Baekmuk Batang
+serif.plain.chinese-big5=AR PL ZenKai Uni
+serif.plain.chinese-gb18030=AR PL ZenKai Uni
+serif.plain.bengali=Lohit Bengali
+serif.plain.gujarati=Lohit Gujarati
+serif.plain.hindi=Lohit Hindi
+serif.plain.malayalam=Lohit Malayalam
+serif.plain.oriya=Lohit Oriya
+serif.plain.punjabi=Lohit Punjabi
+serif.plain.tamil=Lohit Tamil
+serif.plain.telugu=Lohit Telugu
+serif.plain.sinhala=LKLUG
+
+serif.bold.latin-1=DejaVu Serif Bold
+serif.bold.japanese-x0208=Sazanami Mincho
+serif.bold.korean=Baekmuk Batang
+serif.bold.chinese-big5=AR PL ZenKai Uni
+serif.bold.chinese-gb18030=AR PL ZenKai Uni
+serif.bold.bengali=Lohit Bengali
+serif.bold.gujarati=Lohit Gujarati
+serif.bold.hindi=Lohit Hindi
+serif.bold.malayalam=Lohit Malayalam
+serif.bold.oriya=Lohit Oriya
+serif.bold.punjabi=Lohit Punjabi
+serif.bold.tamil=Lohit Tamil
+serif.bold.telugu=Lohit Telugu
+serif.bold.sinhala=LKLUG
+
+serif.italic.latin-1=DejaVu Serif Oblique
+serif.italic.japanese-x0208=Sazanami Mincho
+serif.italic.korean=Baekmuk Batang
+serif.italic.chinese-big5=AR PL ZenKai Uni
+serif.italic.chinese-gb18030=AR PL ZenKai Uni
+serif.italic.bengali=Lohit Bengali
+serif.italic.gujarati=Lohit Gujarati
+serif.italic.hindi=Lohit Hindi
+serif.italic.malayalam=Lohit Malayalam
+serif.italic.oriya=Lohit Oriya
+serif.italic.punjabi=Lohit Punjabi
+serif.italic.tamil=Lohit Tamil
+serif.italic.telugu=Lohit Telugu
+serif.italic.sinhala=LKLUG
+
+serif.bolditalic.latin-1=DejaVu Serif Bold Oblique
+serif.bolditalic.japanese-x0208=Sazanami Mincho
+serif.bolditalic.korean=Baekmuk Batang
+serif.bolditalic.chinese-big5=AR PL ZenKai Uni
+serif.bolditalic.chinese-gb18030=AR PL ZenKai Uni
+serif.bolditalic.bengali=Lohit Bengali
+serif.bolditalic.gujarati=Lohit Gujarati
+serif.bolditalic.hindi=Lohit Hindi
+serif.bolditalic.malayalam=Lohit Malayalam
+serif.bolditalic.oriya=Lohit Oriya
+serif.bolditalic.punjabi=Lohit Punjabi
+serif.bolditalic.tamil=Lohit Tamil
+serif.bolditalic.telugu=Lohit Telugu
+serif.bolditalic.sinhala=LKLUG
+
+monospaced.plain.latin-1=DejaVu Sans Mono
+monospaced.plain.japanese-x0208=Sazanami Gothic
+monospaced.plain.korean=Baekmuk Gulim
+monospaced.plain.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.plain.bengali=Lohit Bengali
+monospaced.plain.gujarati=Lohit Gujarati
+monospaced.plain.hindi=Lohit Hindi
+monospaced.plain.malayalam=Lohit Malayalam
+monospaced.plain.oriya=Lohit Oriya
+monospaced.plain.punjabi=Lohit Punjabi
+monospaced.plain.tamil=Lohit Tamil
+monospaced.plain.telugu=Lohit Telugu
+monospaced.plain.sinhala=LKLUG
+
+monospaced.bold.latin-1=DejaVu Sans Mono Bold
+monospaced.bold.japanese-x0208=Sazanami Gothic
+monospaced.bold.korean=Baekmuk Gulim
+monospaced.bold.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bold.bengali=Lohit Bengali
+monospaced.bold.gujarati=Lohit Gujarati
+monospaced.bold.hindi=Lohit Hindi
+monospaced.bold.malayalam=Lohit Malayalam
+monospaced.bold.oriya=Lohit Oriya
+monospaced.bold.punjabi=Lohit Punjabi
+monospaced.bold.tamil=Lohit Tamil
+monospaced.bold.telugu=Lohit Telugu
+monospaced.bold.sinhala=LKLUG
+
+monospaced.italic.latin-1=DejaVu Sans Mono Oblique
+monospaced.italic.japanese-x0208=Sazanami Gothic
+monospaced.italic.korean=Baekmuk Gulim
+monospaced.italic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.italic.bengali=Lohit Bengali
+monospaced.italic.gujarati=Lohit Gujarati
+monospaced.italic.hindi=Lohit Hindi
+monospaced.italic.malayalam=Lohit Malayalam
+monospaced.italic.oriya=Lohit Oriya
+monospaced.italic.punjabi=Lohit Punjabi
+monospaced.italic.tamil=Lohit Tamil
+monospaced.italic.telugu=Lohit Telugu
+monospaced.italic.sinhala=LKLUG
+
+monospaced.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+monospaced.bolditalic.japanese-x0208=Sazanami Gothic
+monospaced.bolditalic.korean=Baekmuk Gulim
+monospaced.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bolditalic.bengali=Lohit Bengali
+monospaced.bolditalic.gujarati=Lohit Gujarati
+monospaced.bolditalic.hindi=Lohit Hindi
+monospaced.bolditalic.malayalam=Lohit Malayalam
+monospaced.bolditalic.oriya=Lohit Oriya
+monospaced.bolditalic.punjabi=Lohit Punjabi
+monospaced.bolditalic.tamil=Lohit Tamil
+monospaced.bolditalic.telugu=Lohit Telugu
+monospaced.bolditalic.sinhala=LKLUG
+
+dialoginput.plain.latin-1=DejaVu Sans Mono
+dialoginput.plain.japanese-x0208=Sazanami Gothic
+dialoginput.plain.korean=Baekmuk Gulim
+dialoginput.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.plain.bengali=Lohit Bengali
+dialoginput.plain.gujarati=Lohit Gujarati
+dialoginput.plain.hindi=Lohit Hindi
+dialoginput.plain.malayalam=Lohit Malayalam
+dialoginput.plain.oriya=Lohit Oriya
+dialoginput.plain.punjabi=Lohit Punjabi
+dialoginput.plain.tamil=Lohit Tamil
+dialoginput.plain.telugu=Lohit Telugu
+dialoginput.plain.sinhala=LKLUG
+
+dialoginput.bold.latin-1=DejaVu Sans Mono Bold
+dialoginput.bold.japanese-x0208=Sazanami Gothic
+dialoginput.bold.korean=Baekmuk Gulim
+dialoginput.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bold.bengali=Lohit Bengali
+dialoginput.bold.gujarati=Lohit Gujarati
+dialoginput.bold.hindi=Lohit Hindi
+dialoginput.bold.malayalam=Lohit Malayalam
+dialoginput.bold.oriya=Lohit Oriya
+dialoginput.bold.punjabi=Lohit Punjabi
+dialoginput.bold.tamil=Lohit Tamil
+dialoginput.bold.telugu=Lohit Telugu
+dialoginput.bold.sinhala=LKLUG
+
+dialoginput.italic.latin-1=DejaVu Sans Mono Oblique
+dialoginput.italic.japanese-x0208=Sazanami Gothic
+dialoginput.italic.korean=Baekmuk Gulim
+dialoginput.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.italic.bengali=Lohit Bengali
+dialoginput.italic.gujarati=Lohit Gujarati
+dialoginput.italic.hindi=Lohit Hindi
+dialoginput.italic.malayalam=Lohit Malayalam
+dialoginput.italic.oriya=Lohit Oriya
+dialoginput.italic.punjabi=Lohit Punjabi
+dialoginput.italic.tamil=Lohit Tamil
+dialoginput.italic.telugu=Lohit Telugu
+dialoginput.italic.sinhala=LKLUG
+
+dialoginput.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+dialoginput.bolditalic.japanese-x0208=Sazanami Gothic
+dialoginput.bolditalic.korean=Baekmuk Gulim
+dialoginput.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.bengali=Lohit Bengali
+dialoginput.bolditalic.gujarati=Lohit Gujarati
+dialoginput.bolditalic.hindi=Lohit Hindi
+dialoginput.bolditalic.malayalam=Lohit Malayalam
+dialoginput.bolditalic.oriya=Lohit Oriya
+dialoginput.bolditalic.punjabi=Lohit Punjabi
+dialoginput.bolditalic.tamil=Lohit Tamil
+dialoginput.bolditalic.telugu=Lohit Telugu
+dialoginput.bolditalic.sinhala=LKLUG
+
+# Search Sequences
+
+sequence.allfonts=latin-1
+sequence.allfonts.Big5=chinese-big5,latin-1
+sequence.allfonts.x-euc-jp-linux=japanese-x0208,latin-1
+sequence.allfonts.EUC-KR=korean,latin-1
+sequence.allfonts.GB18030=chinese-gb18030,latin-1
+sequence.fallback=chinese-big5,chinese-gb18030,japanese-x0208,korean,bengali,gujarati,hindi,oriya,punjabi,malayalam,tamil,telugu,sinhala
+
+# Font File Names
+
+filename.DejaVu_Sans=/usr/share/fonts/dejavu/DejaVuSans.ttf
+filename.DejaVu_Sans_Bold=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf
+filename.DejaVu_Sans_Oblique=/usr/share/fonts/dejavu/DejaVuSans-Oblique.ttf
+filename.DejaVu_Sans_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSans-BoldOblique.ttf
+
+filename.DejaVu_Sans_Mono=/usr/share/fonts/dejavu/DejaVuSansMono.ttf
+filename.DejaVu_Sans_Mono_Bold=/usr/share/fonts/dejavu/DejaVuSansMono-Bold.ttf
+filename.DejaVu_Sans_Mono_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-Oblique.ttf
+filename.DejaVu_Sans_Mono_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf
+
+filename.DejaVu_Serif=/usr/share/fonts/dejavu/DejaVuSerif.ttf
+filename.DejaVu_Serif_Bold=/usr/share/fonts/dejavu/DejaVuSerif-Bold.ttf
+filename.DejaVu_Serif_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-Oblique.ttf
+filename.DejaVu_Serif_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-BoldOblique.ttf
+
+filename.Sazanami_Gothic=/usr/share/fonts/sazanami-fonts-gothic/sazanami-gothic.ttf
+filename.Sazanami_Mincho=/usr/share/fonts/sazanami-fonts-mincho/sazanami-mincho.ttf
+filename.AR_PL_ShanHeiSun_Uni=/usr/share/fonts/cjkunifonts-uming/uming.ttc
+filename.AR_PL_ZenKai_Uni=/usr/share/fonts/cjkunifonts-ukai/ukai.ttc
+filename.Baekmuk_Gulim=/usr/share/fonts/baekmuk-ttf-gulim/gulim.ttf
+filename.Baekmuk_Batang=/usr/share/fonts/baekmuk-ttf-batang/batang.ttf
+
+filename.Lohit_Bengali=/usr/share/fonts/lohit-bengali/lohit_bn.ttf
+filename.Lohit_Gujarati=/usr/share/fonts/lohit-gujarati/lohit_gu.ttf
+filename.Lohit_Hindi=/usr/share/fonts/lohit-hindi/lohit_hi.ttf
+filename.Lohit_Kannda=/usr/share/fonts/lohit-kannada/lohit_kn.ttf
+filename.Lohit_Malayalam=/usr/share/fonts/lohit-malayalam/lohit_ml.ttf
+filename.Lohit_Oriya=/usr/share/fonts/lohit-oriya/lohit_or.ttf
+filename.Lohit_Punjabi=/usr/share/fonts/lohit-punjabi/lohit_pa.ttf
+filename.Lohit_Tamil=/usr/share/fonts/lohit-tamil/lohit_ta.ttf
+filename.Lohit_Telugu=/usr/share/fonts/lohit-telugu/lohit_te.ttf
+filename.LKLUG=/usr/share/fonts/lklug/lklug.ttf
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/awt/fontconfigs/linux.fontconfig.Fedora.11.properties	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,420 @@
+#
+# 
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# 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.
+#
+
+# Version
+
+# Uses Fedora 9 fonts and file paths.
+version=1
+
+# Component Font Mappings
+
+dialog.plain.latin-1=DejaVu Sans
+dialog.plain.japanese-x0208=Sazanami Gothic
+dialog.plain.korean=Baekmuk Gulim
+dialog.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialog.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.plain.assamese=Lohit Assamese
+dialog.plain.devanagari=Lohit Devanagari
+dialog.plain.bengali=Lohit Bengali
+dialog.plain.gujarati=Lohit Gujarati
+dialog.plain.hindi=Lohit Hindi
+dialog.plain.malayalam=Lohit Malayalam
+dialog.plain.oriya=Lohit Oriya
+dialog.plain.punjabi=Lohit Punjabi
+dialog.plain.tamil=Lohit Tamil
+dialog.plain.telugu=Lohit Telugu
+dialog.plain.sinhala=LKLUG
+
+dialog.bold.latin-1=DejaVu Sans Bold
+dialog.bold.japanese-x0208=Sazanami Gothic
+dialog.bold.korean=Baekmuk Gulim
+dialog.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bold.assamese=Lohit Assamese
+dialog.bold.devanagari=Lohit Devanagari
+dialog.bold.bengali=Lohit Bengali
+dialog.bold.gujarati=Lohit Gujarati
+dialog.bold.hindi=Lohit Hindi
+dialog.bold.malayalam=Lohit Malayalam
+dialog.bold.oriya=Lohit Oriya
+dialog.bold.punjabi=Lohit Punjabi
+dialog.bold.tamil=Lohit Tamil
+dialog.bold.telugu=Lohit Telugu
+dialog.bold.sinhala=LKLUG
+
+dialog.italic.latin-1=DejaVu Sans Oblique
+dialog.italic.japanese-x0208=Sazanami Gothic
+dialog.italic.korean=Baekmuk Gulim
+dialog.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.italic.assamese=Lohit Assamese
+dialog.italic.devanagari=Lohit Devanagari
+dialog.italic.bengali=Lohit Bengali
+dialog.italic.gujarati=Lohit Gujarati
+dialog.italic.hindi=Lohit Hindi
+dialog.italic.malayalam=Lohit Malayalam
+dialog.italic.oriya=Lohit Oriya
+dialog.italic.punjabi=Lohit Punjabi
+dialog.italic.tamil=Lohit Tamil
+dialog.italic.telugu=Lohit Telugu
+dialog.italic.sinhala=LKLUG
+
+dialog.bolditalic.latin-1=DejaVu Sans Bold Oblique
+dialog.bolditalic.japanese-x0208=Sazanami Gothic
+dialog.bolditalic.korean=Baekmuk Gulim
+dialog.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bolditalic.assamese=Lohit Assamese
+dialog.bolditalic.devanagari=Lohit Devanagari
+dialog.bolditalic.bengali=Lohit Bengali
+dialog.bolditalic.gujarati=Lohit Gujarati
+dialog.bolditalic.hindi=Lohit Hindi
+dialog.bolditalic.malayalam=Lohit Malayalam
+dialog.bolditalic.oriya=Lohit Oriya
+dialog.bolditalic.punjabi=Lohit Punjabi
+dialog.bolditalic.tamil=Lohit Tamil
+dialog.bolditalic.telugu=Lohit Telugu
+dialog.bolditalic.sinhala=LKLUG
+
+sansserif.plain.latin-1=DejaVu Sans
+sansserif.plain.japanese-x0208=Sazanami Gothic
+sansserif.plain.korean=Baekmuk Gulim
+sansserif.plain.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.plain.assamese=Lohit Assamese
+sansserif.plain.devanagari=Lohit Devanagari
+sansserif.plain.bengali=Lohit Bengali
+sansserif.plain.gujarati=Lohit Gujarati
+sansserif.plain.hindi=Lohit Hindi
+sansserif.plain.malayalam=Lohit Malayalam
+sansserif.plain.oriya=Lohit Oriya
+sansserif.plain.punjabi=Lohit Punjabi
+sansserif.plain.tamil=Lohit Tamil
+sansserif.plain.telugu=Lohit Telugu
+sansserif.plain.sinhala=LKLUG
+
+sansserif.bold.latin-1=DejaVu Sans Bold
+sansserif.bold.japanese-x0208=Sazanami Gothic
+sansserif.bold.korean=Baekmuk Gulim
+sansserif.bold.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bold.assamese=Lohit Assamese
+sansserif.bold.devanagari=Lohit Devanagari
+sansserif.bold.bengali=Lohit Bengali
+sansserif.bold.gujarati=Lohit Gujarati
+sansserif.bold.hindi=Lohit Hindi
+sansserif.bold.malayalam=Lohit Malayalam
+sansserif.bold.oriya=Lohit Oriya
+sansserif.bold.punjabi=Lohit Punjabi
+sansserif.bold.tamil=Lohit Tamil
+sansserif.bold.telugu=Lohit Telugu
+sansserif.bold.sinhala=LKLUG
+
+sansserif.italic.latin-1=DejaVu Sans Oblique
+sansserif.italic.japanese-x0208=Sazanami Gothic
+sansserif.italic.korean=Baekmuk Gulim
+sansserif.italic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.italic.assamese=Lohit Assamese
+sansserif.italic.devanagari=Lohit Devanagari
+sansserif.italic.bengali=Lohit Bengali
+sansserif.italic.gujarati=Lohit Gujarati
+sansserif.italic.hindi=Lohit Hindi
+sansserif.italic.malayalam=Lohit Malayalam
+sansserif.italic.oriya=Lohit Oriya
+sansserif.italic.punjabi=Lohit Punjabi
+sansserif.italic.tamil=Lohit Tamil
+sansserif.italic.telugu=Lohit Telugu
+sansserif.italic.sinhala=LKLUG
+
+sansserif.bolditalic.latin-1=DejaVu Sans Bold Oblique
+sansserif.bolditalic.japanese-x0208=Sazanami Gothic
+sansserif.bolditalic.korean=Baekmuk Gulim
+sansserif.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bolditalic.assamese=Lohit Assamese
+sansserif.bolditalic.devanagari=Lohit Devanagari
+sansserif.bolditalic.bengali=Lohit Bengali
+sansserif.bolditalic.gujarati=Lohit Gujarati
+sansserif.bolditalic.hindi=Lohit Hindi
+sansserif.bolditalic.malayalam=Lohit Malayalam
+sansserif.bolditalic.oriya=Lohit Oriya
+sansserif.bolditalic.punjabi=Lohit Punjabi
+sansserif.bolditalic.tamil=Lohit Tamil
+sansserif.bolditalic.telugu=Lohit Telugu
+sansserif.bolditalic.sinhala=LKLUG
+
+serif.plain.latin-1=DejaVu Serif
+serif.plain.japanese-x0208=Sazanami Mincho
+serif.plain.korean=Baekmuk Batang
+serif.plain.chinese-big5=AR PL ZenKai Uni
+serif.plain.chinese-gb18030=AR PL ZenKai Uni
+serif.plain.assamese=Lohit Assamese
+serif.plain.devanagari=Lohit Devanagari
+serif.plain.bengali=Lohit Bengali
+serif.plain.gujarati=Lohit Gujarati
+serif.plain.hindi=Lohit Hindi
+serif.plain.malayalam=Lohit Malayalam
+serif.plain.oriya=Lohit Oriya
+serif.plain.punjabi=Lohit Punjabi
+serif.plain.tamil=Lohit Tamil
+serif.plain.telugu=Lohit Telugu
+serif.plain.sinhala=LKLUG
+
+serif.bold.latin-1=DejaVu Serif Bold
+serif.bold.japanese-x0208=Sazanami Mincho
+serif.bold.korean=Baekmuk Batang
+serif.bold.chinese-big5=AR PL ZenKai Uni
+serif.bold.chinese-gb18030=AR PL ZenKai Uni
+serif.bold.assamese=Lohit Assamese
+serif.bold.devanagari=Lohit Devanagari
+serif.bold.bengali=Lohit Bengali
+serif.bold.gujarati=Lohit Gujarati
+serif.bold.hindi=Lohit Hindi
+serif.bold.malayalam=Lohit Malayalam
+serif.bold.oriya=Lohit Oriya
+serif.bold.punjabi=Lohit Punjabi
+serif.bold.tamil=Lohit Tamil
+serif.bold.telugu=Lohit Telugu
+serif.bold.sinhala=LKLUG
+
+serif.italic.latin-1=DejaVu Serif Oblique
+serif.italic.japanese-x0208=Sazanami Mincho
+serif.italic.korean=Baekmuk Batang
+serif.italic.chinese-big5=AR PL ZenKai Uni
+serif.italic.chinese-gb18030=AR PL ZenKai Uni
+serif.italic.assamese=Lohit Assamese
+serif.italic.devanagari=Lohit Devanagari
+serif.italic.bengali=Lohit Bengali
+serif.italic.gujarati=Lohit Gujarati
+serif.italic.hindi=Lohit Hindi
+serif.italic.malayalam=Lohit Malayalam
+serif.italic.oriya=Lohit Oriya
+serif.italic.punjabi=Lohit Punjabi
+serif.italic.tamil=Lohit Tamil
+serif.italic.telugu=Lohit Telugu
+serif.italic.sinhala=LKLUG
+
+serif.bolditalic.latin-1=DejaVu Serif Bold Oblique
+serif.bolditalic.japanese-x0208=Sazanami Mincho
+serif.bolditalic.korean=Baekmuk Batang
+serif.bolditalic.chinese-big5=AR PL ZenKai Uni
+serif.bolditalic.chinese-gb18030=AR PL ZenKai Uni
+serif.bolditalic.assamese=Lohit Assamese
+serif.bolditalic.devanagari=Lohit Devanagari
+serif.bolditalic.bengali=Lohit Bengali
+serif.bolditalic.gujarati=Lohit Gujarati
+serif.bolditalic.hindi=Lohit Hindi
+serif.bolditalic.malayalam=Lohit Malayalam
+serif.bolditalic.oriya=Lohit Oriya
+serif.bolditalic.punjabi=Lohit Punjabi
+serif.bolditalic.tamil=Lohit Tamil
+serif.bolditalic.telugu=Lohit Telugu
+serif.bolditalic.sinhala=LKLUG
+
+monospaced.plain.latin-1=DejaVu Sans Mono
+monospaced.plain.japanese-x0208=Sazanami Gothic
+monospaced.plain.korean=Baekmuk Gulim
+monospaced.plain.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.plain.assamese=Lohit Assamese
+monospaced.plain.devanagari=Lohit Devanagari
+monospaced.plain.bengali=Lohit Bengali
+monospaced.plain.gujarati=Lohit Gujarati
+monospaced.plain.hindi=Lohit Hindi
+monospaced.plain.malayalam=Lohit Malayalam
+monospaced.plain.oriya=Lohit Oriya
+monospaced.plain.punjabi=Lohit Punjabi
+monospaced.plain.tamil=Lohit Tamil
+monospaced.plain.telugu=Lohit Telugu
+monospaced.plain.sinhala=LKLUG
+
+monospaced.bold.latin-1=DejaVu Sans Mono Bold
+monospaced.bold.japanese-x0208=Sazanami Gothic
+monospaced.bold.korean=Baekmuk Gulim
+monospaced.bold.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bold.assamese=Lohit Assamese
+monospaced.bold.devanagari=Lohit Devanagari
+monospaced.bold.bengali=Lohit Bengali
+monospaced.bold.gujarati=Lohit Gujarati
+monospaced.bold.hindi=Lohit Hindi
+monospaced.bold.malayalam=Lohit Malayalam
+monospaced.bold.oriya=Lohit Oriya
+monospaced.bold.punjabi=Lohit Punjabi
+monospaced.bold.tamil=Lohit Tamil
+monospaced.bold.telugu=Lohit Telugu
+monospaced.bold.sinhala=LKLUG
+
+monospaced.italic.latin-1=DejaVu Sans Mono Oblique
+monospaced.italic.japanese-x0208=Sazanami Gothic
+monospaced.italic.korean=Baekmuk Gulim
+monospaced.italic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.italic.assamese=Lohit Assamese
+monospaced.italic.devanagari=Lohit Devanagari
+monospaced.italic.bengali=Lohit Bengali
+monospaced.italic.gujarati=Lohit Gujarati
+monospaced.italic.hindi=Lohit Hindi
+monospaced.italic.malayalam=Lohit Malayalam
+monospaced.italic.oriya=Lohit Oriya
+monospaced.italic.punjabi=Lohit Punjabi
+monospaced.italic.tamil=Lohit Tamil
+monospaced.italic.telugu=Lohit Telugu
+monospaced.italic.sinhala=LKLUG
+
+monospaced.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+monospaced.bolditalic.japanese-x0208=Sazanami Gothic
+monospaced.bolditalic.korean=Baekmuk Gulim
+monospaced.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bolditalic.assamese=Lohit Assamese
+monospaced.bolditalic.devanagari=Lohit Devanagari
+monospaced.bolditalic.bengali=Lohit Bengali
+monospaced.bolditalic.gujarati=Lohit Gujarati
+monospaced.bolditalic.hindi=Lohit Hindi
+monospaced.bolditalic.malayalam=Lohit Malayalam
+monospaced.bolditalic.oriya=Lohit Oriya
+monospaced.bolditalic.punjabi=Lohit Punjabi
+monospaced.bolditalic.tamil=Lohit Tamil
+monospaced.bolditalic.telugu=Lohit Telugu
+monospaced.bolditalic.sinhala=LKLUG
+
+dialoginput.plain.latin-1=DejaVu Sans Mono
+dialoginput.plain.japanese-x0208=Sazanami Gothic
+dialoginput.plain.korean=Baekmuk Gulim
+dialoginput.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.plain.assamese=Lohit Assamese
+dialoginput.plain.devanagari=Lohit Devanagari
+dialoginput.plain.bengali=Lohit Bengali
+dialoginput.plain.gujarati=Lohit Gujarati
+dialoginput.plain.hindi=Lohit Hindi
+dialoginput.plain.malayalam=Lohit Malayalam
+dialoginput.plain.oriya=Lohit Oriya
+dialoginput.plain.punjabi=Lohit Punjabi
+dialoginput.plain.tamil=Lohit Tamil
+dialoginput.plain.telugu=Lohit Telugu
+dialoginput.plain.sinhala=LKLUG
+
+dialoginput.bold.latin-1=DejaVu Sans Mono Bold
+dialoginput.bold.japanese-x0208=Sazanami Gothic
+dialoginput.bold.korean=Baekmuk Gulim
+dialoginput.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bold.assamese=Lohit Assamese
+dialoginput.bold.devanagari=Lohit Devanagari
+dialoginput.bold.bengali=Lohit Bengali
+dialoginput.bold.gujarati=Lohit Gujarati
+dialoginput.bold.hindi=Lohit Hindi
+dialoginput.bold.malayalam=Lohit Malayalam
+dialoginput.bold.oriya=Lohit Oriya
+dialoginput.bold.punjabi=Lohit Punjabi
+dialoginput.bold.tamil=Lohit Tamil
+dialoginput.bold.telugu=Lohit Telugu
+dialoginput.bold.sinhala=LKLUG
+
+dialoginput.italic.latin-1=DejaVu Sans Mono Oblique
+dialoginput.italic.japanese-x0208=Sazanami Gothic
+dialoginput.italic.korean=Baekmuk Gulim
+dialoginput.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.italic.assamese=Lohit Assamese
+dialoginput.italic.devanagari=Lohit Devanagari
+dialoginput.italic.bengali=Lohit Bengali
+dialoginput.italic.gujarati=Lohit Gujarati
+dialoginput.italic.hindi=Lohit Hindi
+dialoginput.italic.malayalam=Lohit Malayalam
+dialoginput.italic.oriya=Lohit Oriya
+dialoginput.italic.punjabi=Lohit Punjabi
+dialoginput.italic.tamil=Lohit Tamil
+dialoginput.italic.telugu=Lohit Telugu
+dialoginput.italic.sinhala=LKLUG
+
+dialoginput.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+dialoginput.bolditalic.japanese-x0208=Sazanami Gothic
+dialoginput.bolditalic.korean=Baekmuk Gulim
+dialoginput.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.assamese=Lohit Assamese
+dialoginput.bolditalic.devanagari=Lohit Devanagari
+dialoginput.bolditalic.bengali=Lohit Bengali
+dialoginput.bolditalic.gujarati=Lohit Gujarati
+dialoginput.bolditalic.hindi=Lohit Hindi
+dialoginput.bolditalic.malayalam=Lohit Malayalam
+dialoginput.bolditalic.oriya=Lohit Oriya
+dialoginput.bolditalic.punjabi=Lohit Punjabi
+dialoginput.bolditalic.tamil=Lohit Tamil
+dialoginput.bolditalic.telugu=Lohit Telugu
+dialoginput.bolditalic.sinhala=LKLUG
+
+# Search Sequences
+
+sequence.allfonts=latin-1
+sequence.allfonts.Big5=chinese-big5,latin-1
+sequence.allfonts.x-euc-jp-linux=japanese-x0208,latin-1
+sequence.allfonts.EUC-KR=korean,latin-1
+sequence.allfonts.GB18030=chinese-gb18030,latin-1
+sequence.fallback=chinese-big5,chinese-gb18030,japanese-x0208,korean,bengali,gujarati,hindi,oriya,punjabi,malayalam,tamil,telugu,sinhala
+
+# Font File Names
+
+filename.DejaVu_Sans=/usr/share/fonts/dejavu/DejaVuSans.ttf
+filename.DejaVu_Sans_Bold=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf
+filename.DejaVu_Sans_Oblique=/usr/share/fonts/dejavu/DejaVuSans-Oblique.ttf
+filename.DejaVu_Sans_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSans-BoldOblique.ttf
+
+filename.DejaVu_Sans_Mono=/usr/share/fonts/dejavu/DejaVuSansMono.ttf
+filename.DejaVu_Sans_Mono_Bold=/usr/share/fonts/dejavu/DejaVuSansMono-Bold.ttf
+filename.DejaVu_Sans_Mono_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-Oblique.ttf
+filename.DejaVu_Sans_Mono_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf
+
+filename.DejaVu_Serif=/usr/share/fonts/dejavu/DejaVuSerif.ttf
+filename.DejaVu_Serif_Bold=/usr/share/fonts/dejavu/DejaVuSerif-Bold.ttf
+filename.DejaVu_Serif_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-Oblique.ttf
+filename.DejaVu_Serif_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-BoldOblique.ttf
+
+filename.Sazanami_Gothic=/usr/share/fonts/sazanami/gothic/sazanami-gothic.ttf
+filename.Sazanami_Mincho=/usr/share/fonts/sazanami/mincho/sazanami-mincho.ttf
+filename.AR_PL_ShanHeiSun_Uni=/usr/share/fonts/cjkunifonts-uming/uming.ttc
+filename.AR_PL_ZenKai_Uni=/usr/share/fonts/cjkunifonts-ukai/ukai.ttc
+filename.Baekmuk_Gulim=/usr/share/fonts/baekmuk-ttf/gulim.ttf
+filename.Baekmuk_Batang=/usr/share/fonts/baekmuk-ttf/batang.ttf
+
+filename.Lohit_Assamese=/usr/share/fonts/lohit-assamese/Lohit-Assamese.ttf
+filename.Lohit_Devanagari=/usr/share/fonts/lohit-devanagari/Lohit-Devanagari.ttf
+filename.Lohit_Bengali=/usr/share/fonts/lohit-bengali/Lohit-Bengali.ttf
+filename.Lohit_Gujarati=/usr/share/fonts/lohit-gujarati/Lohit-Gujarati.ttf
+filename.Lohit_Hindi=/usr/share/fonts/lohit-hindi/Lohit-Hindi.ttf
+filename.Lohit_Kannda=/usr/share/fonts/lohit-kannada/Lohit-Kannada.ttf
+filename.Lohit_Malayalam=/usr/share/fonts/lohit-malayalam/Lohit-Malayalam.ttf
+filename.Lohit_Oriya=/usr/share/fonts/lohit-oriya/Lohit-Oriya.ttf
+filename.Lohit_Punjabi=/usr/share/fonts/lohit-punjabi/Lohit-Punjabi.ttf
+filename.Lohit_Tamil=/usr/share/fonts/lohit-tamil/Lohit-Tamil.ttf
+filename.Lohit_Telugu=/usr/share/fonts/lohit-telugu/Lohit-Telugu.ttf
+
+filename.LKLUG=/usr/share/fonts/lklug/lklug.ttf
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/awt/fontconfigs/linux.fontconfig.Fedora.12.properties	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,420 @@
+#
+# 
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# 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.
+#
+
+# Version
+
+# Uses Fedora 9 fonts and file paths.
+version=1
+
+# Component Font Mappings
+
+dialog.plain.latin-1=DejaVu Sans
+dialog.plain.japanese-x0208=Sazanami Gothic
+dialog.plain.korean=Baekmuk Gulim
+dialog.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialog.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.plain.assamese=Lohit Assamese
+dialog.plain.devanagari=Lohit Devanagari
+dialog.plain.bengali=Lohit Bengali
+dialog.plain.gujarati=Lohit Gujarati
+dialog.plain.hindi=Lohit Hindi
+dialog.plain.malayalam=Lohit Malayalam
+dialog.plain.oriya=Lohit Oriya
+dialog.plain.punjabi=Lohit Punjabi
+dialog.plain.tamil=Lohit Tamil
+dialog.plain.telugu=Lohit Telugu
+dialog.plain.sinhala=LKLUG
+
+dialog.bold.latin-1=DejaVu Sans Bold
+dialog.bold.japanese-x0208=Sazanami Gothic
+dialog.bold.korean=Baekmuk Gulim
+dialog.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bold.assamese=Lohit Assamese
+dialog.bold.devanagari=Lohit Devanagari
+dialog.bold.bengali=Lohit Bengali
+dialog.bold.gujarati=Lohit Gujarati
+dialog.bold.hindi=Lohit Hindi
+dialog.bold.malayalam=Lohit Malayalam
+dialog.bold.oriya=Lohit Oriya
+dialog.bold.punjabi=Lohit Punjabi
+dialog.bold.tamil=Lohit Tamil
+dialog.bold.telugu=Lohit Telugu
+dialog.bold.sinhala=LKLUG
+
+dialog.italic.latin-1=DejaVu Sans Oblique
+dialog.italic.japanese-x0208=Sazanami Gothic
+dialog.italic.korean=Baekmuk Gulim
+dialog.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.italic.assamese=Lohit Assamese
+dialog.italic.devanagari=Lohit Devanagari
+dialog.italic.bengali=Lohit Bengali
+dialog.italic.gujarati=Lohit Gujarati
+dialog.italic.hindi=Lohit Hindi
+dialog.italic.malayalam=Lohit Malayalam
+dialog.italic.oriya=Lohit Oriya
+dialog.italic.punjabi=Lohit Punjabi
+dialog.italic.tamil=Lohit Tamil
+dialog.italic.telugu=Lohit Telugu
+dialog.italic.sinhala=LKLUG
+
+dialog.bolditalic.latin-1=DejaVu Sans Bold Oblique
+dialog.bolditalic.japanese-x0208=Sazanami Gothic
+dialog.bolditalic.korean=Baekmuk Gulim
+dialog.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bolditalic.assamese=Lohit Assamese
+dialog.bolditalic.devanagari=Lohit Devanagari
+dialog.bolditalic.bengali=Lohit Bengali
+dialog.bolditalic.gujarati=Lohit Gujarati
+dialog.bolditalic.hindi=Lohit Hindi
+dialog.bolditalic.malayalam=Lohit Malayalam
+dialog.bolditalic.oriya=Lohit Oriya
+dialog.bolditalic.punjabi=Lohit Punjabi
+dialog.bolditalic.tamil=Lohit Tamil
+dialog.bolditalic.telugu=Lohit Telugu
+dialog.bolditalic.sinhala=LKLUG
+
+sansserif.plain.latin-1=DejaVu Sans
+sansserif.plain.japanese-x0208=Sazanami Gothic
+sansserif.plain.korean=Baekmuk Gulim
+sansserif.plain.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.plain.assamese=Lohit Assamese
+sansserif.plain.devanagari=Lohit Devanagari
+sansserif.plain.bengali=Lohit Bengali
+sansserif.plain.gujarati=Lohit Gujarati
+sansserif.plain.hindi=Lohit Hindi
+sansserif.plain.malayalam=Lohit Malayalam
+sansserif.plain.oriya=Lohit Oriya
+sansserif.plain.punjabi=Lohit Punjabi
+sansserif.plain.tamil=Lohit Tamil
+sansserif.plain.telugu=Lohit Telugu
+sansserif.plain.sinhala=LKLUG
+
+sansserif.bold.latin-1=DejaVu Sans Bold
+sansserif.bold.japanese-x0208=Sazanami Gothic
+sansserif.bold.korean=Baekmuk Gulim
+sansserif.bold.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bold.assamese=Lohit Assamese
+sansserif.bold.devanagari=Lohit Devanagari
+sansserif.bold.bengali=Lohit Bengali
+sansserif.bold.gujarati=Lohit Gujarati
+sansserif.bold.hindi=Lohit Hindi
+sansserif.bold.malayalam=Lohit Malayalam
+sansserif.bold.oriya=Lohit Oriya
+sansserif.bold.punjabi=Lohit Punjabi
+sansserif.bold.tamil=Lohit Tamil
+sansserif.bold.telugu=Lohit Telugu
+sansserif.bold.sinhala=LKLUG
+
+sansserif.italic.latin-1=DejaVu Sans Oblique
+sansserif.italic.japanese-x0208=Sazanami Gothic
+sansserif.italic.korean=Baekmuk Gulim
+sansserif.italic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.italic.assamese=Lohit Assamese
+sansserif.italic.devanagari=Lohit Devanagari
+sansserif.italic.bengali=Lohit Bengali
+sansserif.italic.gujarati=Lohit Gujarati
+sansserif.italic.hindi=Lohit Hindi
+sansserif.italic.malayalam=Lohit Malayalam
+sansserif.italic.oriya=Lohit Oriya
+sansserif.italic.punjabi=Lohit Punjabi
+sansserif.italic.tamil=Lohit Tamil
+sansserif.italic.telugu=Lohit Telugu
+sansserif.italic.sinhala=LKLUG
+
+sansserif.bolditalic.latin-1=DejaVu Sans Bold Oblique
+sansserif.bolditalic.japanese-x0208=Sazanami Gothic
+sansserif.bolditalic.korean=Baekmuk Gulim
+sansserif.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bolditalic.assamese=Lohit Assamese
+sansserif.bolditalic.devanagari=Lohit Devanagari
+sansserif.bolditalic.bengali=Lohit Bengali
+sansserif.bolditalic.gujarati=Lohit Gujarati
+sansserif.bolditalic.hindi=Lohit Hindi
+sansserif.bolditalic.malayalam=Lohit Malayalam
+sansserif.bolditalic.oriya=Lohit Oriya
+sansserif.bolditalic.punjabi=Lohit Punjabi
+sansserif.bolditalic.tamil=Lohit Tamil
+sansserif.bolditalic.telugu=Lohit Telugu
+sansserif.bolditalic.sinhala=LKLUG
+
+serif.plain.latin-1=DejaVu Serif
+serif.plain.japanese-x0208=Sazanami Mincho
+serif.plain.korean=Baekmuk Batang
+serif.plain.chinese-big5=AR PL ZenKai Uni
+serif.plain.chinese-gb18030=AR PL ZenKai Uni
+serif.plain.assamese=Lohit Assamese
+serif.plain.devanagari=Lohit Devanagari
+serif.plain.bengali=Lohit Bengali
+serif.plain.gujarati=Lohit Gujarati
+serif.plain.hindi=Lohit Hindi
+serif.plain.malayalam=Lohit Malayalam
+serif.plain.oriya=Lohit Oriya
+serif.plain.punjabi=Lohit Punjabi
+serif.plain.tamil=Lohit Tamil
+serif.plain.telugu=Lohit Telugu
+serif.plain.sinhala=LKLUG
+
+serif.bold.latin-1=DejaVu Serif Bold
+serif.bold.japanese-x0208=Sazanami Mincho
+serif.bold.korean=Baekmuk Batang
+serif.bold.chinese-big5=AR PL ZenKai Uni
+serif.bold.chinese-gb18030=AR PL ZenKai Uni
+serif.bold.assamese=Lohit Assamese
+serif.bold.devanagari=Lohit Devanagari
+serif.bold.bengali=Lohit Bengali
+serif.bold.gujarati=Lohit Gujarati
+serif.bold.hindi=Lohit Hindi
+serif.bold.malayalam=Lohit Malayalam
+serif.bold.oriya=Lohit Oriya
+serif.bold.punjabi=Lohit Punjabi
+serif.bold.tamil=Lohit Tamil
+serif.bold.telugu=Lohit Telugu
+serif.bold.sinhala=LKLUG
+
+serif.italic.latin-1=DejaVu Serif Oblique
+serif.italic.japanese-x0208=Sazanami Mincho
+serif.italic.korean=Baekmuk Batang
+serif.italic.chinese-big5=AR PL ZenKai Uni
+serif.italic.chinese-gb18030=AR PL ZenKai Uni
+serif.italic.assamese=Lohit Assamese
+serif.italic.devanagari=Lohit Devanagari
+serif.italic.bengali=Lohit Bengali
+serif.italic.gujarati=Lohit Gujarati
+serif.italic.hindi=Lohit Hindi
+serif.italic.malayalam=Lohit Malayalam
+serif.italic.oriya=Lohit Oriya
+serif.italic.punjabi=Lohit Punjabi
+serif.italic.tamil=Lohit Tamil
+serif.italic.telugu=Lohit Telugu
+serif.italic.sinhala=LKLUG
+
+serif.bolditalic.latin-1=DejaVu Serif Bold Oblique
+serif.bolditalic.japanese-x0208=Sazanami Mincho
+serif.bolditalic.korean=Baekmuk Batang
+serif.bolditalic.chinese-big5=AR PL ZenKai Uni
+serif.bolditalic.chinese-gb18030=AR PL ZenKai Uni
+serif.bolditalic.assamese=Lohit Assamese
+serif.bolditalic.devanagari=Lohit Devanagari
+serif.bolditalic.bengali=Lohit Bengali
+serif.bolditalic.gujarati=Lohit Gujarati
+serif.bolditalic.hindi=Lohit Hindi
+serif.bolditalic.malayalam=Lohit Malayalam
+serif.bolditalic.oriya=Lohit Oriya
+serif.bolditalic.punjabi=Lohit Punjabi
+serif.bolditalic.tamil=Lohit Tamil
+serif.bolditalic.telugu=Lohit Telugu
+serif.bolditalic.sinhala=LKLUG
+
+monospaced.plain.latin-1=DejaVu Sans Mono
+monospaced.plain.japanese-x0208=Sazanami Gothic
+monospaced.plain.korean=Baekmuk Gulim
+monospaced.plain.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.plain.assamese=Lohit Assamese
+monospaced.plain.devanagari=Lohit Devanagari
+monospaced.plain.bengali=Lohit Bengali
+monospaced.plain.gujarati=Lohit Gujarati
+monospaced.plain.hindi=Lohit Hindi
+monospaced.plain.malayalam=Lohit Malayalam
+monospaced.plain.oriya=Lohit Oriya
+monospaced.plain.punjabi=Lohit Punjabi
+monospaced.plain.tamil=Lohit Tamil
+monospaced.plain.telugu=Lohit Telugu
+monospaced.plain.sinhala=LKLUG
+
+monospaced.bold.latin-1=DejaVu Sans Mono Bold
+monospaced.bold.japanese-x0208=Sazanami Gothic
+monospaced.bold.korean=Baekmuk Gulim
+monospaced.bold.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bold.assamese=Lohit Assamese
+monospaced.bold.devanagari=Lohit Devanagari
+monospaced.bold.bengali=Lohit Bengali
+monospaced.bold.gujarati=Lohit Gujarati
+monospaced.bold.hindi=Lohit Hindi
+monospaced.bold.malayalam=Lohit Malayalam
+monospaced.bold.oriya=Lohit Oriya
+monospaced.bold.punjabi=Lohit Punjabi
+monospaced.bold.tamil=Lohit Tamil
+monospaced.bold.telugu=Lohit Telugu
+monospaced.bold.sinhala=LKLUG
+
+monospaced.italic.latin-1=DejaVu Sans Mono Oblique
+monospaced.italic.japanese-x0208=Sazanami Gothic
+monospaced.italic.korean=Baekmuk Gulim
+monospaced.italic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.italic.assamese=Lohit Assamese
+monospaced.italic.devanagari=Lohit Devanagari
+monospaced.italic.bengali=Lohit Bengali
+monospaced.italic.gujarati=Lohit Gujarati
+monospaced.italic.hindi=Lohit Hindi
+monospaced.italic.malayalam=Lohit Malayalam
+monospaced.italic.oriya=Lohit Oriya
+monospaced.italic.punjabi=Lohit Punjabi
+monospaced.italic.tamil=Lohit Tamil
+monospaced.italic.telugu=Lohit Telugu
+monospaced.italic.sinhala=LKLUG
+
+monospaced.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+monospaced.bolditalic.japanese-x0208=Sazanami Gothic
+monospaced.bolditalic.korean=Baekmuk Gulim
+monospaced.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bolditalic.assamese=Lohit Assamese
+monospaced.bolditalic.devanagari=Lohit Devanagari
+monospaced.bolditalic.bengali=Lohit Bengali
+monospaced.bolditalic.gujarati=Lohit Gujarati
+monospaced.bolditalic.hindi=Lohit Hindi
+monospaced.bolditalic.malayalam=Lohit Malayalam
+monospaced.bolditalic.oriya=Lohit Oriya
+monospaced.bolditalic.punjabi=Lohit Punjabi
+monospaced.bolditalic.tamil=Lohit Tamil
+monospaced.bolditalic.telugu=Lohit Telugu
+monospaced.bolditalic.sinhala=LKLUG
+
+dialoginput.plain.latin-1=DejaVu Sans Mono
+dialoginput.plain.japanese-x0208=Sazanami Gothic
+dialoginput.plain.korean=Baekmuk Gulim
+dialoginput.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.plain.assamese=Lohit Assamese
+dialoginput.plain.devanagari=Lohit Devanagari
+dialoginput.plain.bengali=Lohit Bengali
+dialoginput.plain.gujarati=Lohit Gujarati
+dialoginput.plain.hindi=Lohit Hindi
+dialoginput.plain.malayalam=Lohit Malayalam
+dialoginput.plain.oriya=Lohit Oriya
+dialoginput.plain.punjabi=Lohit Punjabi
+dialoginput.plain.tamil=Lohit Tamil
+dialoginput.plain.telugu=Lohit Telugu
+dialoginput.plain.sinhala=LKLUG
+
+dialoginput.bold.latin-1=DejaVu Sans Mono Bold
+dialoginput.bold.japanese-x0208=Sazanami Gothic
+dialoginput.bold.korean=Baekmuk Gulim
+dialoginput.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bold.assamese=Lohit Assamese
+dialoginput.bold.devanagari=Lohit Devanagari
+dialoginput.bold.bengali=Lohit Bengali
+dialoginput.bold.gujarati=Lohit Gujarati
+dialoginput.bold.hindi=Lohit Hindi
+dialoginput.bold.malayalam=Lohit Malayalam
+dialoginput.bold.oriya=Lohit Oriya
+dialoginput.bold.punjabi=Lohit Punjabi
+dialoginput.bold.tamil=Lohit Tamil
+dialoginput.bold.telugu=Lohit Telugu
+dialoginput.bold.sinhala=LKLUG
+
+dialoginput.italic.latin-1=DejaVu Sans Mono Oblique
+dialoginput.italic.japanese-x0208=Sazanami Gothic
+dialoginput.italic.korean=Baekmuk Gulim
+dialoginput.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.italic.assamese=Lohit Assamese
+dialoginput.italic.devanagari=Lohit Devanagari
+dialoginput.italic.bengali=Lohit Bengali
+dialoginput.italic.gujarati=Lohit Gujarati
+dialoginput.italic.hindi=Lohit Hindi
+dialoginput.italic.malayalam=Lohit Malayalam
+dialoginput.italic.oriya=Lohit Oriya
+dialoginput.italic.punjabi=Lohit Punjabi
+dialoginput.italic.tamil=Lohit Tamil
+dialoginput.italic.telugu=Lohit Telugu
+dialoginput.italic.sinhala=LKLUG
+
+dialoginput.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+dialoginput.bolditalic.japanese-x0208=Sazanami Gothic
+dialoginput.bolditalic.korean=Baekmuk Gulim
+dialoginput.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.assamese=Lohit Assamese
+dialoginput.bolditalic.devanagari=Lohit Devanagari
+dialoginput.bolditalic.bengali=Lohit Bengali
+dialoginput.bolditalic.gujarati=Lohit Gujarati
+dialoginput.bolditalic.hindi=Lohit Hindi
+dialoginput.bolditalic.malayalam=Lohit Malayalam
+dialoginput.bolditalic.oriya=Lohit Oriya
+dialoginput.bolditalic.punjabi=Lohit Punjabi
+dialoginput.bolditalic.tamil=Lohit Tamil
+dialoginput.bolditalic.telugu=Lohit Telugu
+dialoginput.bolditalic.sinhala=LKLUG
+
+# Search Sequences
+
+sequence.allfonts=latin-1
+sequence.allfonts.Big5=chinese-big5,latin-1
+sequence.allfonts.x-euc-jp-linux=japanese-x0208,latin-1
+sequence.allfonts.EUC-KR=korean,latin-1
+sequence.allfonts.GB18030=chinese-gb18030,latin-1
+sequence.fallback=chinese-big5,chinese-gb18030,japanese-x0208,korean,bengali,gujarati,hindi,oriya,punjabi,malayalam,tamil,telugu,sinhala
+
+# Font File Names
+
+filename.DejaVu_Sans=/usr/share/fonts/dejavu/DejaVuSans.ttf
+filename.DejaVu_Sans_Bold=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf
+filename.DejaVu_Sans_Oblique=/usr/share/fonts/dejavu/DejaVuSans-Oblique.ttf
+filename.DejaVu_Sans_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSans-BoldOblique.ttf
+
+filename.DejaVu_Sans_Mono=/usr/share/fonts/dejavu/DejaVuSansMono.ttf
+filename.DejaVu_Sans_Mono_Bold=/usr/share/fonts/dejavu/DejaVuSansMono-Bold.ttf
+filename.DejaVu_Sans_Mono_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-Oblique.ttf
+filename.DejaVu_Sans_Mono_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf
+
+filename.DejaVu_Serif=/usr/share/fonts/dejavu/DejaVuSerif.ttf
+filename.DejaVu_Serif_Bold=/usr/share/fonts/dejavu/DejaVuSerif-Bold.ttf
+filename.DejaVu_Serif_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-Oblique.ttf
+filename.DejaVu_Serif_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-BoldOblique.ttf
+
+filename.Sazanami_Gothic=/usr/share/fonts/sazanami/gothic/sazanami-gothic.ttf
+filename.Sazanami_Mincho=/usr/share/fonts/sazanami/mincho/sazanami-mincho.ttf
+filename.AR_PL_ShanHeiSun_Uni=/usr/share/fonts/cjkunifonts-uming/uming.ttc
+filename.AR_PL_ZenKai_Uni=/usr/share/fonts/cjkunifonts-ukai/ukai.ttc
+filename.Baekmuk_Gulim=/usr/share/fonts/baekmuk-ttf/gulim.ttf
+filename.Baekmuk_Batang=/usr/share/fonts/baekmuk-ttf/batang.ttf
+
+filename.Lohit_Assamese=/usr/share/fonts/lohit-assamese/Lohit-Assamese.ttf
+filename.Lohit_Devanagari=/usr/share/fonts/lohit-devanagari/Lohit-Devanagari.ttf
+filename.Lohit_Bengali=/usr/share/fonts/lohit-bengali/Lohit-Bengali.ttf
+filename.Lohit_Gujarati=/usr/share/fonts/lohit-gujarati/Lohit-Gujarati.ttf
+filename.Lohit_Hindi=/usr/share/fonts/lohit-devanagari/Lohit-Devanagari.ttf
+filename.Lohit_Kannda=/usr/share/fonts/lohit-kannada/Lohit-Kannada.ttf
+filename.Lohit_Malayalam=/usr/share/fonts/lohit-malayalam/Lohit-Malayalam.ttf
+filename.Lohit_Oriya=/usr/share/fonts/lohit-oriya/Lohit-Oriya.ttf
+filename.Lohit_Punjabi=/usr/share/fonts/lohit-punjabi/Lohit-Punjabi.ttf
+filename.Lohit_Tamil=/usr/share/fonts/lohit-tamil/Lohit-Tamil.ttf
+filename.Lohit_Telugu=/usr/share/fonts/lohit-telugu/Lohit-Telugu.ttf
+
+filename.LKLUG=/usr/share/fonts/lklug/lklug.ttf
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/awt/fontconfigs/linux.fontconfig.Fedora.9.properties	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,377 @@
+#
+# 
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# 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.
+#
+
+# Version
+
+# Uses Fedora 9 fonts and file paths.
+version=1
+
+# Component Font Mappings
+
+dialog.plain.latin-1=DejaVu Sans
+dialog.plain.japanese-x0208=Sazanami Gothic
+dialog.plain.korean=Baekmuk Gulim
+dialog.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialog.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.plain.bengali=Lohit Bengali
+dialog.plain.gujarati=Lohit Gujarati
+dialog.plain.hindi=Lohit Hindi
+dialog.plain.malayalam=Lohit Malayalam
+dialog.plain.oriya=Lohit Oriya
+dialog.plain.punjabi=Lohit Punjabi
+dialog.plain.tamil=Lohit Tamil
+dialog.plain.telugu=Lohit Telugu
+dialog.plain.sinhala=LKLUG
+
+dialog.bold.latin-1=DejaVu Sans Bold
+dialog.bold.japanese-x0208=Sazanami Gothic
+dialog.bold.korean=Baekmuk Gulim
+dialog.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bold.bengali=Lohit Bengali
+dialog.bold.gujarati=Lohit Gujarati
+dialog.bold.hindi=Lohit Hindi
+dialog.bold.malayalam=Lohit Malayalam
+dialog.bold.oriya=Lohit Oriya
+dialog.bold.punjabi=Lohit Punjabi
+dialog.bold.tamil=Lohit Tamil
+dialog.bold.telugu=Lohit Telugu
+dialog.bold.sinhala=LKLUG
+
+dialog.italic.latin-1=DejaVu Sans Oblique
+dialog.italic.japanese-x0208=Sazanami Gothic
+dialog.italic.korean=Baekmuk Gulim
+dialog.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.italic.bengali=Lohit Bengali
+dialog.italic.gujarati=Lohit Gujarati
+dialog.italic.hindi=Lohit Hindi
+dialog.italic.malayalam=Lohit Malayalam
+dialog.italic.oriya=Lohit Oriya
+dialog.italic.punjabi=Lohit Punjabi
+dialog.italic.tamil=Lohit Tamil
+dialog.italic.telugu=Lohit Telugu
+dialog.italic.sinhala=LKLUG
+
+dialog.bolditalic.latin-1=DejaVu Sans Bold Oblique
+dialog.bolditalic.japanese-x0208=Sazanami Gothic
+dialog.bolditalic.korean=Baekmuk Gulim
+dialog.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bolditalic.bengali=Lohit Bengali
+dialog.bolditalic.gujarati=Lohit Gujarati
+dialog.bolditalic.hindi=Lohit Hindi
+dialog.bolditalic.malayalam=Lohit Malayalam
+dialog.bolditalic.oriya=Lohit Oriya
+dialog.bolditalic.punjabi=Lohit Punjabi
+dialog.bolditalic.tamil=Lohit Tamil
+dialog.bolditalic.telugu=Lohit Telugu
+dialog.bolditalic.sinhala=LKLUG
+
+sansserif.plain.latin-1=DejaVu Sans
+sansserif.plain.japanese-x0208=Sazanami Gothic
+sansserif.plain.korean=Baekmuk Gulim
+sansserif.plain.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.plain.bengali=Lohit Bengali
+sansserif.plain.gujarati=Lohit Gujarati
+sansserif.plain.hindi=Lohit Hindi
+sansserif.plain.malayalam=Lohit Malayalam
+sansserif.plain.oriya=Lohit Oriya
+sansserif.plain.punjabi=Lohit Punjabi
+sansserif.plain.tamil=Lohit Tamil
+sansserif.plain.telugu=Lohit Telugu
+sansserif.plain.sinhala=LKLUG
+
+sansserif.bold.latin-1=DejaVu Sans Bold
+sansserif.bold.japanese-x0208=Sazanami Gothic
+sansserif.bold.korean=Baekmuk Gulim
+sansserif.bold.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bold.bengali=Lohit Bengali
+sansserif.bold.gujarati=Lohit Gujarati
+sansserif.bold.hindi=Lohit Hindi
+sansserif.bold.malayalam=Lohit Malayalam
+sansserif.bold.oriya=Lohit Oriya
+sansserif.bold.punjabi=Lohit Punjabi
+sansserif.bold.tamil=Lohit Tamil
+sansserif.bold.telugu=Lohit Telugu
+sansserif.bold.sinhala=LKLUG
+
+sansserif.italic.latin-1=DejaVu Sans Oblique
+sansserif.italic.japanese-x0208=Sazanami Gothic
+sansserif.italic.korean=Baekmuk Gulim
+sansserif.italic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.italic.bengali=Lohit Bengali
+sansserif.italic.gujarati=Lohit Gujarati
+sansserif.italic.hindi=Lohit Hindi
+sansserif.italic.malayalam=Lohit Malayalam
+sansserif.italic.oriya=Lohit Oriya
+sansserif.italic.punjabi=Lohit Punjabi
+sansserif.italic.tamil=Lohit Tamil
+sansserif.italic.telugu=Lohit Telugu
+sansserif.italic.sinhala=LKLUG
+
+sansserif.bolditalic.latin-1=DejaVu Sans Bold Oblique
+sansserif.bolditalic.japanese-x0208=Sazanami Gothic
+sansserif.bolditalic.korean=Baekmuk Gulim
+sansserif.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bolditalic.bengali=Lohit Bengali
+sansserif.bolditalic.gujarati=Lohit Gujarati
+sansserif.bolditalic.hindi=Lohit Hindi
+sansserif.bolditalic.malayalam=Lohit Malayalam
+sansserif.bolditalic.oriya=Lohit Oriya
+sansserif.bolditalic.punjabi=Lohit Punjabi
+sansserif.bolditalic.tamil=Lohit Tamil
+sansserif.bolditalic.telugu=Lohit Telugu
+sansserif.bolditalic.sinhala=LKLUG
+
+serif.plain.latin-1=DejaVu Serif
+serif.plain.japanese-x0208=Sazanami Mincho
+serif.plain.korean=Baekmuk Batang
+serif.plain.chinese-big5=AR PL ZenKai Uni
+serif.plain.chinese-gb18030=AR PL ZenKai Uni
+serif.plain.bengali=Lohit Bengali
+serif.plain.gujarati=Lohit Gujarati
+serif.plain.hindi=Lohit Hindi
+serif.plain.malayalam=Lohit Malayalam
+serif.plain.oriya=Lohit Oriya
+serif.plain.punjabi=Lohit Punjabi
+serif.plain.tamil=Lohit Tamil
+serif.plain.telugu=Lohit Telugu
+serif.plain.sinhala=LKLUG
+
+serif.bold.latin-1=DejaVu Serif Bold
+serif.bold.japanese-x0208=Sazanami Mincho
+serif.bold.korean=Baekmuk Batang
+serif.bold.chinese-big5=AR PL ZenKai Uni
+serif.bold.chinese-gb18030=AR PL ZenKai Uni
+serif.bold.bengali=Lohit Bengali
+serif.bold.gujarati=Lohit Gujarati
+serif.bold.hindi=Lohit Hindi
+serif.bold.malayalam=Lohit Malayalam
+serif.bold.oriya=Lohit Oriya
+serif.bold.punjabi=Lohit Punjabi
+serif.bold.tamil=Lohit Tamil
+serif.bold.telugu=Lohit Telugu
+serif.bold.sinhala=LKLUG
+
+serif.italic.latin-1=DejaVu Serif Oblique
+serif.italic.japanese-x0208=Sazanami Mincho
+serif.italic.korean=Baekmuk Batang
+serif.italic.chinese-big5=AR PL ZenKai Uni
+serif.italic.chinese-gb18030=AR PL ZenKai Uni
+serif.italic.bengali=Lohit Bengali
+serif.italic.gujarati=Lohit Gujarati
+serif.italic.hindi=Lohit Hindi
+serif.italic.malayalam=Lohit Malayalam
+serif.italic.oriya=Lohit Oriya
+serif.italic.punjabi=Lohit Punjabi
+serif.italic.tamil=Lohit Tamil
+serif.italic.telugu=Lohit Telugu
+serif.italic.sinhala=LKLUG
+
+serif.bolditalic.latin-1=DejaVu Serif Bold Oblique
+serif.bolditalic.japanese-x0208=Sazanami Mincho
+serif.bolditalic.korean=Baekmuk Batang
+serif.bolditalic.chinese-big5=AR PL ZenKai Uni
+serif.bolditalic.chinese-gb18030=AR PL ZenKai Uni
+serif.bolditalic.bengali=Lohit Bengali
+serif.bolditalic.gujarati=Lohit Gujarati
+serif.bolditalic.hindi=Lohit Hindi
+serif.bolditalic.malayalam=Lohit Malayalam
+serif.bolditalic.oriya=Lohit Oriya
+serif.bolditalic.punjabi=Lohit Punjabi
+serif.bolditalic.tamil=Lohit Tamil
+serif.bolditalic.telugu=Lohit Telugu
+serif.bolditalic.sinhala=LKLUG
+
+monospaced.plain.latin-1=DejaVu Sans Mono
+monospaced.plain.japanese-x0208=Sazanami Gothic
+monospaced.plain.korean=Baekmuk Gulim
+monospaced.plain.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.plain.bengali=Lohit Bengali
+monospaced.plain.gujarati=Lohit Gujarati
+monospaced.plain.hindi=Lohit Hindi
+monospaced.plain.malayalam=Lohit Malayalam
+monospaced.plain.oriya=Lohit Oriya
+monospaced.plain.punjabi=Lohit Punjabi
+monospaced.plain.tamil=Lohit Tamil
+monospaced.plain.telugu=Lohit Telugu
+monospaced.plain.sinhala=LKLUG
+
+monospaced.bold.latin-1=DejaVu Sans Mono Bold
+monospaced.bold.japanese-x0208=Sazanami Gothic
+monospaced.bold.korean=Baekmuk Gulim
+monospaced.bold.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bold.bengali=Lohit Bengali
+monospaced.bold.gujarati=Lohit Gujarati
+monospaced.bold.hindi=Lohit Hindi
+monospaced.bold.malayalam=Lohit Malayalam
+monospaced.bold.oriya=Lohit Oriya
+monospaced.bold.punjabi=Lohit Punjabi
+monospaced.bold.tamil=Lohit Tamil
+monospaced.bold.telugu=Lohit Telugu
+monospaced.bold.sinhala=LKLUG
+
+monospaced.italic.latin-1=DejaVu Sans Mono Oblique
+monospaced.italic.japanese-x0208=Sazanami Gothic
+monospaced.italic.korean=Baekmuk Gulim
+monospaced.italic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.italic.bengali=Lohit Bengali
+monospaced.italic.gujarati=Lohit Gujarati
+monospaced.italic.hindi=Lohit Hindi
+monospaced.italic.malayalam=Lohit Malayalam
+monospaced.italic.oriya=Lohit Oriya
+monospaced.italic.punjabi=Lohit Punjabi
+monospaced.italic.tamil=Lohit Tamil
+monospaced.italic.telugu=Lohit Telugu
+monospaced.italic.sinhala=LKLUG
+
+monospaced.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+monospaced.bolditalic.japanese-x0208=Sazanami Gothic
+monospaced.bolditalic.korean=Baekmuk Gulim
+monospaced.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bolditalic.bengali=Lohit Bengali
+monospaced.bolditalic.gujarati=Lohit Gujarati
+monospaced.bolditalic.hindi=Lohit Hindi
+monospaced.bolditalic.malayalam=Lohit Malayalam
+monospaced.bolditalic.oriya=Lohit Oriya
+monospaced.bolditalic.punjabi=Lohit Punjabi
+monospaced.bolditalic.tamil=Lohit Tamil
+monospaced.bolditalic.telugu=Lohit Telugu
+monospaced.bolditalic.sinhala=LKLUG
+
+dialoginput.plain.latin-1=DejaVu Sans Mono
+dialoginput.plain.japanese-x0208=Sazanami Gothic
+dialoginput.plain.korean=Baekmuk Gulim
+dialoginput.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.plain.bengali=Lohit Bengali
+dialoginput.plain.gujarati=Lohit Gujarati
+dialoginput.plain.hindi=Lohit Hindi
+dialoginput.plain.malayalam=Lohit Malayalam
+dialoginput.plain.oriya=Lohit Oriya
+dialoginput.plain.punjabi=Lohit Punjabi
+dialoginput.plain.tamil=Lohit Tamil
+dialoginput.plain.telugu=Lohit Telugu
+dialoginput.plain.sinhala=LKLUG
+
+dialoginput.bold.latin-1=DejaVu Sans Mono Bold
+dialoginput.bold.japanese-x0208=Sazanami Gothic
+dialoginput.bold.korean=Baekmuk Gulim
+dialoginput.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bold.bengali=Lohit Bengali
+dialoginput.bold.gujarati=Lohit Gujarati
+dialoginput.bold.hindi=Lohit Hindi
+dialoginput.bold.malayalam=Lohit Malayalam
+dialoginput.bold.oriya=Lohit Oriya
+dialoginput.bold.punjabi=Lohit Punjabi
+dialoginput.bold.tamil=Lohit Tamil
+dialoginput.bold.telugu=Lohit Telugu
+dialoginput.bold.sinhala=LKLUG
+
+dialoginput.italic.latin-1=DejaVu Sans Mono Oblique
+dialoginput.italic.japanese-x0208=Sazanami Gothic
+dialoginput.italic.korean=Baekmuk Gulim
+dialoginput.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.italic.bengali=Lohit Bengali
+dialoginput.italic.gujarati=Lohit Gujarati
+dialoginput.italic.hindi=Lohit Hindi
+dialoginput.italic.malayalam=Lohit Malayalam
+dialoginput.italic.oriya=Lohit Oriya
+dialoginput.italic.punjabi=Lohit Punjabi
+dialoginput.italic.tamil=Lohit Tamil
+dialoginput.italic.telugu=Lohit Telugu
+dialoginput.italic.sinhala=LKLUG
+
+dialoginput.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+dialoginput.bolditalic.japanese-x0208=Sazanami Gothic
+dialoginput.bolditalic.korean=Baekmuk Gulim
+dialoginput.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.bengali=Lohit Bengali
+dialoginput.bolditalic.gujarati=Lohit Gujarati
+dialoginput.bolditalic.hindi=Lohit Hindi
+dialoginput.bolditalic.malayalam=Lohit Malayalam
+dialoginput.bolditalic.oriya=Lohit Oriya
+dialoginput.bolditalic.punjabi=Lohit Punjabi
+dialoginput.bolditalic.tamil=Lohit Tamil
+dialoginput.bolditalic.telugu=Lohit Telugu
+dialoginput.bolditalic.sinhala=LKLUG
+
+# Search Sequences
+
+sequence.allfonts=latin-1
+sequence.allfonts.Big5=chinese-big5,latin-1
+sequence.allfonts.x-euc-jp-linux=japanese-x0208,latin-1
+sequence.allfonts.EUC-KR=korean,latin-1
+sequence.allfonts.GB18030=chinese-gb18030,latin-1
+sequence.fallback=chinese-big5,chinese-gb18030,japanese-x0208,korean,bengali,gujarati,hindi,oriya,punjabi,malayalam,tamil,telugu,sinhala
+
+# Font File Names
+
+filename.DejaVu_Sans=/usr/share/fonts/dejavu/DejaVuSans.ttf
+filename.DejaVu_Sans_Bold=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf
+filename.DejaVu_Sans_Oblique=/usr/share/fonts/dejavu/DejaVuSans-Oblique.ttf
+filename.DejaVu_Sans_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSans-BoldOblique.ttf
+
+filename.DejaVu_Sans_Mono=/usr/share/fonts/dejavu/DejaVuSansMono.ttf
+filename.DejaVu_Sans_Mono_Bold=/usr/share/fonts/dejavu/DejaVuSansMono-Bold.ttf
+filename.DejaVu_Sans_Mono_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-Oblique.ttf
+filename.DejaVu_Sans_Mono_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf
+
+filename.DejaVu_Serif=/usr/share/fonts/dejavu/DejaVuSerif.ttf
+filename.DejaVu_Serif_Bold=/usr/share/fonts/dejavu/DejaVuSerif-Bold.ttf
+filename.DejaVu_Serif_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-Oblique.ttf
+filename.DejaVu_Serif_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-BoldOblique.ttf
+
+filename.Sazanami_Gothic=/usr/share/fonts/sazanami-fonts-gothic/sazanami-gothic.ttf
+filename.Sazanami_Mincho=/usr/share/fonts/sazanami-fonts-mincho/sazanami-mincho.ttf
+filename.AR_PL_ShanHeiSun_Uni=/usr/share/fonts/cjkunifonts-uming/uming.ttc
+filename.AR_PL_ZenKai_Uni=/usr/share/fonts/cjkunifonts-ukai/ukai.ttc
+filename.Baekmuk_Gulim=/usr/share/fonts/baekmuk-ttf-gulim/gulim.ttf
+filename.Baekmuk_Batang=/usr/share/fonts/baekmuk-ttf-batang/batang.ttf
+
+filename.Lohit_Bengali=/usr/share/fonts/lohit-bengali/lohit_bn.ttf
+filename.Lohit_Gujarati=/usr/share/fonts/lohit-gujarati/lohit_gu.ttf
+filename.Lohit_Hindi=/usr/share/fonts/lohit-hindi/lohit_hi.ttf
+filename.Lohit_Kannda=/usr/share/fonts/lohit-kannada/lohit_kn.ttf
+filename.Lohit_Malayalam=/usr/share/fonts/lohit-malayalam/lohit_ml.ttf
+filename.Lohit_Oriya=/usr/share/fonts/lohit-oriya/lohit_or.ttf
+filename.Lohit_Punjabi=/usr/share/fonts/lohit-punjabi/lohit_pa.ttf
+filename.Lohit_Tamil=/usr/share/fonts/lohit-tamil/lohit_ta.ttf
+filename.Lohit_Telugu=/usr/share/fonts/lohit-telugu/lohit_te.ttf
+filename.LKLUG=/usr/share/fonts/lklug/lklug.ttf
+
--- a/src/solaris/classes/sun/awt/fontconfigs/linux.fontconfig.Fedora.properties	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/awt/fontconfigs/linux.fontconfig.Fedora.properties	Tue Aug 22 02:03:52 2017 +0100
@@ -36,6 +36,8 @@
 dialog.plain.korean=Baekmuk Gulim
 dialog.plain.chinese-big5=AR PL ShanHeiSun Uni
 dialog.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.plain.assamese=Lohit Assamese
+dialog.plain.devanagari=Lohit Devanagari
 dialog.plain.bengali=Lohit Bengali
 dialog.plain.gujarati=Lohit Gujarati
 dialog.plain.hindi=Lohit Hindi
@@ -51,6 +53,8 @@
 dialog.bold.korean=Baekmuk Gulim
 dialog.bold.chinese-big5=AR PL ShanHeiSun Uni
 dialog.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bold.assamese=Lohit Assamese
+dialog.bold.devanagari=Lohit Devanagari
 dialog.bold.bengali=Lohit Bengali
 dialog.bold.gujarati=Lohit Gujarati
 dialog.bold.hindi=Lohit Hindi
@@ -66,6 +70,8 @@
 dialog.italic.korean=Baekmuk Gulim
 dialog.italic.chinese-big5=AR PL ShanHeiSun Uni
 dialog.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.italic.assamese=Lohit Assamese
+dialog.italic.devanagari=Lohit Devanagari
 dialog.italic.bengali=Lohit Bengali
 dialog.italic.gujarati=Lohit Gujarati
 dialog.italic.hindi=Lohit Hindi
@@ -81,6 +87,8 @@
 dialog.bolditalic.korean=Baekmuk Gulim
 dialog.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
 dialog.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bolditalic.assamese=Lohit Assamese
+dialog.bolditalic.devanagari=Lohit Devanagari
 dialog.bolditalic.bengali=Lohit Bengali
 dialog.bolditalic.gujarati=Lohit Gujarati
 dialog.bolditalic.hindi=Lohit Hindi
@@ -96,6 +104,8 @@
 sansserif.plain.korean=Baekmuk Gulim
 sansserif.plain.chinese-big5=AR PL ShanHeiSun Uni
 sansserif.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.plain.assamese=Lohit Assamese
+sansserif.plain.devanagari=Lohit Devanagari
 sansserif.plain.bengali=Lohit Bengali
 sansserif.plain.gujarati=Lohit Gujarati
 sansserif.plain.hindi=Lohit Hindi
@@ -111,6 +121,8 @@
 sansserif.bold.korean=Baekmuk Gulim
 sansserif.bold.chinese-big5=AR PL ShanHeiSun Uni
 sansserif.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bold.assamese=Lohit Assamese
+sansserif.bold.devanagari=Lohit Devanagari
 sansserif.bold.bengali=Lohit Bengali
 sansserif.bold.gujarati=Lohit Gujarati
 sansserif.bold.hindi=Lohit Hindi
@@ -126,6 +138,8 @@
 sansserif.italic.korean=Baekmuk Gulim
 sansserif.italic.chinese-big5=AR PL ShanHeiSun Uni
 sansserif.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.italic.assamese=Lohit Assamese
+sansserif.italic.devanagari=Lohit Devanagari
 sansserif.italic.bengali=Lohit Bengali
 sansserif.italic.gujarati=Lohit Gujarati
 sansserif.italic.hindi=Lohit Hindi
@@ -141,6 +155,8 @@
 sansserif.bolditalic.korean=Baekmuk Gulim
 sansserif.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
 sansserif.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bolditalic.assamese=Lohit Assamese
+sansserif.bolditalic.devanagari=Lohit Devanagari
 sansserif.bolditalic.bengali=Lohit Bengali
 sansserif.bolditalic.gujarati=Lohit Gujarati
 sansserif.bolditalic.hindi=Lohit Hindi
@@ -156,6 +172,8 @@
 serif.plain.korean=Baekmuk Batang
 serif.plain.chinese-big5=AR PL ZenKai Uni
 serif.plain.chinese-gb18030=AR PL ZenKai Uni
+serif.plain.assamese=Lohit Assamese
+serif.plain.devanagari=Lohit Devanagari
 serif.plain.bengali=Lohit Bengali
 serif.plain.gujarati=Lohit Gujarati
 serif.plain.hindi=Lohit Hindi
@@ -171,6 +189,8 @@
 serif.bold.korean=Baekmuk Batang
 serif.bold.chinese-big5=AR PL ZenKai Uni
 serif.bold.chinese-gb18030=AR PL ZenKai Uni
+serif.bold.assamese=Lohit Assamese
+serif.bold.devanagari=Lohit Devanagari
 serif.bold.bengali=Lohit Bengali
 serif.bold.gujarati=Lohit Gujarati
 serif.bold.hindi=Lohit Hindi
@@ -186,6 +206,8 @@
 serif.italic.korean=Baekmuk Batang
 serif.italic.chinese-big5=AR PL ZenKai Uni
 serif.italic.chinese-gb18030=AR PL ZenKai Uni
+serif.italic.assamese=Lohit Assamese
+serif.italic.devanagari=Lohit Devanagari
 serif.italic.bengali=Lohit Bengali
 serif.italic.gujarati=Lohit Gujarati
 serif.italic.hindi=Lohit Hindi
@@ -201,6 +223,8 @@
 serif.bolditalic.korean=Baekmuk Batang
 serif.bolditalic.chinese-big5=AR PL ZenKai Uni
 serif.bolditalic.chinese-gb18030=AR PL ZenKai Uni
+serif.bolditalic.assamese=Lohit Assamese
+serif.bolditalic.devanagari=Lohit Devanagari
 serif.bolditalic.bengali=Lohit Bengali
 serif.bolditalic.gujarati=Lohit Gujarati
 serif.bolditalic.hindi=Lohit Hindi
@@ -216,6 +240,8 @@
 monospaced.plain.korean=Baekmuk Gulim
 monospaced.plain.chinese-big5=AR PL ShanHeiSun Uni
 monospaced.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.plain.assamese=Lohit Assamese
+monospaced.plain.devanagari=Lohit Devanagari
 monospaced.plain.bengali=Lohit Bengali
 monospaced.plain.gujarati=Lohit Gujarati
 monospaced.plain.hindi=Lohit Hindi
@@ -231,6 +257,8 @@
 monospaced.bold.korean=Baekmuk Gulim
 monospaced.bold.chinese-big5=AR PL ShanHeiSun Uni
 monospaced.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bold.assamese=Lohit Assamese
+monospaced.bold.devanagari=Lohit Devanagari
 monospaced.bold.bengali=Lohit Bengali
 monospaced.bold.gujarati=Lohit Gujarati
 monospaced.bold.hindi=Lohit Hindi
@@ -246,6 +274,8 @@
 monospaced.italic.korean=Baekmuk Gulim
 monospaced.italic.chinese-big5=AR PL ShanHeiSun Uni
 monospaced.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.italic.assamese=Lohit Assamese
+monospaced.italic.devanagari=Lohit Devanagari
 monospaced.italic.bengali=Lohit Bengali
 monospaced.italic.gujarati=Lohit Gujarati
 monospaced.italic.hindi=Lohit Hindi
@@ -261,6 +291,8 @@
 monospaced.bolditalic.korean=Baekmuk Gulim
 monospaced.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
 monospaced.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bolditalic.assamese=Lohit Assamese
+monospaced.bolditalic.devanagari=Lohit Devanagari
 monospaced.bolditalic.bengali=Lohit Bengali
 monospaced.bolditalic.gujarati=Lohit Gujarati
 monospaced.bolditalic.hindi=Lohit Hindi
@@ -276,6 +308,8 @@
 dialoginput.plain.korean=Baekmuk Gulim
 dialoginput.plain.chinese-big5=AR PL ShanHeiSun Uni
 dialoginput.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.plain.assamese=Lohit Assamese
+dialoginput.plain.devanagari=Lohit Devanagari
 dialoginput.plain.bengali=Lohit Bengali
 dialoginput.plain.gujarati=Lohit Gujarati
 dialoginput.plain.hindi=Lohit Hindi
@@ -291,6 +325,8 @@
 dialoginput.bold.korean=Baekmuk Gulim
 dialoginput.bold.chinese-big5=AR PL ShanHeiSun Uni
 dialoginput.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bold.assamese=Lohit Assamese
+dialoginput.bold.devanagari=Lohit Devanagari
 dialoginput.bold.bengali=Lohit Bengali
 dialoginput.bold.gujarati=Lohit Gujarati
 dialoginput.bold.hindi=Lohit Hindi
@@ -306,6 +342,8 @@
 dialoginput.italic.korean=Baekmuk Gulim
 dialoginput.italic.chinese-big5=AR PL ShanHeiSun Uni
 dialoginput.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.italic.assamese=Lohit Assamese
+dialoginput.italic.devanagari=Lohit Devanagari
 dialoginput.italic.bengali=Lohit Bengali
 dialoginput.italic.gujarati=Lohit Gujarati
 dialoginput.italic.hindi=Lohit Hindi
@@ -321,6 +359,8 @@
 dialoginput.bolditalic.korean=Baekmuk Gulim
 dialoginput.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
 dialoginput.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.assamese=Lohit Assamese
+dialoginput.bolditalic.devanagari=Lohit Devanagari
 dialoginput.bolditalic.bengali=Lohit Bengali
 dialoginput.bolditalic.gujarati=Lohit Gujarati
 dialoginput.bolditalic.hindi=Lohit Hindi
@@ -357,21 +397,24 @@
 filename.DejaVu_Serif_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-Oblique.ttf
 filename.DejaVu_Serif_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-BoldOblique.ttf
 
-filename.Sazanami_Gothic=/usr/share/fonts/sazanami-fonts-gothic/sazanami-gothic.ttf
-filename.Sazanami_Mincho=/usr/share/fonts/sazanami-fonts-mincho/sazanami-mincho.ttf
-filename.AR_PL_ShanHeiSun_Uni=/usr/share/fonts/cjkunifonts-uming/uming.ttc
-filename.AR_PL_ZenKai_Uni=/usr/share/fonts/cjkunifonts-ukai/ukai.ttc
-filename.Baekmuk_Gulim=/usr/share/fonts/baekmuk-ttf-gulim/gulim.ttf
-filename.Baekmuk_Batang=/usr/share/fonts/baekmuk-ttf-batang/batang.ttf
+filename.Sazanami_Gothic=/usr/share/fonts/sazanami/gothic/sazanami-gothic.ttf
+filename.Sazanami_Mincho=/usr/share/fonts/sazanami/mincho/sazanami-mincho.ttf
+filename.AR_PL_ShanHeiSun_Uni=/usr/share/fonts/cjkuni-uming/uming.ttc
+filename.AR_PL_ZenKai_Uni=/usr/share/fonts/cjkuni-ukai/ukai.ttc
+filename.Baekmuk_Gulim=/usr/share/fonts/baekmuk-ttf/gulim.ttf
+filename.Baekmuk_Batang=/usr/share/fonts/baekmuk-ttf/batang.ttf
 
-filename.Lohit_Bengali=/usr/share/fonts/lohit-bengali/lohit_bn.ttf
-filename.Lohit_Gujarati=/usr/share/fonts/lohit-gujarati/lohit_gu.ttf
-filename.Lohit_Hindi=/usr/share/fonts/lohit-hindi/lohit_hi.ttf
-filename.Lohit_Kannda=/usr/share/fonts/lohit-kannada/lohit_kn.ttf
-filename.Lohit_Malayalam=/usr/share/fonts/lohit-malayalam/lohit_ml.ttf
-filename.Lohit_Oriya=/usr/share/fonts/lohit-oriya/lohit_or.ttf
-filename.Lohit_Punjabi=/usr/share/fonts/lohit-punjabi/lohit_pa.ttf
-filename.Lohit_Tamil=/usr/share/fonts/lohit-tamil/lohit_ta.ttf
-filename.Lohit_Telugu=/usr/share/fonts/lohit-telugu/lohit_te.ttf
+filename.Lohit_Assamese=/usr/share/fonts/lohit-assamese/Lohit-Assamese.ttf
+filename.Lohit_Devanagari=/usr/share/fonts/lohit-devanagari/Lohit-Devanagari.ttf
+filename.Lohit_Bengali=/usr/share/fonts/lohit-bengali/Lohit-Bengali.ttf
+filename.Lohit_Gujarati=/usr/share/fonts/lohit-gujarati/Lohit-Gujarati.ttf
+filename.Lohit_Hindi=/usr/share/fonts/lohit-devanagari/Lohit-Devanagari.ttf
+filename.Lohit_Kannda=/usr/share/fonts/lohit-kannada/Lohit-Kannada.ttf
+filename.Lohit_Malayalam=/usr/share/fonts/lohit-malayalam/Lohit-Malayalam.ttf
+filename.Lohit_Oriya=/usr/share/fonts/lohit-oriya/Lohit-Oriya.ttf
+filename.Lohit_Punjabi=/usr/share/fonts/lohit-punjabi/Lohit-Punjabi.ttf
+filename.Lohit_Tamil=/usr/share/fonts/lohit-tamil/Lohit-Tamil.ttf
+filename.Lohit_Telugu=/usr/share/fonts/lohit-telugu/Lohit-Telugu.ttf
+
 filename.LKLUG=/usr/share/fonts/lklug/lklug.ttf
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/awt/fontconfigs/linux.fontconfig.Gentoo.properties	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,385 @@
+#
+# 
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# 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.
+#
+
+# Version
+
+version=1
+
+# Component Font Mappings
+
+dialog.plain.latin-1=DejaVu Sans
+dialog.plain.japanese-x0208=Sazanami Gothic
+dialog.plain.korean=Baekmuk Gulim
+dialog.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialog.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.plain.bengali=Lohit Bengali
+dialog.plain.gujarati=Lohit Gujarati
+dialog.plain.hindi=Lohit Hindi
+dialog.plain.malayalam=Lohit Malayalam
+dialog.plain.oriya=Lohit Oriya
+dialog.plain.punjabi=Lohit Punjabi
+dialog.plain.tamil=Lohit Tamil
+dialog.plain.telugu=Lohit Telugu
+dialog.plain.sinhala=LKLUG
+
+dialog.bold.latin-1=DejaVu Sans Bold
+dialog.bold.japanese-x0208=Sazanami Gothic
+dialog.bold.korean=Baekmuk Gulim
+dialog.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bold.bengali=Lohit Bengali
+dialog.bold.gujarati=Lohit Gujarati
+dialog.bold.hindi=Lohit Hindi
+dialog.bold.malayalam=Lohit Malayalam
+dialog.bold.oriya=Lohit Oriya
+dialog.bold.punjabi=Lohit Punjabi
+dialog.bold.tamil=Lohit Tamil
+dialog.bold.telugu=Lohit Telugu
+dialog.bold.sinhala=LKLUG
+
+dialog.italic.latin-1=DejaVu Sans Oblique
+dialog.italic.japanese-x0208=Sazanami Gothic
+dialog.italic.korean=Baekmuk Gulim
+dialog.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.italic.bengali=Lohit Bengali
+dialog.italic.gujarati=Lohit Gujarati
+dialog.italic.hindi=Lohit Hindi
+dialog.italic.malayalam=Lohit Malayalam
+dialog.italic.oriya=Lohit Oriya
+dialog.italic.punjabi=Lohit Punjabi
+dialog.italic.tamil=Lohit Tamil
+dialog.italic.telugu=Lohit Telugu
+dialog.italic.sinhala=LKLUG
+
+dialog.bolditalic.latin-1=DejaVu Sans Bold Oblique
+dialog.bolditalic.japanese-x0208=Sazanami Gothic
+dialog.bolditalic.korean=Baekmuk Gulim
+dialog.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialog.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialog.bolditalic.bengali=Lohit Bengali
+dialog.bolditalic.gujarati=Lohit Gujarati
+dialog.bolditalic.hindi=Lohit Hindi
+dialog.bolditalic.malayalam=Lohit Malayalam
+dialog.bolditalic.oriya=Lohit Oriya
+dialog.bolditalic.punjabi=Lohit Punjabi
+dialog.bolditalic.tamil=Lohit Tamil
+dialog.bolditalic.telugu=Lohit Telugu
+dialog.bolditalic.sinhala=LKLUG
+
+sansserif.plain.latin-1=DejaVu Sans
+sansserif.plain.japanese-x0208=Sazanami Gothic
+sansserif.plain.korean=Baekmuk Gulim
+sansserif.plain.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.plain.bengali=Lohit Bengali
+sansserif.plain.gujarati=Lohit Gujarati
+sansserif.plain.hindi=Lohit Hindi
+sansserif.plain.malayalam=Lohit Malayalam
+sansserif.plain.oriya=Lohit Oriya
+sansserif.plain.punjabi=Lohit Punjabi
+sansserif.plain.tamil=Lohit Tamil
+sansserif.plain.telugu=Lohit Telugu
+sansserif.plain.sinhala=LKLUG
+
+sansserif.bold.latin-1=DejaVu Sans Bold
+sansserif.bold.japanese-x0208=Sazanami Gothic
+sansserif.bold.korean=Baekmuk Gulim
+sansserif.bold.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bold.bengali=Lohit Bengali
+sansserif.bold.gujarati=Lohit Gujarati
+sansserif.bold.hindi=Lohit Hindi
+sansserif.bold.malayalam=Lohit Malayalam
+sansserif.bold.oriya=Lohit Oriya
+sansserif.bold.punjabi=Lohit Punjabi
+sansserif.bold.tamil=Lohit Tamil
+sansserif.bold.telugu=Lohit Telugu
+sansserif.bold.sinhala=LKLUG
+
+sansserif.italic.latin-1=DejaVu Sans Oblique
+sansserif.italic.japanese-x0208=Sazanami Gothic
+sansserif.italic.korean=Baekmuk Gulim
+sansserif.italic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.italic.bengali=Lohit Bengali
+sansserif.italic.gujarati=Lohit Gujarati
+sansserif.italic.hindi=Lohit Hindi
+sansserif.italic.malayalam=Lohit Malayalam
+sansserif.italic.oriya=Lohit Oriya
+sansserif.italic.punjabi=Lohit Punjabi
+sansserif.italic.tamil=Lohit Tamil
+sansserif.italic.telugu=Lohit Telugu
+sansserif.italic.sinhala=LKLUG
+
+sansserif.bolditalic.latin-1=DejaVu Sans Bold Oblique
+sansserif.bolditalic.japanese-x0208=Sazanami Gothic
+sansserif.bolditalic.korean=Baekmuk Gulim
+sansserif.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+sansserif.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+sansserif.bolditalic.bengali=Lohit Bengali
+sansserif.bolditalic.gujarati=Lohit Gujarati
+sansserif.bolditalic.hindi=Lohit Hindi
+sansserif.bolditalic.malayalam=Lohit Malayalam
+sansserif.bolditalic.oriya=Lohit Oriya
+sansserif.bolditalic.punjabi=Lohit Punjabi
+sansserif.bolditalic.tamil=Lohit Tamil
+sansserif.bolditalic.telugu=Lohit Telugu
+sansserif.bolditalic.sinhala=LKLUG
+
+serif.plain.latin-1=DejaVu Serif
+serif.plain.japanese-x0208=Sazanami Mincho
+serif.plain.korean=Baekmuk Batang
+serif.plain.chinese-big5=AR PL ZenKai Uni
+serif.plain.chinese-gb18030=AR PL ZenKai Uni
+serif.plain.bengali=Lohit Bengali
+serif.plain.gujarati=Lohit Gujarati
+serif.plain.hindi=Lohit Hindi
+serif.plain.malayalam=Lohit Malayalam
+serif.plain.oriya=Lohit Oriya
+serif.plain.punjabi=Lohit Punjabi
+serif.plain.tamil=Lohit Tamil
+serif.plain.telugu=Lohit Telugu
+serif.plain.sinhala=LKLUG
+
+serif.bold.latin-1=DejaVu Serif Bold
+serif.bold.japanese-x0208=Sazanami Mincho
+serif.bold.korean=Baekmuk Batang
+serif.bold.chinese-big5=AR PL ZenKai Uni
+serif.bold.chinese-gb18030=AR PL ZenKai Uni
+serif.bold.bengali=Lohit Bengali
+serif.bold.gujarati=Lohit Gujarati
+serif.bold.hindi=Lohit Hindi
+serif.bold.malayalam=Lohit Malayalam
+serif.bold.oriya=Lohit Oriya
+serif.bold.punjabi=Lohit Punjabi
+serif.bold.tamil=Lohit Tamil
+serif.bold.telugu=Lohit Telugu
+serif.bold.sinhala=LKLUG
+
+serif.italic.latin-1=DejaVu Serif Oblique
+serif.italic.japanese-x0208=Sazanami Mincho
+serif.italic.korean=Baekmuk Batang
+serif.italic.chinese-big5=AR PL ZenKai Uni
+serif.italic.chinese-gb18030=AR PL ZenKai Uni
+serif.italic.bengali=Lohit Bengali
+serif.italic.gujarati=Lohit Gujarati
+serif.italic.hindi=Lohit Hindi
+serif.italic.malayalam=Lohit Malayalam
+serif.italic.oriya=Lohit Oriya
+serif.italic.punjabi=Lohit Punjabi
+serif.italic.tamil=Lohit Tamil
+serif.italic.telugu=Lohit Telugu
+serif.italic.sinhala=LKLUG
+
+serif.bolditalic.latin-1=DejaVu Serif Bold Oblique
+serif.bolditalic.japanese-x0208=Sazanami Mincho
+serif.bolditalic.korean=Baekmuk Batang
+serif.bolditalic.chinese-big5=AR PL ZenKai Uni
+serif.bolditalic.chinese-gb18030=AR PL ZenKai Uni
+serif.bolditalic.bengali=Lohit Bengali
+serif.bolditalic.gujarati=Lohit Gujarati
+serif.bolditalic.hindi=Lohit Hindi
+serif.bolditalic.malayalam=Lohit Malayalam
+serif.bolditalic.oriya=Lohit Oriya
+serif.bolditalic.punjabi=Lohit Punjabi
+serif.bolditalic.tamil=Lohit Tamil
+serif.bolditalic.telugu=Lohit Telugu
+serif.bolditalic.sinhala=LKLUG
+
+monospaced.plain.latin-1=DejaVu Sans Mono
+monospaced.plain.japanese-x0208=Sazanami Gothic
+monospaced.plain.korean=Baekmuk Gulim
+monospaced.plain.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.plain.bengali=Lohit Bengali
+monospaced.plain.gujarati=Lohit Gujarati
+monospaced.plain.hindi=Lohit Hindi
+monospaced.plain.malayalam=Lohit Malayalam
+monospaced.plain.oriya=Lohit Oriya
+monospaced.plain.punjabi=Lohit Punjabi
+monospaced.plain.tamil=Lohit Tamil
+monospaced.plain.telugu=Lohit Telugu
+monospaced.plain.sinhala=LKLUG
+
+monospaced.bold.latin-1=DejaVu Sans Mono Bold
+monospaced.bold.japanese-x0208=Sazanami Gothic
+monospaced.bold.korean=Baekmuk Gulim
+monospaced.bold.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bold.bengali=Lohit Bengali
+monospaced.bold.gujarati=Lohit Gujarati
+monospaced.bold.hindi=Lohit Hindi
+monospaced.bold.malayalam=Lohit Malayalam
+monospaced.bold.oriya=Lohit Oriya
+monospaced.bold.punjabi=Lohit Punjabi
+monospaced.bold.tamil=Lohit Tamil
+monospaced.bold.telugu=Lohit Telugu
+monospaced.bold.sinhala=LKLUG
+
+monospaced.italic.latin-1=DejaVu Sans Mono Oblique
+monospaced.italic.japanese-x0208=Sazanami Gothic
+monospaced.italic.korean=Baekmuk Gulim
+monospaced.italic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.italic.bengali=Lohit Bengali
+monospaced.italic.gujarati=Lohit Gujarati
+monospaced.italic.hindi=Lohit Hindi
+monospaced.italic.malayalam=Lohit Malayalam
+monospaced.italic.oriya=Lohit Oriya
+monospaced.italic.punjabi=Lohit Punjabi
+monospaced.italic.tamil=Lohit Tamil
+monospaced.italic.telugu=Lohit Telugu
+monospaced.italic.sinhala=LKLUG
+
+monospaced.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+monospaced.bolditalic.japanese-x0208=Sazanami Gothic
+monospaced.bolditalic.korean=Baekmuk Gulim
+monospaced.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+monospaced.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+monospaced.bolditalic.bengali=Lohit Bengali
+monospaced.bolditalic.gujarati=Lohit Gujarati
+monospaced.bolditalic.hindi=Lohit Hindi
+monospaced.bolditalic.malayalam=Lohit Malayalam
+monospaced.bolditalic.oriya=Lohit Oriya
+monospaced.bolditalic.punjabi=Lohit Punjabi
+monospaced.bolditalic.tamil=Lohit Tamil
+monospaced.bolditalic.telugu=Lohit Telugu
+monospaced.bolditalic.sinhala=LKLUG
+
+dialoginput.plain.latin-1=DejaVu Sans Mono
+dialoginput.plain.japanese-x0208=Sazanami Gothic
+dialoginput.plain.korean=Baekmuk Gulim
+dialoginput.plain.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.plain.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.plain.bengali=Lohit Bengali
+dialoginput.plain.gujarati=Lohit Gujarati
+dialoginput.plain.hindi=Lohit Hindi
+dialoginput.plain.malayalam=Lohit Malayalam
+dialoginput.plain.oriya=Lohit Oriya
+dialoginput.plain.punjabi=Lohit Punjabi
+dialoginput.plain.tamil=Lohit Tamil
+dialoginput.plain.telugu=Lohit Telugu
+dialoginput.plain.sinhala=LKLUG
+
+dialoginput.bold.latin-1=DejaVu Sans Mono Bold
+dialoginput.bold.japanese-x0208=Sazanami Gothic
+dialoginput.bold.korean=Baekmuk Gulim
+dialoginput.bold.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bold.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bold.bengali=Lohit Bengali
+dialoginput.bold.gujarati=Lohit Gujarati
+dialoginput.bold.hindi=Lohit Hindi
+dialoginput.bold.malayalam=Lohit Malayalam
+dialoginput.bold.oriya=Lohit Oriya
+dialoginput.bold.punjabi=Lohit Punjabi
+dialoginput.bold.tamil=Lohit Tamil
+dialoginput.bold.telugu=Lohit Telugu
+dialoginput.bold.sinhala=LKLUG
+
+dialoginput.italic.latin-1=DejaVu Sans Mono Oblique
+dialoginput.italic.japanese-x0208=Sazanami Gothic
+dialoginput.italic.korean=Baekmuk Gulim
+dialoginput.italic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.italic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.italic.bengali=Lohit Bengali
+dialoginput.italic.gujarati=Lohit Gujarati
+dialoginput.italic.hindi=Lohit Hindi
+dialoginput.italic.malayalam=Lohit Malayalam
+dialoginput.italic.oriya=Lohit Oriya
+dialoginput.italic.punjabi=Lohit Punjabi
+dialoginput.italic.tamil=Lohit Tamil
+dialoginput.italic.telugu=Lohit Telugu
+dialoginput.italic.sinhala=LKLUG
+
+dialoginput.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique
+dialoginput.bolditalic.japanese-x0208=Sazanami Gothic
+dialoginput.bolditalic.korean=Baekmuk Gulim
+dialoginput.bolditalic.chinese-big5=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni
+dialoginput.bolditalic.bengali=Lohit Bengali
+dialoginput.bolditalic.gujarati=Lohit Gujarati
+dialoginput.bolditalic.hindi=Lohit Hindi
+dialoginput.bolditalic.malayalam=Lohit Malayalam
+dialoginput.bolditalic.oriya=Lohit Oriya
+dialoginput.bolditalic.punjabi=Lohit Punjabi
+dialoginput.bolditalic.tamil=Lohit Tamil
+dialoginput.bolditalic.telugu=Lohit Telugu
+dialoginput.bolditalic.sinhala=LKLUG
+
+# Search Sequences
+
+sequence.allfonts=latin-1
+sequence.allfonts.Big5=chinese-big5,latin-1
+sequence.allfonts.x-euc-jp-linux=japanese-x0208,latin-1
+sequence.allfonts.EUC-KR=korean,latin-1
+sequence.allfonts.GB18030=chinese-gb18030,latin-1
+sequence.fallback=chinese-big5,chinese-gb18030,japanese-x0208,korean,bengali,gujarati,hindi,oriya,punjabi,malayalam,tamil,telugu,sinhala
+
+# Font File Names
+
+# media-fonts/dejavu
+filename.DejaVu_Sans=/usr/share/fonts/dejavu/DejaVuSans.ttf
+filename.DejaVu_Sans_Bold=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf
+filename.DejaVu_Sans_Oblique=/usr/share/fonts/dejavu/DejaVuSans-Oblique.ttf
+filename.DejaVu_Sans_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSans-BoldOblique.ttf
+
+filename.DejaVu_Sans_Mono=/usr/share/fonts/dejavu/DejaVuSansMono.ttf
+filename.DejaVu_Sans_Mono_Bold=/usr/share/fonts/dejavu/DejaVuSansMono-Bold.ttf
+filename.DejaVu_Sans_Mono_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-Oblique.ttf
+filename.DejaVu_Sans_Mono_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf
+
+filename.DejaVu_Serif=/usr/share/fonts/dejavu/DejaVuSerif.ttf
+filename.DejaVu_Serif_Bold=/usr/share/fonts/dejavu/DejaVuSerif-Bold.ttf
+filename.DejaVu_Serif_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-Oblique.ttf
+filename.DejaVu_Serif_Bold_Oblique=/usr/share/fonts/dejavu/DejaVuSerif-BoldOblique.ttf
+
+# media-fonts/sazanami
+filename.Sazanami_Gothic=/usr/share/fonts/sazanami/sazanami-gothic.ttf
+filename.Sazanami_Mincho=/usr/share/fonts/sazanami/sazanami-mincho.ttf
+
+# media-fonts/arphicfonts
+filename.AR_PL_ShanHeiSun_Uni=/usr/share/fonts/arphicfonts/uming.ttc
+filename.AR_PL_ZenKai_Uni=/usr/share/fonts/arphicfonts/ukai.ttc
+
+# media-fonts/baekmuk-fonts
+filename.Baekmuk_Gulim=/usr/share/fonts/baekmuk-fonts/gulim.ttf
+filename.Baekmuk_Batang=/usr/share/fonts/baekmuk-fonts/batang.ttf
+
+# media-fonts/lohit-fonts
+filename.Lohit_Bengali=/usr/share/fonts/indic/lohit_bn.ttf
+filename.Lohit_Gujarati=/usr/share/fonts/indic/lohit_gu.ttf
+filename.Lohit_Hindi=/usr/share/fonts/indic/lohit_hi.ttf
+filename.Lohit_Kannda=/usr/share/fonts/indic/lohit_kn.ttf
+filename.Lohit_Malayalam=/usr/share/fonts/indic/lohit_ml.ttf
+filename.Lohit_Oriya=/usr/share/fonts/indic/lohit_or.ttf
+filename.Lohit_Punjabi=/usr/share/fonts/indic/lohit_pa.ttf
+filename.Lohit_Tamil=/usr/share/fonts/indic/lohit_ta.ttf
+filename.Lohit_Telugu=/usr/share/fonts/indic/lohit_te.ttf
+
+# media-fonts/lklug
+filename.LKLUG=/usr/share/fonts/lklug/lklug.ttf
+
--- a/src/solaris/classes/sun/awt/motif/MFontConfiguration.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/awt/motif/MFontConfiguration.java	Tue Aug 22 02:03:52 2017 +0100
@@ -178,6 +178,9 @@
                 } else if ((f = new File("/etc/SuSE-release")).canRead()) {
                     osName = "SuSE";
                     osVersion = getVersionString(f);
+                } else if ((f = new File("/etc/gentoo-release")).canRead()) {
+                    osName = "Gentoo";
+                    osVersion = getVersionString(f);
                 } else if ((f = new File("/etc/lsb-release")).canRead()) {
                     /* Ubuntu and (perhaps others) use only lsb-release.
                      * Syntax and encoding is compatible with java properties.
--- a/src/solaris/classes/sun/java2d/xr/XRRenderer.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/java2d/xr/XRRenderer.java	Tue Aug 22 02:03:52 2017 +0100
@@ -27,7 +27,6 @@
 
 import java.awt.*;
 import java.awt.geom.*;
-
 import sun.awt.SunToolkit;
 import sun.java2d.SunGraphics2D;
 import sun.java2d.loops.*;
@@ -39,6 +38,9 @@
 import sun.java2d.pipe.ShapeSpanIterator;
 import sun.java2d.pipe.LoopPipe;
 
+import static sun.java2d.xr.XRUtils.clampToShort;
+import static sun.java2d.xr.XRUtils.clampToUShort;
+
 /**
  * XRender provides only accalerated rectangles. To emulate higher "order"
  *  geometry we have to pass everything else to DoPath/FillSpans.
@@ -69,20 +71,25 @@
     }
 
     public void drawLine(SunGraphics2D sg2d, int x1, int y1, int x2, int y2) {
-        try {
-            SunToolkit.awtLock();
-
-            validateSurface(sg2d);
-            int transx = sg2d.transX;
-            int transy = sg2d.transY;
+        Region compClip = sg2d.getCompClip();
+        int transX1 = Region.clipAdd(x1, sg2d.transX);
+        int transY1 = Region.clipAdd(y1, sg2d.transY);
+        int transX2 = Region.clipAdd(x2, sg2d.transX);
+        int transY2 = Region.clipAdd(y2, sg2d.transY);
 
-            XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;
-
-            tileManager.addLine(x1 + transx, y1 + transy,
-                                x2 + transx, y2 + transy);
-            tileManager.fillMask(xrsd);
-        } finally {
-            SunToolkit.awtUnlock();
+        // Non clipped fast path
+        if (compClip.contains(transX1, transY1)
+                && compClip.contains(transX2, transY2)) {
+            SunToolkit.awtLock();
+            try {
+                validateSurface(sg2d);
+                tileManager.addLine(transX1, transY1, transX2, transY2);
+                tileManager.fillMask((XRSurfaceData) sg2d.surfaceData);
+            } finally {
+                SunToolkit.awtUnlock();
+            }
+        } else {
+            draw(sg2d, new Line2D.Float(x1, y1, x2, y2));
         }
     }
 
@@ -109,20 +116,40 @@
         draw(sg2d, new Polygon(xpoints, ypoints, npoints));
     }
 
-    public synchronized void fillRect(SunGraphics2D sg2d,
-                                      int x, int y, int width, int height) {
+    public void fillRect(SunGraphics2D sg2d, int x, int y, int width, int height) {
+        x = Region.clipAdd(x, sg2d.transX);
+        y = Region.clipAdd(y, sg2d.transY);
+
+        /*
+         * Limit x/y to signed short, width/height to unsigned short,
+         * to match the X11 coordinate limits for rectangles.
+         * Correct width/height in case x/y have been modified by clipping.
+         */
+        if (x > Short.MAX_VALUE || y > Short.MAX_VALUE) {
+            return;
+        }
+
+        int x2 = Region.dimAdd(x, width);
+        int y2 = Region.dimAdd(y, height);
+
+        if (x2 < Short.MIN_VALUE || y2 < Short.MIN_VALUE) {
+            return;
+        }
+
+        x = clampToShort(x);
+        y = clampToShort(y);
+        width = clampToUShort(x2 - x);
+        height = clampToUShort(y2 - y);
+
+        if (width == 0 || height == 0) {
+            return;
+        }
+
         SunToolkit.awtLock();
         try {
             validateSurface(sg2d);
-
-            XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;
-
-            x += sg2d.transform.getTranslateX();
-            y += sg2d.transform.getTranslateY();
-
             tileManager.addRect(x, y, width, height);
-            tileManager.fillMask(xrsd);
-
+            tileManager.fillMask((XRSurfaceData) sg2d.surfaceData);
         } finally {
             SunToolkit.awtUnlock();
         }
--- a/src/solaris/classes/sun/java2d/xr/XRUtils.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/java2d/xr/XRUtils.java	Tue Aug 22 02:03:52 2017 +0100
@@ -255,7 +255,7 @@
                            : (x < Short.MIN_VALUE ? Short.MIN_VALUE : x));
     }
 
-    public static short clampToUShort(int x) {
-        return (short) (x > 65535 ? 65535 : (x < 0) ? 0 : x);
+    public static int clampToUShort(int x) {
+        return (x > 65535 ? 65535 : (x < 0) ? 0 : x);
     }
 }
--- a/src/solaris/classes/sun/net/dns/ResolverConfigurationImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/net/dns/ResolverConfigurationImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -85,6 +85,15 @@
                     if (val.charAt(0) == '#' || val.charAt(0) == ';') {
                         break;
                     }
+                    if ("nameserver".equals(keyword)) {
+                        if (val.indexOf(':') >= 0 &&
+                            val.indexOf('.') < 0 && // skip for IPv4 literals with port
+                            val.indexOf('[') < 0 &&
+                            val.indexOf(']') < 0 ) {
+                            // IPv6 literal, in non-BSD-style.
+                            val = "[" + val + "]";
+                        }
+                    }
                     ll.add(val);
                     if (--maxvalues == 0) {
                         break;
--- a/src/solaris/classes/sun/nio/ch/SctpChannelImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/nio/ch/SctpChannelImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1105,7 +1105,7 @@
     static {
         IOUtil.load();   /* loads nio & net native libraries */
         java.security.AccessController.doPrivileged(
-                new sun.security.action.LoadLibraryAction("sctp"));
+                new sun.security.action.LoadLibraryAction("javasctp"));
         initIDs();
     }
 }
--- a/src/solaris/classes/sun/nio/ch/SctpMultiChannelImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/nio/ch/SctpMultiChannelImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -988,6 +988,6 @@
     static {
         IOUtil.load();   /* loads nio & net native libraries */
         java.security.AccessController.doPrivileged(
-                new sun.security.action.LoadLibraryAction("sctp"));
+                new sun.security.action.LoadLibraryAction("javasctp"));
     }
 }
--- a/src/solaris/classes/sun/nio/ch/SctpServerChannelImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/nio/ch/SctpServerChannelImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -418,7 +418,7 @@
     static {
         IOUtil.load();   // loads nio & net native libraries
         java.security.AccessController.doPrivileged(
-                new sun.security.action.LoadLibraryAction("sctp"));
+                new sun.security.action.LoadLibraryAction("javasctp"));
         initIDs();
     }
 }
--- a/src/solaris/classes/sun/nio/fs/GnomeFileTypeDetector.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/nio/fs/GnomeFileTypeDetector.java	Tue Aug 22 02:03:52 2017 +0100
@@ -86,7 +86,7 @@
 
     // GIO
     private static native boolean initializeGio();
-    private static native byte[] probeUsingGio(long pathAddress);
+    private static synchronized native byte[] probeUsingGio(long pathAddress);
 
     // GNOME VFS
     private static native boolean initializeGnomeVfs();
--- a/src/solaris/classes/sun/nio/fs/UnixFileStore.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/nio/fs/UnixFileStore.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -186,7 +186,8 @@
             return false;
         UnixFileStore other = (UnixFileStore)ob;
         return (this.dev == other.dev) &&
-               Arrays.equals(this.entry.dir(), other.entry.dir());
+               Arrays.equals(this.entry.dir(), other.entry.dir()) &&
+               this.entry.name().equals(other.entry.name());
     }
 
     @Override
--- a/src/solaris/classes/sun/print/UnixPrintServiceLookup.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/print/UnixPrintServiceLookup.java	Tue Aug 22 02:03:52 2017 +0100
@@ -240,7 +240,7 @@
         if (printServices == null) {
             return new PrintService[0];
         } else {
-            return printServices;
+            return (PrintService[])printServices.clone();
         }
     }
 
--- a/src/solaris/classes/sun/security/smartcardio/PlatformPCSC.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/classes/sun/security/smartcardio/PlatformPCSC.java	Tue Aug 22 02:03:52 2017 +0100
@@ -48,8 +48,12 @@
 
     private final static String PROP_NAME = "sun.security.smartcardio.library";
 
-    private final static String LIB1 = "/usr/$LIBISA/libpcsclite.so";
-    private final static String LIB2 = "/usr/local/$LIBISA/libpcsclite.so";
+    private final static String LIB1 = "/usr/$LIBISA/libpcsclite.so.1";
+    private final static String LIB2 = "/usr/local/$LIBISA/libpcsclite.so.1";
+    private final static String LIB3 = "/usr/lib/$ARCH-linux-gnu/libpcsclite.so.1";
+    private final static String LIB4 = "/usr/lib/arm-linux-gnueabi/libpcsclite.so.1";
+    private final static String LIB5 = "/usr/lib/arm-linux-gnueabihf/libpcsclite.so.1";
+    private final static String LIB6 = "/usr/lib/$ARCH-kfreebsd-gnu/libpcsclite.so.1";
     private final static String PCSC_FRAMEWORK = "/System/Library/Frameworks/PCSC.framework/Versions/Current/PCSC";
 
     PlatformPCSC() {
@@ -76,26 +80,55 @@
 
     // expand $LIBISA to the system specific directory name for libraries
     private static String expand(String lib) {
+        String s1, s2;
         int k = lib.indexOf("$LIBISA");
-        if (k == -1) {
-            return lib;
+        if (k != -1) {
+            String libDir;
+            if ("64".equals(System.getProperty("sun.arch.data.model"))) {
+                if ("SunOS".equals(System.getProperty("os.name"))) {
+                    libDir = "lib/64";
+                } else {
+                    // assume Linux convention
+                    libDir = "lib64";
+                }
+            } else {
+                // must be 32-bit
+                libDir = "lib";
+            }
+            lib = replace(k, lib, "$LIBISA", libDir);
         }
-        String s1 = lib.substring(0, k);
-        String s2 = lib.substring(k + 7);
-        String libDir;
-        if ("64".equals(System.getProperty("sun.arch.data.model"))) {
-            if ("SunOS".equals(System.getProperty("os.name"))) {
-                libDir = "lib/64";
-            } else {
-                // assume Linux convention
-                libDir = "lib64";
+
+        k = lib.indexOf("$ARCH");
+        if (k != -1) {
+            String arch = System.getProperty("os.arch");
+            switch (arch) {
+            case "amd64":
+                arch = "x86_64";
+                break;
+            case "ppc":
+                arch = "powerpc";
+                break;
+            case "ppc64":
+                arch = "powerpc64";
+                break;
+            case "ppc64le":
+                arch = "powerpc64le";
+                break;
             }
-        } else {
-            // must be 32-bit
-            libDir = "lib";
+            lib = replace(k, lib, "$ARCH", arch);
         }
-        String s = s1 + libDir + s2;
-        return s;
+
+        return lib;
+    }
+
+    private static String replace(int k, String text,
+                                  String template, String replacement) {
+        String s1, s2;
+
+        s1 = text.substring(0, k);
+        s2 = text.substring(k + template.length());
+
+        return s1 + replacement + s2;
     }
 
     private static String getLibraryName() throws IOException {
@@ -114,6 +147,26 @@
             // if LIB2 exists, use that
             return lib;
         }
+        lib = expand(LIB3);
+        if (new File(lib).isFile()) {
+            // if LIB3 exists, use that
+            return lib;
+        }
+        lib = LIB4; // Debian armel special case
+        if (new File(lib).isFile()) {
+            // if LIB4 exists, use that
+            return lib;
+        }
+        lib = LIB5; // Debian armhf special case
+        if (new File(lib).isFile()) {
+            // if LIB5 exists, use that
+            return lib;
+        }
+        lib = expand(LIB6);
+        if (new File(lib).isFile()) {
+            // if LIB6 exists, use that
+            return lib;
+        }
         lib = PCSC_FRAMEWORK;
         if (new File(lib).isFile()) {
             // if PCSC.framework exists, use that
--- a/src/solaris/doc/sun/man/man1/jhat.1	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/doc/sun/man/man1/jhat.1	Tue Aug 22 02:03:52 2017 +0100
@@ -77,7 +77,7 @@
 .na
 \f2hprof\fP @
 .fi
-http://java.sun.com/developer/technicalArticles/Programming/HPROF.html. 
+https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html.
 .RE
 
 .LP
@@ -134,7 +134,7 @@
 .na
 \f2hprof \- Heap and CPU profiling tool\fP @
 .fi
-http://java.sun.com/developer/technicalArticles/Programming/HPROF.html 
+https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html.
 .RE
 
 .LP
--- a/src/solaris/javavm/export/jni_md.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/javavm/export/jni_md.h	Tue Aug 22 02:03:52 2017 +0100
@@ -26,8 +26,22 @@
 #ifndef _JAVASOFT_JNI_MD_H_
 #define _JAVASOFT_JNI_MD_H_
 
-#define JNIEXPORT
-#define JNIIMPORT
+#ifndef __has_attribute
+  #define __has_attribute(x) 0
+#endif
+#if (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ > 2))) || __has_attribute(visibility)
+  #define JNIEXPORT     __attribute__((visibility("default")))
+  #define JNIIMPORT     __attribute__((visibility("default")))
+#else
+  #define JNIEXPORT
+  #define JNIIMPORT
+#endif
+#if (defined(__GNUC__)) || __has_attribute(unused)
+  #define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
+#else
+  #define UNUSED(x) UNUSED_ ## x
+#endif
+
 #define JNICALL
 
 typedef int jint;
--- a/src/solaris/native/com/sun/management/LinuxOperatingSystem.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/com/sun/management/LinuxOperatingSystem.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -76,14 +76,17 @@
 static int get_totalticks(int which, ticks *pticks) {
     FILE         *fh;
     uint64_t        userTicks, niceTicks, systemTicks, idleTicks;
+    uint64_t        iowTicks = 0, irqTicks = 0, sirqTicks= 0;
     int             n;
 
     if((fh = fopen("/proc/stat", "r")) == NULL) {
         return -1;
     }
 
-    n = fscanf(fh, "cpu " DEC_64 " " DEC_64 " " DEC_64 " " DEC_64,
-           &userTicks, &niceTicks, &systemTicks, &idleTicks);
+    n = fscanf(fh, "cpu " DEC_64 " " DEC_64 " " DEC_64 " " DEC_64 " " DEC_64 " "
+                   DEC_64 " " DEC_64,
+           &userTicks, &niceTicks, &systemTicks, &idleTicks,
+           &iowTicks, &irqTicks, &sirqTicks);
 
     // Move to next line
     next_line(fh);
@@ -92,24 +95,30 @@
     if (which != -1) {
         int i;
         for (i = 0; i < which; i++) {
-            if (fscanf(fh, "cpu%*d " DEC_64 " " DEC_64 " " DEC_64 " " DEC_64, &userTicks, &niceTicks, &systemTicks, &idleTicks) != 4) {
+            if (fscanf(fh, "cpu%*d " DEC_64 " " DEC_64 " " DEC_64 " " DEC_64 " "
+                            DEC_64 " " DEC_64 " " DEC_64,
+                   &userTicks, &niceTicks, &systemTicks, &idleTicks,
+                   &iowTicks, &irqTicks, &sirqTicks) < 4) {
                 fclose(fh);
                 return -2;
             }
             next_line(fh);
         }
-        n = fscanf(fh, "cpu%*d " DEC_64 " " DEC_64 " " DEC_64 " " DEC_64 "\n",
-           &userTicks, &niceTicks, &systemTicks, &idleTicks);
+        n = fscanf(fh, "cpu%*d " DEC_64 " " DEC_64 " " DEC_64 " " DEC_64 " "
+                       DEC_64 " " DEC_64 " " DEC_64 "\n",
+           &userTicks, &niceTicks, &systemTicks, &idleTicks,
+           &iowTicks, &irqTicks, &sirqTicks);
     }
 
     fclose(fh);
-    if (n != 4) {
+    if (n < 4) {
         return -2;
     }
 
     pticks->used       = userTicks + niceTicks;
-    pticks->usedKernel = systemTicks;
-    pticks->total      = userTicks + niceTicks + systemTicks + idleTicks;
+    pticks->usedKernel = systemTicks + irqTicks + sirqTicks;
+    pticks->total      = userTicks + niceTicks + systemTicks + idleTicks +
+                         iowTicks + irqTicks + sirqTicks;
 
     return 0;
 }
--- a/src/solaris/native/com/sun/security/auth/module/Solaris.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/com/sun/security/auth/module/Solaris.c	Tue Aug 22 02:03:52 2017 +0100
@@ -31,6 +31,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <pwd.h>
+
 JNIEXPORT void JNICALL
 Java_com_sun_security_auth_module_SolarisSystem_getSolarisInfo
                                                 (JNIEnv *env, jobject obj) {
@@ -39,13 +40,23 @@
     char pwd_buf[1024];
     struct passwd pwd;
     jsize numSuppGroups = getgroups(0, NULL);
-    gid_t *groups = (gid_t *)calloc(numSuppGroups, sizeof(gid_t));
-
     jfieldID fid;
     jstring jstr;
     jlongArray jgroups;
     jlong *jgroupsAsArray;
-    jclass cls = (*env)->GetObjectClass(env, obj);
+    gid_t *groups;
+    jclass cls;
+
+    groups = (gid_t *)calloc(numSuppGroups, sizeof(gid_t));
+
+    if (groups == NULL) {
+        jclass cls = (*env)->FindClass(env,"java/lang/OutOfMemoryError");
+        if(cls != 0)
+            (*env)->ThrowNew(env, cls, NULL);
+        return;
+    }
+
+    cls = (*env)->GetObjectClass(env, obj);
 
     memset(pwd_buf, 0, sizeof(pwd_buf));
     if (getpwuid_r(getuid(), &pwd, pwd_buf, sizeof(pwd_buf)) != NULL &&
--- a/src/solaris/native/com/sun/security/auth/module/Unix.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/com/sun/security/auth/module/Unix.c	Tue Aug 22 02:03:52 2017 +0100
@@ -44,86 +44,66 @@
     char pwd_buf[1024];
     struct passwd *pwd;
     struct passwd resbuf;
-    jsize numSuppGroups = getgroups(0, NULL);
-    gid_t *groups = (gid_t *)calloc(numSuppGroups, sizeof(gid_t));
+    jfieldID userNameID;
+    jfieldID userID;
+    jfieldID groupID;
+    jfieldID supplementaryGroupID;
 
-    jfieldID fid;
     jstring jstr;
     jlongArray jgroups;
     jlong *jgroupsAsArray;
-    jclass cls = (*env)->GetObjectClass(env, obj);
+    jsize numSuppGroups;
+    gid_t *groups;
+    jclass cls;
+
+    numSuppGroups = getgroups(0, NULL);
+    groups = (gid_t *)calloc(numSuppGroups, sizeof(gid_t));
+    if (groups == NULL) {
+        jclass cls = (*env)->FindClass(env,"java/lang/OutOfMemoryError");
+        if(cls != 0)
+            (*env)->ThrowNew(env, cls, NULL);
+        return;
+    }
+
+    cls = (*env)->GetObjectClass(env, obj);
 
     memset(pwd_buf, 0, sizeof(pwd_buf));
+
     if (getpwuid_r(getuid(), &resbuf, pwd_buf, sizeof(pwd_buf), &pwd) == 0 &&
         pwd != NULL &&
         getgroups(numSuppGroups, groups) != -1) {
 
-        /*
-         * set username
-         */
-        fid = (*env)->GetFieldID(env, cls, "username", "Ljava/lang/String;");
-        if (fid == 0) {
-            jclass newExcCls =
-                (*env)->FindClass(env, "java/lang/IllegalArgumentException");
-            if (newExcCls == 0) {
-                /* Unable to find the new exception class, give up. */
-                return;
-            }
-            (*env)->ThrowNew(env, newExcCls, "invalid field: username");
-        }
-        jstr = (*env)->NewStringUTF(env, pwd->pw_name);
-        (*env)->SetObjectField(env, obj, fid, jstr);
+        userNameID = (*env)->GetFieldID(env, cls, "username", "Ljava/lang/String;");
+        if (userNameID == 0)
+            goto cleanUpAndReturn;
+
+        userID = (*env)->GetFieldID(env, cls, "uid", "J");
+        if (userID == 0)
+            goto cleanUpAndReturn;
 
-        /*
-         * set uid
-         */
-        fid = (*env)->GetFieldID(env, cls, "uid", "J");
-        if (fid == 0) {
-            jclass newExcCls =
-                (*env)->FindClass(env, "java/lang/IllegalArgumentException");
-            if (newExcCls == 0) {
-                /* Unable to find the new exception class, give up. */
-                return;
-            }
-            (*env)->ThrowNew(env, newExcCls, "invalid field: username");
-        }
-        (*env)->SetLongField(env, obj, fid, pwd->pw_uid);
+        groupID = (*env)->GetFieldID(env, cls, "gid", "J");
+        if (groupID == 0)
+            goto cleanUpAndReturn;
 
-        /*
-         * set gid
-         */
-        fid = (*env)->GetFieldID(env, cls, "gid", "J");
-        if (fid == 0) {
-            jclass newExcCls =
-                (*env)->FindClass(env, "java/lang/IllegalArgumentException");
-            if (newExcCls == 0) {
-                /* Unable to find the new exception class, give up. */
-                return;
-            }
-            (*env)->ThrowNew(env, newExcCls, "invalid field: username");
-        }
-        (*env)->SetLongField(env, obj, fid, pwd->pw_gid);
+        supplementaryGroupID = (*env)->GetFieldID(env, cls, "groups", "[J");
+        if (supplementaryGroupID == 0)
+            goto cleanUpAndReturn;
 
-        /*
-         * set supplementary groups
-         */
-        fid = (*env)->GetFieldID(env, cls, "groups", "[J");
-        if (fid == 0) {
-            jclass newExcCls =
-                (*env)->FindClass(env, "java/lang/IllegalArgumentException");
-            if (newExcCls == 0) {
-                /* Unable to find the new exception class, give up. */
-                return;
-            }
-            (*env)->ThrowNew(env, newExcCls, "invalid field: username");
-        }
+        jstr = (*env)->NewStringUTF(env, pwd->pw_name);
+        (*env)->SetObjectField(env, obj, userNameID, jstr);
+
+        (*env)->SetLongField(env, obj, userID, pwd->pw_uid);
+
+        (*env)->SetLongField(env, obj, groupID, pwd->pw_gid);
 
         jgroups = (*env)->NewLongArray(env, numSuppGroups);
         jgroupsAsArray = (*env)->GetLongArrayElements(env, jgroups, 0);
         for (i = 0; i < numSuppGroups; i++)
             jgroupsAsArray[i] = groups[i];
         (*env)->ReleaseLongArrayElements(env, jgroups, jgroupsAsArray, 0);
-        (*env)->SetObjectField(env, obj, fid, jgroups);
+        (*env)->SetObjectField(env, obj, supplementaryGroupID, jgroups);
     }
+cleanUpAndReturn:
+    free(groups);
     return;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/cups_fp.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2003, 2006, 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 <jvm_md.h>
+#include <dlfcn.h>
+#include <jni.h>
+
+#include <cups/cups.h>
+#include <cups/ppd.h>
+
+#include <cups_fp.h>
+
+jboolean cups_init()
+{
+  void *handle = dlopen(VERSIONED_JNI_LIB_NAME("cups", "2"),
+                        RTLD_LAZY | RTLD_GLOBAL);
+
+  if (handle == NULL) {
+    handle = dlopen(JNI_LIB_NAME("cups"), RTLD_LAZY | RTLD_GLOBAL);
+    if (handle == NULL) {
+      return JNI_FALSE;
+    }
+  }
+
+  j2d_cupsServer = (fn_cupsServer)dlsym(handle, "cupsServer");
+  if (j2d_cupsServer == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  j2d_ippPort = (fn_ippPort)dlsym(handle, "ippPort");
+  if (j2d_ippPort == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  j2d_httpConnect = (fn_httpConnect)dlsym(handle, "httpConnect");
+  if (j2d_httpConnect == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  j2d_httpClose = (fn_httpClose)dlsym(handle, "httpClose");
+  if (j2d_httpClose == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  j2d_cupsGetPPD = (fn_cupsGetPPD)dlsym(handle, "cupsGetPPD");
+  if (j2d_cupsGetPPD == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  j2d_ppdOpenFile = (fn_ppdOpenFile)dlsym(handle, "ppdOpenFile");
+  if (j2d_ppdOpenFile == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+
+  }
+
+  j2d_ppdClose = (fn_ppdClose)dlsym(handle, "ppdClose");
+  if (j2d_ppdClose == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+
+  }
+
+  j2d_ppdFindOption = (fn_ppdFindOption)dlsym(handle, "ppdFindOption");
+  if (j2d_ppdFindOption == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  j2d_ppdPageSize = (fn_ppdPageSize)dlsym(handle, "ppdPageSize");
+  if (j2d_ppdPageSize == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  return JNI_TRUE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/cups_fp.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2003, 2006, 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 __CUPS_FP_H__
+#define __CUPS_FP_H__
+
+typedef const char* (*fn_cupsServer)(void);
+typedef int (*fn_ippPort)(void);
+typedef http_t* (*fn_httpConnect)(const char *, int);
+typedef void (*fn_httpClose)(http_t *);
+typedef char* (*fn_cupsGetPPD)(const char *);
+typedef ppd_file_t* (*fn_ppdOpenFile)(const char *);
+typedef void (*fn_ppdClose)(ppd_file_t *);
+typedef ppd_option_t* (*fn_ppdFindOption)(ppd_file_t *, const char *);
+typedef ppd_size_t* (*fn_ppdPageSize)(ppd_file_t *, char *);
+
+fn_cupsServer j2d_cupsServer;
+fn_ippPort j2d_ippPort;
+fn_httpConnect j2d_httpConnect;
+fn_httpClose j2d_httpClose;
+fn_cupsGetPPD j2d_cupsGetPPD;
+fn_ppdOpenFile j2d_ppdOpenFile;
+fn_ppdClose j2d_ppdClose;
+fn_ppdFindOption j2d_ppdFindOption;
+fn_ppdPageSize j2d_ppdPageSize;
+
+#define cupsServer (*j2d_cupsServer)
+#define ippPort (*j2d_ippPort)
+#define httpConnect (*j2d_httpConnect)
+#define httpClose (*j2d_httpClose)
+#define cupsGetPPD (*j2d_cupsGetPPD)
+#define ppdOpenFile (*j2d_ppdOpenFile)
+#define ppdClose (*j2d_ppdClose)
+#define ppdFindOption (*j2d_ppdFindOption)
+#define ppdPageSize (*j2d_ppdPageSize)
+
+jboolean cups_init();
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/fontconfig2/fontconfig/fontconfig.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,302 @@
+/*
+ * $RCSId: xc/lib/fontconfig/fontconfig/fontconfig.h,v 1.30 2002/09/26 00:17:27 keithp Exp $
+ *
+ * Copyright © 2001 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  Keith Packard makes no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _FONTCONFIG_H_
+#define _FONTCONFIG_H_
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#define FC_ATTRIBUTE_SENTINEL(x) __attribute__((__sentinel__(0)))
+#else
+#define FC_ATTRIBUTE_SENTINEL(x)
+#endif
+
+#ifndef FcPublic
+#define FcPublic
+#endif
+
+typedef unsigned char   FcChar8;
+typedef unsigned short  FcChar16;
+typedef unsigned int    FcChar32;
+typedef int             FcBool;
+
+/*
+ * Current Fontconfig version number.  This same number
+ * must appear in the fontconfig configure.in file. Yes,
+ * it'a a pain to synchronize version numbers like this.
+ */
+
+#define FC_MAJOR        2
+#define FC_MINOR        5
+#define FC_REVISION     0
+
+#define FC_VERSION      ((FC_MAJOR * 10000) + (FC_MINOR * 100) + (FC_REVISION))
+
+/*
+ * Current font cache file format version
+ * This is appended to the cache files so that multiple
+ * versions of the library will peacefully coexist
+ *
+ * Change this value whenever the disk format for the cache file
+ * changes in any non-compatible way.  Try to avoid such changes as
+ * it means multiple copies of the font information.
+ */
+
+#define FC_CACHE_VERSION    "2"
+
+#define FcTrue          1
+#define FcFalse         0
+
+#define FC_FAMILY           "family"            /* String */
+#define FC_STYLE            "style"             /* String */
+#define FC_SLANT            "slant"             /* Int */
+#define FC_WEIGHT           "weight"            /* Int */
+#define FC_SIZE             "size"              /* Double */
+#define FC_ASPECT           "aspect"            /* Double */
+#define FC_PIXEL_SIZE       "pixelsize"         /* Double */
+#define FC_SPACING          "spacing"           /* Int */
+#define FC_FOUNDRY          "foundry"           /* String */
+#define FC_ANTIALIAS        "antialias"         /* Bool (depends) */
+#define FC_HINTING          "hinting"           /* Bool (true) */
+#define FC_HINT_STYLE       "hintstyle"         /* Int */
+#define FC_VERTICAL_LAYOUT  "verticallayout"    /* Bool (false) */
+#define FC_AUTOHINT         "autohint"          /* Bool (false) */
+#define FC_GLOBAL_ADVANCE   "globaladvance"     /* Bool (true) */
+#define FC_WIDTH            "width"             /* Int */
+#define FC_FILE             "file"              /* String */
+#define FC_INDEX            "index"             /* Int */
+#define FC_FT_FACE          "ftface"            /* FT_Face */
+#define FC_RASTERIZER       "rasterizer"        /* String */
+#define FC_OUTLINE          "outline"           /* Bool */
+#define FC_SCALABLE         "scalable"          /* Bool */
+#define FC_SCALE            "scale"             /* double */
+#define FC_DPI              "dpi"               /* double */
+#define FC_RGBA             "rgba"              /* Int */
+#define FC_MINSPACE         "minspace"          /* Bool use minimum line spacing */
+#define FC_SOURCE           "source"            /* String (deprecated) */
+#define FC_CHARSET          "charset"           /* CharSet */
+#define FC_LANG             "lang"              /* String RFC 3066 langs */
+#define FC_FONTVERSION      "fontversion"       /* Int from 'head' table */
+#define FC_FULLNAME         "fullname"          /* String */
+#define FC_FAMILYLANG       "familylang"        /* String RFC 3066 langs */
+#define FC_STYLELANG        "stylelang"         /* String RFC 3066 langs */
+#define FC_FULLNAMELANG     "fullnamelang"      /* String RFC 3066 langs */
+#define FC_CAPABILITY       "capability"        /* String */
+#define FC_FONTFORMAT       "fontformat"        /* String */
+#define FC_EMBOLDEN         "embolden"          /* Bool - true if emboldening needed*/
+#define FC_EMBEDDED_BITMAP  "embeddedbitmap"    /* Bool - true to enable embedded bitmaps */
+#define FC_DECORATIVE       "decorative"        /* Bool - true if style is a decorative variant */
+
+#define FC_CACHE_SUFFIX             ".cache-"FC_CACHE_VERSION
+#define FC_DIR_CACHE_FILE           "fonts.cache-"FC_CACHE_VERSION
+#define FC_USER_CACHE_FILE          ".fonts.cache-"FC_CACHE_VERSION
+
+/* Adjust outline rasterizer */
+#define FC_CHAR_WIDTH       "charwidth" /* Int */
+#define FC_CHAR_HEIGHT      "charheight"/* Int */
+#define FC_MATRIX           "matrix"    /* FcMatrix */
+
+#define FC_WEIGHT_THIN              0
+#define FC_WEIGHT_EXTRALIGHT        40
+#define FC_WEIGHT_ULTRALIGHT        FC_WEIGHT_EXTRALIGHT
+#define FC_WEIGHT_LIGHT             50
+#define FC_WEIGHT_BOOK              75
+#define FC_WEIGHT_REGULAR           80
+#define FC_WEIGHT_NORMAL            FC_WEIGHT_REGULAR
+#define FC_WEIGHT_MEDIUM            100
+#define FC_WEIGHT_DEMIBOLD          180
+#define FC_WEIGHT_SEMIBOLD          FC_WEIGHT_DEMIBOLD
+#define FC_WEIGHT_BOLD              200
+#define FC_WEIGHT_EXTRABOLD         205
+#define FC_WEIGHT_ULTRABOLD         FC_WEIGHT_EXTRABOLD
+#define FC_WEIGHT_BLACK             210
+#define FC_WEIGHT_HEAVY             FC_WEIGHT_BLACK
+#define FC_WEIGHT_EXTRABLACK        215
+#define FC_WEIGHT_ULTRABLACK        FC_WEIGHT_EXTRABLACK
+
+#define FC_SLANT_ROMAN              0
+#define FC_SLANT_ITALIC             100
+#define FC_SLANT_OBLIQUE            110
+
+#define FC_WIDTH_ULTRACONDENSED     50
+#define FC_WIDTH_EXTRACONDENSED     63
+#define FC_WIDTH_CONDENSED          75
+#define FC_WIDTH_SEMICONDENSED      87
+#define FC_WIDTH_NORMAL             100
+#define FC_WIDTH_SEMIEXPANDED       113
+#define FC_WIDTH_EXPANDED           125
+#define FC_WIDTH_EXTRAEXPANDED      150
+#define FC_WIDTH_ULTRAEXPANDED      200
+
+#define FC_PROPORTIONAL             0
+#define FC_DUAL                     90
+#define FC_MONO                     100
+#define FC_CHARCELL                 110
+
+/* sub-pixel order */
+#define FC_RGBA_UNKNOWN     0
+#define FC_RGBA_RGB         1
+#define FC_RGBA_BGR         2
+#define FC_RGBA_VRGB        3
+#define FC_RGBA_VBGR        4
+#define FC_RGBA_NONE        5
+
+/* hinting style */
+#define FC_HINT_NONE        0
+#define FC_HINT_SLIGHT      1
+#define FC_HINT_MEDIUM      2
+#define FC_HINT_FULL        3
+
+typedef enum _FcType {
+    FcTypeVoid,
+    FcTypeInteger,
+    FcTypeDouble,
+    FcTypeString,
+    FcTypeBool,
+    FcTypeMatrix,
+    FcTypeCharSet,
+    FcTypeFTFace,
+    FcTypeLangSet
+} FcType;
+
+typedef struct _FcMatrix {
+    double xx, xy, yx, yy;
+} FcMatrix;
+
+#define FcMatrixInit(m) ((m)->xx = (m)->yy = 1, \
+                         (m)->xy = (m)->yx = 0)
+
+/*
+ * A data structure to represent the available glyphs in a font.
+ * This is represented as a sparse boolean btree.
+ */
+
+typedef struct _FcCharSet FcCharSet;
+
+typedef struct _FcObjectType {
+    const char  *object;
+    FcType      type;
+} FcObjectType;
+
+typedef struct _FcConstant {
+    const FcChar8  *name;
+    const char  *object;
+    int         value;
+} FcConstant;
+
+typedef enum _FcResult {
+    FcResultMatch, FcResultNoMatch, FcResultTypeMismatch, FcResultNoId,
+    FcResultOutOfMemory
+} FcResult;
+
+typedef struct _FcPattern   FcPattern;
+
+typedef struct _FcLangSet   FcLangSet;
+
+typedef struct _FcValue {
+    FcType      type;
+    union {
+        const FcChar8   *s;
+        int             i;
+        FcBool          b;
+        double          d;
+        const FcMatrix  *m;
+        const FcCharSet *c;
+        void            *f;
+        const FcLangSet *l;
+    } u;
+} FcValue;
+
+typedef struct _FcFontSet {
+    int         nfont;
+    int         sfont;
+    FcPattern   **fonts;
+} FcFontSet;
+
+typedef struct _FcObjectSet {
+    int         nobject;
+    int         sobject;
+    const char  **objects;
+} FcObjectSet;
+
+typedef enum _FcMatchKind {
+    FcMatchPattern, FcMatchFont, FcMatchScan
+} FcMatchKind;
+
+typedef enum _FcLangResult {
+    FcLangEqual = 0,
+    FcLangDifferentCountry = 1,
+    FcLangDifferentTerritory = 1,
+    FcLangDifferentLang = 2
+} FcLangResult;
+
+typedef enum _FcSetName {
+    FcSetSystem = 0,
+    FcSetApplication = 1
+} FcSetName;
+
+typedef struct _FcAtomic FcAtomic;
+
+#if defined(__cplusplus) || defined(c_plusplus) /* for C++ V2.0 */
+#define _FCFUNCPROTOBEGIN extern "C" {  /* do not leave open across includes */
+#define _FCFUNCPROTOEND }
+#else
+#define _FCFUNCPROTOBEGIN
+#define _FCFUNCPROTOEND
+#endif
+
+typedef enum { FcEndianBig, FcEndianLittle } FcEndian;
+
+typedef struct _FcConfig    FcConfig;
+
+typedef struct _FcGlobalCache   FcFileCache;
+
+typedef struct _FcBlanks    FcBlanks;
+
+typedef struct _FcStrList   FcStrList;
+
+typedef struct _FcStrSet    FcStrSet;
+
+typedef struct _FcCache     FcCache;
+
+#undef FC_ATTRIBUTE_SENTINEL
+
+
+#ifndef _FCINT_H_
+
+/*
+ * Deprecated functions are placed here to help users fix their code without
+ * digging through documentation
+ */
+
+#define FcConfigGetRescanInverval   FcConfigGetRescanInverval_REPLACE_BY_FcConfigGetRescanInterval
+#define FcConfigSetRescanInverval   FcConfigSetRescanInverval_REPLACE_BY_FcConfigSetRescanInterval
+
+#endif
+
+#endif /* _FONTCONFIG_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/fontconfig2/fontconfig_fp.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 1998, 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.
+ */
+
+#include <fontconfig_fp.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+void* dlOpenFontConfig() {
+
+    char *homeEnv;
+    static char *homeEnvStr = "HOME="; /* must be static */
+    void* libfontconfig = NULL;
+#ifdef __solaris__
+#define SYSINFOBUFSZ 8
+    char sysinfobuf[SYSINFOBUFSZ];
+#endif
+
+    /* Private workaround to not use fontconfig library.
+     * May be useful during testing/debugging
+     */
+    char *useFC = getenv("USE_J2D_FONTCONFIG");
+    if (useFC != NULL && !strcmp(useFC, "no")) {
+        return NULL;
+    }
+
+#ifdef __solaris__
+    /* fontconfig is likely not properly configured on S8/S9 - skip it,
+     * although allow user to override this behaviour with an env. variable
+     * ie if USE_J2D_FONTCONFIG=yes then we skip this test.
+     * NB "4" is the length of a string which matches our patterns.
+     */
+    if (useFC == NULL || strcmp(useFC, "yes")) {
+        if (sysinfo(SI_RELEASE, sysinfobuf, SYSINFOBUFSZ) == 4) {
+            if ((!strcmp(sysinfobuf, "5.8") || !strcmp(sysinfobuf, "5.9"))) {
+                return NULL;
+            }
+        }
+    }
+#endif
+
+#if defined(AIX)
+    /* On AIX, fontconfig is not a standard package supported by IBM.
+     * insted it has to be installed from the "AIX Toolbox for Linux Applications"
+     * site http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/alpha.html
+     * and will be installed under /opt/freeware/lib/libfontconfig.a.
+     * Notice that the archive contains the real 32- and 64-bit shared libraries.
+     * We first try to load 'libfontconfig.so' from the default library path in the
+     * case the user has installed a private version of the library and if that
+     * doesn't succeed, we try the version from /opt/freeware/lib/libfontconfig.a
+     */
+    libfontconfig = dlopen("libfontconfig.so", RTLD_LOCAL|RTLD_LAZY);
+    if (libfontconfig == NULL) {
+        libfontconfig = dlopen("/opt/freeware/lib/libfontconfig.a(libfontconfig.so.1)", RTLD_MEMBER|RTLD_LOCAL|RTLD_LAZY);
+        if (libfontconfig == NULL) {
+            return NULL;
+        }
+    }
+#else
+    /* 64 bit sparc should pick up the right version from the lib path.
+     * New features may be added to libfontconfig, this is expected to
+     * be compatible with old features, but we may need to start
+     * distinguishing the library version, to know whether to expect
+     * certain symbols - and functionality - to be available.
+     * Also add explicit search for .so.1 in case .so symlink doesn't exist.
+     */
+    libfontconfig = dlopen(FONTCONFIG_DLL_VERSIONED, RTLD_LOCAL|RTLD_LAZY);
+    if (libfontconfig == NULL) {
+        libfontconfig = dlopen(FONTCONFIG_DLL, RTLD_LOCAL|RTLD_LAZY);
+        if (libfontconfig == NULL) {
+            return NULL;
+        }
+    }
+#endif
+
+    /* Version 1.0 of libfontconfig crashes if HOME isn't defined in
+     * the environment. This should generally never happen, but we can't
+     * control it, and can't control the version of fontconfig, so iff
+     * its not defined we set it to an empty value which is sufficient
+     * to prevent a crash. I considered unsetting it before exit, but
+     * it doesn't appear to work on Solaris, so I will leave it set.
+     */
+    homeEnv = getenv("HOME");
+    if (homeEnv == NULL) {
+        putenv(homeEnvStr);
+    }
+
+    if (libfontconfig == NULL) {
+        return NULL;
+    }
+
+    PatternBuild     =
+        (FcPatternBuildFuncType)dlsym(libfontconfig, "FcPatternBuild");
+    ObjectSetBuild   =
+        (FcObjectSetFuncType)dlsym(libfontconfig, "FcObjectSetBuild");
+    FontList         =
+        (FcFontListFuncType)dlsym(libfontconfig, "FcFontList");
+    PatternGetString =
+        (FcPatternGetStringFuncType)dlsym(libfontconfig, "FcPatternGetString");
+    StrDirname       =
+        (FcStrDirnameFuncType)dlsym(libfontconfig, "FcStrDirname");
+    PatternDestroy   =
+        (FcPatternDestroyFuncType)dlsym(libfontconfig, "FcPatternDestroy");
+    FontSetDestroy   =
+        (FcFontSetDestroyFuncType)dlsym(libfontconfig, "FcFontSetDestroy");
+#if 0
+    Fini             =
+        (FcFiniFuncType)dlsym(libfontconfig, "FcFini");
+#endif
+    NameParse = (FcNameParseFuncType)dlsym(libfontconfig, "FcNameParse");
+    PatternAddString =
+        (FcPatternAddStringFuncType)dlsym(libfontconfig, "FcPatternAddString");
+    ConfigSubstitute =
+        (FcConfigSubstituteFuncType)dlsym(libfontconfig, "FcConfigSubstitute");
+    DefaultSubstitute = (FcDefaultSubstituteFuncType)
+        dlsym(libfontconfig, "FcDefaultSubstitute");
+    FontMatch = (FcFontMatchFuncType)dlsym(libfontconfig, "FcFontMatch");
+    PatternGetBool = (FcPatternGetBoolFuncType)
+        dlsym(libfontconfig, "FcPatternGetBool");
+    PatternGetInteger = (FcPatternGetIntegerFuncType)
+        dlsym(libfontconfig, "FcPatternGetInteger");
+    PatternDestroy =
+        (FcPatternDestroyFuncType)dlsym(libfontconfig, "FcPatternDestroy");
+    GetVersion = (FcGetVersionFuncType)dlsym(libfontconfig, "FcGetVersion");
+    PatternGetCharSet =
+        (FcPatternGetCharSetFuncType)dlsym(libfontconfig,
+                                           "FcPatternGetCharSet");
+    FontSort =
+        (FcFontSortFuncType)dlsym(libfontconfig, "FcFontSort");
+    FontSetDestroy =
+        (FcFontSetDestroyFuncType)dlsym(libfontconfig, "FcFontSetDestroy");
+    CharSetUnion =
+        (FcCharSetUnionFuncType)dlsym(libfontconfig, "FcCharSetUnion");
+    CharSetSubtractCount =
+        (FcCharSetSubtractCountFuncType)dlsym(libfontconfig,
+                                              "FcCharSetSubtractCount");
+
+    if (PatternBuild     == NULL ||
+        ObjectSetBuild   == NULL ||
+        PatternGetString == NULL ||
+        FontList         == NULL ||
+        StrDirname       == NULL ||
+        PatternDestroy   == NULL ||
+        FontSetDestroy   == NULL ||
+        NameParse          == NULL ||
+        PatternAddString   == NULL ||
+        ConfigSubstitute   == NULL ||
+        DefaultSubstitute  == NULL ||
+        FontMatch          == NULL ||
+        PatternGetBool     == NULL ||
+        PatternGetInteger  == NULL ||
+        PatternDestroy     == NULL ||
+	GetVersion         == NULL ||
+        PatternGetCharSet  == NULL ||
+        CharSetUnion       == NULL ||
+        GetVersion         == NULL ||
+        CharSetSubtractCount == NULL) {/* problem with the library: return.*/
+        dlCloseFontConfig (libfontconfig);
+        return NULL;
+    }
+
+    /* Optionally get the cache dir locations. This isn't
+     * available until v 2.4.x, but this is OK since on those later versions
+     * we can check the time stamps on the cache dirs to see if we
+     * are out of date. There are a couple of assumptions here. First
+     * that the time stamp on the directory changes when the contents are
+     * updated. Secondly that the locations don't change. The latter is
+     * most likely if a new version of fontconfig is installed, but we also
+     * invalidate the cache if we detect that. Arguably even that is "rare",
+     * and most likely is tied to an OS upgrade which gets a new file anyway.
+     */
+    ConfigGetCacheDirs =
+        (FcConfigGetCacheDirsFuncType)dlsym(libfontconfig,
+                                            "FcConfigGetCacheDirs");
+    StrListNext =
+        (FcStrListNextFuncType)dlsym(libfontconfig, "FcStrListNext");
+    StrListDone =
+        (FcStrListDoneFuncType)dlsym(libfontconfig, "FcStrListDone");
+
+    return libfontconfig;
+}
+
+void dlCloseFontConfig(void* libfontconfig)
+{
+    dlclose(libfontconfig);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/fontconfig2/fontconfig_fp.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1998, 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.
+ */
+
+#ifndef __FONTCONFIG_FP_H__
+#define __FONTCONFIG_FP_H__
+
+#include <dlfcn.h>
+
+#include <fontconfig/fontconfig.h>
+#include <jvm_md.h>
+
+#ifdef MACOSX
+
+//
+// XXXDARWIN: Hard-code the path to Apple's fontconfig, as it is
+// not included in the dyld search path by default, and 10.4
+// does not support -rpath.
+//
+// This ignores the build time setting of ALT_FREETYPE_LIB_PATH,
+// and should be replaced with -rpath/@rpath support on 10.5 or later,
+// or via support for a the FREETYPE_LIB_PATH define.
+#define FONTCONFIG_DLL_VERSIONED X11_PATH "/lib/" VERSIONED_JNI_LIB_NAME("fontconfig", "1")
+#define FONTCONFIG_DLL X11_PATH "/lib/" JNI_LIB_NAME("fontconfig")
+#else
+#define FONTCONFIG_DLL_VERSIONED VERSIONED_JNI_LIB_NAME("fontconfig", "1")
+#define FONTCONFIG_DLL JNI_LIB_NAME("fontconfig")
+#endif
+
+void* dlOpenFontConfig();
+void dlCloseFontConfig(void *libfontconfig);
+
+typedef void* (FcFiniFuncType)();
+typedef FcConfig* (*FcInitLoadConfigFuncType)();
+typedef FcPattern* (*FcPatternBuildFuncType)(FcPattern *orig, ...);
+typedef FcObjectSet* (*FcObjectSetFuncType)(const char *first, ...);
+typedef FcFontSet* (*FcFontListFuncType)(FcConfig *config,
+                                         FcPattern *p,
+                                         FcObjectSet *os);
+typedef FcResult (*FcPatternGetBoolFuncType)(const FcPattern *p,
+                                               const char *object,
+                                               int n,
+                                               FcBool *b);
+typedef FcResult (*FcPatternGetIntegerFuncType)(const FcPattern *p,
+                                                const char *object,
+                                                int n,
+                                                int *i);
+typedef FcResult (*FcPatternGetStringFuncType)(const FcPattern *p,
+                                               const char *object,
+                                               int n,
+                                               FcChar8 ** s);
+typedef FcChar8* (*FcStrDirnameFuncType)(const FcChar8 *file);
+typedef void (*FcPatternDestroyFuncType)(FcPattern *p);
+typedef void (*FcFontSetDestroyFuncType)(FcFontSet *s);
+typedef FcPattern* (*FcNameParseFuncType)(const FcChar8 *name);
+typedef FcBool (*FcPatternAddStringFuncType)(FcPattern *p,
+                                             const char *object,
+                                             const FcChar8 *s);
+typedef void (*FcDefaultSubstituteFuncType)(FcPattern *p);
+typedef FcBool (*FcConfigSubstituteFuncType)(FcConfig *config,
+                                             FcPattern *p,
+                                             FcMatchKind kind);
+typedef FcPattern* (*FcFontMatchFuncType)(FcConfig *config,
+                                          FcPattern *p,
+                                          FcResult *result);
+typedef FcFontSet* (*FcFontSetCreateFuncType)();
+typedef FcBool (*FcFontSetAddFuncType)(FcFontSet *s, FcPattern *font);
+
+typedef FcResult (*FcPatternGetCharSetFuncType)(FcPattern *p,
+                                                const char *object,
+                                                int n,
+                                                FcCharSet **c);
+typedef FcFontSet* (*FcFontSortFuncType)(FcConfig *config,
+                                         FcPattern *p,
+                                         FcBool trim,
+                                         FcCharSet **csp,
+                                         FcResult *result);
+typedef FcCharSet* (*FcCharSetUnionFuncType)(const FcCharSet *a,
+                                             const FcCharSet *b);
+typedef FcChar32 (*FcCharSetSubtractCountFuncType)(const FcCharSet *a,
+                                                   const FcCharSet *b);
+
+typedef int (*FcGetVersionFuncType)();
+
+typedef FcStrList* (*FcConfigGetCacheDirsFuncType)(FcConfig *config);
+typedef FcChar8* (*FcStrListNextFuncType)(FcStrList *list);
+typedef FcChar8* (*FcStrListDoneFuncType)(FcStrList *list);
+
+FcInitLoadConfigFuncType InitLoadConfig;
+FcPatternBuildFuncType PatternBuild;
+FcObjectSetFuncType ObjectSetBuild;
+FcFontListFuncType FontList;
+FcPatternGetStringFuncType PatternGetString;
+FcStrDirnameFuncType StrDirname;
+FcPatternDestroyFuncType PatternDestroy;
+FcFontSetDestroyFuncType FontSetDestroy;
+FcNameParseFuncType NameParse;
+FcPatternAddStringFuncType PatternAddString;
+FcConfigSubstituteFuncType ConfigSubstitute;
+FcDefaultSubstituteFuncType  DefaultSubstitute;
+FcFontMatchFuncType FontMatch;
+FcPatternGetBoolFuncType PatternGetBool;
+FcPatternGetIntegerFuncType PatternGetInteger;
+FcGetVersionFuncType GetVersion;
+FcPatternGetCharSetFuncType PatternGetCharSet;
+FcFontSortFuncType FontSort;
+FcFontSetDestroyFuncType FontSetDestroy;
+FcCharSetUnionFuncType CharSetUnion;
+FcCharSetSubtractCountFuncType CharSetSubtractCount;
+FcConfigGetCacheDirsFuncType ConfigGetCacheDirs;
+FcStrListNextFuncType StrListNext;
+FcStrListDoneFuncType StrListDone;
+#if 0
+FcFiniFuncType Fini;
+#endif
+
+#define FcPatternBuild (*PatternBuild)
+#define FcObjectSetBuild (*ObjectSetBuild)
+#define FcFontList (*FontList)
+#define FcPatternGetString (*PatternGetString)
+#define FcStrDirname (*StrDirname)
+#define FcFontSetDestroy (*FontSetDestroy)
+#define FcPatternDestroy (*PatternDestroy)
+#define FcNameParse (*NameParse)
+#define FcPatternAddString (*PatternAddString)
+#define FcConfigSubstitute (*ConfigSubstitute)
+#define FcDefaultSubstitute (*DefaultSubstitute)
+#define FcFontMatch (*FontMatch)
+#define FcPatternGetBool (*PatternGetBool)
+#define FcPatternGetInteger (*PatternGetInteger)
+#define FcGetVersion (*GetVersion)
+#define FcStrListNext (*StrListNext)
+#define FcStrListDone (*StrListDone)
+#define FcConfigGetCacheDirs (*ConfigGetCacheDirs)
+#define FcFontSort (*FontSort)
+#define FcPatternGetCharSet (*PatternGetCharSet)
+#define FcCharSetSubtractCount (*CharSetSubtractCount)
+#define FcCharSetUnion (*CharSetUnion)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/gconf2/gconf/gconf-client.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 GCONF_GCONF_H
+#define GCONF_GCONF_H
+
+/**
+ * These functions are used by the sun.net.spi.DefaultProxySelector class
+ * to access some platform specific settings.
+ * This is the Solaris/Linux Gnome 2.x code using the GConf-2 library.
+ * Everything is loaded dynamically so no hard link with any library exists.
+ */
+typedef void* fp_client_get_default_func();
+typedef char* fp_client_get_string_func(void *, char *, void**);
+typedef int   fp_client_get_int_func(void*, char *, void**);
+typedef int   fp_client_get_bool_func(void*, char *, void**);
+typedef int   fp_conf_init_func(int, char**, void**);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/gconf2/gconf_fp.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 <gconf_fp.h>
+#include <dlfcn.h>
+#include "jvm_md.h"
+
+fp_client_get_default_func* my_get_default_func = NULL;
+fp_client_get_string_func* my_get_string_func = NULL;
+fp_client_get_int_func* my_get_int_func = NULL;
+fp_client_get_bool_func* my_get_bool_func = NULL;
+fp_conf_init_func* my_gconf_init_func = NULL;
+type_init_func type_init = NULL;
+free_func gfree = NULL;
+
+jboolean init_gconf(int* gconf_ver, void** gconf_client)
+{
+  /**
+   * Let's try to load le GConf-2 library
+   */
+  if (dlopen(JNI_LIB_NAME("gconf-2"), RTLD_GLOBAL | RTLD_LAZY) != NULL ||
+      dlopen(VERSIONED_JNI_LIB_NAME("gconf-2", "4"),
+             RTLD_GLOBAL | RTLD_LAZY) != NULL) {
+    *gconf_ver = 2;
+  }
+  if (*gconf_ver > 0) {
+    /*
+     * Now let's get pointer to the functions we need.
+     */
+    type_init = (type_init_func) dlsym(RTLD_DEFAULT, "g_type_init");
+    gfree = (free_func) dlsym(RTLD_DEFAULT, "g_free");
+    my_get_default_func = (fp_client_get_default_func*) dlsym(RTLD_DEFAULT, "gconf_client_get_default");
+    if (type_init != NULL && gfree != NULL && my_get_default_func != NULL) {
+      /**
+       * Try to connect to GConf.
+       */
+      (*type_init)();
+      (*gconf_client) = (*my_get_default_func)();
+      if ((*gconf_client) != NULL) {
+        my_get_string_func = (fp_client_get_string_func*) dlsym(RTLD_DEFAULT, "gconf_client_get_string");
+        my_get_int_func = (fp_client_get_int_func*) dlsym(RTLD_DEFAULT, "gconf_client_get_int");
+        my_get_bool_func = (fp_client_get_bool_func*) dlsym(RTLD_DEFAULT, "gconf_client_get_bool");
+        if (my_get_int_func != NULL && my_get_string_func != NULL &&
+            my_get_bool_func != NULL) {
+          /**
+           * We did get all we need. Let's enable the System Proxy Settings.
+           */
+          return JNI_TRUE;
+        }
+      }
+    }
+  }
+  return JNI_FALSE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/gconf2/gconf_fp.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 GCONF_GCONF_FP_H
+#define GCONF_GCONF_FP_H
+
+#include <glib_fp.h>
+#include <gconf/gconf-client.h>
+#include <jni.h>
+#include <stddef.h>
+
+extern fp_client_get_default_func* my_get_default_func;
+extern fp_client_get_string_func* my_get_string_func;
+extern fp_client_get_int_func* my_get_int_func;
+extern fp_client_get_bool_func* my_get_bool_func;
+extern fp_conf_init_func* my_gconf_init_func;
+
+#define gconf_client_get_default (*my_get_default_func)
+#define gconf_client_get_string (*my_get_string_func)
+#define gconf_client_get_int (*my_get_int_func)
+#define gconf_client_get_bool (*my_get_bool_func)
+#define gconf_init (*my_gconf_init_func)
+
+jboolean init_gconf(int* gconf_ver, void** gconf_client);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/glib2/gio/gio_typedefs.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2008, 2009, 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.
+ */
+
+/* Definitions for GIO */
+
+#ifndef __GIO_H__
+#define __GIO_H__
+
+#define G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "standard::content-type"
+
+typedef struct _GFile GFile;
+typedef struct _GFileInfo GFileInfo;
+typedef struct _GCancellable GCancellable;
+typedef struct _GAppLaunchContext GAppLaunchContext;
+typedef struct _GSettings GSettings;
+
+typedef enum {
+  G_FILE_QUERY_INFO_NONE = 0
+} GFileQueryInfoFlags;
+
+typedef void (*object_unref_func)(gpointer object);
+typedef GFile* (*file_new_for_path_func)(const char* path);
+typedef GFileInfo* (*file_query_info_func)(GFile *file,
+    const char *attributes, GFileQueryInfoFlags flags,
+    GCancellable *cancellable, GError **error);
+typedef char* (*file_info_get_content_type_func)(GFileInfo *info);
+typedef gboolean  (*app_info_launch_default_for_uri_func)(const char              *uri,
+							  GAppLaunchContext       *launch_context,
+							  GError                 **error);
+typedef GSettings* (*settings_new_func) (const gchar *schema);
+typedef gboolean (*settings_get_boolean_func) (GSettings *settings, const gchar *key);
+typedef gchar* (*settings_get_string_func) (GSettings *settings, const gchar *key);
+typedef gchar** (*settings_get_strv_func) (GSettings *settings, const gchar *key);
+typedef gint (*settings_get_int_func) (GSettings *settings, const gchar *key);
+typedef GSettings* (*settings_get_child_func) (GSettings *settings, const gchar *name);
+typedef void (*strfreev_func) (gchar **str_array);
+typedef void (*error_free_func) (GError *error);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/glib2/gio_fp.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2008, 2009, 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 <dlfcn.h>
+#include <jvm.h>
+
+#include "gio_fp.h"
+
+type_init_func type_init;
+object_unref_func object_unref;
+file_new_for_path_func file_new_for_path;
+file_query_info_func file_query_info;
+file_info_get_content_type_func file_info_get_content_type;
+app_info_launch_default_for_uri_func app_info_launch_default_for_uri;
+strfreev_func gstrfreev;
+free_func gfree;
+error_free_func gerror_free;
+
+settings_new_func settings_new;
+settings_get_boolean_func settings_get_boolean;
+settings_get_string_func settings_get_string;
+settings_get_strv_func settings_get_strv;
+settings_get_int_func settings_get_int;
+settings_get_child_func settings_get_child;
+
+static void* gio_handle = NULL;
+
+jboolean gio_init()
+{
+
+    if (gio_handle == NULL) {
+        gio_handle = dlopen("libgio-2.0.so", RTLD_LAZY);
+        if (gio_handle == NULL) {
+            gio_handle = dlopen("libgio-2.0.so.0", RTLD_LAZY);
+            if (gio_handle == NULL) {
+                NATDEBUG("Couldn't find libgio; returning false\n")
+                return JNI_FALSE;
+            }
+        }
+    }
+
+    if (type_init != NULL &&
+        object_unref != NULL &&
+        file_new_for_path != NULL &&
+        file_query_info != NULL &&
+        file_info_get_content_type != NULL &&
+        app_info_launch_default_for_uri != NULL &&
+        gstrfreev != NULL &&
+        gfree != NULL &&
+	gerror_free != NULL)
+    {
+        NATDEBUG("gio_init returning early true\n")
+        return JNI_TRUE;
+    }
+
+    type_init = (type_init_func)dlsym(gio_handle, "g_type_init");
+
+    object_unref = (object_unref_func)dlsym(gio_handle, "g_object_unref");
+
+    file_new_for_path =
+        (file_new_for_path_func)dlsym(gio_handle, "g_file_new_for_path");
+
+    file_query_info =
+        (file_query_info_func)dlsym(gio_handle, "g_file_query_info");
+
+    file_info_get_content_type = (file_info_get_content_type_func)
+        dlsym(gio_handle, "g_file_info_get_content_type");
+
+    app_info_launch_default_for_uri = (app_info_launch_default_for_uri_func)
+        dlsym (gio_handle, "g_app_info_launch_default_for_uri");
+
+    gstrfreev = (strfreev_func) dlsym (gio_handle, "g_strfreev");
+    gfree = (free_func) dlsym (gio_handle, "g_free");
+    gerror_free = (error_free_func) dlsym (gio_handle, "g_error_free");
+
+#ifdef NATIVE_SUPPORT_DEBUG
+    printf("type_init=%p, object_unref=%p, file_new_for_path=%p,"
+           "file_query_info=%p, file_info_get_content_type=%p,"
+           "app_info_launch_default_for_uri=%p,gstrfreev=%p,"
+           "gfree=%p, gerror_free=%p\n", type_init, object_unref,
+	   file_new_for_path, file_query_info, file_info_get_content_type,
+	   app_info_launch_default_for_uri, gstrfreev, gfree, gerror_free);
+#endif
+
+    if (type_init == NULL ||
+        object_unref == NULL ||
+        file_new_for_path == NULL ||
+        file_query_info == NULL ||
+        file_info_get_content_type == NULL ||
+        app_info_launch_default_for_uri == NULL ||
+        gstrfreev == NULL ||
+        gfree == NULL ||
+	gerror_free == NULL)
+    {
+        dlclose(gio_handle);
+        NATDEBUG("gio_init returning false\n")
+        return JNI_FALSE;
+    }
+
+    NATDEBUG("gio_init returning true\n")
+    return JNI_TRUE;
+}
+
+jboolean gsettings_init()
+{
+    jboolean gio_init_result;
+
+    gio_init_result = gio_init();
+    if (gio_init_result == JNI_FALSE)
+    {
+        NATDEBUG("gio_init failed; returning false\n")
+        return JNI_FALSE;
+    }
+
+    if (settings_new != NULL &&
+        settings_get_boolean != NULL &&
+        settings_get_string != NULL &&
+        settings_get_strv != NULL &&
+        settings_get_int != NULL &&
+        settings_get_child != NULL)
+    {
+        NATDEBUG("gsettings_init returning early true\n")
+        return JNI_TRUE;
+    }
+
+    settings_new = (settings_new_func) dlsym (gio_handle, "g_settings_new");
+    settings_get_boolean = (settings_get_boolean_func)
+      dlsym (gio_handle, "g_settings_get_boolean");
+    settings_get_string = (settings_get_string_func)
+      dlsym (gio_handle, "g_settings_get_string");
+    settings_get_strv = (settings_get_strv_func)
+      dlsym (gio_handle, "g_settings_get_strv");
+    settings_get_int = (settings_get_int_func)
+      dlsym (gio_handle, "g_settings_get_int");
+    settings_get_child = (settings_get_child_func)
+      dlsym (gio_handle, "g_settings_get_child");
+
+#ifdef NATIVE_SUPPORT_DEBUG
+    printf("settings_new=%p, settings_get_boolean=%p,"
+           "settings_get_string=%p, settings_get_strv=%p,"
+           "settings_get_int=%p, settings_get_child=%p\n",
+           settings_new, settings_get_boolean,
+           settings_get_string, settings_get_strv,
+           settings_get_int, settings_get_child);
+#endif
+
+    if (settings_new == NULL ||
+        settings_get_boolean == NULL ||
+        settings_get_string == NULL ||
+        settings_get_strv == NULL ||
+        settings_get_int == NULL ||
+        settings_get_child == NULL)
+    {
+        dlclose(gio_handle);
+        NATDEBUG("g_settings_init returning false\n")
+        return JNI_FALSE;
+    }
+
+    NATDEBUG("g_settings_init returning true\n")
+    return JNI_TRUE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/glib2/gio_fp.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2008, 2009, 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 __GIO_FP_H__
+#define __GIO_FP_H__
+
+#include <glib_fp.h>
+#include <gio/gio_typedefs.h>
+
+#ifdef NATIVE_SUPPORT_DEBUG
+#define NATDEBUG(x) printf(x);
+#else
+#define NATDEBUG(x)
+#endif
+
+extern object_unref_func object_unref;
+extern file_new_for_path_func file_new_for_path;
+extern file_query_info_func file_query_info;
+extern file_info_get_content_type_func file_info_get_content_type;
+extern app_info_launch_default_for_uri_func app_info_launch_default_for_uri;
+extern settings_new_func settings_new;
+extern settings_get_boolean_func settings_get_boolean;
+extern settings_get_string_func settings_get_string;
+extern settings_get_strv_func settings_get_strv;
+extern settings_get_int_func settings_get_int;
+extern settings_get_child_func settings_get_child;
+extern strfreev_func gstrfreev;
+extern error_free_func gerror_free;
+
+#define g_object_unref (*object_unref)
+#define g_strfreev (*gstrfreev)
+#define g_error_free (*gerror_free);
+#define g_file_new_for_path (*file_new_for_path)
+#define g_file_query_info (*file_query_info)
+#define g_file_info_get_content_type (*file_info_get_content_type)
+#define g_app_info_launch_default_for_uri (*app_info_launch_default_for_uri)
+#define g_settings_new (*settings_new)
+#define g_settings_get_boolean (*settings_get_boolean)
+#define g_settings_get_string (*settings_get_string)
+#define g_settings_get_strv (*settings_get_strv)
+#define g_settings_get_int (*settings_get_int)
+#define g_settings_get_child (*settings_get_child)
+
+jboolean gio_init();
+jboolean gsettings_init();
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/glib2/glib_fp.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 Red Hat Inc.
+ * 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 __GLIB_FP_H__
+#define __GLIB_FP_H__
+
+#include <stdint.h>
+
+#ifndef __G_TYPES_H__
+typedef void* gpointer;
+typedef int    gint;
+typedef gint   gboolean;
+typedef char   gchar;
+#endif
+
+#ifndef __G_LIBCONFIG_H__
+#ifndef __GLIBCONFIG_H__
+typedef uint32_t guint32;
+#endif
+#endif
+
+#ifndef __G_QUARK_H__
+typedef guint32 GQuark;
+#endif
+
+#ifndef __G_ERROR_H__
+typedef struct {
+  GQuark       domain;
+  gint         code;
+  gchar       *message;
+} GError;
+#endif
+
+#ifndef USE_SYSTEM_GIO
+#ifndef USE_SYSTEM_GCONF
+#define g_type_init (*type_init)
+#define g_free (*gfree)
+#endif
+#endif
+
+typedef void (*type_init_func)(void);
+typedef void (*free_func) (void* mem);
+
+extern type_init_func type_init;
+extern free_func gfree;
+
+#endif /* __GLIB_FP_H__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/gtk2/gtk/gtk.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,567 @@
+/*
+ * Copyright (c) 2005, 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.
+ */
+#ifndef __GTK_H__
+#define __GTK_H__
+
+#define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
+#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
+#define GTK_TYPE_FILE_CHOOSER             (fp_gtk_file_chooser_get_type ())
+#define GTK_FILE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_CHOOSER, GtkFileChooser))
+#define fp_g_signal_connect(instance, detailed_signal, c_handler, data) \
+    fp_g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
+#define G_CALLBACK(f) ((GCallback) (f))
+#define G_TYPE_FUNDAMENTAL_SHIFT (2)
+#define G_TYPE_MAKE_FUNDAMENTAL(x) ((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
+#define G_TYPE_OBJECT G_TYPE_MAKE_FUNDAMENTAL (20)
+#define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
+#define GTK_STOCK_CANCEL           "gtk-cancel"
+#define GTK_STOCK_SAVE             "gtk-save"
+#define GTK_STOCK_OPEN             "gtk-open"
+
+/* GTK types, here to eliminate need for GTK headers at compile time */
+
+#ifndef FALSE
+#define FALSE           (0)
+#define TRUE            (!FALSE)
+#endif
+
+#define GTK_HAS_FOCUS   (1 << 12)
+#define GTK_HAS_DEFAULT (1 << 14)
+
+
+/* basic types */
+typedef char    gchar;
+typedef short   gshort;
+typedef int     gint;
+typedef long    glong;
+typedef float   gfloat;
+typedef double  gdouble;
+typedef void*   gpointer;
+typedef gint    gboolean;
+
+typedef signed char  gint8;
+typedef signed short gint16;
+typedef signed int   gint32;
+
+typedef unsigned char  guchar;
+typedef unsigned char  guint8;
+typedef unsigned short gushort;
+typedef unsigned short guint16;
+typedef unsigned int   guint;
+typedef unsigned int   guint32;
+typedef unsigned int   gsize;
+typedef unsigned long  gulong;
+
+typedef signed long long   gint64;
+typedef unsigned long long guint64;
+
+/* enumerated constants */
+typedef enum
+{
+  GTK_ARROW_UP,
+  GTK_ARROW_DOWN,
+  GTK_ARROW_LEFT,
+  GTK_ARROW_RIGHT
+} GtkArrowType;
+
+typedef enum {
+  GDK_COLORSPACE_RGB
+} GdkColorspace;
+
+typedef enum
+{
+  GTK_EXPANDER_COLLAPSED,
+  GTK_EXPANDER_SEMI_COLLAPSED,
+  GTK_EXPANDER_SEMI_EXPANDED,
+  GTK_EXPANDER_EXPANDED
+} GtkExpanderStyle;
+
+typedef enum
+{
+  GTK_ICON_SIZE_INVALID,
+  GTK_ICON_SIZE_MENU,
+  GTK_ICON_SIZE_SMALL_TOOLBAR,
+  GTK_ICON_SIZE_LARGE_TOOLBAR,
+  GTK_ICON_SIZE_BUTTON,
+  GTK_ICON_SIZE_DND,
+  GTK_ICON_SIZE_DIALOG
+} GtkIconSize;
+
+typedef enum
+{
+  GTK_ORIENTATION_HORIZONTAL,
+  GTK_ORIENTATION_VERTICAL
+} GtkOrientation;
+
+typedef enum
+{
+  GTK_POS_LEFT,
+  GTK_POS_RIGHT,
+  GTK_POS_TOP,
+  GTK_POS_BOTTOM
+} GtkPositionType;
+
+typedef enum
+{
+  GTK_SHADOW_NONE,
+  GTK_SHADOW_IN,
+  GTK_SHADOW_OUT,
+  GTK_SHADOW_ETCHED_IN,
+  GTK_SHADOW_ETCHED_OUT
+} GtkShadowType;
+
+typedef enum
+{
+  GTK_STATE_NORMAL,
+  GTK_STATE_ACTIVE,
+  GTK_STATE_PRELIGHT,
+  GTK_STATE_SELECTED,
+  GTK_STATE_INSENSITIVE
+} GtkStateType;
+
+typedef enum
+{
+  GTK_TEXT_DIR_NONE,
+  GTK_TEXT_DIR_LTR,
+  GTK_TEXT_DIR_RTL
+} GtkTextDirection;
+
+typedef enum
+{
+  GTK_WINDOW_TOPLEVEL,
+  GTK_WINDOW_POPUP
+} GtkWindowType;
+
+typedef enum
+{
+  G_PARAM_READABLE            = 1 << 0,
+  G_PARAM_WRITABLE            = 1 << 1,
+  G_PARAM_CONSTRUCT           = 1 << 2,
+  G_PARAM_CONSTRUCT_ONLY      = 1 << 3,
+  G_PARAM_LAX_VALIDATION      = 1 << 4,
+  G_PARAM_PRIVATE             = 1 << 5
+} GParamFlags;
+
+/* We define all structure pointers to be void* */
+typedef void GError;
+typedef void GMainContext;
+
+typedef struct _GSList GSList;
+struct _GSList
+{
+  gpointer data;
+  GSList *next;
+};
+
+typedef void GdkColormap;
+typedef void GdkDrawable;
+typedef void GdkGC;
+typedef void GdkPixbuf;
+typedef void GdkPixmap;
+typedef void GdkWindow;
+
+typedef void GtkFixed;
+typedef void GtkMenuItem;
+typedef void GtkMenuShell;
+typedef void GtkWidgetClass;
+typedef void PangoFontDescription;
+typedef void GtkSettings;
+
+/* Some real structures */
+typedef struct
+{
+  guint32 pixel;
+  guint16 red;
+  guint16 green;
+  guint16 blue;
+} GdkColor;
+
+typedef struct {
+  gint      fd;
+  gushort   events;
+  gushort   revents;
+} GPollFD;
+
+typedef struct {
+  gint x;
+  gint y;
+  gint width;
+  gint height;
+} GdkRectangle;
+
+typedef struct {
+  gint x;
+  gint y;
+  gint width;
+  gint height;
+} GtkAllocation;
+
+typedef struct {
+  gint width;
+  gint height;
+} GtkRequisition;
+
+typedef struct {
+  GtkWidgetClass *g_class;
+} GTypeInstance;
+
+typedef struct {
+  gint left;
+  gint right;
+  gint top;
+  gint bottom;
+} GtkBorder;
+
+/******************************************************
+ * FIXME: it is more safe to include gtk headers for
+ * the precise type definition of GType and other
+ * structures. This is a place where getting rid of gtk
+ * headers may be dangerous.
+ ******************************************************/
+typedef gulong         GType;
+
+typedef struct
+{
+  GType         g_type;
+
+  union {
+    gint        v_int;
+    guint       v_uint;
+    glong       v_long;
+    gulong      v_ulong;
+    gint64      v_int64;
+    guint64     v_uint64;
+    gfloat      v_float;
+    gdouble     v_double;
+    gpointer    v_pointer;
+  } data[2];
+} GValue;
+
+typedef struct
+{
+  GTypeInstance  g_type_instance;
+
+  gchar         *name;
+  GParamFlags    flags;
+  GType          value_type;
+  GType          owner_type;
+} GParamSpec;
+
+typedef struct {
+  GTypeInstance g_type_instance;
+  guint         ref_count;
+  void         *qdata;
+} GObject;
+
+typedef struct {
+  GObject parent_instance;
+  guint32 flags;
+} GtkObject;
+
+typedef struct
+{
+  GObject parent_instance;
+
+  GdkColor fg[5];
+  GdkColor bg[5];
+  GdkColor light[5];
+  GdkColor dark[5];
+  GdkColor mid[5];
+  GdkColor text[5];
+  GdkColor base[5];
+  GdkColor text_aa[5];          /* Halfway between text/base */
+
+  GdkColor black;
+  GdkColor white;
+  PangoFontDescription *font_desc;
+
+  gint xthickness;
+  gint ythickness;
+
+  GdkGC *fg_gc[5];
+  GdkGC *bg_gc[5];
+  GdkGC *light_gc[5];
+  GdkGC *dark_gc[5];
+  GdkGC *mid_gc[5];
+  GdkGC *text_gc[5];
+  GdkGC *base_gc[5];
+  GdkGC *text_aa_gc[5];
+  GdkGC *black_gc;
+  GdkGC *white_gc;
+
+  GdkPixmap *bg_pixmap[5];
+} GtkStyle;
+
+typedef struct _GtkWidget GtkWidget;
+struct _GtkWidget
+{
+  GtkObject object;
+  guint16 private_flags;
+  guint8 state;
+  guint8 saved_state;
+  gchar *name;
+  GtkStyle *style;
+  GtkRequisition requisition;
+  GtkAllocation allocation;
+  GdkWindow *window;
+  GtkWidget *parent;
+};
+
+typedef struct
+{
+  GtkWidget widget;
+
+  gfloat xalign;
+  gfloat yalign;
+
+  guint16 xpad;
+  guint16 ypad;
+} GtkMisc;
+
+typedef struct {
+  GtkWidget widget;
+  GtkWidget *focus_child;
+  guint border_width : 16;
+  guint need_resize : 1;
+  guint resize_mode : 2;
+  guint reallocate_redraws : 1;
+  guint has_focus_chain : 1;
+} GtkContainer;
+
+typedef struct {
+  GtkContainer container;
+  GtkWidget *child;
+} GtkBin;
+
+typedef struct {
+  GtkBin bin;
+  GdkWindow *event_window;
+  gchar *label_text;
+  guint activate_timeout;
+  guint constructed : 1;
+  guint in_button : 1;
+  guint button_down : 1;
+  guint relief : 2;
+  guint use_underline : 1;
+  guint use_stock : 1;
+  guint depressed : 1;
+  guint depress_on_activate : 1;
+  guint focus_on_click : 1;
+} GtkButton;
+
+typedef struct {
+  GtkButton button;
+  guint active : 1;
+  guint draw_indicator : 1;
+  guint inconsistent : 1;
+} GtkToggleButton;
+
+typedef struct _GtkAdjustment GtkAdjustment;
+struct _GtkAdjustment
+{
+  GtkObject parent_instance;
+
+  gdouble lower;
+  gdouble upper;
+  gdouble value;
+  gdouble step_increment;
+  gdouble page_increment;
+  gdouble page_size;
+};
+
+typedef enum
+{
+  GTK_UPDATE_CONTINUOUS,
+  GTK_UPDATE_DISCONTINUOUS,
+  GTK_UPDATE_DELAYED
+} GtkUpdateType;
+
+typedef struct _GtkRange GtkRange;
+struct _GtkRange
+{
+  GtkWidget widget;
+  GtkAdjustment *adjustment;
+  GtkUpdateType update_policy;
+  guint inverted : 1;
+  /*< protected >*/
+  guint flippable : 1;
+  guint has_stepper_a : 1;
+  guint has_stepper_b : 1;
+  guint has_stepper_c : 1;
+  guint has_stepper_d : 1;
+  guint need_recalc : 1;
+  guint slider_size_fixed : 1;
+  gint min_slider_size;
+  GtkOrientation orientation;
+  GdkRectangle range_rect;
+  gint slider_start, slider_end;
+  gint round_digits;
+  /*< private >*/
+  guint trough_click_forward : 1;
+  guint update_pending : 1;
+  /*GtkRangeLayout * */ void *layout;
+  /*GtkRangeStepTimer * */ void* timer;
+  gint slide_initial_slider_position;
+  gint slide_initial_coordinate;
+  guint update_timeout_id;
+  GdkWindow *event_window;
+};
+
+typedef struct _GtkProgressBar       GtkProgressBar;
+
+typedef enum
+{
+  GTK_PROGRESS_CONTINUOUS,
+  GTK_PROGRESS_DISCRETE
+} GtkProgressBarStyle;
+
+typedef enum
+{
+  GTK_PROGRESS_LEFT_TO_RIGHT,
+  GTK_PROGRESS_RIGHT_TO_LEFT,
+  GTK_PROGRESS_BOTTOM_TO_TOP,
+  GTK_PROGRESS_TOP_TO_BOTTOM
+} GtkProgressBarOrientation;
+
+typedef struct _GtkProgress       GtkProgress;
+
+struct _GtkProgress
+{
+  GtkWidget widget;
+  GtkAdjustment *adjustment;
+  GdkPixmap     *offscreen_pixmap;
+  gchar         *format;
+  gfloat         x_align;
+  gfloat         y_align;
+  guint          show_text : 1;
+  guint          activity_mode : 1;
+  guint          use_text_format : 1;
+};
+
+struct _GtkProgressBar
+{
+  GtkProgress progress;
+  GtkProgressBarStyle bar_style;
+  GtkProgressBarOrientation orientation;
+  guint blocks;
+  gint  in_block;
+  gint  activity_pos;
+  guint activity_step;
+  guint activity_blocks;
+  gdouble pulse_fraction;
+  guint activity_dir : 1;
+  guint ellipsize : 3;
+};
+
+typedef enum {
+  GTK_RESPONSE_NONE = -1,
+  GTK_RESPONSE_REJECT = -2,
+  GTK_RESPONSE_ACCEPT = -3,
+  GTK_RESPONSE_DELETE_EVENT = -4,
+  GTK_RESPONSE_OK = -5,
+  GTK_RESPONSE_CANCEL = -6,
+  GTK_RESPONSE_CLOSE = -7,
+  GTK_RESPONSE_YES = -8,
+  GTK_RESPONSE_NO = -9,
+  GTK_RESPONSE_APPLY = -10,
+  GTK_RESPONSE_HELP = -11
+} GtkResponseType;
+
+typedef struct _GtkWindow GtkWindow;
+
+typedef struct _GtkFileChooser GtkFileChooser;
+
+typedef enum {
+  GTK_FILE_CHOOSER_ACTION_OPEN,
+  GTK_FILE_CHOOSER_ACTION_SAVE,
+  GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+  GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
+} GtkFileChooserAction;
+
+typedef struct _GtkFileFilter GtkFileFilter;
+
+typedef enum {
+  GTK_FILE_FILTER_FILENAME = 1 << 0,
+  GTK_FILE_FILTER_URI = 1 << 1,
+  GTK_FILE_FILTER_DISPLAY_NAME = 1 << 2,
+  GTK_FILE_FILTER_MIME_TYPE = 1 << 3
+} GtkFileFilterFlags;
+
+typedef struct {
+  GtkFileFilterFlags contains;
+  const gchar *filename;
+  const gchar *uri;
+  const gchar *display_name;
+  const gchar *mime_type;
+} GtkFileFilterInfo;
+
+typedef gboolean (*GtkFileFilterFunc)(const GtkFileFilterInfo *filter_info,
+    gpointer data);
+
+typedef void (*GDestroyNotify)(gpointer data);
+
+typedef void (*GCallback)(void);
+
+typedef struct _GClosure GClosure;
+
+typedef void (*GClosureNotify)(gpointer data, GClosure *closure);
+
+typedef enum {
+  G_CONNECT_AFTER = 1 << 0, G_CONNECT_SWAPPED = 1 << 1
+} GConnectFlags;
+
+typedef struct _GThreadFunctions GThreadFunctions;
+
+#define G_TYPE_INVALID                  G_TYPE_MAKE_FUNDAMENTAL (0)
+#define G_TYPE_NONE                     G_TYPE_MAKE_FUNDAMENTAL (1)
+#define G_TYPE_INTERFACE                G_TYPE_MAKE_FUNDAMENTAL (2)
+#define G_TYPE_CHAR                     G_TYPE_MAKE_FUNDAMENTAL (3)
+#define G_TYPE_UCHAR                    G_TYPE_MAKE_FUNDAMENTAL (4)
+#define G_TYPE_BOOLEAN                  G_TYPE_MAKE_FUNDAMENTAL (5)
+#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
+#define G_TYPE_UINT                     G_TYPE_MAKE_FUNDAMENTAL (7)
+#define G_TYPE_LONG                     G_TYPE_MAKE_FUNDAMENTAL (8)
+#define G_TYPE_ULONG                    G_TYPE_MAKE_FUNDAMENTAL (9)
+#define G_TYPE_INT64                    G_TYPE_MAKE_FUNDAMENTAL (10)
+#define G_TYPE_UINT64                   G_TYPE_MAKE_FUNDAMENTAL (11)
+#define G_TYPE_ENUM                     G_TYPE_MAKE_FUNDAMENTAL (12)
+#define G_TYPE_FLAGS                    G_TYPE_MAKE_FUNDAMENTAL (13)
+#define G_TYPE_FLOAT                    G_TYPE_MAKE_FUNDAMENTAL (14)
+#define G_TYPE_DOUBLE                   G_TYPE_MAKE_FUNDAMENTAL (15)
+#define G_TYPE_STRING                   G_TYPE_MAKE_FUNDAMENTAL (16)
+#define G_TYPE_POINTER                  G_TYPE_MAKE_FUNDAMENTAL (17)
+#define G_TYPE_BOXED                    G_TYPE_MAKE_FUNDAMENTAL (18)
+#define G_TYPE_PARAM                    G_TYPE_MAKE_FUNDAMENTAL (19)
+#define G_TYPE_OBJECT                   G_TYPE_MAKE_FUNDAMENTAL (20)
+
+#define GTK_TYPE_BORDER                 gtk_border_get_type()
+
+#define G_TYPE_FUNDAMENTAL_SHIFT        (2)
+#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
+
+#define g_signal_connect(instance, detailed_signal, c_handler, data) \
+ g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
+
+#endif /* __GTK_H__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/gtk2/gtk_fp.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,367 @@
+/*
+ * Copyright (c) 2005, 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.
+ */
+#include <dlfcn.h>
+#include <setjmp.h>
+#include <stddef.h>
+#include "gtk_fp.h"
+
+#define GTHREAD_LIB_VERSIONED VERSIONED_JNI_LIB_NAME("gthread-2.0", "0")
+#define GTHREAD_LIB JNI_LIB_NAME("gthread-2.0")
+#define NO_SYMBOL_EXCEPTION 1
+
+static gboolean new_combo_used = TRUE;
+static void *gtk2_libhandle = NULL;
+static void *gthread_libhandle = NULL;
+static jmp_buf j;
+
+/* This is a workaround for the bug:
+ * http://sourceware.org/bugzilla/show_bug.cgi?id=1814
+ * (dlsym/dlopen clears dlerror state)
+ * This bug is specific to Linux, but there is no harm in
+ * applying this workaround on Solaris as well.
+ */
+static void* dl_symbol(const char* name)
+{
+    void* result = dlsym(gtk2_libhandle, name);
+    if (!result)
+        longjmp(j, NO_SYMBOL_EXCEPTION);
+
+    return result;
+}
+
+static void* dl_symbol_gthread(const char* name)
+{
+    void* result = dlsym(gthread_libhandle, name);
+    if (!result)
+        longjmp(j, NO_SYMBOL_EXCEPTION);
+
+    return result;
+}
+
+/**
+ * Functions for sun_awt_X11_GtkFileDialogPeer.c
+ */
+void gtk2_file_chooser_load()
+{
+    fp_gtk_file_chooser_get_filename = dl_symbol(
+            "gtk_file_chooser_get_filename");
+    fp_gtk_file_chooser_dialog_new = dl_symbol("gtk_file_chooser_dialog_new");
+    fp_gtk_file_chooser_set_current_folder = dl_symbol(
+            "gtk_file_chooser_set_current_folder");
+    fp_gtk_file_chooser_set_filename = dl_symbol(
+            "gtk_file_chooser_set_filename");
+    fp_gtk_file_chooser_set_current_name = dl_symbol(
+            "gtk_file_chooser_set_current_name");
+    fp_gtk_file_filter_add_custom = dl_symbol("gtk_file_filter_add_custom");
+    fp_gtk_file_chooser_set_filter = dl_symbol("gtk_file_chooser_set_filter");
+    fp_gtk_file_chooser_get_type = dl_symbol("gtk_file_chooser_get_type");
+    fp_gtk_file_filter_new = dl_symbol("gtk_file_filter_new");
+    if (fp_gtk_check_version(2, 8, 0) == NULL) {
+        fp_gtk_file_chooser_set_do_overwrite_confirmation = dl_symbol(
+                "gtk_file_chooser_set_do_overwrite_confirmation");
+    }
+    fp_gtk_file_chooser_set_select_multiple = dl_symbol(
+            "gtk_file_chooser_set_select_multiple");
+    fp_gtk_file_chooser_get_current_folder = dl_symbol(
+            "gtk_file_chooser_get_current_folder");
+    fp_gtk_file_chooser_get_filenames = dl_symbol(
+            "gtk_file_chooser_get_filenames");
+    fp_gtk_g_slist_length = dl_symbol("g_slist_length");
+}
+
+gboolean gtk2_dlload()
+{
+    gtk2_libhandle = dlopen(GTK2_LIB_VERSIONED, RTLD_LAZY | RTLD_LOCAL);
+    if (gtk2_libhandle == NULL) {
+        gtk2_libhandle = dlopen(GTK2_LIB, RTLD_LAZY | RTLD_LOCAL);
+        if (gtk2_libhandle == NULL)
+            return FALSE;
+    }
+
+    gthread_libhandle = dlopen(GTHREAD_LIB_VERSIONED, RTLD_LAZY | RTLD_LOCAL);
+    if (gthread_libhandle == NULL) {
+        gthread_libhandle = dlopen(GTHREAD_LIB, RTLD_LAZY | RTLD_LOCAL);
+        if (gthread_libhandle == NULL)
+            return FALSE;
+    }
+
+    if (setjmp(j) == 0)
+    {
+        fp_gtk_check_version = dl_symbol("gtk_check_version");
+        /* Check for GTK 2.2+ */
+        if (fp_gtk_check_version(2, 2, 0)) {
+            longjmp(j, NO_SYMBOL_EXCEPTION);
+        }
+
+        /* GLib */
+        fp_g_free = dl_symbol("g_free");
+        fp_g_object_unref = dl_symbol("g_object_unref");
+
+        fp_g_main_context_iteration =
+            dl_symbol("g_main_context_iteration");
+
+        fp_g_value_init = dl_symbol("g_value_init");
+        fp_g_type_is_a = dl_symbol("g_type_is_a");
+
+        fp_g_value_get_boolean = dl_symbol("g_value_get_boolean");
+        fp_g_value_get_char = dl_symbol("g_value_get_char");
+        fp_g_value_get_uchar = dl_symbol("g_value_get_uchar");
+        fp_g_value_get_int = dl_symbol("g_value_get_int");
+        fp_g_value_get_uint = dl_symbol("g_value_get_uint");
+        fp_g_value_get_long = dl_symbol("g_value_get_long");
+        fp_g_value_get_ulong = dl_symbol("g_value_get_ulong");
+        fp_g_value_get_int64 = dl_symbol("g_value_get_int64");
+        fp_g_value_get_uint64 = dl_symbol("g_value_get_uint64");
+        fp_g_value_get_float = dl_symbol("g_value_get_float");
+        fp_g_value_get_double = dl_symbol("g_value_get_double");
+        fp_g_value_get_string = dl_symbol("g_value_get_string");
+        fp_g_value_get_enum = dl_symbol("g_value_get_enum");
+        fp_g_value_get_flags = dl_symbol("g_value_get_flags");
+        fp_g_value_get_param = dl_symbol("g_value_get_param");
+        fp_g_value_get_boxed = dl_symbol("g_value_get_boxed");
+        fp_g_value_get_pointer = dl_symbol("g_value_get_pointer");
+        fp_g_value_get_object = dl_symbol("g_value_get_object");
+        fp_g_param_spec_int = dl_symbol("g_param_spec_int");
+        fp_g_object_get = dl_symbol("g_object_get");
+        fp_g_object_set = dl_symbol("g_object_set");
+
+        /* GDK */
+        fp_gdk_pixmap_new = dl_symbol("gdk_pixmap_new");
+        fp_gdk_pixbuf_get_from_drawable =
+            dl_symbol("gdk_pixbuf_get_from_drawable");
+        fp_gdk_gc_new = dl_symbol("gdk_gc_new");
+        fp_gdk_rgb_gc_set_foreground =
+            dl_symbol("gdk_rgb_gc_set_foreground");
+        fp_gdk_draw_rectangle = dl_symbol("gdk_draw_rectangle");
+        fp_gdk_drawable_get_size = dl_symbol("gdk_drawable_get_size");
+
+        /* Pixbuf */
+        fp_gdk_pixbuf_new = dl_symbol("gdk_pixbuf_new");
+        fp_gdk_pixbuf_new_from_file =
+                dl_symbol("gdk_pixbuf_new_from_file");
+        fp_gdk_pixbuf_get_width = dl_symbol("gdk_pixbuf_get_width");
+        fp_gdk_pixbuf_get_height = dl_symbol("gdk_pixbuf_get_height");
+        fp_gdk_pixbuf_get_pixels = dl_symbol("gdk_pixbuf_get_pixels");
+        fp_gdk_pixbuf_get_rowstride =
+                dl_symbol("gdk_pixbuf_get_rowstride");
+        fp_gdk_pixbuf_get_has_alpha =
+                dl_symbol("gdk_pixbuf_get_has_alpha");
+        fp_gdk_pixbuf_get_bits_per_sample =
+                dl_symbol("gdk_pixbuf_get_bits_per_sample");
+        fp_gdk_pixbuf_get_n_channels =
+                dl_symbol("gdk_pixbuf_get_n_channels");
+
+        /* GTK painting */
+        fp_gtk_init_check = dl_symbol("gtk_init_check");
+        fp_gtk_paint_hline = dl_symbol("gtk_paint_hline");
+        fp_gtk_paint_vline = dl_symbol("gtk_paint_vline");
+        fp_gtk_paint_shadow = dl_symbol("gtk_paint_shadow");
+        fp_gtk_paint_arrow = dl_symbol("gtk_paint_arrow");
+        fp_gtk_paint_diamond = dl_symbol("gtk_paint_diamond");
+        fp_gtk_paint_box = dl_symbol("gtk_paint_box");
+        fp_gtk_paint_flat_box = dl_symbol("gtk_paint_flat_box");
+        fp_gtk_paint_check = dl_symbol("gtk_paint_check");
+        fp_gtk_paint_option = dl_symbol("gtk_paint_option");
+        fp_gtk_paint_box_gap = dl_symbol("gtk_paint_box_gap");
+        fp_gtk_paint_extension = dl_symbol("gtk_paint_extension");
+        fp_gtk_paint_focus = dl_symbol("gtk_paint_focus");
+        fp_gtk_paint_slider = dl_symbol("gtk_paint_slider");
+        fp_gtk_paint_handle = dl_symbol("gtk_paint_handle");
+        fp_gtk_paint_expander = dl_symbol("gtk_paint_expander");
+        fp_gtk_style_apply_default_background =
+                dl_symbol("gtk_style_apply_default_background");
+
+        /* GTK widgets */
+        fp_gtk_arrow_new = dl_symbol("gtk_arrow_new");
+        fp_gtk_button_new = dl_symbol("gtk_button_new");
+        fp_gtk_spin_button_new = dl_symbol("gtk_spin_button_new");
+        fp_gtk_check_button_new = dl_symbol("gtk_check_button_new");
+        fp_gtk_check_menu_item_new =
+                dl_symbol("gtk_check_menu_item_new");
+        fp_gtk_color_selection_dialog_new =
+                dl_symbol("gtk_color_selection_dialog_new");
+        fp_gtk_entry_new = dl_symbol("gtk_entry_new");
+        fp_gtk_fixed_new = dl_symbol("gtk_fixed_new");
+        fp_gtk_handle_box_new = dl_symbol("gtk_handle_box_new");
+        fp_gtk_image_new = dl_symbol("gtk_image_new");
+        fp_gtk_hpaned_new = dl_symbol("gtk_hpaned_new");
+        fp_gtk_vpaned_new = dl_symbol("gtk_vpaned_new");
+        fp_gtk_hscale_new = dl_symbol("gtk_hscale_new");
+        fp_gtk_vscale_new = dl_symbol("gtk_vscale_new");
+        fp_gtk_hscrollbar_new = dl_symbol("gtk_hscrollbar_new");
+        fp_gtk_vscrollbar_new = dl_symbol("gtk_vscrollbar_new");
+        fp_gtk_hseparator_new = dl_symbol("gtk_hseparator_new");
+        fp_gtk_vseparator_new = dl_symbol("gtk_vseparator_new");
+        fp_gtk_label_new = dl_symbol("gtk_label_new");
+        fp_gtk_menu_new = dl_symbol("gtk_menu_new");
+        fp_gtk_menu_bar_new = dl_symbol("gtk_menu_bar_new");
+        fp_gtk_menu_item_new = dl_symbol("gtk_menu_item_new");
+        fp_gtk_menu_item_set_submenu =
+                dl_symbol("gtk_menu_item_set_submenu");
+        fp_gtk_notebook_new = dl_symbol("gtk_notebook_new");
+        fp_gtk_progress_bar_new =
+            dl_symbol("gtk_progress_bar_new");
+        fp_gtk_progress_bar_set_orientation =
+            dl_symbol("gtk_progress_bar_set_orientation");
+        fp_gtk_radio_button_new =
+            dl_symbol("gtk_radio_button_new");
+        fp_gtk_radio_menu_item_new =
+            dl_symbol("gtk_radio_menu_item_new");
+        fp_gtk_scrolled_window_new =
+            dl_symbol("gtk_scrolled_window_new");
+        fp_gtk_separator_menu_item_new =
+            dl_symbol("gtk_separator_menu_item_new");
+        fp_gtk_text_view_new = dl_symbol("gtk_text_view_new");
+        fp_gtk_toggle_button_new =
+            dl_symbol("gtk_toggle_button_new");
+        fp_gtk_toolbar_new = dl_symbol("gtk_toolbar_new");
+        fp_gtk_tree_view_new = dl_symbol("gtk_tree_view_new");
+        fp_gtk_viewport_new = dl_symbol("gtk_viewport_new");
+        fp_gtk_window_new = dl_symbol("gtk_window_new");
+        fp_gtk_window_present = dl_symbol("gtk_window_present");
+        fp_gtk_window_move = dl_symbol("gtk_window_move");
+        fp_gtk_window_resize = dl_symbol("gtk_window_resize");
+
+          fp_gtk_dialog_new = dl_symbol("gtk_dialog_new");
+        fp_gtk_frame_new = dl_symbol("gtk_frame_new");
+
+        fp_gtk_adjustment_new = dl_symbol("gtk_adjustment_new");
+        fp_gtk_container_add = dl_symbol("gtk_container_add");
+        fp_gtk_menu_shell_append =
+            dl_symbol("gtk_menu_shell_append");
+        fp_gtk_widget_realize = dl_symbol("gtk_widget_realize");
+        fp_gtk_widget_destroy = dl_symbol("gtk_widget_destroy");
+        fp_gtk_widget_render_icon =
+            dl_symbol("gtk_widget_render_icon");
+        fp_gtk_widget_set_name =
+            dl_symbol("gtk_widget_set_name");
+        fp_gtk_widget_set_parent =
+            dl_symbol("gtk_widget_set_parent");
+        fp_gtk_widget_set_direction =
+            dl_symbol("gtk_widget_set_direction");
+        fp_gtk_widget_style_get =
+            dl_symbol("gtk_widget_style_get");
+        fp_gtk_widget_class_install_style_property =
+            dl_symbol("gtk_widget_class_install_style_property");
+        fp_gtk_widget_class_find_style_property =
+            dl_symbol("gtk_widget_class_find_style_property");
+        fp_gtk_widget_style_get_property =
+            dl_symbol("gtk_widget_style_get_property");
+        fp_pango_font_description_to_string =
+            dl_symbol("pango_font_description_to_string");
+        fp_gtk_settings_get_default =
+            dl_symbol("gtk_settings_get_default");
+        fp_gtk_widget_get_settings =
+            dl_symbol("gtk_widget_get_settings");
+        fp_gtk_border_get_type =  dl_symbol("gtk_border_get_type");
+        fp_gtk_arrow_set = dl_symbol("gtk_arrow_set");
+        fp_gtk_widget_size_request =
+            dl_symbol("gtk_widget_size_request");
+        fp_gtk_range_get_adjustment =
+            dl_symbol("gtk_range_get_adjustment");
+
+        fp_gtk_widget_hide = dl_symbol("gtk_widget_hide");
+        fp_gtk_main_quit = dl_symbol("gtk_main_quit");
+        fp_g_signal_connect_data = dl_symbol("g_signal_connect_data");
+        fp_gtk_widget_show = dl_symbol("gtk_widget_show");
+        fp_gtk_main = dl_symbol("gtk_main");
+
+        /**
+         * GLib thread system
+         */
+        fp_g_thread_init = dl_symbol_gthread("g_thread_init");
+        fp_gdk_threads_init = dl_symbol("gdk_threads_init");
+        fp_gdk_threads_enter = dl_symbol("gdk_threads_enter");
+        fp_gdk_threads_leave = dl_symbol("gdk_threads_leave");
+
+        /**
+         * Functions for sun_awt_X11_GtkFileDialogPeer.c
+         */
+        if (fp_gtk_check_version(2, 4, 0) == NULL) {
+            // The current GtkFileChooser is available from GTK+ 2.4
+            gtk2_file_chooser_load();
+        }
+
+        /* Some functions may be missing in pre-2.4 GTK.
+           We handle them specially here.
+         */
+        fp_gtk_combo_box_new = dlsym(gtk2_libhandle, "gtk_combo_box_new");
+        if (fp_gtk_combo_box_new == NULL) {
+            fp_gtk_combo_box_new = dl_symbol("gtk_combo_new");
+        }
+
+        fp_gtk_combo_box_entry_new =
+            dlsym(gtk2_libhandle, "gtk_combo_box_entry_new");
+        if (fp_gtk_combo_box_entry_new == NULL) {
+            fp_gtk_combo_box_entry_new = dl_symbol("gtk_combo_new");
+            new_combo_used = FALSE;
+        }
+
+        fp_gtk_separator_tool_item_new =
+            dlsym(gtk2_libhandle, "gtk_separator_tool_item_new");
+        if (fp_gtk_separator_tool_item_new == NULL) {
+            fp_gtk_separator_tool_item_new =
+                dl_symbol("gtk_vseparator_new");
+        }
+    }
+    /* Now we have only one kind of exceptions: NO_SYMBOL_EXCEPTION
+     * Otherwise we can check the return value of setjmp method.
+     */
+    else
+    {
+        dlclose(gtk2_libhandle);
+        gtk2_libhandle = NULL;
+
+        dlclose(gthread_libhandle);
+        gthread_libhandle = NULL;
+
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+int gtk2_dlunload()
+{
+    char *gtk2_error;
+
+    if (!gtk2_libhandle)
+        return TRUE;
+
+    dlerror();
+    dlclose(gtk2_libhandle);
+    dlclose(gthread_libhandle);
+    if ((gtk2_error = dlerror()) != NULL)
+    {
+        return FALSE;
+    }
+    return TRUE;
+}
+
+gboolean new_combo()
+{
+  return new_combo_used;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/gtk2/gtk_fp.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,460 @@
+/*
+ * Copyright (c) 2005, 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.
+ */
+#ifndef __GTK_FP_H__
+#define __GTK_FP_H__
+
+#include "gtk_fp_check.h"
+
+gboolean gtk2_dlload();
+int gtk2_dlunload();
+gboolean new_combo();
+
+/*************************
+ * Glib function pointers
+ *************************/
+
+gboolean (*fp_g_main_context_iteration)(GMainContext *context,
+                                             gboolean may_block);
+
+GValue*      (*fp_g_value_init)(GValue *value, GType g_type);
+gboolean     (*fp_g_type_is_a)(GType type, GType is_a_type);
+gboolean     (*fp_g_value_get_boolean)(const GValue *value);
+gchar        (*fp_g_value_get_char)(const GValue *value);
+guchar       (*fp_g_value_get_uchar)(const GValue *value);
+gint         (*fp_g_value_get_int)(const GValue *value);
+guint        (*fp_g_value_get_uint)(const GValue *value);
+glong        (*fp_g_value_get_long)(const GValue *value);
+gulong       (*fp_g_value_get_ulong)(const GValue *value);
+gint64       (*fp_g_value_get_int64)(const GValue *value);
+guint64      (*fp_g_value_get_uint64)(const GValue *value);
+gfloat       (*fp_g_value_get_float)(const GValue *value);
+gdouble      (*fp_g_value_get_double)(const GValue *value);
+const gchar* (*fp_g_value_get_string)(const GValue *value);
+gint         (*fp_g_value_get_enum)(const GValue *value);
+guint        (*fp_g_value_get_flags)(const GValue *value);
+GParamSpec*  (*fp_g_value_get_param)(const GValue *value);
+gpointer*    (*fp_g_value_get_boxed)(const GValue *value);
+gpointer*    (*fp_g_value_get_pointer)(const GValue *value);
+GObject*     (*fp_g_value_get_object)(const GValue *value);
+GParamSpec*  (*fp_g_param_spec_int)(const gchar *name,
+        const gchar *nick, const gchar *blurb,
+        gint minimum, gint maximum, gint default_value,
+        GParamFlags flags);
+void         (*fp_g_object_get)(gpointer object,
+                                       const gchar* fpn, ...);
+void         (*fp_g_object_set)(gpointer object,
+                                       const gchar *first_property_name,
+                                       ...);
+/************************
+ * GDK function pointers
+ ************************/
+GdkPixmap *(*fp_gdk_pixmap_new)(GdkDrawable *drawable,
+        gint width, gint height, gint depth);
+GdkGC *(*fp_gdk_gc_new)(GdkDrawable*);
+void (*fp_gdk_rgb_gc_set_foreground)(GdkGC*, guint32);
+void (*fp_gdk_draw_rectangle)(GdkDrawable*, GdkGC*, gboolean,
+        gint, gint, gint, gint);
+GdkPixbuf *(*fp_gdk_pixbuf_new)(GdkColorspace colorspace,
+        gboolean has_alpha, int bits_per_sample, int width, int height);
+GdkPixbuf *(*fp_gdk_pixbuf_get_from_drawable)(GdkPixbuf *dest,
+        GdkDrawable *src, GdkColormap *cmap, int src_x, int src_y,
+        int dest_x, int dest_y, int width, int height);
+void (*fp_gdk_drawable_get_size)(GdkDrawable *drawable,
+        gint* width, gint* height);
+
+/************************
+ * Gtk function pointers
+ ************************/
+gboolean (*fp_gtk_init_check)(int* argc, char** argv);
+
+/* Painting */
+void (*fp_gtk_paint_hline)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GdkRectangle* area, GtkWidget* widget,
+        const gchar* detail, gint x1, gint x2, gint y);
+void (*fp_gtk_paint_vline)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GdkRectangle* area, GtkWidget* widget,
+        const gchar* detail, gint y1, gint y2, gint x);
+void (*fp_gtk_paint_shadow)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height);
+void (*fp_gtk_paint_arrow)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        GtkArrowType arrow_type, gboolean fill, gint x, gint y,
+        gint width, gint height);
+void (*fp_gtk_paint_diamond)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height);
+void (*fp_gtk_paint_box)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height);
+void (*fp_gtk_paint_flat_box)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height);
+void (*fp_gtk_paint_check)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height);
+void (*fp_gtk_paint_option)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height);
+void (*fp_gtk_paint_box_gap)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height,
+        GtkPositionType gap_side, gint gap_x, gint gap_width);
+void (*fp_gtk_paint_extension)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height, GtkPositionType gap_side);
+void (*fp_gtk_paint_focus)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GdkRectangle* area, GtkWidget* widget,
+        const gchar* detail, gint x, gint y, gint width, gint height);
+void (*fp_gtk_paint_slider)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height, GtkOrientation orientation);
+void (*fp_gtk_paint_handle)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GtkShadowType shadow_type,
+        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
+        gint x, gint y, gint width, gint height, GtkOrientation orientation);
+void (*fp_gtk_paint_expander)(GtkStyle* style, GdkWindow* window,
+        GtkStateType state_type, GdkRectangle* area, GtkWidget* widget,
+        const gchar* detail, gint x, gint y, GtkExpanderStyle expander_style);
+void (*fp_gtk_style_apply_default_background)(GtkStyle* style,
+        GdkWindow* window, gboolean set_bg, GtkStateType state_type,
+        GdkRectangle* area, gint x, gint y, gint width, gint height);
+
+/* Widget creation */
+GtkWidget* (*fp_gtk_arrow_new)(GtkArrowType arrow_type,
+                                      GtkShadowType shadow_type);
+GtkWidget* (*fp_gtk_button_new)();
+GtkWidget* (*fp_gtk_check_button_new)();
+GtkWidget* (*fp_gtk_check_menu_item_new)();
+GtkWidget* (*fp_gtk_color_selection_dialog_new)(const gchar* title);
+GtkWidget* (*fp_gtk_combo_box_new)();
+GtkWidget* (*fp_gtk_combo_box_entry_new)();
+GtkWidget* (*fp_gtk_entry_new)();
+GtkWidget* (*fp_gtk_fixed_new)();
+GtkWidget* (*fp_gtk_handle_box_new)();
+GtkWidget* (*fp_gtk_hpaned_new)();
+GtkWidget* (*fp_gtk_vpaned_new)();
+GtkWidget* (*fp_gtk_hscale_new)(GtkAdjustment* adjustment);
+GtkWidget* (*fp_gtk_vscale_new)(GtkAdjustment* adjustment);
+GtkWidget* (*fp_gtk_hscrollbar_new)(GtkAdjustment* adjustment);
+GtkWidget* (*fp_gtk_vscrollbar_new)(GtkAdjustment* adjustment);
+GtkWidget* (*fp_gtk_hseparator_new)();
+GtkWidget* (*fp_gtk_vseparator_new)();
+GtkWidget* (*fp_gtk_image_new)();
+GtkWidget* (*fp_gtk_label_new)(const gchar* str);
+GtkWidget* (*fp_gtk_menu_new)();
+GtkWidget* (*fp_gtk_menu_bar_new)();
+GtkWidget* (*fp_gtk_menu_item_new)();
+GtkWidget* (*fp_gtk_notebook_new)();
+GtkWidget* (*fp_gtk_progress_bar_new)();
+GtkWidget* (*fp_gtk_progress_bar_set_orientation)(
+        GtkProgressBar *pbar,
+        GtkProgressBarOrientation orientation);
+GtkWidget* (*fp_gtk_radio_button_new)(GSList *group);
+GtkWidget* (*fp_gtk_radio_menu_item_new)(GSList *group);
+GtkWidget* (*fp_gtk_scrolled_window_new)(GtkAdjustment *hadjustment,
+        GtkAdjustment *vadjustment);
+GtkWidget* (*fp_gtk_separator_menu_item_new)();
+GtkWidget* (*fp_gtk_separator_tool_item_new)();
+GtkWidget* (*fp_gtk_text_view_new)();
+GtkWidget* (*fp_gtk_toggle_button_new)();
+GtkWidget* (*fp_gtk_toolbar_new)();
+GtkWidget* (*fp_gtk_tree_view_new)();
+GtkWidget* (*fp_gtk_viewport_new)(GtkAdjustment *hadjustment,
+        GtkAdjustment *vadjustment);
+GtkWidget* (*fp_gtk_window_new)(GtkWindowType type);
+GtkWidget* (*fp_gtk_dialog_new)();
+GtkWidget* (*fp_gtk_spin_button_new)(GtkAdjustment *adjustment,
+        gdouble climb_rate, guint digits);
+GtkWidget* (*fp_gtk_frame_new)(const gchar *label);
+
+/* Other widget operations */
+GtkObject* (*fp_gtk_adjustment_new)(gdouble value,
+        gdouble lower, gdouble upper, gdouble step_increment,
+        gdouble page_increment, gdouble page_size);
+void (*fp_gtk_container_add)(GtkContainer *window, GtkWidget *widget);
+void (*fp_gtk_menu_shell_append)(GtkMenuShell *menu_shell,
+        GtkWidget *child);
+void (*fp_gtk_menu_item_set_submenu)(GtkMenuItem *menu_item,
+        GtkWidget *submenu);
+void (*fp_gtk_widget_realize)(GtkWidget *widget);
+GdkPixbuf* (*fp_gtk_widget_render_icon)(GtkWidget *widget,
+        const gchar *stock_id, GtkIconSize size, const gchar *detail);
+void (*fp_gtk_widget_set_name)(GtkWidget *widget, const gchar *name);
+void (*fp_gtk_widget_set_parent)(GtkWidget *widget, GtkWidget *parent);
+void (*fp_gtk_widget_set_direction)(GtkWidget *widget,
+        GtkTextDirection direction);
+void (*fp_gtk_widget_style_get)(GtkWidget *widget,
+        const gchar *first_property_name, ...);
+void (*fp_gtk_widget_class_install_style_property)(
+        GtkWidgetClass* class, GParamSpec *pspec);
+GParamSpec* (*fp_gtk_widget_class_find_style_property)(
+        GtkWidgetClass* class, const gchar* property_name);
+void (*fp_gtk_widget_style_get_property)(GtkWidget* widget,
+        const gchar* property_name, GValue* value);
+char* (*fp_pango_font_description_to_string)(
+        const PangoFontDescription* fd);
+GtkSettings* (*fp_gtk_settings_get_default)();
+GtkSettings* (*fp_gtk_widget_get_settings)(GtkWidget *widget);
+GType        (*fp_gtk_border_get_type)();
+void (*fp_gtk_arrow_set)(GtkWidget* arrow,
+                                GtkArrowType arrow_type,
+                                GtkShadowType shadow_type);
+void (*fp_gtk_widget_size_request)(GtkWidget *widget,
+                                          GtkRequisition *requisition);
+GtkAdjustment* (*fp_gtk_range_get_adjustment)(GtkRange* range);
+
+void (*fp_g_free)(gpointer mem);
+void (*fp_g_object_unref)(gpointer object);
+int (*fp_gdk_pixbuf_get_bits_per_sample)(const GdkPixbuf *pixbuf);
+guchar *(*fp_gdk_pixbuf_get_pixels)(const GdkPixbuf *pixbuf);
+gboolean (*fp_gdk_pixbuf_get_has_alpha)(const GdkPixbuf *pixbuf);
+int (*fp_gdk_pixbuf_get_height)(const GdkPixbuf *pixbuf);
+int (*fp_gdk_pixbuf_get_n_channels)(const GdkPixbuf *pixbuf);
+int (*fp_gdk_pixbuf_get_rowstride)(const GdkPixbuf *pixbuf);
+int (*fp_gdk_pixbuf_get_width)(const GdkPixbuf *pixbuf);
+GdkPixbuf *(*fp_gdk_pixbuf_new_from_file)(const char *filename, GError **error);
+void (*fp_gtk_widget_destroy)(GtkWidget *widget);
+void (*fp_gtk_window_present)(GtkWindow *window);
+void (*fp_gtk_window_move)(GtkWindow *window, gint x, gint y);
+void (*fp_gtk_window_resize)(GtkWindow *window, gint width, gint height);
+
+/**
+ * Function Pointers for GtkFileChooser
+ */
+gchar* (*fp_gtk_file_chooser_get_filename)(GtkFileChooser *chooser);
+void (*fp_gtk_widget_hide)(GtkWidget *widget);
+void (*fp_gtk_main_quit)(void);
+GtkWidget* (*fp_gtk_file_chooser_dialog_new)(const gchar *title,
+    GtkWindow *parent, GtkFileChooserAction action,
+    const gchar *first_button_text, ...);
+gboolean (*fp_gtk_file_chooser_set_current_folder)(GtkFileChooser *chooser,
+    const gchar *filename);
+gboolean (*fp_gtk_file_chooser_set_filename)(GtkFileChooser *chooser,
+    const char *filename);
+void (*fp_gtk_file_chooser_set_current_name)(GtkFileChooser *chooser,
+    const gchar *name);
+void (*fp_gtk_file_filter_add_custom)(GtkFileFilter *filter,
+    GtkFileFilterFlags needed, GtkFileFilterFunc func, gpointer data,
+    GDestroyNotify notify);
+void (*fp_gtk_file_chooser_set_filter)(GtkFileChooser *chooser,
+    GtkFileFilter *filter);
+GType (*fp_gtk_file_chooser_get_type)(void);
+GtkFileFilter* (*fp_gtk_file_filter_new)(void);
+void (*fp_gtk_file_chooser_set_do_overwrite_confirmation)(
+    GtkFileChooser *chooser, gboolean do_overwrite_confirmation);
+void (*fp_gtk_file_chooser_set_select_multiple)(
+    GtkFileChooser *chooser, gboolean select_multiple);
+gchar* (*fp_gtk_file_chooser_get_current_folder)(GtkFileChooser *chooser);
+GSList* (*fp_gtk_file_chooser_get_filenames)(GtkFileChooser *chooser);
+guint (*fp_gtk_g_slist_length)(GSList *list);
+gulong (*fp_g_signal_connect_data)(gpointer instance,
+    const gchar *detailed_signal, GCallback c_handler, gpointer data,
+    GClosureNotify destroy_data, GConnectFlags connect_flags);
+void (*fp_gtk_widget_show)(GtkWidget *widget);
+void (*fp_gtk_main)(void);
+guint (*fp_gtk_main_level)(void);
+
+void (*fp_g_thread_init)(GThreadFunctions *vtable);
+void (*fp_gdk_threads_init)(void);
+void (*fp_gdk_threads_enter)(void);
+void (*fp_gdk_threads_leave)(void);
+
+/* Glib */
+#define g_main_context_iteration (*fp_g_main_context_iteration)
+#define g_value_init (*fp_g_value_init)
+#define g_type_is_a (*fp_g_type_is_a)
+#define g_value_get_boolean (*fp_g_value_get_boolean)
+#define g_value_get_char (*fp_g_value_get_char)
+#define g_value_get_uchar (*fp_g_value_get_uchar)
+#define g_value_get_int (*fp_g_value_get_int)
+#define g_value_get_uint (*fp_g_value_get_uint)
+#define g_value_get_long (*fp_g_value_get_long)
+#define g_value_get_ulong (*fp_g_value_get_ulong)
+#define g_value_get_int64 (*fp_g_value_get_int64)
+#define g_value_get_uint64 (*fp_g_value_get_uint64)
+#define g_value_get_float (*fp_g_value_get_float)
+#define g_value_get_double (*fp_g_value_get_double)
+#define g_value_get_string (*fp_g_value_get_string)
+#define g_value_get_enum (*fp_g_value_get_enum)
+#define g_value_get_flags (*fp_g_value_get_flags)
+#define g_value_get_param (*fp_g_value_get_param)
+#define g_value_get_boxed (*fp_g_value_get_boxed)
+#define g_value_get_object (*fp_g_value_get_object)
+#define g_param_spec_int (*fp_g_param_spec_int)
+#define g_object_get (*fp_g_object_get)
+#define g_object_set (*fp_g_object_set)
+#define g_thread_init (*fp_g_thread_init)
+#define g_object_unref (*fp_g_object_unref)
+#define g_free (*fp_g_free)
+#define g_slist_length (*fp_gtk_g_slist_length)
+#define g_signal_connect_data (*fp_g_signal_connect_data)
+
+/* GDK */
+#define gdk_pixmap_new (*fp_gdk_pixmap_new)
+#define gdk_gc_new (*fp_gdk_gc_new)
+#define gdk_rgb_gc_set_foreground (*fp_gdk_rgb_gc_set_foreground)
+#define gdk_draw_rectangle (*fp_gdk_draw_rectangle)
+#define gdk_pixbuf_get_from_drawable (*fp_gdk_pixbuf_get_from_drawable)
+#define gdk_drawable_get_size (*fp_gdk_drawable_get_size)
+#define gdk_threads_leave (*fp_gdk_threads_leave)
+#define gdk_threads_init (*fp_gdk_threads_init)
+#define gdk_threads_enter (*fp_gdk_threads_enter)
+
+/************************
+ * Gtk function pointers
+ ************************/
+#define gtk_init_check (*fp_gtk_init_check)
+
+/* Painting */
+#define gtk_paint_hline (*fp_gtk_paint_hline)
+#define gtk_paint_vline (*fp_gtk_paint_vline)
+#define gtk_paint_shadow (*fp_gtk_paint_shadow)
+#define gtk_paint_arrow (*fp_gtk_paint_arrow)
+#define gtk_paint_diamond (*fp_gtk_paint_diamond)
+#define gtk_paint_box (*fp_gtk_paint_box)
+#define gtk_paint_flat_box (*fp_gtk_paint_flat_box)
+#define gtk_paint_check (*fp_gtk_paint_check)
+#define gtk_paint_option (*fp_gtk_paint_option)
+#define gtk_paint_box_gap (*fp_gtk_paint_box_gap)
+#define gtk_paint_extension (*fp_gtk_paint_extension)
+#define gtk_paint_focus (*fp_gtk_paint_focus)
+#define gtk_paint_slider (*fp_gtk_paint_slider)
+#define gtk_paint_handle (*fp_gtk_paint_handle)
+#define gtk_paint_expander (*fp_gtk_paint_expander)
+#define gtk_style_apply_default_background (*fp_gtk_style_apply_default_background)
+
+/* Widget creation */
+#define gtk_arrow_new (*fp_gtk_arrow_new)
+#define gtk_button_new (*fp_gtk_button_new)
+#define gtk_check_button_new (*fp_gtk_check_button_new)
+#define gtk_check_menu_item_new (*fp_gtk_check_menu_item_new)
+#define gtk_color_selection_dialog_new (*fp_gtk_color_selection_dialog_new)
+#define gtk_combo_box_new (*fp_gtk_combo_box_new)
+#define gtk_combo_box_entry_new (*fp_gtk_combo_box_entry_new)
+#define gtk_entry_new (*fp_gtk_entry_new)
+#define gtk_fixed_new (*fp_gtk_fixed_new)
+#define gtk_handle_box_new (*fp_gtk_handle_box_new)
+#define gtk_hpaned_new (*fp_gtk_hpaned_new)
+#define gtk_vpaned_new (*fp_gtk_vpaned_new)
+#define gtk_hscale_new (*fp_gtk_hscale_new)
+#define gtk_vscale_new (*fp_gtk_vscale_new)
+#define gtk_hscrollbar_new (*fp_gtk_hscrollbar_new)
+#define gtk_vscrollbar_new (*fp_gtk_vscrollbar_new)
+#define gtk_hseparator_new (*fp_gtk_hseparator_new)
+#define gtk_vseparator_new (*fp_gtk_vseparator_new)
+#define gtk_image_new (*fp_gtk_image_new)
+#define gtk_label_new (*fp_gtk_label_new)
+#define gtk_menu_new (*fp_gtk_menu_new)
+#define gtk_menu_bar_new (*fp_gtk_menu_bar_new)
+#define gtk_menu_item_new (*fp_gtk_menu_item_new)
+#define gtk_notebook_new (*fp_gtk_notebook_new)
+#define gtk_progress_bar_new (*fp_gtk_progress_bar_new)
+#define gtk_progress_bar_set_orientation (*fp_gtk_progress_bar_set_orientation)
+#define gtk_radio_button_new (*fp_gtk_radio_button_new)
+#define gtk_radio_menu_item_new (*fp_gtk_radio_menu_item_new)
+#define gtk_scrolled_window_new (*fp_gtk_scrolled_window_new)
+#define gtk_separator_menu_item_new (*fp_gtk_separator_menu_item_new)
+#define gtk_separator_tool_item_new (*fp_gtk_separator_tool_item_new)
+#define gtk_text_view_new (*fp_gtk_text_view_new)
+#define gtk_toggle_button_new (*fp_gtk_toggle_button_new)
+#define gtk_toolbar_new (*fp_gtk_toolbar_new)
+#define gtk_tree_view_new (*fp_gtk_tree_view_new)
+#define gtk_viewport_new (*fp_gtk_viewport_new)
+#define gtk_window_new (*fp_gtk_window_new)
+#define gtk_dialog_new (*fp_gtk_dialog_new)
+#define gtk_spin_button_new (*fp_gtk_spin_button_new)
+#define gtk_frame_new (*fp_gtk_frame_new)
+
+/* Other widget operations */
+#define gtk_adjustment_new (*fp_gtk_adjustment_new)
+#define gtk_container_add (*fp_gtk_container_add)
+#define gtk_menu_shell_append (*fp_gtk_menu_shell_append)
+#define gtk_menu_item_set_submenu (*fp_gtk_menu_item_set_submenu)
+#define gtk_widget_realize (*fp_gtk_widget_realize)
+#define gtk_widget_render_icon (*fp_gtk_widget_render_icon)
+#define gtk_widget_set_name (*fp_gtk_widget_set_name)
+#define gtk_widget_set_parent (*fp_gtk_widget_set_parent)
+#define gtk_widget_set_direction (*fp_gtk_widget_set_direction)
+#define gtk_widget_style_get (*fp_gtk_widget_style_get)
+#define gtk_widget_class_install_style_property (*fp_gtk_widget_class_install_style_property)
+#define gtk_widget_class_find_style_property (*fp_gtk_widget_class_find_style_property)
+#define gtk_widget_style_get_property (*fp_gtk_widget_style_get_property)
+#define pango_font_description_to_string (*fp_pango_font_description_to_string)
+#define gtk_settings_get_default (*fp_gtk_settings_get_default)
+#define gtk_widget_get_settings (*fp_gtk_widget_get_settings)
+#define gtk_border_get_type (*fp_gtk_border_get_type)
+#define gtk_arrow_set (*fp_gtk_arrow_set)
+#define gtk_widget_size_request (*fp_gtk_widget_size_request)
+#define gtk_range_get_adjustment (*fp_gtk_range_get_adjustment)
+#define gtk_widget_destroy (*fp_gtk_widget_destroy)
+#define gtk_window_present (*fp_gtk_window_present)
+#define gtk_window_move (*fp_gtk_window_move)
+#define gtk_window_resize (*fp_gtk_window_resize)
+#define gtk_widget_show (*fp_gtk_widget_show)
+#define gtk_widget_hide (*fp_gtk_widget_hide)
+#define gtk_main (*fp_gtk_main)
+#define gtk_main_level (*fp_gtk_main_level)
+#define gtk_main_quit (*fp_gtk_main_quit)
+#define gtk_check_version (*fp_gtk_check_version)
+#define gtk_init_check (*fp_gtk_init_check)
+
+/* GdkPixbuf */
+#define gdk_pixbuf_get_bits_per_sample (*fp_gdk_pixbuf_get_bits_per_sample)
+#define gdk_pixbuf_get_pixels (*fp_gdk_pixbuf_get_pixels)
+#define gdk_pixbuf_get_has_alpha (*fp_gdk_pixbuf_get_has_alpha)
+#define gdk_pixbuf_get_height (*fp_gdk_pixbuf_get_height)
+#define gdk_pixbuf_get_n_channels (*fp_gdk_pixbuf_get_n_channels)
+#define gdk_pixbuf_get_rowstride (*fp_gdk_pixbuf_get_rowstride)
+#define gdk_pixbuf_get_width (*fp_gdk_pixbuf_get_width)
+#define gdk_pixbuf_new_from_file (*fp_gdk_pixbuf_new_from_file)
+#define gdk_pixbuf_new (*fp_gdk_pixbuf_new)
+
+/* GtkFileChooser */
+#define gtk_file_chooser_get_filename (*fp_gtk_file_chooser_get_filename)
+#define gtk_file_chooser_dialog_new (*fp_gtk_file_chooser_dialog_new)
+#define gtk_file_chooser_set_current_folder (*fp_gtk_file_chooser_set_current_folder)
+#define gtk_file_chooser_set_filename (*fp_gtk_file_chooser_set_filename)
+#define gtk_file_chooser_set_current_name (*fp_gtk_file_chooser_set_current_name)
+#define gtk_file_chooser_set_filter (*fp_gtk_file_chooser_set_filter)
+#define gtk_file_chooser_get_type (*fp_gtk_file_chooser_get_type)
+#define gtk_file_chooser_set_do_overwrite_confirmation (*fp_gtk_file_chooser_set_do_overwrite_confirmation)
+#define gtk_file_chooser_set_select_multiple (*fp_gtk_file_chooser_set_select_multiple)
+#define gtk_file_chooser_get_current_folder (*fp_gtk_file_chooser_get_current_folder)
+#define gtk_file_chooser_get_filenames (*fp_gtk_file_chooser_get_filenames)
+#define gtk_file_filter_add_custom (*fp_gtk_file_filter_add_custom)
+#define gtk_file_filter_new (*fp_gtk_file_filter_new)
+
+#endif /* __GTK_FP_H__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/gtk2/gtk_fp_check.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2005, 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.
+ */
+#include "gtk_fp_check.h"
+
+#include <dlfcn.h>
+
+static gboolean gtk2_present = FALSE;
+
+gboolean gtk2_check_dlversion()
+{
+    if (gtk2_present == TRUE) {
+        /* We've already successfully checked the GTK libs, so return true. */
+        return TRUE;
+    }
+    void *lib = NULL;
+    
+    lib = dlopen(GTK2_LIB_VERSIONED, RTLD_LAZY | RTLD_LOCAL);
+    if (lib == NULL) {
+      lib = dlopen(GTK2_LIB, RTLD_LAZY | RTLD_LOCAL);
+      if (lib == NULL) {
+	return FALSE;
+      }
+    }
+    
+    fp_gtk_check_version = dlsym(lib, "gtk_check_version");
+    /* Check for GTK 2.2+ */
+    if (!fp_gtk_check_version(2, 2, 0)) {
+      gtk2_present = TRUE;
+    }
+    
+    dlclose(lib);
+    
+    return gtk2_present;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/gtk2/gtk_fp_check.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2005, 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.
+ */
+#ifndef __GTK_FP_CHECK_H__
+#define __GTK_FP_CHECK_H__
+
+#include <gtk/gtk.h>
+#include "jvm_md.h"
+
+#define GTK2_LIB_VERSIONED VERSIONED_JNI_LIB_NAME("gtk-x11-2.0", "0")
+#define GTK2_LIB JNI_LIB_NAME("gtk-x11-2.0")
+
+gboolean gtk2_check_dlversion();
+
+/************************
+ * Gtk function pointers
+ ************************/
+/**
+ * Returns :
+ * NULL if the GTK+ library is compatible with the given version, or a string
+ * describing the version mismatch.
+ */
+gchar* (*fp_gtk_check_version)(guint required_major, guint required_minor,
+				      guint required_micro);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/syscalls_fp.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2008, 2009, 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 <syscalls_fp.h>
+
+#include <dlfcn.h>
+#include <jni_util.h>
+
+openat64_func* my_openat64_func = NULL;
+fstatat64_func* my_fstatat64_func = NULL;
+unlinkat_func* my_unlinkat_func = NULL;
+renameat_func* my_renameat_func = NULL;
+futimesat_func* my_futimesat_func = NULL;
+fdopendir_func* my_fdopendir_func = NULL;
+fgetxattr_func* my_fgetxattr_func = NULL;
+fsetxattr_func* my_fsetxattr_func = NULL;
+fremovexattr_func* my_fremovexattr_func = NULL;
+flistxattr_func* my_flistxattr_func = NULL;
+
+void syscalls_init()
+{
+    my_fgetxattr_func = (fgetxattr_func*)dlsym(RTLD_DEFAULT, "fgetxattr");
+    my_fsetxattr_func = (fsetxattr_func*)dlsym(RTLD_DEFAULT, "fsetxattr");
+    my_fremovexattr_func = (fremovexattr_func*)dlsym(RTLD_DEFAULT, "fremovexattr");
+    my_flistxattr_func = (flistxattr_func*)dlsym(RTLD_DEFAULT, "flistxattr");
+}
+
+int atsyscalls_init()
+{
+    /* system calls that might not be available at run time */
+
+#if (defined(__solaris__) && defined(_LP64)) || defined(_ALLBSD_SOURCE)
+    /* Solaris 64-bit does not have openat64/fstatat64 */
+    my_openat64_func = (openat64_func*)dlsym(RTLD_DEFAULT, "openat");
+    my_fstatat64_func = (fstatat64_func*)dlsym(RTLD_DEFAULT, "fstatat");
+#else
+    my_openat64_func = (openat64_func*) dlsym(RTLD_DEFAULT, "openat64");
+    my_fstatat64_func = (fstatat64_func*) dlsym(RTLD_DEFAULT, "fstatat64");
+#endif
+    my_unlinkat_func = (unlinkat_func*) dlsym(RTLD_DEFAULT, "unlinkat");
+    my_renameat_func = (renameat_func*) dlsym(RTLD_DEFAULT, "renameat");
+    my_futimesat_func = (futimesat_func*) dlsym(RTLD_DEFAULT, "futimesat");
+    my_fdopendir_func = (fdopendir_func*) dlsym(RTLD_DEFAULT, "fdopendir");
+
+#if defined(_ATFILE_SOURCE)
+    /* fstatat64 from glibc requires a define */
+    if (my_fstatat64_func == NULL)
+        my_fstatat64_func = (fstatat64_func*)&fstatat64;
+#endif
+
+    if (my_openat64_func != NULL &&  my_fstatat64_func != NULL &&
+        my_unlinkat_func != NULL && my_renameat_func != NULL &&
+        my_futimesat_func != NULL && my_fdopendir_func != NULL)
+    {
+        return 0;
+    }
+
+    return -1;
+}
+
+size_t fgetxattr_dl(int fd, const char* name, void* value, size_t size)
+{
+    if (my_fgetxattr_func == NULL) {
+        errno = ENOTSUP;
+	return -1;
+    }
+    /* EINTR not documented */
+    return (*my_fgetxattr_func)(fd, name, value, size);
+}
+
+int fsetxattr_dl(int fd, const char* name, void* value, size_t size, int flags)
+{
+    if (my_fsetxattr_func == NULL) {
+        errno = ENOTSUP;
+	return -1;
+    }
+    /* EINTR not documented */
+    return (*my_fsetxattr_func)(fd, name, value, size, flags);
+}
+
+int fremovexattr_dl(int fd, const char* name)
+{
+    if (my_fremovexattr_func == NULL) {
+        errno = ENOTSUP;
+	return -1;
+    }
+    /* EINTR not documented */
+    return (*my_fremovexattr_func)(fd, name);
+}
+
+int flistxattr_dl(int fd, char* list, size_t size)
+{
+    if (my_flistxattr_func == NULL) {
+        errno = ENOTSUP;
+	return -1;
+    }
+    /* EINTR not documented */
+    return (*my_flistxattr_func)(fd, list, size);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/common/deps/syscalls_fp.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2008, 2009, 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 __SYSCALLS_FP_H__
+#define __SYSCALLS_FP_H__
+
+#include <dirent.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/resource.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/**
+ * System calls that may not be available at run time.
+ */
+typedef size_t fgetxattr_func(int fd, const char* name, void* value, size_t size);
+typedef int fsetxattr_func(int fd, const char* name, void* value, size_t size, int flags);
+typedef int fremovexattr_func(int fd, const char* name);
+typedef int flistxattr_func(int fd, char* list, size_t size);
+typedef int openat64_func(int, const char *, int, ...);
+typedef int fstatat64_func(int, const char *, struct stat64 *, int);
+typedef int unlinkat_func(int, const char*, int);
+typedef int renameat_func(int, const char*, int, const char*);
+typedef int futimesat_func(int, const char *, const struct timeval *);
+typedef DIR* fdopendir_func(int);
+
+extern openat64_func* my_openat64_func;
+extern fstatat64_func* my_fstatat64_func;
+extern unlinkat_func* my_unlinkat_func;
+extern renameat_func* my_renameat_func;
+extern futimesat_func* my_futimesat_func;
+extern fdopendir_func* my_fdopendir_func;
+extern fgetxattr_func* my_fgetxattr_func;
+extern fsetxattr_func* my_fsetxattr_func;
+extern fremovexattr_func* my_fremovexattr_func;
+extern flistxattr_func* my_flistxattr_func;
+
+void syscalls_init();
+int atsyscalls_init();
+size_t fgetxattr_dl(int fd, const char* name, void* value, size_t size);
+int fsetxattr_dl(int fd, const char* name, void* value, size_t size, int flags);
+int fremovexattr_dl(int fd, const char* name);
+int flistxattr_dl(int fd, char* list, size_t size);
+
+#define openat64 (*my_openat64_func)
+#define fstatat64 (*my_fstatat64_func)
+#define unlinkat (*my_unlinkat_func)
+#define renameat (*my_renameat_func)
+#define futimesat (*my_futimesat_func)
+#define fdopendir (*my_fdopendir_func)
+#define fgetxattr fgetxattr_dl
+#define fsetxattr fsetxattr_dl
+#define fremovexattr fremovexattr_dl
+#define flistxattr flistxattr_dl
+#endif
--- a/src/solaris/native/java/lang/java_props_md.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/java/lang/java_props_md.c	Tue Aug 22 02:03:52 2017 +0100
@@ -137,7 +137,7 @@
 
 static int ParseLocale(int cat, char ** std_language, char ** std_script,
                        char ** std_country, char ** std_variant, char ** std_encoding) {
-    char temp[64];
+    char *temp;
     char *language = NULL, *country = NULL, *variant = NULL,
          *encoding = NULL;
     char *p, encoding_variant[64];
@@ -186,6 +186,7 @@
      * <country name>, <encoding name>, and <variant name> are optional.
      */
 
+    temp = (char*) malloc(strlen(lc)+1);
     strcpy(temp, lc);
 #ifdef MACOSX
     free(lc); // malloced memory
@@ -345,6 +346,10 @@
 #endif
     }
 
+	
+    /* Free temp */
+    free(temp);
+
     return 1;
 }
 
--- a/src/solaris/native/java/net/AbstractPlainDatagramSocketImpl.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
- * 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.
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#ifdef __solaris__
-#include <unistd.h>
-#include <stropts.h>
-
-#ifndef BSD_COMP
-#define BSD_COMP
-#endif
-
-#endif
-
-#include <sys/ioctl.h>
-
-#include "jvm.h"
-#include "jni_util.h"
-#include "net_util.h"
-
-#include "java_net_AbstractPlainDatagramSocketImpl.h"
-
-static jfieldID IO_fd_fdID;
-
-static jfieldID apdsi_fdID;
-
-
-/*
- * Class:     java_net_AbstractPlainDatagramSocketImpl
- * Method:    init
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
-
-    apdsi_fdID = (*env)->GetFieldID(env, cls, "fd",
-                                   "Ljava/io/FileDescriptor;");
-    CHECK_NULL(apdsi_fdID);
-
-    IO_fd_fdID = NET_GetFileDescriptorID(env);
-}
-
-/*
- * Class:     java_net_AbstractPlainDatagramSocketImpl
- * Method:    dataAvailable
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
-(JNIEnv *env, jobject this) {
-    int fd, retval;
-
-    jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID);
-
-    if (IS_NULL(fdObj)) {
-        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
-                        "Socket closed");
-        return -1;
-    }
-    fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
-
-    if (ioctl(fd, FIONREAD, &retval) < 0) {
-        return -1;
-    }
-    return retval;
-}
--- a/src/solaris/native/java/net/PlainDatagramSocketImpl.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/java/net/PlainDatagramSocketImpl.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -32,6 +32,12 @@
 
 #ifdef __solaris__
 #include <fcntl.h>
+#include <unistd.h>
+#include <stropts.h>
+
+#ifndef BSD_COMP
+#define BSD_COMP
+#endif
 #endif
 #ifdef __linux__
 #include <unistd.h>
@@ -45,6 +51,8 @@
 #endif
 #endif
 
+#include <sys/ioctl.h>
+
 #ifndef IPTOS_TOS_MASK
 #define IPTOS_TOS_MASK 0x1e
 #endif
@@ -2485,3 +2493,28 @@
 {
     mcast_join_leave(env, this, iaObj, niObj, JNI_FALSE);
 }
+
+/*
+ * Class:     java_net_PlainDatagramSocketImpl
+ * Method:    dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL
+Java_java_net_PlainDatagramSocketImpl_dataAvailable(JNIEnv *env, jobject this)
+{
+    int fd, retval;
+
+    jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
+
+    if (IS_NULL(fdObj)) {
+        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+                        "Socket closed");
+        return -1;
+    }
+    fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
+
+    if (ioctl(fd, FIONREAD, &retval) < 0) {
+        return -1;
+    }
+    return retval;
+}
--- a/src/solaris/native/java/util/TimeZone_md.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/java/util/TimeZone_md.c	Tue Aug 22 02:03:52 2017 +0100
@@ -53,6 +53,7 @@
 
 
 static const char *ETC_TIMEZONE_FILE = "/etc/timezone";
+static const char *SYSCONFIG_CLOCK_FILE = "/etc/sysconfig/clock";
 static const char *ZONEINFO_DIR = "/usr/share/zoneinfo";
 static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime";
 #else
@@ -247,6 +248,7 @@
             }
         }
         (void) fclose(fp);
+	fp = NULL;
         if (tz != NULL) {
             return tz;
         }
@@ -254,6 +256,62 @@
 #endif /* __linux__ */
 
     /*
+     * Next, try the ZONE entry in /etc/sysconfig/clock.
+     */
+    if ((fp = fopen(SYSCONFIG_CLOCK_FILE, "r")) != NULL) {
+	char line[256];
+	
+	while (fgets(line, sizeof(line), fp) != NULL) {
+	    char *p = line;
+	    char *s;
+	    
+	    SKIP_SPACE(p);
+	    if (*p != 'Z') {
+		continue;
+	    }
+	    if (strncmp(p, "ZONE=\"", 6) == 0) {
+		p += 6;
+	    } else {
+		/*
+		 * In case we need to parse it token by token.
+		 */
+		if (strncmp(p, "ZONE", 4) != 0) {
+		    continue;
+		}
+		p += 4;
+		SKIP_SPACE(p);
+		if (*p++ != '=') {
+		    break;
+		}
+		SKIP_SPACE(p);
+		if (*p++ != '"') {
+		    break;
+		}
+	    }
+	    for (s = p; *s && *s != '"'; s++) {
+		/* Old files may contain spaces; RH489586 */
+		if (*s == ' ')
+		    *s = '_';
+	    }
+	    if (*s != '"') {
+		/* this ZONE entry is broken. */
+		break;
+	    }
+	    *s = '\0';
+	    tz = strdup(p);
+	    break; 
+	}
+	
+	if (fp != NULL) {
+	    (void) fclose(fp);
+	    fp = NULL;
+	}
+	if (tz != NULL) {
+	    return tz;
+	}
+    }
+
+    /*
      * Next, try /etc/localtime to find the zone ID.
      */
     if (lstat(DEFAULT_ZONEINFO_FILE, &statbuf) == -1) {
--- a/src/solaris/native/sun/awt/CUPSfuncs.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/CUPSfuncs.c	Tue Aug 22 02:03:52 2017 +0100
@@ -25,11 +25,13 @@
 
 #include <jni.h>
 #include <jni_util.h>
-#include <jvm_md.h>
-#include <dlfcn.h>
 #include <cups/cups.h>
 #include <cups/ppd.h>
 
+#ifndef USE_SYSTEM_CUPS
+#include <cups_fp.h>
+#endif
+
 //#define CUPS_DEBUG
 
 #ifdef CUPS_DEBUG
@@ -38,27 +40,6 @@
 #define DPRINTF(x, y)
 #endif
 
-typedef const char* (*fn_cupsServer)(void);
-typedef int (*fn_ippPort)(void);
-typedef http_t* (*fn_httpConnect)(const char *, int);
-typedef void (*fn_httpClose)(http_t *);
-typedef char* (*fn_cupsGetPPD)(const char *);
-typedef ppd_file_t* (*fn_ppdOpenFile)(const char *);
-typedef void (*fn_ppdClose)(ppd_file_t *);
-typedef ppd_option_t* (*fn_ppdFindOption)(ppd_file_t *, const char *);
-typedef ppd_size_t* (*fn_ppdPageSize)(ppd_file_t *, char *);
-
-fn_cupsServer j2d_cupsServer;
-fn_ippPort j2d_ippPort;
-fn_httpConnect j2d_httpConnect;
-fn_httpClose j2d_httpClose;
-fn_cupsGetPPD j2d_cupsGetPPD;
-fn_ppdOpenFile j2d_ppdOpenFile;
-fn_ppdClose j2d_ppdClose;
-fn_ppdFindOption j2d_ppdFindOption;
-fn_ppdPageSize j2d_ppdPageSize;
-
-
 /*
  * Initialize library functions.
  * // REMIND : move tab , add dlClose before return
@@ -66,73 +47,11 @@
 JNIEXPORT jboolean JNICALL
 Java_sun_print_CUPSPrinter_initIDs(JNIEnv *env,
                                          jobject printObj) {
-  void *handle = dlopen(VERSIONED_JNI_LIB_NAME("cups", "2"),
-                        RTLD_LAZY | RTLD_GLOBAL);
-
-  if (handle == NULL) {
-    handle = dlopen(JNI_LIB_NAME("cups"), RTLD_LAZY | RTLD_GLOBAL);
-    if (handle == NULL) {
-      return JNI_FALSE;
-    }
-  }
-
-  j2d_cupsServer = (fn_cupsServer)dlsym(handle, "cupsServer");
-  if (j2d_cupsServer == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-  }
-
-  j2d_ippPort = (fn_ippPort)dlsym(handle, "ippPort");
-  if (j2d_ippPort == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-  }
-
-  j2d_httpConnect = (fn_httpConnect)dlsym(handle, "httpConnect");
-  if (j2d_httpConnect == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-  }
-
-  j2d_httpClose = (fn_httpClose)dlsym(handle, "httpClose");
-  if (j2d_httpClose == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-  }
-
-  j2d_cupsGetPPD = (fn_cupsGetPPD)dlsym(handle, "cupsGetPPD");
-  if (j2d_cupsGetPPD == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-  }
-
-  j2d_ppdOpenFile = (fn_ppdOpenFile)dlsym(handle, "ppdOpenFile");
-  if (j2d_ppdOpenFile == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-
-  }
-
-  j2d_ppdClose = (fn_ppdClose)dlsym(handle, "ppdClose");
-  if (j2d_ppdClose == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-
-  }
-
-  j2d_ppdFindOption = (fn_ppdFindOption)dlsym(handle, "ppdFindOption");
-  if (j2d_ppdFindOption == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-  }
-
-  j2d_ppdPageSize = (fn_ppdPageSize)dlsym(handle, "ppdPageSize");
-  if (j2d_ppdPageSize == NULL) {
-    dlclose(handle);
-    return JNI_FALSE;
-  }
-
+#ifndef USE_SYSTEM_CUPS
+  return cups_init();
+#else
   return JNI_TRUE;
+#endif
 }
 
 /*
@@ -144,7 +63,7 @@
                                          jobject printObj)
 {
     jstring cServer = NULL;
-    const char* server = j2d_cupsServer();
+    const char* server = cupsServer();
     if (server != NULL) {
         // Is this a local domain socket?
         if (strncmp(server, "/", 1) == 0) {
@@ -164,7 +83,7 @@
 Java_sun_print_CUPSPrinter_getCupsPort(JNIEnv *env,
                                          jobject printObj)
 {
-    int port = j2d_ippPort();
+    int port = ippPort();
     return (jint) port;
 }
 
@@ -182,10 +101,10 @@
     const char *serverName;
     serverName = (*env)->GetStringUTFChars(env, server, NULL);
     if (serverName != NULL) {
-        http_t *http = j2d_httpConnect(serverName, (int)port);
+        http_t *http = httpConnect(serverName, (int)port);
         (*env)->ReleaseStringUTFChars(env, server, serverName);
         if (http != NULL) {
-            j2d_httpClose(http);
+            httpClose(http);
             return JNI_TRUE;
         }
     }
@@ -218,7 +137,7 @@
 
     // NOTE: cupsGetPPD returns a pointer to a filename of a temporary file.
     // unlink() must be caled to remove the file when finished using it.
-    filename = j2d_cupsGetPPD(name);
+    filename = cupsGetPPD(name);
     (*env)->ReleaseStringUTFChars(env, printer, name);
 
     cls = (*env)->FindClass(env, "java/lang/String");
@@ -227,18 +146,18 @@
         return NULL;
     }
 
-    if ((ppd = j2d_ppdOpenFile(filename)) == NULL) {
+    if ((ppd = ppdOpenFile(filename)) == NULL) {
         unlink(filename);
         DPRINTF("CUPSfuncs::unable to open PPD  %s\n", filename);
         return NULL;
     }
 
-    optionPage = j2d_ppdFindOption(ppd, "PageSize");
+    optionPage = ppdFindOption(ppd, "PageSize");
     if (optionPage != NULL) {
         nPages = optionPage->num_choices;
     }
 
-    optionTray = j2d_ppdFindOption(ppd, "InputSlot");
+    optionTray = ppdFindOption(ppd, "InputSlot");
     if (optionTray != NULL) {
         nTrays = optionTray->num_choices;
     }
@@ -247,7 +166,7 @@
         nameArray = (*env)->NewObjectArray(env, nTotal, cls, NULL);
         if (nameArray == NULL) {
             unlink(filename);
-            j2d_ppdClose(ppd);
+            ppdClose(ppd);
             DPRINTF("CUPSfuncs::bad alloc new array\n", "")
             JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
             return NULL;
@@ -258,7 +177,7 @@
             utf_str = JNU_NewStringPlatform(env, choice->text);
             if (utf_str == NULL) {
                 unlink(filename);
-                j2d_ppdClose(ppd);
+                ppdClose(ppd);
                 DPRINTF("CUPSfuncs::bad alloc new string ->text\n", "")
                 JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
                 return NULL;
@@ -268,7 +187,7 @@
             utf_str = JNU_NewStringPlatform(env, choice->choice);
             if (utf_str == NULL) {
                 unlink(filename);
-                j2d_ppdClose(ppd);
+                ppdClose(ppd);
                 DPRINTF("CUPSfuncs::bad alloc new string ->choice\n", "")
                 JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
                 return NULL;
@@ -282,7 +201,7 @@
             utf_str = JNU_NewStringPlatform(env, choice->text);
             if (utf_str == NULL) {
                 unlink(filename);
-                j2d_ppdClose(ppd);
+                ppdClose(ppd);
                 DPRINTF("CUPSfuncs::bad alloc new string text\n", "")
                 JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
                 return NULL;
@@ -293,7 +212,7 @@
             utf_str = JNU_NewStringPlatform(env, choice->choice);
             if (utf_str == NULL) {
                 unlink(filename);
-                j2d_ppdClose(ppd);
+                ppdClose(ppd);
                 DPRINTF("CUPSfuncs::bad alloc new string choice\n", "")
                 JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
                 return NULL;
@@ -303,7 +222,7 @@
             (*env)->DeleteLocalRef(env, utf_str);
         }
     }
-    j2d_ppdClose(ppd);
+    ppdClose(ppd);
     unlink(filename);
     return nameArray;
 }
@@ -330,17 +249,17 @@
 
     // NOTE: cupsGetPPD returns a pointer to a filename of a temporary file.
     // unlink() must be called to remove the file after using it.
-    filename = j2d_cupsGetPPD(name);
+    filename = cupsGetPPD(name);
     (*env)->ReleaseStringUTFChars(env, printer, name);
     if (filename == NULL) {
         return NULL;
     }
-    if ((ppd = j2d_ppdOpenFile(filename)) == NULL) {
+    if ((ppd = ppdOpenFile(filename)) == NULL) {
         unlink(filename);
         DPRINTF("unable to open PPD  %s\n", filename)
         return NULL;
     }
-    option = j2d_ppdFindOption(ppd, "PageSize");
+    option = ppdFindOption(ppd, "PageSize");
     if (option != NULL && option->num_choices > 0) {
         // create array of dimensions - (num_choices * 6)
         //to cover length & height
@@ -348,7 +267,7 @@
         sizeArray = (*env)->NewFloatArray(env, option->num_choices*6);
         if (sizeArray == NULL) {
             unlink(filename);
-            j2d_ppdClose(ppd);
+            ppdClose(ppd);
             DPRINTF("CUPSfuncs::bad alloc new float array\n", "")
             JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
             return NULL;
@@ -357,7 +276,7 @@
         dims = (*env)->GetFloatArrayElements(env, sizeArray, NULL);
         for (i = 0; i<option->num_choices; i++) {
             choice = (option->choices)+i;
-            size = j2d_ppdPageSize(ppd, choice->choice);
+            size = ppdPageSize(ppd, choice->choice);
             if (size != NULL) {
                 // paper width and height
                 dims[i*6] = size->width;
@@ -373,7 +292,7 @@
         (*env)->ReleaseFloatArrayElements(env, sizeArray, dims, 0);
     }
 
-    j2d_ppdClose(ppd);
+    ppdClose(ppd);
     unlink(filename);
     return sizeArray;
 }
--- a/src/solaris/native/sun/awt/awt_Font.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/awt_Font.c	Tue Aug 22 02:03:52 2017 +0100
@@ -574,7 +574,7 @@
             jio_snprintf(fdata->flist[i].xlfd, strlen(nativename) + 10,
                          nativename, size * 10);
 
-            if (nativename != NULL && nativename != "")
+            if (nativename != NULL && *nativename != '\0')
                 JNU_ReleaseStringPlatformChars(env, fontDescriptorName, (const char *) nativename);
 
             /*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/sun/awt/awt_GTKToolkit.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <jni.h>
+#include <jni_util.h>
+#include <sizecalc.h>
+#include "sun_awt_UNIXToolkit.h"
+
+#ifndef HEADLESS
+#include "gtk2_interface.h"
+#endif /* !HEADLESS */
+
+static jclass this_class = NULL;
+static jmethodID icon_upcall_method = NULL;
+
+/*
+ * Class:     sun_awt_UNIXToolkit
+ * Method:    load_gtk
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_sun_awt_UNIXToolkit_load_1gtk(JNIEnv *env, jclass klass)
+{
+#ifndef HEADLESS
+    return (jboolean)gtk2_load();
+#else
+    return JNI_FALSE;
+#endif /* !HEADLESS */
+}
+
+
+/*
+ * Class:     sun_awt_UNIXToolkit
+ * Method:    unload_gtk
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_sun_awt_UNIXToolkit_unload_1gtk(JNIEnv *env, jclass klass)
+{
+#ifndef HEADLESS
+    return (jboolean)gtk2_unload();
+#else
+    return JNI_FALSE;
+#endif /* !HEADLESS */
+}
+
+jboolean _icon_upcall(JNIEnv *env, jobject this, GdkPixbuf *pixbuf)
+{
+    jboolean result = JNI_FALSE;
+
+    if (this_class == NULL) {
+        this_class = (*env)->NewGlobalRef(env,
+                                          (*env)->GetObjectClass(env, this));
+        icon_upcall_method = (*env)->GetMethodID(env, this_class,
+                                 "loadIconCallback", "([BIIIIIZ)V");
+    }
+
+    if (pixbuf != NULL)
+    {
+        guchar *pixbuf_data = gdk_pixbuf_get_pixels (pixbuf);
+        int row_stride = gdk_pixbuf_get_rowstride (pixbuf);
+        int width = gdk_pixbuf_get_width (pixbuf);
+        int height = gdk_pixbuf_get_height (pixbuf);
+        int bps = gdk_pixbuf_get_bits_per_sample (pixbuf);
+        int channels = gdk_pixbuf_get_n_channels (pixbuf);
+        gboolean alpha = gdk_pixbuf_get_has_alpha (pixbuf);
+
+        /* Copy the data array into a Java structure so we can pass it back. */
+        jbyteArray data = (*env)->NewByteArray(env, (row_stride * height));
+        (*env)->SetByteArrayRegion(env, data, 0, (row_stride * height),
+                                   (jbyte *)pixbuf_data);
+
+        /* Release the pixbuf. */
+        g_object_unref (pixbuf);
+
+        /* Call the callback method to create the image on the Java side. */
+        (*env)->CallVoidMethod(env, this, icon_upcall_method, data,
+                width, height, row_stride, bps, channels, alpha);
+        result = JNI_TRUE;
+    }
+    return result;
+}
+
+/*
+ * Class:     sun_awt_UNIXToolkit
+ * Method:    load_gtk_icon
+ * Signature: (Ljava/lang/String)Z
+ *
+ * This method assumes that GTK libs are present.
+ */
+JNIEXPORT jboolean JNICALL
+Java_sun_awt_UNIXToolkit_load_1gtk_1icon(JNIEnv *env, jobject this,
+        jstring filename)
+{
+#ifndef HEADLESS
+    int len;
+    char *filename_str = NULL;
+    GError **error = NULL;
+    GdkPixbuf *pixbuf;
+
+    if (filename == NULL)
+    {
+        return JNI_FALSE;
+    }
+
+    len = (*env)->GetStringUTFLength(env, filename);
+    filename_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
+            sizeof(char), len + 1);
+    if (filename_str == NULL) {
+        JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
+        return JNI_FALSE;
+    }
+    (*env)->GetStringUTFRegion(env, filename, 0, len, filename_str);
+    pixbuf = gdk_pixbuf_new_from_file (filename_str, error);
+
+    /* Release the strings we've allocated. */
+    free(filename_str);
+
+    return _icon_upcall(env, this, pixbuf);
+#else /* HEADLESS */
+    return JNI_FALSE;
+#endif /* !HEADLESS */
+}
+
+/*
+ * Class:     sun_awt_UNIXToolkit
+ * Method:    load_stock_icon
+ * Signature: (ILjava/lang/String;IILjava/lang/String;)Z
+ *
+ * This method assumes that GTK libs are present.
+ */
+JNIEXPORT jboolean JNICALL
+Java_sun_awt_UNIXToolkit_load_1stock_1icon(JNIEnv *env, jobject this,
+        jint widget_type, jstring stock_id, jint icon_size,
+        jint text_direction, jstring detail)
+{
+#ifndef HEADLESS
+    int len;
+    char *stock_id_str = NULL;
+    char *detail_str = NULL;
+    GdkPixbuf *pixbuf;
+
+    if (stock_id == NULL)
+    {
+        return JNI_FALSE;
+    }
+
+    len = (*env)->GetStringUTFLength(env, stock_id);
+    stock_id_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
+            sizeof(char), len + 1);
+    if (stock_id_str == NULL) {
+        JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
+        return JNI_FALSE;
+    }
+    (*env)->GetStringUTFRegion(env, stock_id, 0, len, stock_id_str);
+
+    /* Detail isn't required so check for NULL. */
+    if (detail != NULL)
+    {
+        len = (*env)->GetStringUTFLength(env, detail);
+        detail_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
+                sizeof(char), len + 1);
+        if (detail_str == NULL) {
+            JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
+            return JNI_FALSE;
+        }
+        (*env)->GetStringUTFRegion(env, detail, 0, len, detail_str);
+    }
+
+    pixbuf = gtk2_get_stock_icon(widget_type, stock_id_str, icon_size,
+                                 text_direction, detail_str);
+
+    /* Release the strings we've allocated. */
+    free(stock_id_str);
+    if (detail_str != NULL)
+    {
+        free(detail_str);
+    }
+
+    return _icon_upcall(env, this, pixbuf);
+#else /* HEADLESS */
+    return JNI_FALSE;
+#endif /* !HEADLESS */
+}
+
+/*
+ * Class:     sun_awt_UNIXToolkit
+ * Method:    gtkCheckVersionImpl
+ * Signature: (III)Ljava/lang/String;
+ */
+JNIEXPORT jboolean JNICALL
+Java_sun_awt_UNIXToolkit_gtkCheckVersionImpl(JNIEnv *env, jobject this,
+        jint major, jint minor, jint micro)
+{
+    char *ret;
+
+    ret = gtk_check_version(major, minor, micro);
+    if (ret == NULL) {
+        return TRUE;
+    }
+
+    free(ret);
+    return FALSE;
+}
--- a/src/solaris/native/sun/awt/awt_GraphicsEnv.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/awt_GraphicsEnv.c	Tue Aug 22 02:03:52 2017 +0100
@@ -449,7 +449,7 @@
         if (xrenderLibHandle != NULL) {
             xrenderFindVisualFormat =
                 (XRenderFindVisualFormatFunc*)dlsym(xrenderLibHandle,
-                                                    "XRenderFindVisualFormat");
+						    "XRenderFindVisualFormat");
         }
     }
 
--- a/src/solaris/native/sun/awt/awt_LoadLibrary.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/awt_LoadLibrary.c	Tue Aug 22 02:03:52 2017 +0100
@@ -43,7 +43,7 @@
 
 static void *awtHandle = NULL;
 
-typedef JNIEXPORT jint JNICALL JNI_OnLoad_type(JavaVM *vm, void *reserved);
+typedef jint JNICALL JNI_OnLoad_type(JavaVM *vm, void *reserved);
 
 /* Initialize the Java VM instance variable when the library is
    first loaded */
@@ -228,7 +228,7 @@
                                      jobject frame, jstring jcommand)
 {
     /* type of the old backdoor function */
-    typedef JNIEXPORT void JNICALL
+    typedef void JNICALL
         XsessionWMcommand_type(JNIEnv *env, jobject this,
                                jobject frame, jstring jcommand);
 
@@ -256,7 +256,7 @@
 JNIEXPORT void JNICALL
 Java_sun_awt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jargv)
 {
-    typedef JNIEXPORT void JNICALL
+    typedef void JNICALL
         XsessionWMcommand_New_type(JNIEnv *env, jobjectArray jargv);
 
     static XsessionWMcommand_New_type *XsessionWMcommand = NULL;
--- a/src/solaris/native/sun/awt/awt_Robot.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/awt_Robot.c	Tue Aug 22 02:03:52 2017 +0100
@@ -39,6 +39,7 @@
 #include <X11/extensions/XTest.h>
 #include <X11/extensions/XInput.h>
 #include <X11/extensions/XI.h>
+#include <X11/extensions/Xcomposite.h>
 #include <jni.h>
 #include <sizecalc.h>
 #include "robot_common.h"
@@ -89,6 +90,32 @@
     return isXTestAvailable;
 }
 
+static Bool hasXCompositeOverlayExtension(Display *display) {
+
+    int xoverlay = False;
+    int eventBase, errorBase;
+    if (XCompositeQueryExtension(display, &eventBase, &errorBase)) {
+        int major = 0;
+        int minor = 0;
+
+        XCompositeQueryVersion(display, &major, &minor);
+        if (major > 0 || minor >= 3)
+            xoverlay = True;
+    }
+
+    return xoverlay;
+}
+
+static jboolean isXCompositeDisplay(Display *display, int screenNumber) {
+
+    char NET_WM_CM_Sn[25];
+    snprintf(NET_WM_CM_Sn, sizeof(NET_WM_CM_Sn), "_NET_WM_CM_S%d\0", screenNumber);
+
+    Atom managerSelection = XInternAtom(display, NET_WM_CM_Sn, 0);
+    Window owner = XGetSelectionOwner(display, managerSelection);
+
+    return owner != 0;
+}
 
 static XImage *getWindowImage(Display * display, Window window,
                               int32_t x, int32_t y,
@@ -230,6 +257,12 @@
     DASSERT(adata != NULL);
 
     rootWindow = XRootWindow(awt_display, adata->awt_visInfo.screen);
+    if (isXCompositeDisplay(awt_display, adata->awt_visInfo.screen) &&
+        hasXCompositeOverlayExtension(awt_display))
+    {
+        rootWindow = XCompositeGetOverlayWindow(awt_display, rootWindow);
+    }
+
     image = getWindowImage(awt_display, rootWindow, x, y, width, height);
 
     /* Array to use to crunch around the pixel values */
--- a/src/solaris/native/sun/awt/awt_UNIXToolkit.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/awt_UNIXToolkit.c	Tue Aug 22 02:03:52 2017 +0100
@@ -23,9 +23,6 @@
  * questions.
  */
 
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
 #include <dlfcn.h>
 
 #include <jni.h>
@@ -34,14 +31,9 @@
 
 #ifndef HEADLESS
 #include "awt.h"
-#include "gtk2_interface.h"
+#include "gtk2_interface_check.h"
 #endif /* !HEADLESS */
 
-
-static jclass this_class = NULL;
-static jmethodID icon_upcall_method = NULL;
-
-
 /*
  * Class:     sun_awt_UNIXToolkit
  * Method:    check_gtk
@@ -57,177 +49,6 @@
 #endif /* !HEADLESS */
 }
 
-
-/*
- * Class:     sun_awt_UNIXToolkit
- * Method:    load_gtk
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_UNIXToolkit_load_1gtk(JNIEnv *env, jclass klass)
-{
-#ifndef HEADLESS
-    return (jboolean)gtk2_load();
-#else
-    return JNI_FALSE;
-#endif /* !HEADLESS */
-}
-
-
-/*
- * Class:     sun_awt_UNIXToolkit
- * Method:    unload_gtk
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_UNIXToolkit_unload_1gtk(JNIEnv *env, jclass klass)
-{
-#ifndef HEADLESS
-    return (jboolean)gtk2_unload();
-#else
-    return JNI_FALSE;
-#endif /* !HEADLESS */
-}
-
-jboolean _icon_upcall(JNIEnv *env, jobject this, GdkPixbuf *pixbuf)
-{
-    jboolean result = JNI_FALSE;
-
-    if (this_class == NULL) {
-        this_class = (*env)->NewGlobalRef(env,
-                                          (*env)->GetObjectClass(env, this));
-        icon_upcall_method = (*env)->GetMethodID(env, this_class,
-                                 "loadIconCallback", "([BIIIIIZ)V");
-    }
-
-    if (pixbuf != NULL)
-    {
-        guchar *pixbuf_data = (*fp_gdk_pixbuf_get_pixels)(pixbuf);
-        int row_stride = (*fp_gdk_pixbuf_get_rowstride)(pixbuf);
-        int width = (*fp_gdk_pixbuf_get_width)(pixbuf);
-        int height = (*fp_gdk_pixbuf_get_height)(pixbuf);
-        int bps = (*fp_gdk_pixbuf_get_bits_per_sample)(pixbuf);
-        int channels = (*fp_gdk_pixbuf_get_n_channels)(pixbuf);
-        gboolean alpha = (*fp_gdk_pixbuf_get_has_alpha)(pixbuf);
-
-        /* Copy the data array into a Java structure so we can pass it back. */
-        jbyteArray data = (*env)->NewByteArray(env, (row_stride * height));
-        (*env)->SetByteArrayRegion(env, data, 0, (row_stride * height),
-                                   (jbyte *)pixbuf_data);
-
-        /* Release the pixbuf. */
-        (*fp_g_object_unref)(pixbuf);
-
-        /* Call the callback method to create the image on the Java side. */
-        (*env)->CallVoidMethod(env, this, icon_upcall_method, data,
-                width, height, row_stride, bps, channels, alpha);
-        result = JNI_TRUE;
-    }
-    return result;
-}
-
-/*
- * Class:     sun_awt_UNIXToolkit
- * Method:    load_gtk_icon
- * Signature: (Ljava/lang/String)Z
- *
- * This method assumes that GTK libs are present.
- */
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_UNIXToolkit_load_1gtk_1icon(JNIEnv *env, jobject this,
-        jstring filename)
-{
-#ifndef HEADLESS
-    int len;
-    char *filename_str = NULL;
-    GError **error = NULL;
-    GdkPixbuf *pixbuf;
-
-    if (filename == NULL)
-    {
-        return JNI_FALSE;
-    }
-
-    len = (*env)->GetStringUTFLength(env, filename);
-    filename_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
-            sizeof(char), len + 1);
-    if (filename_str == NULL) {
-        JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
-        return JNI_FALSE;
-    }
-    (*env)->GetStringUTFRegion(env, filename, 0, len, filename_str);
-    pixbuf = (*fp_gdk_pixbuf_new_from_file)(filename_str, error);
-
-    /* Release the strings we've allocated. */
-    free(filename_str);
-
-    return _icon_upcall(env, this, pixbuf);
-#else /* HEADLESS */
-    return JNI_FALSE;
-#endif /* !HEADLESS */
-}
-
-/*
- * Class:     sun_awt_UNIXToolkit
- * Method:    load_stock_icon
- * Signature: (ILjava/lang/String;IILjava/lang/String;)Z
- *
- * This method assumes that GTK libs are present.
- */
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_UNIXToolkit_load_1stock_1icon(JNIEnv *env, jobject this,
-        jint widget_type, jstring stock_id, jint icon_size,
-        jint text_direction, jstring detail)
-{
-#ifndef HEADLESS
-    int len;
-    char *stock_id_str = NULL;
-    char *detail_str = NULL;
-    GdkPixbuf *pixbuf;
-
-    if (stock_id == NULL)
-    {
-        return JNI_FALSE;
-    }
-
-    len = (*env)->GetStringUTFLength(env, stock_id);
-    stock_id_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
-            sizeof(char), len + 1);
-    if (stock_id_str == NULL) {
-        JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
-        return JNI_FALSE;
-    }
-    (*env)->GetStringUTFRegion(env, stock_id, 0, len, stock_id_str);
-
-    /* Detail isn't required so check for NULL. */
-    if (detail != NULL)
-    {
-        len = (*env)->GetStringUTFLength(env, detail);
-        detail_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
-                sizeof(char), len + 1);
-        if (detail_str == NULL) {
-            JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
-            return JNI_FALSE;
-        }
-        (*env)->GetStringUTFRegion(env, detail, 0, len, detail_str);
-    }
-
-    pixbuf = gtk2_get_stock_icon(widget_type, stock_id_str, icon_size,
-                                 text_direction, detail_str);
-
-    /* Release the strings we've allocated. */
-    free(stock_id_str);
-    if (detail_str != NULL)
-    {
-        free(detail_str);
-    }
-
-    return _icon_upcall(env, this, pixbuf);
-#else /* HEADLESS */
-    return JNI_FALSE;
-#endif /* !HEADLESS */
-}
-
 /*
  * Class:     sun_awt_UNIXToolkit
  * Method:    nativeSync
@@ -265,22 +86,3 @@
     dlclose(hSplashLib);
 }
 
-/*
- * Class:     sun_awt_UNIXToolkit
- * Method:    gtkCheckVersionImpl
- * Signature: (III)Ljava/lang/String;
- */
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_UNIXToolkit_gtkCheckVersionImpl(JNIEnv *env, jobject this,
-        jint major, jint minor, jint micro)
-{
-    char *ret;
-
-    ret = fp_gtk_check_version(major, minor, micro);
-    if (ret == NULL) {
-        return TRUE;
-    }
-
-    free(ret);
-    return FALSE;
-}
--- a/src/solaris/native/sun/awt/fontconfig.h	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,941 +0,0 @@
-/*
- * $RCSId: xc/lib/fontconfig/fontconfig/fontconfig.h,v 1.30 2002/09/26 00:17:27 keithp Exp $
- *
- * Copyright © 2001 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _FONTCONFIG_H_
-#define _FONTCONFIG_H_
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdarg.h>
-
-#if defined(__GNUC__) && (__GNUC__ >= 4)
-#define FC_ATTRIBUTE_SENTINEL(x) __attribute__((__sentinel__(0)))
-#else
-#define FC_ATTRIBUTE_SENTINEL(x)
-#endif
-
-#ifndef FcPublic
-#define FcPublic
-#endif
-
-typedef unsigned char   FcChar8;
-typedef unsigned short  FcChar16;
-typedef unsigned int    FcChar32;
-typedef int             FcBool;
-
-/*
- * Current Fontconfig version number.  This same number
- * must appear in the fontconfig configure.in file. Yes,
- * it'a a pain to synchronize version numbers like this.
- */
-
-#define FC_MAJOR        2
-#define FC_MINOR        5
-#define FC_REVISION     0
-
-#define FC_VERSION      ((FC_MAJOR * 10000) + (FC_MINOR * 100) + (FC_REVISION))
-
-/*
- * Current font cache file format version
- * This is appended to the cache files so that multiple
- * versions of the library will peacefully coexist
- *
- * Change this value whenever the disk format for the cache file
- * changes in any non-compatible way.  Try to avoid such changes as
- * it means multiple copies of the font information.
- */
-
-#define FC_CACHE_VERSION    "2"
-
-#define FcTrue          1
-#define FcFalse         0
-
-#define FC_FAMILY           "family"            /* String */
-#define FC_STYLE            "style"             /* String */
-#define FC_SLANT            "slant"             /* Int */
-#define FC_WEIGHT           "weight"            /* Int */
-#define FC_SIZE             "size"              /* Double */
-#define FC_ASPECT           "aspect"            /* Double */
-#define FC_PIXEL_SIZE       "pixelsize"         /* Double */
-#define FC_SPACING          "spacing"           /* Int */
-#define FC_FOUNDRY          "foundry"           /* String */
-#define FC_ANTIALIAS        "antialias"         /* Bool (depends) */
-#define FC_HINTING          "hinting"           /* Bool (true) */
-#define FC_HINT_STYLE       "hintstyle"         /* Int */
-#define FC_VERTICAL_LAYOUT  "verticallayout"    /* Bool (false) */
-#define FC_AUTOHINT         "autohint"          /* Bool (false) */
-#define FC_GLOBAL_ADVANCE   "globaladvance"     /* Bool (true) */
-#define FC_WIDTH            "width"             /* Int */
-#define FC_FILE             "file"              /* String */
-#define FC_INDEX            "index"             /* Int */
-#define FC_FT_FACE          "ftface"            /* FT_Face */
-#define FC_RASTERIZER       "rasterizer"        /* String */
-#define FC_OUTLINE          "outline"           /* Bool */
-#define FC_SCALABLE         "scalable"          /* Bool */
-#define FC_SCALE            "scale"             /* double */
-#define FC_DPI              "dpi"               /* double */
-#define FC_RGBA             "rgba"              /* Int */
-#define FC_MINSPACE         "minspace"          /* Bool use minimum line spacing */
-#define FC_SOURCE           "source"            /* String (deprecated) */
-#define FC_CHARSET          "charset"           /* CharSet */
-#define FC_LANG             "lang"              /* String RFC 3066 langs */
-#define FC_FONTVERSION      "fontversion"       /* Int from 'head' table */
-#define FC_FULLNAME         "fullname"          /* String */
-#define FC_FAMILYLANG       "familylang"        /* String RFC 3066 langs */
-#define FC_STYLELANG        "stylelang"         /* String RFC 3066 langs */
-#define FC_FULLNAMELANG     "fullnamelang"      /* String RFC 3066 langs */
-#define FC_CAPABILITY       "capability"        /* String */
-#define FC_FONTFORMAT       "fontformat"        /* String */
-#define FC_EMBOLDEN         "embolden"          /* Bool - true if emboldening needed*/
-#define FC_EMBEDDED_BITMAP  "embeddedbitmap"    /* Bool - true to enable embedded bitmaps */
-#define FC_DECORATIVE       "decorative"        /* Bool - true if style is a decorative variant */
-
-#define FC_CACHE_SUFFIX             ".cache-"FC_CACHE_VERSION
-#define FC_DIR_CACHE_FILE           "fonts.cache-"FC_CACHE_VERSION
-#define FC_USER_CACHE_FILE          ".fonts.cache-"FC_CACHE_VERSION
-
-/* Adjust outline rasterizer */
-#define FC_CHAR_WIDTH       "charwidth" /* Int */
-#define FC_CHAR_HEIGHT      "charheight"/* Int */
-#define FC_MATRIX           "matrix"    /* FcMatrix */
-
-#define FC_WEIGHT_THIN              0
-#define FC_WEIGHT_EXTRALIGHT        40
-#define FC_WEIGHT_ULTRALIGHT        FC_WEIGHT_EXTRALIGHT
-#define FC_WEIGHT_LIGHT             50
-#define FC_WEIGHT_BOOK              75
-#define FC_WEIGHT_REGULAR           80
-#define FC_WEIGHT_NORMAL            FC_WEIGHT_REGULAR
-#define FC_WEIGHT_MEDIUM            100
-#define FC_WEIGHT_DEMIBOLD          180
-#define FC_WEIGHT_SEMIBOLD          FC_WEIGHT_DEMIBOLD
-#define FC_WEIGHT_BOLD              200
-#define FC_WEIGHT_EXTRABOLD         205
-#define FC_WEIGHT_ULTRABOLD         FC_WEIGHT_EXTRABOLD
-#define FC_WEIGHT_BLACK             210
-#define FC_WEIGHT_HEAVY             FC_WEIGHT_BLACK
-#define FC_WEIGHT_EXTRABLACK        215
-#define FC_WEIGHT_ULTRABLACK        FC_WEIGHT_EXTRABLACK
-
-#define FC_SLANT_ROMAN              0
-#define FC_SLANT_ITALIC             100
-#define FC_SLANT_OBLIQUE            110
-
-#define FC_WIDTH_ULTRACONDENSED     50
-#define FC_WIDTH_EXTRACONDENSED     63
-#define FC_WIDTH_CONDENSED          75
-#define FC_WIDTH_SEMICONDENSED      87
-#define FC_WIDTH_NORMAL             100
-#define FC_WIDTH_SEMIEXPANDED       113
-#define FC_WIDTH_EXPANDED           125
-#define FC_WIDTH_EXTRAEXPANDED      150
-#define FC_WIDTH_ULTRAEXPANDED      200
-
-#define FC_PROPORTIONAL             0
-#define FC_DUAL                     90
-#define FC_MONO                     100
-#define FC_CHARCELL                 110
-
-/* sub-pixel order */
-#define FC_RGBA_UNKNOWN     0
-#define FC_RGBA_RGB         1
-#define FC_RGBA_BGR         2
-#define FC_RGBA_VRGB        3
-#define FC_RGBA_VBGR        4
-#define FC_RGBA_NONE        5
-
-/* hinting style */
-#define FC_HINT_NONE        0
-#define FC_HINT_SLIGHT      1
-#define FC_HINT_MEDIUM      2
-#define FC_HINT_FULL        3
-
-typedef enum _FcType {
-    FcTypeVoid,
-    FcTypeInteger,
-    FcTypeDouble,
-    FcTypeString,
-    FcTypeBool,
-    FcTypeMatrix,
-    FcTypeCharSet,
-    FcTypeFTFace,
-    FcTypeLangSet
-} FcType;
-
-typedef struct _FcMatrix {
-    double xx, xy, yx, yy;
-} FcMatrix;
-
-#define FcMatrixInit(m) ((m)->xx = (m)->yy = 1, \
-                         (m)->xy = (m)->yx = 0)
-
-/*
- * A data structure to represent the available glyphs in a font.
- * This is represented as a sparse boolean btree.
- */
-
-typedef struct _FcCharSet FcCharSet;
-
-typedef struct _FcObjectType {
-    const char  *object;
-    FcType      type;
-} FcObjectType;
-
-typedef struct _FcConstant {
-    const FcChar8  *name;
-    const char  *object;
-    int         value;
-} FcConstant;
-
-typedef enum _FcResult {
-    FcResultMatch, FcResultNoMatch, FcResultTypeMismatch, FcResultNoId,
-    FcResultOutOfMemory
-} FcResult;
-
-typedef struct _FcPattern   FcPattern;
-
-typedef struct _FcLangSet   FcLangSet;
-
-typedef struct _FcValue {
-    FcType      type;
-    union {
-        const FcChar8   *s;
-        int             i;
-        FcBool          b;
-        double          d;
-        const FcMatrix  *m;
-        const FcCharSet *c;
-        void            *f;
-        const FcLangSet *l;
-    } u;
-} FcValue;
-
-typedef struct _FcFontSet {
-    int         nfont;
-    int         sfont;
-    FcPattern   **fonts;
-} FcFontSet;
-
-typedef struct _FcObjectSet {
-    int         nobject;
-    int         sobject;
-    const char  **objects;
-} FcObjectSet;
-
-typedef enum _FcMatchKind {
-    FcMatchPattern, FcMatchFont, FcMatchScan
-} FcMatchKind;
-
-typedef enum _FcLangResult {
-    FcLangEqual = 0,
-    FcLangDifferentCountry = 1,
-    FcLangDifferentTerritory = 1,
-    FcLangDifferentLang = 2
-} FcLangResult;
-
-typedef enum _FcSetName {
-    FcSetSystem = 0,
-    FcSetApplication = 1
-} FcSetName;
-
-typedef struct _FcAtomic FcAtomic;
-
-#if defined(__cplusplus) || defined(c_plusplus) /* for C++ V2.0 */
-#define _FCFUNCPROTOBEGIN extern "C" {  /* do not leave open across includes */
-#define _FCFUNCPROTOEND }
-#else
-#define _FCFUNCPROTOBEGIN
-#define _FCFUNCPROTOEND
-#endif
-
-typedef enum { FcEndianBig, FcEndianLittle } FcEndian;
-
-typedef struct _FcConfig    FcConfig;
-
-typedef struct _FcGlobalCache   FcFileCache;
-
-typedef struct _FcBlanks    FcBlanks;
-
-typedef struct _FcStrList   FcStrList;
-
-typedef struct _FcStrSet    FcStrSet;
-
-typedef struct _FcCache     FcCache;
-
-_FCFUNCPROTOBEGIN
-
-/* fcblanks.c */
-FcPublic FcBlanks *
-FcBlanksCreate (void);
-
-FcPublic void
-FcBlanksDestroy (FcBlanks *b);
-
-FcPublic FcBool
-FcBlanksAdd (FcBlanks *b, FcChar32 ucs4);
-
-FcPublic FcBool
-FcBlanksIsMember (FcBlanks *b, FcChar32 ucs4);
-
-/* fccache.c */
-
-FcPublic const FcChar8 *
-FcCacheDir(const FcCache *c);
-
-FcPublic FcFontSet *
-FcCacheCopySet(const FcCache *c);
-
-FcPublic const FcChar8 *
-FcCacheSubdir (const FcCache *c, int i);
-
-FcPublic int
-FcCacheNumSubdir (const FcCache *c);
-
-FcPublic int
-FcCacheNumFont (const FcCache *c);
-
-FcPublic FcBool
-FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config);
-
-FcPublic FcBool
-FcDirCacheValid (const FcChar8 *cache_file);
-
-/* fccfg.c */
-FcPublic FcChar8 *
-FcConfigHome (void);
-
-FcPublic FcBool
-FcConfigEnableHome (FcBool enable);
-
-FcPublic FcChar8 *
-FcConfigFilename (const FcChar8 *url);
-
-FcPublic FcConfig *
-FcConfigCreate (void);
-
-FcPublic void
-FcConfigDestroy (FcConfig *config);
-
-FcPublic FcBool
-FcConfigSetCurrent (FcConfig *config);
-
-FcPublic FcConfig *
-FcConfigGetCurrent (void);
-
-FcPublic FcBool
-FcConfigUptoDate (FcConfig *config);
-
-FcPublic FcBool
-FcConfigBuildFonts (FcConfig *config);
-
-FcPublic FcStrList *
-FcConfigGetFontDirs (FcConfig   *config);
-
-FcPublic FcStrList *
-FcConfigGetConfigDirs (FcConfig   *config);
-
-FcPublic FcStrList *
-FcConfigGetConfigFiles (FcConfig    *config);
-
-FcPublic FcChar8 *
-FcConfigGetCache (FcConfig  *config);
-
-FcPublic FcBlanks *
-FcConfigGetBlanks (FcConfig *config);
-
-FcPublic FcStrList *
-FcConfigGetCacheDirs (FcConfig  *config);
-
-FcPublic int
-FcConfigGetRescanInterval (FcConfig *config);
-
-FcPublic FcBool
-FcConfigSetRescanInterval (FcConfig *config, int rescanInterval);
-
-FcPublic FcFontSet *
-FcConfigGetFonts (FcConfig      *config,
-                  FcSetName     set);
-
-FcPublic FcBool
-FcConfigAppFontAddFile (FcConfig    *config,
-                        const FcChar8  *file);
-
-FcPublic FcBool
-FcConfigAppFontAddDir (FcConfig     *config,
-                       const FcChar8   *dir);
-
-FcPublic void
-FcConfigAppFontClear (FcConfig      *config);
-
-FcPublic FcBool
-FcConfigSubstituteWithPat (FcConfig     *config,
-                           FcPattern    *p,
-                           FcPattern    *p_pat,
-                           FcMatchKind  kind);
-
-FcPublic FcBool
-FcConfigSubstitute (FcConfig    *config,
-                    FcPattern   *p,
-                    FcMatchKind kind);
-
-/* fccharset.c */
-FcPublic FcCharSet*
-FcCharSetCreate (void);
-
-/* deprecated alias for FcCharSetCreate */
-FcPublic FcCharSet *
-FcCharSetNew (void);
-
-FcPublic void
-FcCharSetDestroy (FcCharSet *fcs);
-
-FcPublic FcBool
-FcCharSetAddChar (FcCharSet *fcs, FcChar32 ucs4);
-
-FcPublic FcCharSet*
-FcCharSetCopy (FcCharSet *src);
-
-FcPublic FcBool
-FcCharSetEqual (const FcCharSet *a, const FcCharSet *b);
-
-FcPublic FcCharSet*
-FcCharSetIntersect (const FcCharSet *a, const FcCharSet *b);
-
-FcPublic FcCharSet*
-FcCharSetUnion (const FcCharSet *a, const FcCharSet *b);
-
-FcPublic FcCharSet*
-FcCharSetSubtract (const FcCharSet *a, const FcCharSet *b);
-
-FcPublic FcBool
-FcCharSetHasChar (const FcCharSet *fcs, FcChar32 ucs4);
-
-FcPublic FcChar32
-FcCharSetCount (const FcCharSet *a);
-
-FcPublic FcChar32
-FcCharSetIntersectCount (const FcCharSet *a, const FcCharSet *b);
-
-FcPublic FcChar32
-FcCharSetSubtractCount (const FcCharSet *a, const FcCharSet *b);
-
-FcPublic FcBool
-FcCharSetIsSubset (const FcCharSet *a, const FcCharSet *b);
-
-#define FC_CHARSET_MAP_SIZE (256/32)
-#define FC_CHARSET_DONE ((FcChar32) -1)
-
-FcPublic FcChar32
-FcCharSetFirstPage (const FcCharSet *a,
-                    FcChar32        map[FC_CHARSET_MAP_SIZE],
-                    FcChar32        *next);
-
-FcPublic FcChar32
-FcCharSetNextPage (const FcCharSet  *a,
-                   FcChar32         map[FC_CHARSET_MAP_SIZE],
-                   FcChar32         *next);
-
-/*
- * old coverage API, rather hard to use correctly
- */
-
-FcPublic FcChar32
-FcCharSetCoverage (const FcCharSet *a, FcChar32 page, FcChar32 *result);
-
-/* fcdbg.c */
-FcPublic void
-FcValuePrint (const FcValue v);
-
-FcPublic void
-FcPatternPrint (const FcPattern *p);
-
-FcPublic void
-FcFontSetPrint (const FcFontSet *s);
-
-/* fcdefault.c */
-FcPublic void
-FcDefaultSubstitute (FcPattern *pattern);
-
-/* fcdir.c */
-FcPublic FcBool
-FcFileIsDir (const FcChar8 *file);
-
-FcPublic FcBool
-FcFileScan (FcFontSet       *set,
-            FcStrSet        *dirs,
-            FcFileCache     *cache,
-            FcBlanks        *blanks,
-            const FcChar8   *file,
-            FcBool          force);
-
-FcPublic FcBool
-FcDirScan (FcFontSet        *set,
-           FcStrSet         *dirs,
-           FcFileCache      *cache,
-           FcBlanks         *blanks,
-           const FcChar8    *dir,
-           FcBool           force);
-
-FcPublic FcBool
-FcDirSave (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir);
-
-FcPublic FcCache *
-FcDirCacheLoad (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file);
-
-FcPublic FcCache *
-FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config);
-
-FcPublic FcCache *
-FcDirCacheLoadFile (const FcChar8 *cache_file, struct stat *file_stat);
-
-FcPublic void
-FcDirCacheUnload (FcCache *cache);
-
-/* fcfreetype.c */
-FcPublic FcPattern *
-FcFreeTypeQuery (const FcChar8 *file, int id, FcBlanks *blanks, int *count);
-
-/* fcfs.c */
-
-FcPublic FcFontSet *
-FcFontSetCreate (void);
-
-FcPublic void
-FcFontSetDestroy (FcFontSet *s);
-
-FcPublic FcBool
-FcFontSetAdd (FcFontSet *s, FcPattern *font);
-
-/* fcinit.c */
-FcPublic FcConfig *
-FcInitLoadConfig (void);
-
-FcPublic FcConfig *
-FcInitLoadConfigAndFonts (void);
-
-FcPublic FcBool
-FcInit (void);
-
-FcPublic void
-FcFini (void);
-
-FcPublic int
-FcGetVersion (void);
-
-FcPublic FcBool
-FcInitReinitialize (void);
-
-FcPublic FcBool
-FcInitBringUptoDate (void);
-
-/* fclang.c */
-FcPublic FcStrSet *
-FcGetLangs (void);
-
-FcPublic const FcCharSet *
-FcLangGetCharSet (const FcChar8 *lang);
-
-FcPublic FcLangSet*
-FcLangSetCreate (void);
-
-FcPublic void
-FcLangSetDestroy (FcLangSet *ls);
-
-FcPublic FcLangSet*
-FcLangSetCopy (const FcLangSet *ls);
-
-FcPublic FcBool
-FcLangSetAdd (FcLangSet *ls, const FcChar8 *lang);
-
-FcPublic FcLangResult
-FcLangSetHasLang (const FcLangSet *ls, const FcChar8 *lang);
-
-FcPublic FcLangResult
-FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb);
-
-FcPublic FcBool
-FcLangSetContains (const FcLangSet *lsa, const FcLangSet *lsb);
-
-FcPublic FcBool
-FcLangSetEqual (const FcLangSet *lsa, const FcLangSet *lsb);
-
-FcPublic FcChar32
-FcLangSetHash (const FcLangSet *ls);
-
-/* fclist.c */
-FcPublic FcObjectSet *
-FcObjectSetCreate (void);
-
-FcPublic FcBool
-FcObjectSetAdd (FcObjectSet *os, const char *object);
-
-FcPublic void
-FcObjectSetDestroy (FcObjectSet *os);
-
-FcPublic FcObjectSet *
-FcObjectSetVaBuild (const char *first, va_list va);
-
-FcPublic FcObjectSet *
-FcObjectSetBuild (const char *first, ...) FC_ATTRIBUTE_SENTINEL(0);
-
-FcPublic FcFontSet *
-FcFontSetList (FcConfig     *config,
-               FcFontSet    **sets,
-               int          nsets,
-               FcPattern    *p,
-               FcObjectSet  *os);
-
-FcPublic FcFontSet *
-FcFontList (FcConfig    *config,
-            FcPattern   *p,
-            FcObjectSet *os);
-
-/* fcatomic.c */
-
-FcPublic FcAtomic *
-FcAtomicCreate (const FcChar8   *file);
-
-FcPublic FcBool
-FcAtomicLock (FcAtomic *atomic);
-
-FcPublic FcChar8 *
-FcAtomicNewFile (FcAtomic *atomic);
-
-FcPublic FcChar8 *
-FcAtomicOrigFile (FcAtomic *atomic);
-
-FcPublic FcBool
-FcAtomicReplaceOrig (FcAtomic *atomic);
-
-FcPublic void
-FcAtomicDeleteNew (FcAtomic *atomic);
-
-FcPublic void
-FcAtomicUnlock (FcAtomic *atomic);
-
-FcPublic void
-FcAtomicDestroy (FcAtomic *atomic);
-
-/* fcmatch.c */
-FcPublic FcPattern *
-FcFontSetMatch (FcConfig    *config,
-                FcFontSet   **sets,
-                int         nsets,
-                FcPattern   *p,
-                FcResult    *result);
-
-FcPublic FcPattern *
-FcFontMatch (FcConfig   *config,
-             FcPattern  *p,
-             FcResult   *result);
-
-FcPublic FcPattern *
-FcFontRenderPrepare (FcConfig       *config,
-                     FcPattern      *pat,
-                     FcPattern      *font);
-
-FcPublic FcFontSet *
-FcFontSetSort (FcConfig     *config,
-               FcFontSet    **sets,
-               int          nsets,
-               FcPattern    *p,
-               FcBool       trim,
-               FcCharSet    **csp,
-               FcResult     *result);
-
-FcPublic FcFontSet *
-FcFontSort (FcConfig     *config,
-            FcPattern    *p,
-            FcBool       trim,
-            FcCharSet    **csp,
-            FcResult     *result);
-
-FcPublic void
-FcFontSetSortDestroy (FcFontSet *fs);
-
-/* fcmatrix.c */
-FcPublic FcMatrix *
-FcMatrixCopy (const FcMatrix *mat);
-
-FcPublic FcBool
-FcMatrixEqual (const FcMatrix *mat1, const FcMatrix *mat2);
-
-FcPublic void
-FcMatrixMultiply (FcMatrix *result, const FcMatrix *a, const FcMatrix *b);
-
-FcPublic void
-FcMatrixRotate (FcMatrix *m, double c, double s);
-
-FcPublic void
-FcMatrixScale (FcMatrix *m, double sx, double sy);
-
-FcPublic void
-FcMatrixShear (FcMatrix *m, double sh, double sv);
-
-/* fcname.c */
-
-FcPublic FcBool
-FcNameRegisterObjectTypes (const FcObjectType *types, int ntype);
-
-FcPublic FcBool
-FcNameUnregisterObjectTypes (const FcObjectType *types, int ntype);
-
-FcPublic const FcObjectType *
-FcNameGetObjectType (const char *object);
-
-FcPublic FcBool
-FcNameRegisterConstants (const FcConstant *consts, int nconsts);
-
-FcPublic FcBool
-FcNameUnregisterConstants (const FcConstant *consts, int nconsts);
-
-FcPublic const FcConstant *
-FcNameGetConstant (FcChar8 *string);
-
-FcPublic FcBool
-FcNameConstant (FcChar8 *string, int *result);
-
-FcPublic FcPattern *
-FcNameParse (const FcChar8 *name);
-
-FcPublic FcChar8 *
-FcNameUnparse (FcPattern *pat);
-
-/* fcpat.c */
-FcPublic FcPattern *
-FcPatternCreate (void);
-
-FcPublic FcPattern *
-FcPatternDuplicate (const FcPattern *p);
-
-FcPublic void
-FcPatternReference (FcPattern *p);
-
-FcPublic void
-FcValueDestroy (FcValue v);
-
-FcPublic FcBool
-FcValueEqual (FcValue va, FcValue vb);
-
-FcPublic FcValue
-FcValueSave (FcValue v);
-
-FcPublic void
-FcPatternDestroy (FcPattern *p);
-
-FcPublic FcBool
-FcPatternEqual (const FcPattern *pa, const FcPattern *pb);
-
-FcPublic FcBool
-FcPatternEqualSubset (const FcPattern *pa, const FcPattern *pb, const FcObjectSet *os);
-
-FcPublic FcChar32
-FcPatternHash (const FcPattern *p);
-
-FcPublic FcBool
-FcPatternAdd (FcPattern *p, const char *object, FcValue value, FcBool append);
-
-FcPublic FcBool
-FcPatternAddWeak (FcPattern *p, const char *object, FcValue value, FcBool append);
-
-FcPublic FcResult
-FcPatternGet (const FcPattern *p, const char *object, int id, FcValue *v);
-
-FcPublic FcBool
-FcPatternDel (FcPattern *p, const char *object);
-
-FcPublic FcBool
-FcPatternRemove (FcPattern *p, const char *object, int id);
-
-FcPublic FcBool
-FcPatternAddInteger (FcPattern *p, const char *object, int i);
-
-FcPublic FcBool
-FcPatternAddDouble (FcPattern *p, const char *object, double d);
-
-FcPublic FcBool
-FcPatternAddString (FcPattern *p, const char *object, const FcChar8 *s);
-
-FcPublic FcBool
-FcPatternAddMatrix (FcPattern *p, const char *object, const FcMatrix *s);
-
-FcPublic FcBool
-FcPatternAddCharSet (FcPattern *p, const char *object, const FcCharSet *c);
-
-FcPublic FcBool
-FcPatternAddBool (FcPattern *p, const char *object, FcBool b);
-
-FcPublic FcBool
-FcPatternAddLangSet (FcPattern *p, const char *object, const FcLangSet *ls);
-
-FcPublic FcResult
-FcPatternGetInteger (const FcPattern *p, const char *object, int n, int *i);
-
-FcPublic FcResult
-FcPatternGetDouble (const FcPattern *p, const char *object, int n, double *d);
-
-FcPublic FcResult
-FcPatternGetString (const FcPattern *p, const char *object, int n, FcChar8 ** s);
-
-FcPublic FcResult
-FcPatternGetMatrix (const FcPattern *p, const char *object, int n, FcMatrix **s);
-
-FcPublic FcResult
-FcPatternGetCharSet (const FcPattern *p, const char *object, int n, FcCharSet **c);
-
-FcPublic FcResult
-FcPatternGetBool (const FcPattern *p, const char *object, int n, FcBool *b);
-
-FcPublic FcResult
-FcPatternGetLangSet (const FcPattern *p, const char *object, int n, FcLangSet **ls);
-
-FcPublic FcPattern *
-FcPatternVaBuild (FcPattern *orig, va_list va);
-
-FcPublic FcPattern *
-FcPatternBuild (FcPattern *orig, ...) FC_ATTRIBUTE_SENTINEL(0);
-
-/* fcstr.c */
-
-FcPublic FcChar8 *
-FcStrCopy (const FcChar8 *s);
-
-FcPublic FcChar8 *
-FcStrCopyFilename (const FcChar8 *s);
-
-FcPublic FcChar8 *
-FcStrPlus (const FcChar8 *s1, const FcChar8 *s2);
-
-FcPublic void
-FcStrFree (FcChar8 *s);
-
-/* These are ASCII only, suitable only for pattern element names */
-#define FcIsUpper(c)    ((0101 <= (c) && (c) <= 0132))
-#define FcIsLower(c)    ((0141 <= (c) && (c) <= 0172))
-#define FcToLower(c)    (FcIsUpper(c) ? (c) - 0101 + 0141 : (c))
-
-FcPublic FcChar8 *
-FcStrDowncase (const FcChar8 *s);
-
-FcPublic int
-FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
-
-FcPublic int
-FcStrCmp (const FcChar8 *s1, const FcChar8 *s2);
-
-FcPublic const FcChar8 *
-FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
-
-FcPublic const FcChar8 *
-FcStrStr (const FcChar8 *s1, const FcChar8 *s2);
-
-FcPublic int
-FcUtf8ToUcs4 (const FcChar8 *src_orig,
-              FcChar32      *dst,
-              int           len);
-
-FcPublic FcBool
-FcUtf8Len (const FcChar8    *string,
-           int              len,
-           int              *nchar,
-           int              *wchar);
-
-#define FC_UTF8_MAX_LEN 6
-
-FcPublic int
-FcUcs4ToUtf8 (FcChar32  ucs4,
-              FcChar8   dest[FC_UTF8_MAX_LEN]);
-
-FcPublic int
-FcUtf16ToUcs4 (const FcChar8    *src_orig,
-               FcEndian         endian,
-               FcChar32         *dst,
-               int              len);       /* in bytes */
-
-FcPublic FcBool
-FcUtf16Len (const FcChar8   *string,
-            FcEndian        endian,
-            int             len,            /* in bytes */
-            int             *nchar,
-            int             *wchar);
-
-FcPublic FcChar8 *
-FcStrDirname (const FcChar8 *file);
-
-FcPublic FcChar8 *
-FcStrBasename (const FcChar8 *file);
-
-FcPublic FcStrSet *
-FcStrSetCreate (void);
-
-FcPublic FcBool
-FcStrSetMember (FcStrSet *set, const FcChar8 *s);
-
-FcPublic FcBool
-FcStrSetEqual (FcStrSet *sa, FcStrSet *sb);
-
-FcPublic FcBool
-FcStrSetAdd (FcStrSet *set, const FcChar8 *s);
-
-FcPublic FcBool
-FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s);
-
-FcPublic FcBool
-FcStrSetDel (FcStrSet *set, const FcChar8 *s);
-
-FcPublic void
-FcStrSetDestroy (FcStrSet *set);
-
-FcPublic FcStrList *
-FcStrListCreate (FcStrSet *set);
-
-FcPublic FcChar8 *
-FcStrListNext (FcStrList *list);
-
-FcPublic void
-FcStrListDone (FcStrList *list);
-
-/* fcxml.c */
-FcPublic FcBool
-FcConfigParseAndLoad (FcConfig *config, const FcChar8 *file, FcBool complain);
-
-_FCFUNCPROTOEND
-
-#undef FC_ATTRIBUTE_SENTINEL
-
-
-#ifndef _FCINT_H_
-
-/*
- * Deprecated functions are placed here to help users fix their code without
- * digging through documentation
- */
-
-#define FcConfigGetRescanInverval   FcConfigGetRescanInverval_REPLACE_BY_FcConfigGetRescanInterval
-#define FcConfigSetRescanInverval   FcConfigSetRescanInverval_REPLACE_BY_FcConfigSetRescanInterval
-
-#endif
-
-#endif /* _FONTCONFIG_H_ */
--- a/src/solaris/native/sun/awt/fontpath.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/fontpath.c	Tue Aug 22 02:03:52 2017 +0100
@@ -60,21 +60,8 @@
 extern Display *awt_display;
 #endif /* !HEADLESS */
 
-#ifdef MACOSX
-
-//
-// XXXDARWIN: Hard-code the path to Apple's fontconfig, as it is
-// not included in the dyld search path by default, and 10.4
-// does not support -rpath.
-//
-// This ignores the build time setting of ALT_FREETYPE_LIB_PATH,
-// and should be replaced with -rpath/@rpath support on 10.5 or later,
-// or via support for a the FREETYPE_LIB_PATH define.
-#define FONTCONFIG_DLL_VERSIONED X11_PATH "/lib/" VERSIONED_JNI_LIB_NAME("fontconfig", "1")
-#define FONTCONFIG_DLL X11_PATH "/lib/" JNI_LIB_NAME("fontconfig")
-#else
-#define FONTCONFIG_DLL_VERSIONED VERSIONED_JNI_LIB_NAME("fontconfig", "1")
-#define FONTCONFIG_DLL JNI_LIB_NAME("fontconfig")
+#ifndef USE_SYSTEM_FONTCONFIG
+#include <fontconfig_fp.h>
 #endif
 
 #define MAXFDIRS 512    /* Max number of directories that contain fonts */
@@ -598,95 +585,16 @@
     return ret;
 }
 
-#include <dlfcn.h>
-
-#include "fontconfig.h"
-
+#include <fontconfig/fontconfig.h>
 
 static void* openFontConfig() {
-
-    char *homeEnv;
-    static char *homeEnvStr = "HOME="; /* must be static */
-    void* libfontconfig = NULL;
-#ifdef __solaris__
-#define SYSINFOBUFSZ 8
-    char sysinfobuf[SYSINFOBUFSZ];
-#endif
-
-    /* Private workaround to not use fontconfig library.
-     * May be useful during testing/debugging
-     */
-    char *useFC = getenv("USE_J2D_FONTCONFIG");
-    if (useFC != NULL && !strcmp(useFC, "no")) {
-        return NULL;
-    }
-
-#ifdef __solaris__
-    /* fontconfig is likely not properly configured on S8/S9 - skip it,
-     * although allow user to override this behaviour with an env. variable
-     * ie if USE_J2D_FONTCONFIG=yes then we skip this test.
-     * NB "4" is the length of a string which matches our patterns.
-     */
-    if (useFC == NULL || strcmp(useFC, "yes")) {
-        if (sysinfo(SI_RELEASE, sysinfobuf, SYSINFOBUFSZ) == 4) {
-            if ((!strcmp(sysinfobuf, "5.8") || !strcmp(sysinfobuf, "5.9"))) {
-                return NULL;
-            }
-        }
-    }
+#ifdef USE_SYSTEM_FONTCONFIG
+    return NULL;
+#else
+    return dlOpenFontConfig();
 #endif
-
-#if defined(AIX)
-    /* On AIX, fontconfig is not a standard package supported by IBM.
-     * insted it has to be installed from the "AIX Toolbox for Linux Applications"
-     * site http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/alpha.html
-     * and will be installed under /opt/freeware/lib/libfontconfig.a.
-     * Notice that the archive contains the real 32- and 64-bit shared libraries.
-     * We first try to load 'libfontconfig.so' from the default library path in the
-     * case the user has installed a private version of the library and if that
-     * doesn't succeed, we try the version from /opt/freeware/lib/libfontconfig.a
-     */
-    libfontconfig = dlopen("libfontconfig.so", RTLD_LOCAL|RTLD_LAZY);
-    if (libfontconfig == NULL) {
-        libfontconfig = dlopen("/opt/freeware/lib/libfontconfig.a(libfontconfig.so.1)", RTLD_MEMBER|RTLD_LOCAL|RTLD_LAZY);
-        if (libfontconfig == NULL) {
-            return NULL;
-        }
-    }
-#else
-    /* 64 bit sparc should pick up the right version from the lib path.
-     * New features may be added to libfontconfig, this is expected to
-     * be compatible with old features, but we may need to start
-     * distinguishing the library version, to know whether to expect
-     * certain symbols - and functionality - to be available.
-     * Also add explicit search for .so.1 in case .so symlink doesn't exist.
-     */
-    libfontconfig = dlopen(FONTCONFIG_DLL_VERSIONED, RTLD_LOCAL|RTLD_LAZY);
-    if (libfontconfig == NULL) {
-        libfontconfig = dlopen(FONTCONFIG_DLL, RTLD_LOCAL|RTLD_LAZY);
-        if (libfontconfig == NULL) {
-            return NULL;
-        }
-    }
-#endif
-
-    /* Version 1.0 of libfontconfig crashes if HOME isn't defined in
-     * the environment. This should generally never happen, but we can't
-     * control it, and can't control the version of fontconfig, so iff
-     * its not defined we set it to an empty value which is sufficient
-     * to prevent a crash. I considered unsetting it before exit, but
-     * it doesn't appear to work on Solaris, so I will leave it set.
-     */
-    homeEnv = getenv("HOME");
-    if (homeEnv == NULL) {
-        putenv(homeEnvStr);
-    }
-
-    return libfontconfig;
 }
 
-typedef void* (FcFiniFuncType)();
-
 static void closeFontConfig(void* libfontconfig, jboolean fcFini) {
 
   /* NB FcFini is not in (eg) the Solaris 10 version of fontconfig. Its not
@@ -698,83 +606,23 @@
    */
 #if 0
     if (fcFini) { /* release resources */
-        FcFiniFuncType FcFini = (FcFiniFuncType)dlsym(libfontconfig, "FcFini");
 
         if (FcFini != NULL) {
             (*FcFini)();
         }
     }
 #endif
-    dlclose(libfontconfig);
+
+#ifndef USE_SYSTEM_FONTCONFIG
+    dlCloseFontConfig (libfontconfig);
+#endif
 }
 
-typedef FcConfig* (*FcInitLoadConfigFuncType)();
-typedef FcPattern* (*FcPatternBuildFuncType)(FcPattern *orig, ...);
-typedef FcObjectSet* (*FcObjectSetFuncType)(const char *first, ...);
-typedef FcFontSet* (*FcFontListFuncType)(FcConfig *config,
-                                         FcPattern *p,
-                                         FcObjectSet *os);
-typedef FcResult (*FcPatternGetBoolFuncType)(const FcPattern *p,
-                                               const char *object,
-                                               int n,
-                                               FcBool *b);
-typedef FcResult (*FcPatternGetIntegerFuncType)(const FcPattern *p,
-                                                const char *object,
-                                                int n,
-                                                int *i);
-typedef FcResult (*FcPatternGetStringFuncType)(const FcPattern *p,
-                                               const char *object,
-                                               int n,
-                                               FcChar8 ** s);
-typedef FcChar8* (*FcStrDirnameFuncType)(const FcChar8 *file);
-typedef void (*FcPatternDestroyFuncType)(FcPattern *p);
-typedef void (*FcFontSetDestroyFuncType)(FcFontSet *s);
-typedef FcPattern* (*FcNameParseFuncType)(const FcChar8 *name);
-typedef FcBool (*FcPatternAddStringFuncType)(FcPattern *p,
-                                             const char *object,
-                                             const FcChar8 *s);
-typedef void (*FcDefaultSubstituteFuncType)(FcPattern *p);
-typedef FcBool (*FcConfigSubstituteFuncType)(FcConfig *config,
-                                             FcPattern *p,
-                                             FcMatchKind kind);
-typedef FcPattern* (*FcFontMatchFuncType)(FcConfig *config,
-                                          FcPattern *p,
-                                          FcResult *result);
-typedef FcFontSet* (*FcFontSetCreateFuncType)();
-typedef FcBool (*FcFontSetAddFuncType)(FcFontSet *s, FcPattern *font);
-
-typedef FcResult (*FcPatternGetCharSetFuncType)(FcPattern *p,
-                                                const char *object,
-                                                int n,
-                                                FcCharSet **c);
-typedef FcFontSet* (*FcFontSortFuncType)(FcConfig *config,
-                                         FcPattern *p,
-                                         FcBool trim,
-                                         FcCharSet **csp,
-                                         FcResult *result);
-typedef FcCharSet* (*FcCharSetUnionFuncType)(const FcCharSet *a,
-                                             const FcCharSet *b);
-typedef FcChar32 (*FcCharSetSubtractCountFuncType)(const FcCharSet *a,
-                                                   const FcCharSet *b);
-
-typedef int (*FcGetVersionFuncType)();
-
-typedef FcStrList* (*FcConfigGetCacheDirsFuncType)(FcConfig *config);
-typedef FcChar8* (*FcStrListNextFuncType)(FcStrList *list);
-typedef FcChar8* (*FcStrListDoneFuncType)(FcStrList *list);
 
 static char **getFontConfigLocations() {
 
     char **fontdirs;
     int numdirs = 0;
-    FcInitLoadConfigFuncType FcInitLoadConfig;
-    FcPatternBuildFuncType FcPatternBuild;
-    FcObjectSetFuncType FcObjectSetBuild;
-    FcFontListFuncType FcFontList;
-    FcPatternGetStringFuncType FcPatternGetString;
-    FcStrDirnameFuncType FcStrDirname;
-    FcPatternDestroyFuncType FcPatternDestroy;
-    FcFontSetDestroyFuncType FcFontSetDestroy;
 
     FcConfig *fontconfig;
     FcPattern *pattern;
@@ -787,36 +635,6 @@
 
     void* libfontconfig = openFontConfig();
 
-    if (libfontconfig == NULL) {
-        return NULL;
-    }
-
-    FcPatternBuild     =
-        (FcPatternBuildFuncType)dlsym(libfontconfig, "FcPatternBuild");
-    FcObjectSetBuild   =
-        (FcObjectSetFuncType)dlsym(libfontconfig, "FcObjectSetBuild");
-    FcFontList         =
-        (FcFontListFuncType)dlsym(libfontconfig, "FcFontList");
-    FcPatternGetString =
-        (FcPatternGetStringFuncType)dlsym(libfontconfig, "FcPatternGetString");
-    FcStrDirname       =
-        (FcStrDirnameFuncType)dlsym(libfontconfig, "FcStrDirname");
-    FcPatternDestroy   =
-        (FcPatternDestroyFuncType)dlsym(libfontconfig, "FcPatternDestroy");
-    FcFontSetDestroy   =
-        (FcFontSetDestroyFuncType)dlsym(libfontconfig, "FcFontSetDestroy");
-
-    if (FcPatternBuild     == NULL ||
-        FcObjectSetBuild   == NULL ||
-        FcPatternGetString == NULL ||
-        FcFontList         == NULL ||
-        FcStrDirname       == NULL ||
-        FcPatternDestroy   == NULL ||
-        FcFontSetDestroy   == NULL) { /* problem with the library: return. */
-        closeFontConfig(libfontconfig, JNI_FALSE);
-        return NULL;
-    }
-
     /* Make calls into the fontconfig library to build a search for
      * outline fonts, and to get the set of full file paths from the matches.
      * This set is returned from the call to FcFontList(..)
@@ -830,16 +648,16 @@
      * Finally we clean up, freeing allocated resources, and return the
      * array of unique directories.
      */
-    pattern = (*FcPatternBuild)(NULL, FC_OUTLINE, FcTypeBool, FcTrue, NULL);
-    objset = (*FcObjectSetBuild)(FC_FILE, NULL);
-    fontSet = (*FcFontList)(NULL, pattern, objset);
+    pattern = FcPatternBuild (NULL, FC_OUTLINE, FcTypeBool, FcTrue, NULL);
+    objset = FcObjectSetBuild (FC_FILE, NULL);
+    fontSet = FcFontList (NULL, pattern, objset);
     fontdirs = (char**)calloc(fontSet->nfont+1, sizeof(char*));
     for (f=0; f < fontSet->nfont; f++) {
         FcChar8 *file;
         FcChar8 *dir;
-        if ((*FcPatternGetString)(fontSet->fonts[f], FC_FILE, 0, &file) ==
+        if (FcPatternGetString (fontSet->fonts[f], FC_FILE, 0, &file) ==
                                   FcResultMatch) {
-            dir = (*FcStrDirname)(file);
+            dir = FcStrDirname (file);
             found = 0;
             for (i=0;i<numdirs; i++) {
                 if (strcmp(fontdirs[i], (char*)dir) == 0) {
@@ -856,8 +674,8 @@
     }
 
     /* Free memory and close the ".so" */
-    (*FcFontSetDestroy)(fontSet);
-    (*FcPatternDestroy)(pattern);
+    FcFontSetDestroy (fontSet);
+    FcPatternDestroy (pattern);
     closeFontConfig(libfontconfig, JNI_TRUE);
     return fontdirs;
 }
@@ -876,15 +694,6 @@
 Java_sun_font_FontConfigManager_getFontConfigAASettings
 (JNIEnv *env, jclass obj, jstring localeStr, jstring fcNameStr) {
 
-    FcNameParseFuncType FcNameParse;
-    FcPatternAddStringFuncType FcPatternAddString;
-    FcConfigSubstituteFuncType FcConfigSubstitute;
-    FcDefaultSubstituteFuncType  FcDefaultSubstitute;
-    FcFontMatchFuncType FcFontMatch;
-    FcPatternGetBoolFuncType FcPatternGetBool;
-    FcPatternGetIntegerFuncType FcPatternGetInteger;
-    FcPatternDestroyFuncType FcPatternDestroy;
-
     FcPattern *pattern, *matchPattern;
     FcResult result;
     FcBool antialias = FcFalse;
@@ -902,6 +711,7 @@
     }
     locale = (*env)->GetStringUTFChars(env, localeStr, 0);
 
+#ifndef USE_SYSTEM_FONTCONFIG
     if ((libfontconfig = openFontConfig()) == NULL) {
         (*env)->ReleaseStringUTFChars (env, fcNameStr, (const char*)fcName);
         if (locale) {
@@ -909,57 +719,25 @@
         }
         return -1;
     }
-
-    FcNameParse = (FcNameParseFuncType)dlsym(libfontconfig, "FcNameParse");
-    FcPatternAddString =
-        (FcPatternAddStringFuncType)dlsym(libfontconfig, "FcPatternAddString");
-    FcConfigSubstitute =
-        (FcConfigSubstituteFuncType)dlsym(libfontconfig, "FcConfigSubstitute");
-    FcDefaultSubstitute = (FcDefaultSubstituteFuncType)
-        dlsym(libfontconfig, "FcDefaultSubstitute");
-    FcFontMatch = (FcFontMatchFuncType)dlsym(libfontconfig, "FcFontMatch");
-    FcPatternGetBool = (FcPatternGetBoolFuncType)
-        dlsym(libfontconfig, "FcPatternGetBool");
-    FcPatternGetInteger = (FcPatternGetIntegerFuncType)
-        dlsym(libfontconfig, "FcPatternGetInteger");
-    FcPatternDestroy =
-        (FcPatternDestroyFuncType)dlsym(libfontconfig, "FcPatternDestroy");
+#endif
 
-    if (FcNameParse          == NULL ||
-        FcPatternAddString   == NULL ||
-        FcConfigSubstitute   == NULL ||
-        FcDefaultSubstitute  == NULL ||
-        FcFontMatch          == NULL ||
-        FcPatternGetBool     == NULL ||
-        FcPatternGetInteger  == NULL ||
-        FcPatternDestroy     == NULL) { /* problem with the library: return. */
-
-        (*env)->ReleaseStringUTFChars (env, fcNameStr, (const char*)fcName);
-        if (locale) {
-            (*env)->ReleaseStringUTFChars (env, localeStr,(const char*)locale);
-        }
-        closeFontConfig(libfontconfig, JNI_FALSE);
-        return -1;
+    pattern = FcNameParse((FcChar8 *)fcName);
+    if (locale != NULL) {
+        FcPatternAddString (pattern, FC_LANG, (unsigned char*)locale);
     }
-
-
-    pattern = (*FcNameParse)((FcChar8 *)fcName);
-    if (locale != NULL) {
-        (*FcPatternAddString)(pattern, FC_LANG, (unsigned char*)locale);
-    }
-    (*FcConfigSubstitute)(NULL, pattern, FcMatchPattern);
-    (*FcDefaultSubstitute)(pattern);
-    matchPattern = (*FcFontMatch)(NULL, pattern, &result);
+    FcConfigSubstitute (NULL, pattern, FcMatchPattern);
+    FcDefaultSubstitute (pattern);
+    matchPattern = FcFontMatch (NULL, pattern, &result);
     /* Perhaps should call FcFontRenderPrepare() here as some pattern
      * elements might change as a result of that call, but I'm not seeing
      * any difference in testing.
      */
     if (matchPattern) {
-        (*FcPatternGetBool)(matchPattern, FC_ANTIALIAS, 0, &antialias);
-        (*FcPatternGetInteger)(matchPattern, FC_RGBA, 0, &rgba);
-        (*FcPatternDestroy)(matchPattern);
+        FcPatternGetBool (matchPattern, FC_ANTIALIAS, 0, &antialias);
+        FcPatternGetInteger (matchPattern, FC_RGBA, 0, &rgba);
+        FcPatternDestroy (matchPattern);
     }
-    (*FcPatternDestroy)(pattern);
+    FcPatternDestroy (pattern);
 
     (*env)->ReleaseStringUTFChars (env, fcNameStr, (const char*)fcName);
     if (locale) {
@@ -986,21 +764,16 @@
 Java_sun_font_FontConfigManager_getFontConfigVersion
     (JNIEnv *env, jclass obj) {
 
-    void* libfontconfig;
-    FcGetVersionFuncType FcGetVersion;
+    void* libfontconfig = NULL;
     int version = 0;
 
+#ifndef USE_SYSTEM_FONTCONFIG
     if ((libfontconfig = openFontConfig()) == NULL) {
         return 0;
     }
-
-    FcGetVersion = (FcGetVersionFuncType)dlsym(libfontconfig, "FcGetVersion");
+#endif
 
-    if (FcGetVersion == NULL) {
-        closeFontConfig(libfontconfig, JNI_FALSE);
-        return 0;
-    }
-    version = (*FcGetVersion)();
+    version = FcGetVersion ();
     closeFontConfig(libfontconfig, JNI_FALSE);
 
     return version;
@@ -1012,23 +785,6 @@
 (JNIEnv *env, jclass obj, jstring localeStr, jobject fcInfoObj,
  jobjectArray fcCompFontArray,  jboolean includeFallbacks) {
 
-    FcNameParseFuncType FcNameParse;
-    FcPatternAddStringFuncType FcPatternAddString;
-    FcConfigSubstituteFuncType FcConfigSubstitute;
-    FcDefaultSubstituteFuncType  FcDefaultSubstitute;
-    FcFontMatchFuncType FcFontMatch;
-    FcPatternGetStringFuncType FcPatternGetString;
-    FcPatternDestroyFuncType FcPatternDestroy;
-    FcPatternGetCharSetFuncType FcPatternGetCharSet;
-    FcFontSortFuncType FcFontSort;
-    FcFontSetDestroyFuncType FcFontSetDestroy;
-    FcCharSetUnionFuncType FcCharSetUnion;
-    FcCharSetSubtractCountFuncType FcCharSetSubtractCount;
-    FcGetVersionFuncType FcGetVersion;
-    FcConfigGetCacheDirsFuncType FcConfigGetCacheDirs;
-    FcStrListNextFuncType FcStrListNext;
-    FcStrListDoneFuncType FcStrListDone;
-
     int i, arrlen;
     jobject fcCompFontObj;
     jstring fcNameStr, jstr;
@@ -1086,73 +842,18 @@
         return;
     }
 
+#ifndef USE_SYSTEM_FONTCONFIG
     if ((libfontconfig = openFontConfig()) == NULL) {
         return;
     }
-
-    FcNameParse = (FcNameParseFuncType)dlsym(libfontconfig, "FcNameParse");
-    FcPatternAddString =
-        (FcPatternAddStringFuncType)dlsym(libfontconfig, "FcPatternAddString");
-    FcConfigSubstitute =
-        (FcConfigSubstituteFuncType)dlsym(libfontconfig, "FcConfigSubstitute");
-    FcDefaultSubstitute = (FcDefaultSubstituteFuncType)
-        dlsym(libfontconfig, "FcDefaultSubstitute");
-    FcFontMatch = (FcFontMatchFuncType)dlsym(libfontconfig, "FcFontMatch");
-    FcPatternGetString =
-        (FcPatternGetStringFuncType)dlsym(libfontconfig, "FcPatternGetString");
-    FcPatternDestroy =
-        (FcPatternDestroyFuncType)dlsym(libfontconfig, "FcPatternDestroy");
-    FcPatternGetCharSet =
-        (FcPatternGetCharSetFuncType)dlsym(libfontconfig,
-                                           "FcPatternGetCharSet");
-    FcFontSort =
-        (FcFontSortFuncType)dlsym(libfontconfig, "FcFontSort");
-    FcFontSetDestroy =
-        (FcFontSetDestroyFuncType)dlsym(libfontconfig, "FcFontSetDestroy");
-    FcCharSetUnion =
-        (FcCharSetUnionFuncType)dlsym(libfontconfig, "FcCharSetUnion");
-    FcCharSetSubtractCount =
-        (FcCharSetSubtractCountFuncType)dlsym(libfontconfig,
-                                              "FcCharSetSubtractCount");
-    FcGetVersion = (FcGetVersionFuncType)dlsym(libfontconfig, "FcGetVersion");
+#endif
 
-    if (FcNameParse          == NULL ||
-        FcPatternAddString   == NULL ||
-        FcConfigSubstitute   == NULL ||
-        FcDefaultSubstitute  == NULL ||
-        FcFontMatch          == NULL ||
-        FcPatternGetString   == NULL ||
-        FcPatternDestroy     == NULL ||
-        FcPatternGetCharSet  == NULL ||
-        FcFontSetDestroy     == NULL ||
-        FcCharSetUnion       == NULL ||
-        FcGetVersion         == NULL ||
-        FcCharSetSubtractCount == NULL) {/* problem with the library: return.*/
-        closeFontConfig(libfontconfig, JNI_FALSE);
-        return;
-    }
-
-    (*env)->SetIntField(env, fcInfoObj, fcVersionID, (*FcGetVersion)());
+    (*env)->SetIntField(env, fcInfoObj, fcVersionID, FcGetVersion ());
 
-    /* Optionally get the cache dir locations. This isn't
-     * available until v 2.4.x, but this is OK since on those later versions
-     * we can check the time stamps on the cache dirs to see if we
-     * are out of date. There are a couple of assumptions here. First
-     * that the time stamp on the directory changes when the contents are
-     * updated. Secondly that the locations don't change. The latter is
-     * most likely if a new version of fontconfig is installed, but we also
-     * invalidate the cache if we detect that. Arguably even that is "rare",
-     * and most likely is tied to an OS upgrade which gets a new file anyway.
-     */
-    FcConfigGetCacheDirs =
-        (FcConfigGetCacheDirsFuncType)dlsym(libfontconfig,
-                                            "FcConfigGetCacheDirs");
-    FcStrListNext =
-        (FcStrListNextFuncType)dlsym(libfontconfig, "FcStrListNext");
-    FcStrListDone =
-        (FcStrListDoneFuncType)dlsym(libfontconfig, "FcStrListDone");
+#ifndef USE_SYSTEM_FONTCONFIG
     if (FcStrListNext != NULL && FcStrListDone != NULL &&
         FcConfigGetCacheDirs != NULL) {
+#endif
 
         FcStrList* cacheDirs;
         FcChar8* cacheDir;
@@ -1161,15 +862,18 @@
             (*env)->GetObjectField(env, fcInfoObj, fcCacheDirsID);
         int max = (*env)->GetArrayLength(env, cacheDirArray);
 
-        cacheDirs = (*FcConfigGetCacheDirs)(NULL);
+        cacheDirs = FcConfigGetCacheDirs (NULL);
         if (cacheDirs != NULL) {
-            while ((cnt < max) && (cacheDir = (*FcStrListNext)(cacheDirs))) {
+            while ((cnt < max) && (cacheDir = FcStrListNext (cacheDirs))) {
                 jstr = (*env)->NewStringUTF(env, (const char*)cacheDir);
                 (*env)->SetObjectArrayElement(env, cacheDirArray, cnt++, jstr);
             }
-            (*FcStrListDone)(cacheDirs);
+            FcStrListDone (cacheDirs);
         }
+
+#ifndef USE_SYSTEM_FONTCONFIG
     }
+#endif
 
     locale = (*env)->GetStringUTFChars(env, localeStr, 0);
 
@@ -1188,7 +892,7 @@
         if (fcName == NULL) {
             continue;
         }
-        pattern = (*FcNameParse)((FcChar8 *)fcName);
+        pattern = FcNameParse((FcChar8 *)fcName);
         (*env)->ReleaseStringUTFChars(env, fcNameStr, (const char*)fcName);
         if (pattern == NULL) {
             closeFontConfig(libfontconfig, JNI_FALSE);
@@ -1201,13 +905,13 @@
          * care of it.
          */
         if (locale != NULL) {
-            (*FcPatternAddString)(pattern, FC_LANG, (unsigned char*)locale);
+            FcPatternAddString (pattern, FC_LANG, (unsigned char*)locale);
         }
-        (*FcConfigSubstitute)(NULL, pattern, FcMatchPattern);
-        (*FcDefaultSubstitute)(pattern);
-        fontset = (*FcFontSort)(NULL, pattern, FcTrue, NULL, &result);
+        FcConfigSubstitute (NULL, pattern, FcMatchPattern);
+        FcDefaultSubstitute (pattern);
+        fontset = FcFontSort (NULL, pattern, FcTrue, NULL, &result);
         if (fontset == NULL) {
-            (*FcPatternDestroy)(pattern);
+            FcPatternDestroy(pattern);
             closeFontConfig(libfontconfig, JNI_FALSE);
             return;
         }
@@ -1237,8 +941,8 @@
             if (file != NULL) {
                 free(file);
             }
-            (*FcPatternDestroy)(pattern);
-            (*FcFontSetDestroy)(fontset);
+            FcPatternDestroy(pattern);
+            FcFontSetDestroy(fontset);
             closeFontConfig(libfontconfig, JNI_FALSE);
             return;
         }
@@ -1257,7 +961,7 @@
             FcCharSet *unionCharset = NULL, *charset;
 
             fontformat = NULL;
-            (*FcPatternGetString)(fontPattern, FC_FONTFORMAT, 0, &fontformat);
+            FcPatternGetString(fontPattern, FC_FONTFORMAT, 0, &fontformat);
             /* We only want TrueType fonts but some Linuxes still depend
              * on Type 1 fonts for some Locale support, so we'll allow
              * them there.
@@ -1270,15 +974,15 @@
              ) {
                 continue;
             }
-            result = (*FcPatternGetCharSet)(fontPattern,
+            result = FcPatternGetCharSet (fontPattern,
                                             FC_CHARSET, 0, &charset);
             if (result != FcResultMatch) {
                 free(family);
                 free(family);
                 free(styleStr);
                 free(file);
-                (*FcPatternDestroy)(pattern);
-                (*FcFontSetDestroy)(fontset);
+                FcPatternDestroy(pattern);
+                FcFontSetDestroy(fontset);
                 closeFontConfig(libfontconfig, JNI_FALSE);
                 return;
             }
@@ -1294,7 +998,7 @@
             if (unionCharset == NULL) {
                 unionCharset = charset;
             } else {
-                if ((*FcCharSetSubtractCount)(charset, unionCharset)
+                if (FcCharSetSubtractCount (charset, unionCharset)
                     > minGlyphs) {
                     unionCharset = (* FcCharSetUnion)(unionCharset, charset);
                 } else {
@@ -1303,10 +1007,10 @@
             }
 
             fontCount++; // found a font we will use.
-            (*FcPatternGetString)(fontPattern, FC_FILE, 0, &file[j]);
-            (*FcPatternGetString)(fontPattern, FC_FAMILY, 0, &family[j]);
-            (*FcPatternGetString)(fontPattern, FC_STYLE, 0, &styleStr[j]);
-            (*FcPatternGetString)(fontPattern, FC_FULLNAME, 0, &fullname[j]);
+            FcPatternGetString (fontPattern, FC_FILE, 0, &file[j]);
+            FcPatternGetString (fontPattern, FC_FAMILY, 0, &family[j]);
+            FcPatternGetString (fontPattern, FC_STYLE, 0, &styleStr[j]);
+            FcPatternGetString (fontPattern, FC_FULLNAME, 0, &fullname[j]);
             if (!includeFallbacks) {
                 break;
             }
@@ -1328,8 +1032,8 @@
                 free(fullname);
                 free(styleStr);
                 free(file);
-                (*FcPatternDestroy)(pattern);
-                (*FcFontSetDestroy)(fontset);
+                FcPatternDestroy(pattern);
+                FcFontSetDestroy(fontset);
                 closeFontConfig(libfontconfig, JNI_FALSE);
                 return;
             }
@@ -1371,8 +1075,8 @@
                 }
             }
         }
-        (*FcFontSetDestroy)(fontset);
-        (*FcPatternDestroy)(pattern);
+        FcFontSetDestroy (fontset);
+        FcPatternDestroy (pattern);
         free(family);
         free(styleStr);
         free(fullname);
--- a/src/solaris/native/sun/awt/gtk2_interface.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/gtk2_interface.c	Tue Aug 22 02:03:52 2017 +0100
@@ -22,8 +22,6 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-#include <dlfcn.h>
-#include <setjmp.h>
 #include <X11/Xlib.h>
 #include <limits.h>
 #include <stdio.h>
@@ -33,43 +31,10 @@
 #include "jvm_md.h"
 #include "sizecalc.h"
 
-#define GTK2_LIB_VERSIONED VERSIONED_JNI_LIB_NAME("gtk-x11-2.0", "0")
-#define GTK2_LIB JNI_LIB_NAME("gtk-x11-2.0")
-#define GTHREAD_LIB_VERSIONED VERSIONED_JNI_LIB_NAME("gthread-2.0", "0")
-#define GTHREAD_LIB JNI_LIB_NAME("gthread-2.0")
-
-#define G_TYPE_INVALID                  G_TYPE_MAKE_FUNDAMENTAL (0)
-#define G_TYPE_NONE                     G_TYPE_MAKE_FUNDAMENTAL (1)
-#define G_TYPE_INTERFACE                G_TYPE_MAKE_FUNDAMENTAL (2)
-#define G_TYPE_CHAR                     G_TYPE_MAKE_FUNDAMENTAL (3)
-#define G_TYPE_UCHAR                    G_TYPE_MAKE_FUNDAMENTAL (4)
-#define G_TYPE_BOOLEAN                  G_TYPE_MAKE_FUNDAMENTAL (5)
-#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
-#define G_TYPE_UINT                     G_TYPE_MAKE_FUNDAMENTAL (7)
-#define G_TYPE_LONG                     G_TYPE_MAKE_FUNDAMENTAL (8)
-#define G_TYPE_ULONG                    G_TYPE_MAKE_FUNDAMENTAL (9)
-#define G_TYPE_INT64                    G_TYPE_MAKE_FUNDAMENTAL (10)
-#define G_TYPE_UINT64                   G_TYPE_MAKE_FUNDAMENTAL (11)
-#define G_TYPE_ENUM                     G_TYPE_MAKE_FUNDAMENTAL (12)
-#define G_TYPE_FLAGS                    G_TYPE_MAKE_FUNDAMENTAL (13)
-#define G_TYPE_FLOAT                    G_TYPE_MAKE_FUNDAMENTAL (14)
-#define G_TYPE_DOUBLE                   G_TYPE_MAKE_FUNDAMENTAL (15)
-#define G_TYPE_STRING                   G_TYPE_MAKE_FUNDAMENTAL (16)
-#define G_TYPE_POINTER                  G_TYPE_MAKE_FUNDAMENTAL (17)
-#define G_TYPE_BOXED                    G_TYPE_MAKE_FUNDAMENTAL (18)
-#define G_TYPE_PARAM                    G_TYPE_MAKE_FUNDAMENTAL (19)
-#define G_TYPE_OBJECT                   G_TYPE_MAKE_FUNDAMENTAL (20)
-
-#define GTK_TYPE_BORDER                 ((*fp_gtk_border_get_type)())
-
-#define G_TYPE_FUNDAMENTAL_SHIFT        (2)
-#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
 #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
 
 #define CONV_BUFFER_SIZE 128
 
-#define NO_SYMBOL_EXCEPTION 1
-
 /* SynthConstants */
 const gint ENABLED    = 1 << 0;
 const gint MOUSE_OVER = 1 << 1;
@@ -79,10 +44,7 @@
 const gint SELECTED   = 1 << 9;
 const gint DEFAULT    = 1 << 10;
 
-static void *gtk2_libhandle = NULL;
-static void *gthread_libhandle = NULL;
 static gboolean flag_g_thread_get_initialized = FALSE;
-static jmp_buf j;
 
 /* Widgets */
 static GtkWidget *gtk2_widget = NULL;
@@ -100,8 +62,8 @@
 /* Static buffer for conversion from java.lang.String to UTF-8 */
 static char convertionBuffer[CONV_BUFFER_SIZE];
 
-static gboolean new_combo = TRUE;
 const char ENV_PREFIX[] = "GTK_MODULES=";
+static gboolean initialised = FALSE;
 
 /*******************/
 enum GtkWidgetType
@@ -151,214 +113,8 @@
     _GTK_WIDGET_TYPE_SIZE
 };
 
-
 static GtkWidget *gtk2_widgets[_GTK_WIDGET_TYPE_SIZE];
 
-/*************************
- * Glib function pointers
- *************************/
-
-static gboolean (*fp_g_main_context_iteration)(GMainContext *context,
-                                             gboolean may_block);
-
-static GValue*      (*fp_g_value_init)(GValue *value, GType g_type);
-static gboolean     (*fp_g_type_is_a)(GType type, GType is_a_type);
-static gboolean     (*fp_g_value_get_boolean)(const GValue *value);
-static gchar        (*fp_g_value_get_char)(const GValue *value);
-static guchar       (*fp_g_value_get_uchar)(const GValue *value);
-static gint         (*fp_g_value_get_int)(const GValue *value);
-static guint        (*fp_g_value_get_uint)(const GValue *value);
-static glong        (*fp_g_value_get_long)(const GValue *value);
-static gulong       (*fp_g_value_get_ulong)(const GValue *value);
-static gint64       (*fp_g_value_get_int64)(const GValue *value);
-static guint64      (*fp_g_value_get_uint64)(const GValue *value);
-static gfloat       (*fp_g_value_get_float)(const GValue *value);
-static gdouble      (*fp_g_value_get_double)(const GValue *value);
-static const gchar* (*fp_g_value_get_string)(const GValue *value);
-static gint         (*fp_g_value_get_enum)(const GValue *value);
-static guint        (*fp_g_value_get_flags)(const GValue *value);
-static GParamSpec*  (*fp_g_value_get_param)(const GValue *value);
-static gpointer*    (*fp_g_value_get_boxed)(const GValue *value);
-static gpointer*    (*fp_g_value_get_pointer)(const GValue *value);
-static GObject*     (*fp_g_value_get_object)(const GValue *value);
-static GParamSpec*  (*fp_g_param_spec_int)(const gchar *name,
-        const gchar *nick, const gchar *blurb,
-        gint minimum, gint maximum, gint default_value,
-        GParamFlags flags);
-static void         (*fp_g_object_get)(gpointer object,
-                                       const gchar* fpn, ...);
-static void         (*fp_g_object_set)(gpointer object,
-                                       const gchar *first_property_name,
-                                       ...);
-/************************
- * GDK function pointers
- ************************/
-static GdkPixmap *(*fp_gdk_pixmap_new)(GdkDrawable *drawable,
-        gint width, gint height, gint depth);
-static GdkGC *(*fp_gdk_gc_new)(GdkDrawable*);
-static void (*fp_gdk_rgb_gc_set_foreground)(GdkGC*, guint32);
-static void (*fp_gdk_draw_rectangle)(GdkDrawable*, GdkGC*, gboolean,
-        gint, gint, gint, gint);
-static GdkPixbuf *(*fp_gdk_pixbuf_new)(GdkColorspace colorspace,
-        gboolean has_alpha, int bits_per_sample, int width, int height);
-static GdkPixbuf *(*fp_gdk_pixbuf_get_from_drawable)(GdkPixbuf *dest,
-        GdkDrawable *src, GdkColormap *cmap, int src_x, int src_y,
-        int dest_x, int dest_y, int width, int height);
-static void (*fp_gdk_drawable_get_size)(GdkDrawable *drawable,
-        gint* width, gint* height);
-
-/************************
- * Gtk function pointers
- ************************/
-static gboolean (*fp_gtk_init_check)(int* argc, char** argv);
-
-/* Painting */
-static void (*fp_gtk_paint_hline)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GdkRectangle* area, GtkWidget* widget,
-        const gchar* detail, gint x1, gint x2, gint y);
-static void (*fp_gtk_paint_vline)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GdkRectangle* area, GtkWidget* widget,
-        const gchar* detail, gint y1, gint y2, gint x);
-static void (*fp_gtk_paint_shadow)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height);
-static void (*fp_gtk_paint_arrow)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        GtkArrowType arrow_type, gboolean fill, gint x, gint y,
-        gint width, gint height);
-static void (*fp_gtk_paint_diamond)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height);
-static void (*fp_gtk_paint_box)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height);
-static void (*fp_gtk_paint_flat_box)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height);
-static void (*fp_gtk_paint_check)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height);
-static void (*fp_gtk_paint_option)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height);
-static void (*fp_gtk_paint_box_gap)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height,
-        GtkPositionType gap_side, gint gap_x, gint gap_width);
-static void (*fp_gtk_paint_extension)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height, GtkPositionType gap_side);
-static void (*fp_gtk_paint_focus)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GdkRectangle* area, GtkWidget* widget,
-        const gchar* detail, gint x, gint y, gint width, gint height);
-static void (*fp_gtk_paint_slider)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height, GtkOrientation orientation);
-static void (*fp_gtk_paint_handle)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GtkShadowType shadow_type,
-        GdkRectangle* area, GtkWidget* widget, const gchar* detail,
-        gint x, gint y, gint width, gint height, GtkOrientation orientation);
-static void (*fp_gtk_paint_expander)(GtkStyle* style, GdkWindow* window,
-        GtkStateType state_type, GdkRectangle* area, GtkWidget* widget,
-        const gchar* detail, gint x, gint y, GtkExpanderStyle expander_style);
-static void (*fp_gtk_style_apply_default_background)(GtkStyle* style,
-        GdkWindow* window, gboolean set_bg, GtkStateType state_type,
-        GdkRectangle* area, gint x, gint y, gint width, gint height);
-
-/* Widget creation */
-static GtkWidget* (*fp_gtk_arrow_new)(GtkArrowType arrow_type,
-                                      GtkShadowType shadow_type);
-static GtkWidget* (*fp_gtk_button_new)();
-static GtkWidget* (*fp_gtk_check_button_new)();
-static GtkWidget* (*fp_gtk_check_menu_item_new)();
-static GtkWidget* (*fp_gtk_color_selection_dialog_new)(const gchar* title);
-static GtkWidget* (*fp_gtk_combo_box_new)();
-static GtkWidget* (*fp_gtk_combo_box_entry_new)();
-static GtkWidget* (*fp_gtk_entry_new)();
-static GtkWidget* (*fp_gtk_fixed_new)();
-static GtkWidget* (*fp_gtk_handle_box_new)();
-static GtkWidget* (*fp_gtk_hpaned_new)();
-static GtkWidget* (*fp_gtk_vpaned_new)();
-static GtkWidget* (*fp_gtk_hscale_new)(GtkAdjustment* adjustment);
-static GtkWidget* (*fp_gtk_vscale_new)(GtkAdjustment* adjustment);
-static GtkWidget* (*fp_gtk_hscrollbar_new)(GtkAdjustment* adjustment);
-static GtkWidget* (*fp_gtk_vscrollbar_new)(GtkAdjustment* adjustment);
-static GtkWidget* (*fp_gtk_hseparator_new)();
-static GtkWidget* (*fp_gtk_vseparator_new)();
-static GtkWidget* (*fp_gtk_image_new)();
-static GtkWidget* (*fp_gtk_label_new)(const gchar* str);
-static GtkWidget* (*fp_gtk_menu_new)();
-static GtkWidget* (*fp_gtk_menu_bar_new)();
-static GtkWidget* (*fp_gtk_menu_item_new)();
-static GtkWidget* (*fp_gtk_notebook_new)();
-static GtkWidget* (*fp_gtk_progress_bar_new)();
-static GtkWidget* (*fp_gtk_progress_bar_set_orientation)(
-        GtkProgressBar *pbar,
-        GtkProgressBarOrientation orientation);
-static GtkWidget* (*fp_gtk_radio_button_new)(GSList *group);
-static GtkWidget* (*fp_gtk_radio_menu_item_new)(GSList *group);
-static GtkWidget* (*fp_gtk_scrolled_window_new)(GtkAdjustment *hadjustment,
-        GtkAdjustment *vadjustment);
-static GtkWidget* (*fp_gtk_separator_menu_item_new)();
-static GtkWidget* (*fp_gtk_separator_tool_item_new)();
-static GtkWidget* (*fp_gtk_text_view_new)();
-static GtkWidget* (*fp_gtk_toggle_button_new)();
-static GtkWidget* (*fp_gtk_toolbar_new)();
-static GtkWidget* (*fp_gtk_tree_view_new)();
-static GtkWidget* (*fp_gtk_viewport_new)(GtkAdjustment *hadjustment,
-        GtkAdjustment *vadjustment);
-static GtkWidget* (*fp_gtk_window_new)(GtkWindowType type);
-static GtkWidget* (*fp_gtk_dialog_new)();
-static GtkWidget* (*fp_gtk_spin_button_new)(GtkAdjustment *adjustment,
-        gdouble climb_rate, guint digits);
-static GtkWidget* (*fp_gtk_frame_new)(const gchar *label);
-
-/* Other widget operations */
-static GtkObject* (*fp_gtk_adjustment_new)(gdouble value,
-        gdouble lower, gdouble upper, gdouble step_increment,
-        gdouble page_increment, gdouble page_size);
-static void (*fp_gtk_container_add)(GtkContainer *window, GtkWidget *widget);
-static void (*fp_gtk_menu_shell_append)(GtkMenuShell *menu_shell,
-        GtkWidget *child);
-static void (*fp_gtk_menu_item_set_submenu)(GtkMenuItem *menu_item,
-        GtkWidget *submenu);
-static void (*fp_gtk_widget_realize)(GtkWidget *widget);
-static GdkPixbuf* (*fp_gtk_widget_render_icon)(GtkWidget *widget,
-        const gchar *stock_id, GtkIconSize size, const gchar *detail);
-static void (*fp_gtk_widget_set_name)(GtkWidget *widget, const gchar *name);
-static void (*fp_gtk_widget_set_parent)(GtkWidget *widget, GtkWidget *parent);
-static void (*fp_gtk_widget_set_direction)(GtkWidget *widget,
-        GtkTextDirection direction);
-static void (*fp_gtk_widget_style_get)(GtkWidget *widget,
-        const gchar *first_property_name, ...);
-static void (*fp_gtk_widget_class_install_style_property)(
-        GtkWidgetClass* class, GParamSpec *pspec);
-static GParamSpec* (*fp_gtk_widget_class_find_style_property)(
-        GtkWidgetClass* class, const gchar* property_name);
-static void (*fp_gtk_widget_style_get_property)(GtkWidget* widget,
-        const gchar* property_name, GValue* value);
-static char* (*fp_pango_font_description_to_string)(
-        const PangoFontDescription* fd);
-static GtkSettings* (*fp_gtk_settings_get_default)();
-static GtkSettings* (*fp_gtk_widget_get_settings)(GtkWidget *widget);
-static GType        (*fp_gtk_border_get_type)();
-static void (*fp_gtk_arrow_set)(GtkWidget* arrow,
-                                GtkArrowType arrow_type,
-                                GtkShadowType shadow_type);
-static void (*fp_gtk_widget_size_request)(GtkWidget *widget,
-                                          GtkRequisition *requisition);
-static GtkAdjustment* (*fp_gtk_range_get_adjustment)(GtkRange* range);
-
 /* Method bodies */
 const char *getStrFor(JNIEnv *env, jstring val)
 {
@@ -385,90 +141,6 @@
     (*env)->DeleteLocalRef(env, class);
 }
 
-/* This is a workaround for the bug:
- * http://sourceware.org/bugzilla/show_bug.cgi?id=1814
- * (dlsym/dlopen clears dlerror state)
- * This bug is specific to Linux, but there is no harm in
- * applying this workaround on Solaris as well.
- */
-static void* dl_symbol(const char* name)
-{
-    void* result = dlsym(gtk2_libhandle, name);
-    if (!result)
-        longjmp(j, NO_SYMBOL_EXCEPTION);
-
-    return result;
-}
-
-static void* dl_symbol_gthread(const char* name)
-{
-    void* result = dlsym(gthread_libhandle, name);
-    if (!result)
-        longjmp(j, NO_SYMBOL_EXCEPTION);
-
-    return result;
-}
-
-gboolean gtk2_check_version()
-{
-    if (gtk2_libhandle != NULL) {
-        /* We've already successfully opened the GTK libs, so return true. */
-        return TRUE;
-    } else {
-        void *lib = NULL;
-        gboolean result = FALSE;
-
-        lib = dlopen(GTK2_LIB_VERSIONED, RTLD_LAZY | RTLD_LOCAL);
-        if (lib == NULL) {
-            lib = dlopen(GTK2_LIB, RTLD_LAZY | RTLD_LOCAL);
-            if (lib == NULL) {
-                return FALSE;
-            }
-        }
-
-        fp_gtk_check_version = dlsym(lib, "gtk_check_version");
-        /* Check for GTK 2.2+ */
-        if (!fp_gtk_check_version(2, 2, 0)) {
-            result = TRUE;
-        }
-
-        dlclose(lib);
-
-        return result;
-    }
-}
-
-/**
- * Functions for sun_awt_X11_GtkFileDialogPeer.c
- */
-void gtk2_file_chooser_load()
-{
-    fp_gtk_file_chooser_get_filename = dl_symbol(
-            "gtk_file_chooser_get_filename");
-    fp_gtk_file_chooser_dialog_new = dl_symbol("gtk_file_chooser_dialog_new");
-    fp_gtk_file_chooser_set_current_folder = dl_symbol(
-            "gtk_file_chooser_set_current_folder");
-    fp_gtk_file_chooser_set_filename = dl_symbol(
-            "gtk_file_chooser_set_filename");
-    fp_gtk_file_chooser_set_current_name = dl_symbol(
-            "gtk_file_chooser_set_current_name");
-    fp_gtk_file_filter_add_custom = dl_symbol("gtk_file_filter_add_custom");
-    fp_gtk_file_chooser_set_filter = dl_symbol("gtk_file_chooser_set_filter");
-    fp_gtk_file_chooser_get_type = dl_symbol("gtk_file_chooser_get_type");
-    fp_gtk_file_filter_new = dl_symbol("gtk_file_filter_new");
-    if (fp_gtk_check_version(2, 8, 0) == NULL) {
-        fp_gtk_file_chooser_set_do_overwrite_confirmation = dl_symbol(
-                "gtk_file_chooser_set_do_overwrite_confirmation");
-    }
-    fp_gtk_file_chooser_set_select_multiple = dl_symbol(
-            "gtk_file_chooser_set_select_multiple");
-    fp_gtk_file_chooser_get_current_folder = dl_symbol(
-            "gtk_file_chooser_get_current_folder");
-    fp_gtk_file_chooser_get_filenames = dl_symbol(
-            "gtk_file_chooser_get_filenames");
-    fp_gtk_g_slist_length = dl_symbol("g_slist_length");
-}
-
 gboolean gtk2_load()
 {
     gboolean result;
@@ -477,252 +149,9 @@
     int (*io_handler)();
     char *gtk_modules_env;
 
-    gtk2_libhandle = dlopen(GTK2_LIB_VERSIONED, RTLD_LAZY | RTLD_LOCAL);
-    if (gtk2_libhandle == NULL) {
-        gtk2_libhandle = dlopen(GTK2_LIB, RTLD_LAZY | RTLD_LOCAL);
-        if (gtk2_libhandle == NULL)
-            return FALSE;
-    }
-
-    gthread_libhandle = dlopen(GTHREAD_LIB_VERSIONED, RTLD_LAZY | RTLD_LOCAL);
-    if (gthread_libhandle == NULL) {
-        gthread_libhandle = dlopen(GTHREAD_LIB, RTLD_LAZY | RTLD_LOCAL);
-        if (gthread_libhandle == NULL)
-            return FALSE;
-    }
-
-    if (setjmp(j) == 0)
-    {
-        fp_gtk_check_version = dl_symbol("gtk_check_version");
-        /* Check for GTK 2.2+ */
-        if (fp_gtk_check_version(2, 2, 0)) {
-            longjmp(j, NO_SYMBOL_EXCEPTION);
-        }
-
-        /* GLib */
-        fp_g_free = dl_symbol("g_free");
-        fp_g_object_unref = dl_symbol("g_object_unref");
-
-        fp_g_main_context_iteration =
-            dl_symbol("g_main_context_iteration");
-
-        fp_g_value_init = dl_symbol("g_value_init");
-        fp_g_type_is_a = dl_symbol("g_type_is_a");
-
-        fp_g_value_get_boolean = dl_symbol("g_value_get_boolean");
-        fp_g_value_get_char = dl_symbol("g_value_get_char");
-        fp_g_value_get_uchar = dl_symbol("g_value_get_uchar");
-        fp_g_value_get_int = dl_symbol("g_value_get_int");
-        fp_g_value_get_uint = dl_symbol("g_value_get_uint");
-        fp_g_value_get_long = dl_symbol("g_value_get_long");
-        fp_g_value_get_ulong = dl_symbol("g_value_get_ulong");
-        fp_g_value_get_int64 = dl_symbol("g_value_get_int64");
-        fp_g_value_get_uint64 = dl_symbol("g_value_get_uint64");
-        fp_g_value_get_float = dl_symbol("g_value_get_float");
-        fp_g_value_get_double = dl_symbol("g_value_get_double");
-        fp_g_value_get_string = dl_symbol("g_value_get_string");
-        fp_g_value_get_enum = dl_symbol("g_value_get_enum");
-        fp_g_value_get_flags = dl_symbol("g_value_get_flags");
-        fp_g_value_get_param = dl_symbol("g_value_get_param");
-        fp_g_value_get_boxed = dl_symbol("g_value_get_boxed");
-        fp_g_value_get_pointer = dl_symbol("g_value_get_pointer");
-        fp_g_value_get_object = dl_symbol("g_value_get_object");
-        fp_g_param_spec_int = dl_symbol("g_param_spec_int");
-        fp_g_object_get = dl_symbol("g_object_get");
-        fp_g_object_set = dl_symbol("g_object_set");
-
-        /* GDK */
-        fp_gdk_pixmap_new = dl_symbol("gdk_pixmap_new");
-        fp_gdk_pixbuf_get_from_drawable =
-            dl_symbol("gdk_pixbuf_get_from_drawable");
-        fp_gdk_gc_new = dl_symbol("gdk_gc_new");
-        fp_gdk_rgb_gc_set_foreground =
-            dl_symbol("gdk_rgb_gc_set_foreground");
-        fp_gdk_draw_rectangle = dl_symbol("gdk_draw_rectangle");
-        fp_gdk_drawable_get_size = dl_symbol("gdk_drawable_get_size");
-
-        /* Pixbuf */
-        fp_gdk_pixbuf_new = dl_symbol("gdk_pixbuf_new");
-        fp_gdk_pixbuf_new_from_file =
-                dl_symbol("gdk_pixbuf_new_from_file");
-        fp_gdk_pixbuf_get_width = dl_symbol("gdk_pixbuf_get_width");
-        fp_gdk_pixbuf_get_height = dl_symbol("gdk_pixbuf_get_height");
-        fp_gdk_pixbuf_get_pixels = dl_symbol("gdk_pixbuf_get_pixels");
-        fp_gdk_pixbuf_get_rowstride =
-                dl_symbol("gdk_pixbuf_get_rowstride");
-        fp_gdk_pixbuf_get_has_alpha =
-                dl_symbol("gdk_pixbuf_get_has_alpha");
-        fp_gdk_pixbuf_get_bits_per_sample =
-                dl_symbol("gdk_pixbuf_get_bits_per_sample");
-        fp_gdk_pixbuf_get_n_channels =
-                dl_symbol("gdk_pixbuf_get_n_channels");
-
-        /* GTK painting */
-        fp_gtk_init_check = dl_symbol("gtk_init_check");
-        fp_gtk_paint_hline = dl_symbol("gtk_paint_hline");
-        fp_gtk_paint_vline = dl_symbol("gtk_paint_vline");
-        fp_gtk_paint_shadow = dl_symbol("gtk_paint_shadow");
-        fp_gtk_paint_arrow = dl_symbol("gtk_paint_arrow");
-        fp_gtk_paint_diamond = dl_symbol("gtk_paint_diamond");
-        fp_gtk_paint_box = dl_symbol("gtk_paint_box");
-        fp_gtk_paint_flat_box = dl_symbol("gtk_paint_flat_box");
-        fp_gtk_paint_check = dl_symbol("gtk_paint_check");
-        fp_gtk_paint_option = dl_symbol("gtk_paint_option");
-        fp_gtk_paint_box_gap = dl_symbol("gtk_paint_box_gap");
-        fp_gtk_paint_extension = dl_symbol("gtk_paint_extension");
-        fp_gtk_paint_focus = dl_symbol("gtk_paint_focus");
-        fp_gtk_paint_slider = dl_symbol("gtk_paint_slider");
-        fp_gtk_paint_handle = dl_symbol("gtk_paint_handle");
-        fp_gtk_paint_expander = dl_symbol("gtk_paint_expander");
-        fp_gtk_style_apply_default_background =
-                dl_symbol("gtk_style_apply_default_background");
-
-        /* GTK widgets */
-        fp_gtk_arrow_new = dl_symbol("gtk_arrow_new");
-        fp_gtk_button_new = dl_symbol("gtk_button_new");
-        fp_gtk_spin_button_new = dl_symbol("gtk_spin_button_new");
-        fp_gtk_check_button_new = dl_symbol("gtk_check_button_new");
-        fp_gtk_check_menu_item_new =
-                dl_symbol("gtk_check_menu_item_new");
-        fp_gtk_color_selection_dialog_new =
-                dl_symbol("gtk_color_selection_dialog_new");
-        fp_gtk_entry_new = dl_symbol("gtk_entry_new");
-        fp_gtk_fixed_new = dl_symbol("gtk_fixed_new");
-        fp_gtk_handle_box_new = dl_symbol("gtk_handle_box_new");
-        fp_gtk_image_new = dl_symbol("gtk_image_new");
-        fp_gtk_hpaned_new = dl_symbol("gtk_hpaned_new");
-        fp_gtk_vpaned_new = dl_symbol("gtk_vpaned_new");
-        fp_gtk_hscale_new = dl_symbol("gtk_hscale_new");
-        fp_gtk_vscale_new = dl_symbol("gtk_vscale_new");
-        fp_gtk_hscrollbar_new = dl_symbol("gtk_hscrollbar_new");
-        fp_gtk_vscrollbar_new = dl_symbol("gtk_vscrollbar_new");
-        fp_gtk_hseparator_new = dl_symbol("gtk_hseparator_new");
-        fp_gtk_vseparator_new = dl_symbol("gtk_vseparator_new");
-        fp_gtk_label_new = dl_symbol("gtk_label_new");
-        fp_gtk_menu_new = dl_symbol("gtk_menu_new");
-        fp_gtk_menu_bar_new = dl_symbol("gtk_menu_bar_new");
-        fp_gtk_menu_item_new = dl_symbol("gtk_menu_item_new");
-        fp_gtk_menu_item_set_submenu =
-                dl_symbol("gtk_menu_item_set_submenu");
-        fp_gtk_notebook_new = dl_symbol("gtk_notebook_new");
-        fp_gtk_progress_bar_new =
-            dl_symbol("gtk_progress_bar_new");
-        fp_gtk_progress_bar_set_orientation =
-            dl_symbol("gtk_progress_bar_set_orientation");
-        fp_gtk_radio_button_new =
-            dl_symbol("gtk_radio_button_new");
-        fp_gtk_radio_menu_item_new =
-            dl_symbol("gtk_radio_menu_item_new");
-        fp_gtk_scrolled_window_new =
-            dl_symbol("gtk_scrolled_window_new");
-        fp_gtk_separator_menu_item_new =
-            dl_symbol("gtk_separator_menu_item_new");
-        fp_gtk_text_view_new = dl_symbol("gtk_text_view_new");
-        fp_gtk_toggle_button_new =
-            dl_symbol("gtk_toggle_button_new");
-        fp_gtk_toolbar_new = dl_symbol("gtk_toolbar_new");
-        fp_gtk_tree_view_new = dl_symbol("gtk_tree_view_new");
-        fp_gtk_viewport_new = dl_symbol("gtk_viewport_new");
-        fp_gtk_window_new = dl_symbol("gtk_window_new");
-        fp_gtk_window_present = dl_symbol("gtk_window_present");
-        fp_gtk_window_move = dl_symbol("gtk_window_move");
-        fp_gtk_window_resize = dl_symbol("gtk_window_resize");
-
-          fp_gtk_dialog_new = dl_symbol("gtk_dialog_new");
-        fp_gtk_frame_new = dl_symbol("gtk_frame_new");
-
-        fp_gtk_adjustment_new = dl_symbol("gtk_adjustment_new");
-        fp_gtk_container_add = dl_symbol("gtk_container_add");
-        fp_gtk_menu_shell_append =
-            dl_symbol("gtk_menu_shell_append");
-        fp_gtk_widget_realize = dl_symbol("gtk_widget_realize");
-        fp_gtk_widget_destroy = dl_symbol("gtk_widget_destroy");
-        fp_gtk_widget_render_icon =
-            dl_symbol("gtk_widget_render_icon");
-        fp_gtk_widget_set_name =
-            dl_symbol("gtk_widget_set_name");
-        fp_gtk_widget_set_parent =
-            dl_symbol("gtk_widget_set_parent");
-        fp_gtk_widget_set_direction =
-            dl_symbol("gtk_widget_set_direction");
-        fp_gtk_widget_style_get =
-            dl_symbol("gtk_widget_style_get");
-        fp_gtk_widget_class_install_style_property =
-            dl_symbol("gtk_widget_class_install_style_property");
-        fp_gtk_widget_class_find_style_property =
-            dl_symbol("gtk_widget_class_find_style_property");
-        fp_gtk_widget_style_get_property =
-            dl_symbol("gtk_widget_style_get_property");
-        fp_pango_font_description_to_string =
-            dl_symbol("pango_font_description_to_string");
-        fp_gtk_settings_get_default =
-            dl_symbol("gtk_settings_get_default");
-        fp_gtk_widget_get_settings =
-            dl_symbol("gtk_widget_get_settings");
-        fp_gtk_border_get_type =  dl_symbol("gtk_border_get_type");
-        fp_gtk_arrow_set = dl_symbol("gtk_arrow_set");
-        fp_gtk_widget_size_request =
-            dl_symbol("gtk_widget_size_request");
-        fp_gtk_range_get_adjustment =
-            dl_symbol("gtk_range_get_adjustment");
-
-        fp_gtk_widget_hide = dl_symbol("gtk_widget_hide");
-        fp_gtk_main_quit = dl_symbol("gtk_main_quit");
-        fp_g_signal_connect_data = dl_symbol("g_signal_connect_data");
-        fp_gtk_widget_show = dl_symbol("gtk_widget_show");
-        fp_gtk_main = dl_symbol("gtk_main");
-
-        /**
-         * GLib thread system
-         */
-        fp_g_thread_init = dl_symbol_gthread("g_thread_init");
-        fp_gdk_threads_init = dl_symbol("gdk_threads_init");
-        fp_gdk_threads_enter = dl_symbol("gdk_threads_enter");
-        fp_gdk_threads_leave = dl_symbol("gdk_threads_leave");
-
-        /**
-         * Functions for sun_awt_X11_GtkFileDialogPeer.c
-         */
-        if (fp_gtk_check_version(2, 4, 0) == NULL) {
-            // The current GtkFileChooser is available from GTK+ 2.4
-            gtk2_file_chooser_load();
-        }
-
-        /* Some functions may be missing in pre-2.4 GTK.
-           We handle them specially here.
-         */
-        fp_gtk_combo_box_new = dlsym(gtk2_libhandle, "gtk_combo_box_new");
-        if (fp_gtk_combo_box_new == NULL) {
-            fp_gtk_combo_box_new = dl_symbol("gtk_combo_new");
-        }
-
-        fp_gtk_combo_box_entry_new =
-            dlsym(gtk2_libhandle, "gtk_combo_box_entry_new");
-        if (fp_gtk_combo_box_entry_new == NULL) {
-            fp_gtk_combo_box_entry_new = dl_symbol("gtk_combo_new");
-            new_combo = FALSE;
-        }
-
-        fp_gtk_separator_tool_item_new =
-            dlsym(gtk2_libhandle, "gtk_separator_tool_item_new");
-        if (fp_gtk_separator_tool_item_new == NULL) {
-            fp_gtk_separator_tool_item_new =
-                dl_symbol("gtk_vseparator_new");
-        }
-    }
-    /* Now we have only one kind of exceptions: NO_SYMBOL_EXCEPTION
-     * Otherwise we can check the return value of setjmp method.
-     */
-    else
-    {
-        dlclose(gtk2_libhandle);
-        gtk2_libhandle = NULL;
-
-        dlclose(gthread_libhandle);
-        gthread_libhandle = NULL;
-
-        return FALSE;
-    }
+#ifndef USE_SYSTEM_GTK
+    gtk2_dlload ();
+#endif
 
     /*
      * Strip the AT-SPI GTK_MODULEs if present
@@ -775,19 +204,19 @@
     handler = XSetErrorHandler(NULL);
     io_handler = XSetIOErrorHandler(NULL);
 
-    if (fp_gtk_check_version(2, 2, 0) == NULL) {
+    if (gtk_check_version(2, 2, 0) == NULL) {
         // Init the thread system to use GLib in a thread-safe mode
         if (!flag_g_thread_get_initialized) {
             flag_g_thread_get_initialized = TRUE;
 
-            fp_g_thread_init(NULL);
+            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();
+            gdk_threads_init();
         }
     }
-    result = (*fp_gtk_init_check)(NULL, NULL);
+    result = gtk_init_check (NULL, NULL);
 
     XSetErrorHandler(handler);
     XSetIOErrorHandler(io_handler);
@@ -798,23 +227,23 @@
         gtk2_widgets[i] = NULL;
     }
 
+    initialised = result;
     return result;
 }
 
 int gtk2_unload()
 {
     int i;
-    char *gtk2_error;
 
-    if (!gtk2_libhandle)
+    if (!initialised)
         return TRUE;
 
     /* Release painting objects */
     if (gtk2_white_pixmap != NULL) {
-        (*fp_g_object_unref)(gtk2_white_pixmap);
-        (*fp_g_object_unref)(gtk2_black_pixmap);
-        (*fp_g_object_unref)(gtk2_white_pixbuf);
-        (*fp_g_object_unref)(gtk2_black_pixbuf);
+        g_object_unref (gtk2_white_pixmap);
+        g_object_unref (gtk2_black_pixmap);
+        g_object_unref (gtk2_white_pixbuf);
+        g_object_unref (gtk2_black_pixbuf);
         gtk2_white_pixmap = gtk2_black_pixmap =
             gtk2_white_pixbuf = gtk2_black_pixbuf = NULL;
     }
@@ -823,20 +252,17 @@
 
     if (gtk2_window != NULL) {
         /* Destroying toplevel widget will destroy all contained widgets */
-        (*fp_gtk_widget_destroy)(gtk2_window);
+        gtk_widget_destroy (gtk2_window);
 
         /* Unset some static data so they get reinitialized on next load */
         gtk2_window = NULL;
     }
 
-    dlerror();
-    dlclose(gtk2_libhandle);
-    dlclose(gthread_libhandle);
-    if ((gtk2_error = dlerror()) != NULL)
-    {
-        return FALSE;
-    }
+#ifdef USE_SYSTEM_GTK
     return TRUE;
+#else
+    return gtk2_dlunload ();
+#endif
 }
 
 /* Dispatch all pending events from the GTK event loop.
@@ -844,7 +270,7 @@
  */
 void flush_gtk_event_loop()
 {
-    while( (*fp_g_main_context_iteration)(NULL, FALSE));
+    while( g_main_context_iteration (NULL, FALSE));
 }
 
 /*
@@ -855,12 +281,12 @@
 {
     if (gtk2_window == NULL)
     {
-        gtk2_window = (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
-        gtk2_fixed = (GtkFixed *)(*fp_gtk_fixed_new)();
-        (*fp_gtk_container_add)((GtkContainer*)gtk2_window,
-                                (GtkWidget *)gtk2_fixed);
-        (*fp_gtk_widget_realize)(gtk2_window);
-        (*fp_gtk_widget_realize)((GtkWidget *)gtk2_fixed);
+        gtk2_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+        gtk2_fixed = (GtkFixed *) gtk_fixed_new ();
+        gtk_container_add ((GtkContainer*)gtk2_window,
+			   (GtkWidget *)gtk2_fixed);
+        gtk_widget_realize (gtk2_window);
+        gtk_widget_realize ((GtkWidget *)gtk2_fixed);
     }
 }
 
@@ -900,27 +326,27 @@
 
     if (gtk2_pixbuf_width < width || gtk2_pixbuf_height < height)
     {
-        white = (*fp_gdk_pixbuf_new)(GDK_COLORSPACE_RGB, TRUE, 8, width, height);
-        black = (*fp_gdk_pixbuf_new)(GDK_COLORSPACE_RGB, TRUE, 8, width, height);
+        white = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height);
+        black = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height);
 
         if (white == NULL || black == NULL)
         {
             snprintf(convertionBuffer, CONV_BUFFER_SIZE, "Couldn't create pixbuf of size %dx%d", width, height);
             throw_exception(env, "java/lang/RuntimeException", convertionBuffer);
-            fp_gdk_threads_leave();
+            gdk_threads_leave();
             return;
         }
 
         if (gtk2_white_pixmap != NULL) {
             /* free old stuff */
-            (*fp_g_object_unref)(gtk2_white_pixmap);
-            (*fp_g_object_unref)(gtk2_black_pixmap);
-            (*fp_g_object_unref)(gtk2_white_pixbuf);
-            (*fp_g_object_unref)(gtk2_black_pixbuf);
+            g_object_unref (gtk2_white_pixmap);
+            g_object_unref (gtk2_black_pixmap);
+            g_object_unref (gtk2_white_pixbuf);
+            g_object_unref (gtk2_black_pixbuf);
         }
 
-        gtk2_white_pixmap = (*fp_gdk_pixmap_new)(gtk2_window->window, width, height, -1);
-        gtk2_black_pixmap = (*fp_gdk_pixmap_new)(gtk2_window->window, width, height, -1);
+        gtk2_white_pixmap = gdk_pixmap_new (gtk2_window->window, width, height, -1);
+        gtk2_black_pixmap = gdk_pixmap_new (gtk2_window->window, width, height, -1);
 
         gtk2_white_pixbuf = white;
         gtk2_black_pixbuf = black;
@@ -930,15 +356,15 @@
     }
 
     /* clear the pixmaps */
-    gc = (*fp_gdk_gc_new)(gtk2_white_pixmap);
-    (*fp_gdk_rgb_gc_set_foreground)(gc, 0xffffff);
-    (*fp_gdk_draw_rectangle)(gtk2_white_pixmap, gc, TRUE, 0, 0, width, height);
-    (*fp_g_object_unref)(gc);
+    gc = gdk_gc_new (gtk2_white_pixmap);
+    gdk_rgb_gc_set_foreground (gc, 0xffffff);
+    gdk_draw_rectangle (gtk2_white_pixmap, gc, TRUE, 0, 0, width, height);
+    g_object_unref (gc);
 
-    gc = (*fp_gdk_gc_new)(gtk2_black_pixmap);
-    (*fp_gdk_rgb_gc_set_foreground)(gc, 0x000000);
-    (*fp_gdk_draw_rectangle)(gtk2_black_pixmap, gc, TRUE, 0, 0, width, height);
-    (*fp_g_object_unref)(gc);
+    gc = gdk_gc_new (gtk2_black_pixmap);
+    gdk_rgb_gc_set_foreground (gc, 0x000000);
+    gdk_draw_rectangle (gtk2_black_pixmap, gc, TRUE, 0, 0, width, height);
+    g_object_unref (gc);
 }
 
 /*
@@ -959,14 +385,14 @@
     gboolean is_opaque = TRUE;
     gboolean is_bitmask = TRUE;
 
-    (*fp_gdk_pixbuf_get_from_drawable)(gtk2_white_pixbuf, gtk2_white_pixmap,
+    gdk_pixbuf_get_from_drawable (gtk2_white_pixbuf, gtk2_white_pixmap,
             NULL, 0, 0, 0, 0, width, height);
-    (*fp_gdk_pixbuf_get_from_drawable)(gtk2_black_pixbuf, gtk2_black_pixmap,
+    gdk_pixbuf_get_from_drawable (gtk2_black_pixbuf, gtk2_black_pixmap,
             NULL, 0, 0, 0, 0, width, height);
 
-    white = (*fp_gdk_pixbuf_get_pixels)(gtk2_white_pixbuf);
-    black = (*fp_gdk_pixbuf_get_pixels)(gtk2_black_pixbuf);
-    stride = (*fp_gdk_pixbuf_get_rowstride)(gtk2_black_pixbuf);
+    white = gdk_pixbuf_get_pixels (gtk2_white_pixbuf);
+    black = gdk_pixbuf_get_pixels (gtk2_black_pixbuf);
+    stride = gdk_pixbuf_get_rowstride (gtk2_black_pixbuf);
     padding = stride - width * 4;
 
     for (i = 0; i < height; i++) {
@@ -1021,9 +447,9 @@
      * parent, so we need to set the direction of both the widget and its
      * parent.
      */
-    (*fp_gtk_widget_set_direction)(widget, dir);
+    gtk_widget_set_direction (widget, dir);
     if (widget->parent != NULL) {
-        (*fp_gtk_widget_set_direction)(widget->parent, dir);
+        gtk_widget_set_direction (widget->parent, dir);
     }
 }
 
@@ -1089,20 +515,20 @@
     GtkWidget *arrow = NULL;
     if (NULL == gtk2_widgets[_GTK_ARROW_TYPE])
     {
-        gtk2_widgets[_GTK_ARROW_TYPE] = (*fp_gtk_arrow_new)(arrow_type, shadow_type);
-        (*fp_gtk_container_add)((GtkContainer *)gtk2_fixed, gtk2_widgets[_GTK_ARROW_TYPE]);
-        (*fp_gtk_widget_realize)(gtk2_widgets[_GTK_ARROW_TYPE]);
+        gtk2_widgets[_GTK_ARROW_TYPE] = gtk_arrow_new (arrow_type, shadow_type);
+        gtk_container_add ((GtkContainer *)gtk2_fixed, gtk2_widgets[_GTK_ARROW_TYPE]);
+        gtk_widget_realize (gtk2_widgets[_GTK_ARROW_TYPE]);
     }
     arrow = gtk2_widgets[_GTK_ARROW_TYPE];
 
-    (*fp_gtk_arrow_set)(arrow, arrow_type, shadow_type);
+    gtk_arrow_set (arrow, arrow_type, shadow_type);
     return arrow;
 }
 
 static GtkAdjustment* create_adjustment()
 {
     return (GtkAdjustment *)
-            (*fp_gtk_adjustment_new)(50.0, 0.0, 100.0, 10.0, 20.0, 20.0);
+            gtk_adjustment_new (50.0, 0.0, 100.0, 10.0, 20.0, 20.0);
 }
 
 /**
@@ -1119,7 +545,7 @@
         case TABLE_HEADER:
             if (init_result = (NULL == gtk2_widgets[_GTK_BUTTON_TYPE]))
             {
-                gtk2_widgets[_GTK_BUTTON_TYPE] = (*fp_gtk_button_new)();
+                gtk2_widgets[_GTK_BUTTON_TYPE] = gtk_button_new ();
             }
             result = gtk2_widgets[_GTK_BUTTON_TYPE];
             break;
@@ -1127,7 +553,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_CHECK_BUTTON_TYPE]))
             {
                 gtk2_widgets[_GTK_CHECK_BUTTON_TYPE] =
-                    (*fp_gtk_check_button_new)();
+                    gtk_check_button_new ();
             }
             result = gtk2_widgets[_GTK_CHECK_BUTTON_TYPE];
             break;
@@ -1135,7 +561,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE]))
             {
                 gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE] =
-                    (*fp_gtk_check_menu_item_new)();
+                    gtk_check_menu_item_new ();
             }
             result = gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE];
             break;
@@ -1148,7 +574,7 @@
                     (NULL == gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE]))
             {
                 gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE] =
-                    (*fp_gtk_color_selection_dialog_new)(NULL);
+                    gtk_color_selection_dialog_new (NULL);
             }
             result = gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE];
             break;*/
@@ -1156,7 +582,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_COMBO_BOX_TYPE]))
             {
                 gtk2_widgets[_GTK_COMBO_BOX_TYPE] =
-                    (*fp_gtk_combo_box_new)();
+                    gtk_combo_box_new ();
             }
             result = gtk2_widgets[_GTK_COMBO_BOX_TYPE];
             break;
@@ -1165,7 +591,7 @@
                     (NULL == gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE]))
             {
                 gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE] =
-                     (*fp_gtk_toggle_button_new)();
+                     gtk_toggle_button_new ();
             }
             result = gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE];
             break;
@@ -1174,10 +600,7 @@
                     (NULL == gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE]))
             {
                 result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE] =
-                     (*fp_gtk_entry_new)();
-
-                GtkSettings* settings = fp_gtk_widget_get_settings(result);
-                fp_g_object_set(settings, "gtk-cursor-blink", FALSE, NULL);
+                     gtk_entry_new ();
             }
             result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE];
             break;
@@ -1187,7 +610,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_LABEL_TYPE]))
             {
                 gtk2_widgets[_GTK_LABEL_TYPE] =
-                    (*fp_gtk_label_new)(NULL);
+                    gtk_label_new (NULL);
             }
             result = gtk2_widgets[_GTK_LABEL_TYPE];
             break;
@@ -1201,7 +624,7 @@
                  * constructor.
                  */
                 gtk2_widgets[_GTK_CONTAINER_TYPE] =
-                    (*fp_gtk_fixed_new)();
+                    gtk_fixed_new();
             }
             result = gtk2_widgets[_GTK_CONTAINER_TYPE];
             break;
@@ -1211,7 +634,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_TEXT_VIEW_TYPE]))
             {
                 gtk2_widgets[_GTK_TEXT_VIEW_TYPE] =
-                    (*fp_gtk_text_view_new)();
+                    gtk_text_view_new();
             }
             result = gtk2_widgets[_GTK_TEXT_VIEW_TYPE];
             break;
@@ -1221,11 +644,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_ENTRY_TYPE]))
             {
                 gtk2_widgets[_GTK_ENTRY_TYPE] =
-                    (*fp_gtk_entry_new)();
-
-                GtkSettings* settings =
-                    fp_gtk_widget_get_settings(gtk2_widgets[_GTK_ENTRY_TYPE]);
-                fp_g_object_set(settings, "gtk-cursor-blink", FALSE, NULL);
+                    gtk_entry_new ();
             }
             result = gtk2_widgets[_GTK_ENTRY_TYPE];
             break;
@@ -1233,7 +652,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_HANDLE_BOX_TYPE]))
             {
                 gtk2_widgets[_GTK_HANDLE_BOX_TYPE] =
-                    (*fp_gtk_handle_box_new)();
+                    gtk_handle_box_new ();
             }
             result = gtk2_widgets[_GTK_HANDLE_BOX_TYPE];
             break;
@@ -1245,7 +664,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_HSCROLLBAR_TYPE]))
             {
                 gtk2_widgets[_GTK_HSCROLLBAR_TYPE] =
-                    (*fp_gtk_hscrollbar_new)(create_adjustment());
+                    gtk_hscrollbar_new (create_adjustment());
             }
             result = gtk2_widgets[_GTK_HSCROLLBAR_TYPE];
             break;
@@ -1253,7 +672,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_HSEPARATOR_TYPE]))
             {
                 gtk2_widgets[_GTK_HSEPARATOR_TYPE] =
-                    (*fp_gtk_hseparator_new)();
+                    gtk_hseparator_new ();
             }
             result = gtk2_widgets[_GTK_HSEPARATOR_TYPE];
             break;
@@ -1263,7 +682,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_HSCALE_TYPE]))
             {
                 gtk2_widgets[_GTK_HSCALE_TYPE] =
-                    (*fp_gtk_hscale_new)(NULL);
+		    gtk_hscale_new (NULL);
             }
             result = gtk2_widgets[_GTK_HSCALE_TYPE];
             break;
@@ -1271,14 +690,14 @@
         case SPLIT_PANE:
             if (init_result = (NULL == gtk2_widgets[_GTK_HPANED_TYPE]))
             {
-                gtk2_widgets[_GTK_HPANED_TYPE] = (*fp_gtk_hpaned_new)();
+                gtk2_widgets[_GTK_HPANED_TYPE] = gtk_hpaned_new ();
             }
             result = gtk2_widgets[_GTK_HPANED_TYPE];
             break;
         case IMAGE:
             if (init_result = (NULL == gtk2_widgets[_GTK_IMAGE_TYPE]))
             {
-                gtk2_widgets[_GTK_IMAGE_TYPE] = (*fp_gtk_image_new)();
+                gtk2_widgets[_GTK_IMAGE_TYPE] = gtk_image_new ();
             }
             result = gtk2_widgets[_GTK_IMAGE_TYPE];
             break;
@@ -1286,15 +705,15 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_WINDOW_TYPE]))
             {
                 gtk2_widgets[_GTK_WINDOW_TYPE] =
-                    (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
+                    gtk_window_new (GTK_WINDOW_TOPLEVEL);
             }
             result = gtk2_widgets[_GTK_WINDOW_TYPE];
             break;
         case TOOL_TIP:
             if (init_result = (NULL == gtk2_widgets[_GTK_TOOLTIP_TYPE]))
             {
-                result = (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
-                (*fp_gtk_widget_set_name)(result, "gtk-tooltips");
+                result = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+                gtk_widget_set_name (result, "gtk-tooltips");
                 gtk2_widgets[_GTK_TOOLTIP_TYPE] = result;
             }
             result = gtk2_widgets[_GTK_TOOLTIP_TYPE];
@@ -1306,14 +725,14 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_TREE_VIEW_TYPE]))
             {
                 gtk2_widgets[_GTK_TREE_VIEW_TYPE] =
-                    (*fp_gtk_tree_view_new)();
+                    gtk_tree_view_new ();
             }
             result = gtk2_widgets[_GTK_TREE_VIEW_TYPE];
             break;
         case TITLED_BORDER:
             if (init_result = (NULL == gtk2_widgets[_GTK_FRAME_TYPE]))
             {
-                gtk2_widgets[_GTK_FRAME_TYPE] = fp_gtk_frame_new(NULL);
+                gtk2_widgets[_GTK_FRAME_TYPE] = gtk_frame_new(NULL);
             }
             result = gtk2_widgets[_GTK_FRAME_TYPE];
             break;
@@ -1321,7 +740,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_MENU_TYPE]))
             {
                 gtk2_widgets[_GTK_MENU_TYPE] =
-                    (*fp_gtk_menu_new)();
+                    gtk_menu_new ();
             }
             result = gtk2_widgets[_GTK_MENU_TYPE];
             break;
@@ -1331,7 +750,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_MENU_ITEM_TYPE]))
             {
                 gtk2_widgets[_GTK_MENU_ITEM_TYPE] =
-                    (*fp_gtk_menu_item_new)();
+                    gtk_menu_item_new ();
             }
             result = gtk2_widgets[_GTK_MENU_ITEM_TYPE];
             break;
@@ -1339,7 +758,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_MENU_BAR_TYPE]))
             {
                 gtk2_widgets[_GTK_MENU_BAR_TYPE] =
-                    (*fp_gtk_menu_bar_new)();
+                    gtk_menu_bar_new ();
             }
             result = gtk2_widgets[_GTK_MENU_BAR_TYPE];
             break;
@@ -1348,7 +767,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_DIALOG_TYPE]))
             {
                 gtk2_widgets[_GTK_DIALOG_TYPE] =
-                    (*fp_gtk_dialog_new)();
+                    gtk_dialog_new ();
             }
             result = gtk2_widgets[_GTK_DIALOG_TYPE];
             break;
@@ -1357,7 +776,7 @@
                     (NULL == gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE]))
             {
                 gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE] =
-                    (*fp_gtk_separator_menu_item_new)();
+                    gtk_separator_menu_item_new ();
             }
             result = gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE];
             break;
@@ -1365,7 +784,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE]))
             {
                 gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE] =
-                    (*fp_gtk_progress_bar_new)();
+                    gtk_progress_bar_new ();
             }
             result = gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE];
             break;
@@ -1373,12 +792,12 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE]))
             {
                 gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE] =
-                    (*fp_gtk_progress_bar_new)();
+                    gtk_progress_bar_new ();
                 /*
                  * Vertical JProgressBars always go bottom-to-top,
                  * regardless of the ComponentOrientation.
                  */
-                (*fp_gtk_progress_bar_set_orientation)(
+                gtk_progress_bar_set_orientation (
                     (GtkProgressBar *)gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE],
                     GTK_PROGRESS_BOTTOM_TO_TOP);
             }
@@ -1388,7 +807,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_RADIO_BUTTON_TYPE]))
             {
                 gtk2_widgets[_GTK_RADIO_BUTTON_TYPE] =
-                    (*fp_gtk_radio_button_new)(NULL);
+                    gtk_radio_button_new (NULL);
             }
             result = gtk2_widgets[_GTK_RADIO_BUTTON_TYPE];
             break;
@@ -1397,7 +816,7 @@
                     (NULL == gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE]))
             {
                 gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE] =
-                    (*fp_gtk_radio_menu_item_new)(NULL);
+                    gtk_radio_menu_item_new (NULL);
             }
             result = gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE];
             break;
@@ -1406,7 +825,7 @@
                     (NULL == gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE]))
             {
                 gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE] =
-                    (*fp_gtk_scrolled_window_new)(NULL, NULL);
+                    gtk_scrolled_window_new (NULL, NULL);
             }
             result = gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE];
             break;
@@ -1416,10 +835,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_SPIN_BUTTON_TYPE]))
             {
                 result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE] =
-                    (*fp_gtk_spin_button_new)(NULL, 0, 0);
-
-                GtkSettings* settings = fp_gtk_widget_get_settings(result);
-                fp_g_object_set(settings, "gtk-cursor-blink", FALSE, NULL);
+                    gtk_spin_button_new (NULL, 0, 0);
             }
             result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE];
             break;
@@ -1430,7 +846,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_NOTEBOOK_TYPE]))
             {
                 gtk2_widgets[_GTK_NOTEBOOK_TYPE] =
-                    (*fp_gtk_notebook_new)(NULL);
+                    gtk_notebook_new ();
             }
             result = gtk2_widgets[_GTK_NOTEBOOK_TYPE];
             break;
@@ -1438,7 +854,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE]))
             {
                 gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE] =
-                    (*fp_gtk_toggle_button_new)(NULL);
+                    gtk_toggle_button_new ();
             }
             result = gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE];
             break;
@@ -1447,7 +863,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_TOOLBAR_TYPE]))
             {
                 gtk2_widgets[_GTK_TOOLBAR_TYPE] =
-                    (*fp_gtk_toolbar_new)(NULL);
+                    gtk_toolbar_new ();
             }
             result = gtk2_widgets[_GTK_TOOLBAR_TYPE];
             break;
@@ -1456,7 +872,7 @@
                     (NULL == gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE]))
             {
                 gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE] =
-                    (*fp_gtk_separator_tool_item_new)();
+                    gtk_separator_tool_item_new();
             }
             result = gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE];
             break;
@@ -1465,7 +881,7 @@
             {
                 GtkAdjustment *adjustment = create_adjustment();
                 gtk2_widgets[_GTK_VIEWPORT_TYPE] =
-                    (*fp_gtk_viewport_new)(adjustment, adjustment);
+                    gtk_viewport_new (adjustment, adjustment);
             }
             result = gtk2_widgets[_GTK_VIEWPORT_TYPE];
             break;
@@ -1477,7 +893,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_VSCROLLBAR_TYPE]))
             {
                 gtk2_widgets[_GTK_VSCROLLBAR_TYPE] =
-                    (*fp_gtk_vscrollbar_new)(create_adjustment());
+                    gtk_vscrollbar_new (create_adjustment());
             }
             result = gtk2_widgets[_GTK_VSCROLLBAR_TYPE];
             break;
@@ -1485,7 +901,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_VSEPARATOR_TYPE]))
             {
                 gtk2_widgets[_GTK_VSEPARATOR_TYPE] =
-                    (*fp_gtk_vseparator_new)();
+                    gtk_vseparator_new ();
             }
             result = gtk2_widgets[_GTK_VSEPARATOR_TYPE];
             break;
@@ -1495,7 +911,7 @@
             if (init_result = (NULL == gtk2_widgets[_GTK_VSCALE_TYPE]))
             {
                 gtk2_widgets[_GTK_VSCALE_TYPE] =
-                    (*fp_gtk_vscale_new)(NULL);
+                    gtk_vscale_new (NULL);
             }
             result = gtk2_widgets[_GTK_VSCALE_TYPE];
             /*
@@ -1508,7 +924,7 @@
         case VSPLIT_PANE_DIVIDER:
             if (init_result = (NULL == gtk2_widgets[_GTK_VPANED_TYPE]))
             {
-                gtk2_widgets[_GTK_VPANED_TYPE] = (*fp_gtk_vpaned_new)();
+                gtk2_widgets[_GTK_VPANED_TYPE] = gtk_vpaned_new ();
             }
             result = gtk2_widgets[_GTK_VPANED_TYPE];
             break;
@@ -1526,14 +942,14 @@
                 widget_type == POPUP_MENU_SEPARATOR)
         {
             GtkWidget *menu = gtk2_get_widget(POPUP_MENU);
-            (*fp_gtk_menu_shell_append)((GtkMenuShell *)menu, result);
+            gtk_menu_shell_append ((GtkMenuShell *)menu, result);
         }
         else if (widget_type == POPUP_MENU)
         {
             GtkWidget *menu_bar = gtk2_get_widget(MENU_BAR);
-            GtkWidget *root_menu = (*fp_gtk_menu_item_new)();
-            (*fp_gtk_menu_item_set_submenu)((GtkMenuItem*)root_menu, result);
-            (*fp_gtk_menu_shell_append)((GtkMenuShell *)menu_bar, root_menu);
+            GtkWidget *root_menu = gtk_menu_item_new ();
+            gtk_menu_item_set_submenu ((GtkMenuItem*)root_menu, result);
+            gtk_menu_shell_append ((GtkMenuShell *)menu_bar, root_menu);
         }
         else if (widget_type == COMBO_BOX_ARROW_BUTTON ||
                  widget_type == COMBO_BOX_TEXT_FIELD)
@@ -1543,23 +959,30 @@
             * in order to trick engines into thinking it's a real combobox
             * arrow button/text field.
             */
-            GtkWidget *combo = (*fp_gtk_combo_box_entry_new)();
+            GtkWidget *combo = gtk_combo_box_entry_new ();
+	    gboolean use_new_combo;
+	    
+#ifdef USE_SYSTEM_GTK
+	    use_new_combo = TRUE;
+#else
+	    use_new_combo = new_combo();
+#endif
 
-            if (new_combo && widget_type == COMBO_BOX_ARROW_BUTTON) {
-                (*fp_gtk_widget_set_parent)(result, combo);
+            if (use_new_combo && widget_type == COMBO_BOX_ARROW_BUTTON) {
+                gtk_widget_set_parent (result, combo);
                 ((GtkBin*)combo)->child = result;
             } else {
-                (*fp_gtk_container_add)((GtkContainer *)combo, result);
+                gtk_container_add ((GtkContainer *)combo, result);
             }
-            (*fp_gtk_container_add)((GtkContainer *)gtk2_fixed, combo);
+            gtk_container_add ((GtkContainer *)gtk2_fixed, combo);
         }
         else if (widget_type != TOOL_TIP &&
                  widget_type != INTERNAL_FRAME &&
                  widget_type != OPTION_PANE)
         {
-            (*fp_gtk_container_add)((GtkContainer *)gtk2_fixed, result);
+            gtk_container_add ((GtkContainer *)gtk2_fixed, result);
         }
-        (*fp_gtk_widget_realize)(result);
+        gtk_widget_realize (result);
     }
     return result;
 }
@@ -1601,7 +1024,7 @@
         case COMBO_BOX_ARROW_BUTTON:
         case TABLE:
             x = 1;
-            (*fp_gtk_widget_size_request)(gtk2_widget, &size);
+            gtk_widget_size_request (gtk2_widget, &size);
             w = size.width - ((GtkMisc*)gtk2_widget)->xpad * 2;
             h = size.height - ((GtkMisc*)gtk2_widget)->ypad * 2;
             w = h = MIN(MIN(w, h), MIN(width,height)) * 0.7;
@@ -1615,10 +1038,10 @@
     x += (width - w) / 2;
     y += (height - h) / 2;
 
-    (*fp_gtk_paint_arrow)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_arrow (gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail, arrow_type, fill,
             x, y, w, h);
-    (*fp_gtk_paint_arrow)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_arrow (gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail, arrow_type, fill,
             x, y, w, h);
 }
@@ -1764,9 +1187,9 @@
         break;
     }
 
-    (*fp_gtk_paint_box)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_box (gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail, x, y, width, height);
-    (*fp_gtk_paint_box)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_box (gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail, x, y, width, height);
 
     /*
@@ -1785,10 +1208,10 @@
     GdkRectangle area = { x, y, width, height };
 
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_box_gap)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_box_gap(gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, &area, gtk2_widget, detail,
             x, y, width, height, gap_side, gap_x, gap_width);
-    (*fp_gtk_paint_box_gap)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_box_gap(gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, &area, gtk2_widget, detail,
             x, y, width, height, gap_side, gap_x, gap_width);
 }
@@ -1802,10 +1225,10 @@
     gtk2_widget = gtk2_get_widget(widget_type);
     init_toggle_widget(widget_type, synth_state);
 
-    (*fp_gtk_paint_check)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_check (gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height);
-    (*fp_gtk_paint_check)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_check (gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height);
 }
@@ -1815,10 +1238,10 @@
         gint x, gint y, gint width, gint height)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_diamond)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_diamond (gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height);
-    (*fp_gtk_paint_diamond)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_diamond (gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height);
 }
@@ -1828,10 +1251,10 @@
         GtkExpanderStyle expander_style)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_expander)(gtk2_widget->style, gtk2_white_pixmap,
+    gtk_paint_expander (gtk2_widget->style, gtk2_white_pixmap,
             state_type, NULL, gtk2_widget, detail,
             x + width / 2, y + height / 2, expander_style);
-    (*fp_gtk_paint_expander)(gtk2_widget->style, gtk2_black_pixmap,
+    gtk_paint_expander (gtk2_widget->style, gtk2_black_pixmap,
             state_type, NULL, gtk2_widget, detail,
             x + width / 2, y + height / 2, expander_style);
 }
@@ -1841,10 +1264,10 @@
         gint x, gint y, gint width, gint height, GtkPositionType gap_side)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_extension)(gtk2_widget->style, gtk2_white_pixmap,
+    gtk_paint_extension (gtk2_widget->style, gtk2_white_pixmap,
             state_type, shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height, gap_side);
-    (*fp_gtk_paint_extension)(gtk2_widget->style, gtk2_black_pixmap,
+    gtk_paint_extension (gtk2_widget->style, gtk2_black_pixmap,
             state_type, shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height, gap_side);
 }
@@ -1860,10 +1283,10 @@
     else
         ((GtkObject*)gtk2_widget)->flags &= ~GTK_HAS_FOCUS;
 
-    (*fp_gtk_paint_flat_box)(gtk2_widget->style, gtk2_white_pixmap,
+    gtk_paint_flat_box (gtk2_widget->style, gtk2_white_pixmap,
             state_type, shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height);
-    (*fp_gtk_paint_flat_box)(gtk2_widget->style, gtk2_black_pixmap,
+    gtk_paint_flat_box (gtk2_widget->style, gtk2_black_pixmap,
             state_type, shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height);
 }
@@ -1872,9 +1295,9 @@
         const char *detail, gint x, gint y, gint width, gint height)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_focus)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_focus (gtk2_widget->style, gtk2_white_pixmap, state_type,
             NULL, gtk2_widget, detail, x, y, width, height);
-    (*fp_gtk_paint_focus)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_focus (gtk2_widget->style, gtk2_black_pixmap, state_type,
             NULL, gtk2_widget, detail, x, y, width, height);
 }
 
@@ -1883,10 +1306,10 @@
         gint x, gint y, gint width, gint height, GtkOrientation orientation)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_handle)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_handle (gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height, orientation);
-    (*fp_gtk_paint_handle)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_handle (gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height, orientation);
 }
@@ -1895,9 +1318,9 @@
         const gchar *detail, gint x, gint y, gint width, gint height)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_hline)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_hline (gtk2_widget->style, gtk2_white_pixmap, state_type,
             NULL, gtk2_widget, detail, x, x + width, y);
-    (*fp_gtk_paint_hline)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_hline (gtk2_widget->style, gtk2_black_pixmap, state_type,
             NULL, gtk2_widget, detail, x, x + width, y);
 }
 
@@ -1910,10 +1333,10 @@
     gtk2_widget = gtk2_get_widget(widget_type);
     init_toggle_widget(widget_type, synth_state);
 
-    (*fp_gtk_paint_option)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_option (gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height);
-    (*fp_gtk_paint_option)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_option (gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height);
 }
@@ -1956,9 +1379,9 @@
         break;
     }
 
-    (*fp_gtk_paint_shadow)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_shadow (gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail, x, y, width, height);
-    (*fp_gtk_paint_shadow)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_shadow (gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail, x, y, width, height);
 
     /*
@@ -1973,10 +1396,10 @@
         gint x, gint y, gint width, gint height, GtkOrientation orientation)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_slider)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_slider (gtk2_widget->style, gtk2_white_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height, orientation);
-    (*fp_gtk_paint_slider)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_slider (gtk2_widget->style, gtk2_black_pixmap, state_type,
             shadow_type, NULL, gtk2_widget, detail,
             x, y, width, height, orientation);
 }
@@ -1985,9 +1408,9 @@
         const gchar *detail, gint x, gint y, gint width, gint height)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_paint_vline)(gtk2_widget->style, gtk2_white_pixmap, state_type,
+    gtk_paint_vline (gtk2_widget->style, gtk2_white_pixmap, state_type,
             NULL, gtk2_widget, detail, y, y + height, x);
-    (*fp_gtk_paint_vline)(gtk2_widget->style, gtk2_black_pixmap, state_type,
+    gtk_paint_vline (gtk2_widget->style, gtk2_black_pixmap, state_type,
             NULL, gtk2_widget, detail, y, y + height, x);
 }
 
@@ -1995,9 +1418,9 @@
         gint x, gint y, gint width, gint height)
 {
     gtk2_widget = gtk2_get_widget(widget_type);
-    (*fp_gtk_style_apply_default_background)(gtk2_widget->style,
+    gtk_style_apply_default_background (gtk2_widget->style,
             gtk2_white_pixmap, TRUE, state_type, NULL, x, y, width, height);
-    (*fp_gtk_style_apply_default_background)(gtk2_widget->style,
+    gtk_style_apply_default_background (gtk2_widget->style,
             gtk2_black_pixmap, TRUE, state_type, NULL, x, y, width, height);
 }
 
@@ -2007,8 +1430,8 @@
     init_containers();
     gtk2_widget = gtk2_get_widget((widget_type < 0) ? IMAGE : widget_type);
     gtk2_widget->state = GTK_STATE_NORMAL;
-    (*fp_gtk_widget_set_direction)(gtk2_widget, direction);
-    return (*fp_gtk_widget_render_icon)(gtk2_widget, stock_id, size, detail);
+    gtk_widget_set_direction (gtk2_widget, direction);
+    return gtk_widget_render_icon (gtk2_widget, stock_id, size, detail);
 }
 
 /*************************************************/
@@ -2106,81 +1529,81 @@
     GValue value;
     value.g_type = 0;
 
-    GParamSpec* param = (*fp_gtk_widget_class_find_style_property)(
+    GParamSpec* param = gtk_widget_class_find_style_property (
                                     ((GTypeInstance*)gtk2_widget)->g_class, key);
     if( param )
     {
-        (*fp_g_value_init)( &value, param->value_type );
-        (*fp_gtk_widget_style_get_property)(gtk2_widget, key, &value);
+        g_value_init ( &value, param->value_type );
+        gtk_widget_style_get_property (gtk2_widget, key, &value);
 
-        if( (*fp_g_type_is_a)( param->value_type, G_TYPE_BOOLEAN ))
+        if( g_type_is_a ( param->value_type, G_TYPE_BOOLEAN ))
         {
-            gboolean val = (*fp_g_value_get_boolean)(&value);
+            gboolean val = g_value_get_boolean (&value);
             return create_Boolean(env, (jboolean)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_CHAR ))
+        else if( g_type_is_a ( param->value_type, G_TYPE_CHAR ))
         {
-            gchar val = (*fp_g_value_get_char)(&value);
+            gchar val = g_value_get_char (&value);
             return create_Character(env, (jchar)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_UCHAR ))
+        else if( g_type_is_a( param->value_type, G_TYPE_UCHAR ))
         {
-            guchar val = (*fp_g_value_get_uchar)(&value);
+            guchar val = g_value_get_uchar (&value);
             return create_Character(env, (jchar)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_INT ))
+        else if( g_type_is_a ( param->value_type, G_TYPE_INT ))
         {
-            gint val = (*fp_g_value_get_int)(&value);
+            gint val = g_value_get_int (&value);
             return create_Integer(env, (jint)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_UINT ))
+        else if( g_type_is_a( param->value_type, G_TYPE_UINT ))
         {
-            guint val = (*fp_g_value_get_uint)(&value);
+            guint val = g_value_get_uint (&value);
             return create_Integer(env, (jint)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_LONG ))
+        else if( g_type_is_a( param->value_type, G_TYPE_LONG ))
         {
-            glong val = (*fp_g_value_get_long)(&value);
+            glong val = g_value_get_long (&value);
             return create_Long(env, (jlong)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_ULONG ))
+        else if( g_type_is_a( param->value_type, G_TYPE_ULONG ))
         {
-            gulong val = (*fp_g_value_get_ulong)(&value);
+            gulong val = g_value_get_ulong (&value);
             return create_Long(env, (jlong)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_INT64 ))
+        else if( g_type_is_a( param->value_type, G_TYPE_INT64 ))
         {
-            gint64 val = (*fp_g_value_get_int64)(&value);
+            gint64 val = g_value_get_int64(&value);
             return create_Long(env, (jlong)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_UINT64 ))
+        else if( g_type_is_a( param->value_type, G_TYPE_UINT64 ))
         {
-            guint64 val = (*fp_g_value_get_uint64)(&value);
+            guint64 val = g_value_get_uint64 (&value);
             return create_Long(env, (jlong)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_FLOAT ))
+        else if( g_type_is_a( param->value_type, G_TYPE_FLOAT ))
         {
-            gfloat val = (*fp_g_value_get_float)(&value);
+            gfloat val = g_value_get_float (&value);
             return create_Float(env, (jfloat)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_DOUBLE ))
+        else if( g_type_is_a( param->value_type, G_TYPE_DOUBLE ))
         {
-            gdouble val = (*fp_g_value_get_double)(&value);
+            gdouble val = g_value_get_double (&value);
             return create_Double(env, (jdouble)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_ENUM ))
+        else if( g_type_is_a( param->value_type, G_TYPE_ENUM ))
         {
-            gint val = (*fp_g_value_get_enum)(&value);
+            gint val = g_value_get_enum (&value);
             return create_Integer(env, (jint)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_FLAGS ))
+        else if( g_type_is_a( param->value_type, G_TYPE_FLAGS ))
         {
-            guint val = (*fp_g_value_get_flags)(&value);
+            guint val = g_value_get_flags (&value);
             return create_Integer(env, (jint)val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_STRING ))
+        else if( g_type_is_a( param->value_type, G_TYPE_STRING ))
         {
-            const gchar* val = (*fp_g_value_get_string)(&value);
+            const gchar* val = g_value_get_string (&value);
 
             /* We suppose that all values come in C locale and
              * utf-8 representation of a string is the same as
@@ -2189,31 +1612,31 @@
              */
             return (*env)->NewStringUTF(env, val);
         }
-        else if( (*fp_g_type_is_a)( param->value_type, GTK_TYPE_BORDER ))
+        else if( g_type_is_a( param->value_type, GTK_TYPE_BORDER ))
         {
-            GtkBorder *border = (GtkBorder*)(*fp_g_value_get_boxed)(&value);
+            GtkBorder *border = (GtkBorder*)g_value_get_boxed(&value);
             return border ? create_Insets(env, border) : NULL;
         }
 
         /*      TODO: Other types are not supported yet.*/
-/*        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_PARAM ))
+/*        else if( g_type_is_a( param->value_type, G_TYPE_PARAM ))
         {
-            GParamSpec* val = (*fp_g_value_get_param)(&value);
+            GParamSpec* val = g_value_get_param (&value);
             printf( "Param: %p\n", val );
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_BOXED ))
+        else if( g_type_is_a( param->value_type, G_TYPE_BOXED ))
         {
-            gpointer* val = (*fp_g_value_get_boxed)(&value);
+            gpointer* val = g_value_get_boxed (&value);
             printf( "Boxed: %p\n", val );
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_POINTER ))
+        else if( g_type_is_a( param->value_type, G_TYPE_POINTER ))
         {
-            gpointer* val = (*fp_g_value_get_pointer)(&value);
+            gpointer* val = g_value_get_pointer (&value);
             printf( "Pointer: %p\n", val );
         }
-        else if( (*fp_g_type_is_a)( param->value_type, G_TYPE_OBJECT ))
+        else if( g_type_is_a( param->value_type, G_TYPE_OBJECT ))
         {
-            GObject* val = (GObject*)(*fp_g_value_get_object)(&value);
+            GObject* val = (GObject*)g_value_get_object (&value);
             printf( "Object: %p\n", val );
         }*/
     }
@@ -2228,7 +1651,7 @@
 
     gtk2_widget = gtk2_get_widget(widget_type);
 
-    adj = (*fp_gtk_range_get_adjustment)((GtkRange *)gtk2_widget);
+    adj = gtk_range_get_adjustment ((GtkRange *)gtk2_widget);
     adj->value = (gdouble)value;
     adj->lower = (gdouble)min;
     adj->upper = (gdouble)max;
@@ -2349,9 +1772,9 @@
 
     if (style && style->font_desc)
     {
-        gchar* val = (*fp_pango_font_description_to_string)(style->font_desc);
+        gchar* val = pango_font_description_to_string (style->font_desc);
         result = (*env)->NewStringUTF(env, val);
-        (*fp_g_free)( val );
+        g_free( val );
     }
 
     return result;
@@ -2363,24 +1786,31 @@
     jobject result = NULL;
     gchar*  strval = NULL;
 
-    (*fp_g_object_get)(settings, key, &strval, NULL);
+    g_object_get (settings, key, &strval, NULL);
     result = (*env)->NewStringUTF(env, strval);
-    (*fp_g_free)(strval);
+    g_free (strval);
 
     return result;
 }
-/*
+
 jobject get_integer_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
 {
-    gint    intval = NULL;
+    gint intval = NULL;
+    g_object_get (settings, key, &intval, NULL);
+    return create_Integer(env, intval);
+}
 
-    (*fp_g_object_get)(settings, key, &intval, NULL);
-    return create_Integer(env, intval);
-}*/
+jobject get_boolean_property(JNIEnv* env, GtkSettings* settings, const gchar *key)
+{
+    gint intval = NULL;
+
+    g_object_get (settings, key, &intval, NULL);
+    return create_Boolean(env, intval);
+}
 
 jobject gtk2_get_setting(JNIEnv *env, Setting property)
 {
-    GtkSettings* settings = (*fp_gtk_settings_get_default)();
+    GtkSettings* settings = gtk_settings_get_default ();
 
     switch (property)
     {
@@ -2388,6 +1818,12 @@
             return get_string_property(env, settings, "gtk-font-name");
         case GTK_ICON_SIZES:
             return get_string_property(env, settings, "gtk-icon-sizes");
+        case GTK_BUTTON_ORDER:
+	    return get_boolean_property(env, settings, "gtk-alternative-button-order");
+        case GTK_CURSOR_BLINK:
+            return get_boolean_property(env, settings, "gtk-cursor-blink");
+        case GTK_CURSOR_BLINK_TIME:
+            return get_integer_property(env, settings, "gtk-cursor-blink-time");
     }
 
     return NULL;
--- a/src/solaris/native/sun/awt/gtk2_interface.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/gtk2_interface.h	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -28,20 +28,11 @@
 #include <stdlib.h>
 #include <jni.h>
 
-#define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
-#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
-#define GTK_TYPE_FILE_CHOOSER             (fp_gtk_file_chooser_get_type ())
-#define GTK_FILE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_CHOOSER, GtkFileChooser))
-#define fp_g_signal_connect(instance, detailed_signal, c_handler, data) \
-    fp_g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
-#define G_CALLBACK(f) ((GCallback) (f))
-#define G_TYPE_FUNDAMENTAL_SHIFT (2)
-#define G_TYPE_MAKE_FUNDAMENTAL(x) ((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
-#define G_TYPE_OBJECT G_TYPE_MAKE_FUNDAMENTAL (20)
-#define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
-#define GTK_STOCK_CANCEL           "gtk-cancel"
-#define GTK_STOCK_SAVE             "gtk-save"
-#define GTK_STOCK_OPEN             "gtk-open"
+#include <gtk/gtk.h>
+
+#ifndef USE_SYSTEM_GTK
+#include <gtk_fp.h>
+#endif
 
 typedef enum _WidgetType
 {
@@ -139,524 +130,18 @@
 typedef enum _Setting
 {
     GTK_FONT_NAME,
-    GTK_ICON_SIZES
+    GTK_ICON_SIZES,
+    GTK_BUTTON_ORDER,
+    GTK_CURSOR_BLINK,
+    GTK_CURSOR_BLINK_TIME
 } Setting;
 
-/* GTK types, here to eliminate need for GTK headers at compile time */
-
-#ifndef FALSE
-#define FALSE           (0)
-#define TRUE            (!FALSE)
-#endif
-
-#define GTK_HAS_FOCUS   (1 << 12)
-#define GTK_HAS_DEFAULT (1 << 14)
-
-
-/* basic types */
-typedef char    gchar;
-typedef short   gshort;
-typedef int     gint;
-typedef long    glong;
-typedef float   gfloat;
-typedef double  gdouble;
-typedef void*   gpointer;
-typedef gint    gboolean;
-
-typedef signed char  gint8;
-typedef signed short gint16;
-typedef signed int   gint32;
-
-typedef unsigned char  guchar;
-typedef unsigned char  guint8;
-typedef unsigned short gushort;
-typedef unsigned short guint16;
-typedef unsigned int   guint;
-typedef unsigned int   guint32;
-typedef unsigned int   gsize;
-typedef unsigned long  gulong;
-
-typedef signed long long   gint64;
-typedef unsigned long long guint64;
-
-/* enumerated constants */
-typedef enum
-{
-  GTK_ARROW_UP,
-  GTK_ARROW_DOWN,
-  GTK_ARROW_LEFT,
-  GTK_ARROW_RIGHT
-} GtkArrowType;
-
-typedef enum {
-  GDK_COLORSPACE_RGB
-} GdkColorspace;
-
-typedef enum
-{
-  GTK_EXPANDER_COLLAPSED,
-  GTK_EXPANDER_SEMI_COLLAPSED,
-  GTK_EXPANDER_SEMI_EXPANDED,
-  GTK_EXPANDER_EXPANDED
-} GtkExpanderStyle;
-
-typedef enum
-{
-  GTK_ICON_SIZE_INVALID,
-  GTK_ICON_SIZE_MENU,
-  GTK_ICON_SIZE_SMALL_TOOLBAR,
-  GTK_ICON_SIZE_LARGE_TOOLBAR,
-  GTK_ICON_SIZE_BUTTON,
-  GTK_ICON_SIZE_DND,
-  GTK_ICON_SIZE_DIALOG
-} GtkIconSize;
-
-typedef enum
-{
-  GTK_ORIENTATION_HORIZONTAL,
-  GTK_ORIENTATION_VERTICAL
-} GtkOrientation;
-
-typedef enum
-{
-  GTK_POS_LEFT,
-  GTK_POS_RIGHT,
-  GTK_POS_TOP,
-  GTK_POS_BOTTOM
-} GtkPositionType;
-
-typedef enum
-{
-  GTK_SHADOW_NONE,
-  GTK_SHADOW_IN,
-  GTK_SHADOW_OUT,
-  GTK_SHADOW_ETCHED_IN,
-  GTK_SHADOW_ETCHED_OUT
-} GtkShadowType;
-
-typedef enum
-{
-  GTK_STATE_NORMAL,
-  GTK_STATE_ACTIVE,
-  GTK_STATE_PRELIGHT,
-  GTK_STATE_SELECTED,
-  GTK_STATE_INSENSITIVE
-} GtkStateType;
-
-typedef enum
-{
-  GTK_TEXT_DIR_NONE,
-  GTK_TEXT_DIR_LTR,
-  GTK_TEXT_DIR_RTL
-} GtkTextDirection;
-
-typedef enum
-{
-  GTK_WINDOW_TOPLEVEL,
-  GTK_WINDOW_POPUP
-} GtkWindowType;
-
-typedef enum
-{
-  G_PARAM_READABLE            = 1 << 0,
-  G_PARAM_WRITABLE            = 1 << 1,
-  G_PARAM_CONSTRUCT           = 1 << 2,
-  G_PARAM_CONSTRUCT_ONLY      = 1 << 3,
-  G_PARAM_LAX_VALIDATION      = 1 << 4,
-  G_PARAM_PRIVATE             = 1 << 5
-} GParamFlags;
-
-/* We define all structure pointers to be void* */
-typedef void GError;
-typedef void GMainContext;
-
-typedef struct _GSList GSList;
-struct _GSList
-{
-  gpointer data;
-  GSList *next;
-};
-
-typedef void GdkColormap;
-typedef void GdkDrawable;
-typedef void GdkGC;
-typedef void GdkPixbuf;
-typedef void GdkPixmap;
-typedef void GdkWindow;
-
-typedef void GtkFixed;
-typedef void GtkMenuItem;
-typedef void GtkMenuShell;
-typedef void GtkWidgetClass;
-typedef void PangoFontDescription;
-typedef void GtkSettings;
-
-/* Some real structures */
-typedef struct
-{
-  guint32 pixel;
-  guint16 red;
-  guint16 green;
-  guint16 blue;
-} GdkColor;
-
-typedef struct {
-  gint      fd;
-  gushort   events;
-  gushort   revents;
-} GPollFD;
-
-typedef struct {
-  gint x;
-  gint y;
-  gint width;
-  gint height;
-} GdkRectangle;
-
-typedef struct {
-  gint x;
-  gint y;
-  gint width;
-  gint height;
-} GtkAllocation;
-
-typedef struct {
-  gint width;
-  gint height;
-} GtkRequisition;
-
-typedef struct {
-  GtkWidgetClass *g_class;
-} GTypeInstance;
-
-typedef struct {
-  gint left;
-  gint right;
-  gint top;
-  gint bottom;
-} GtkBorder;
-
-/******************************************************
- * FIXME: it is more safe to include gtk headers for
- * the precise type definition of GType and other
- * structures. This is a place where getting rid of gtk
- * headers may be dangerous.
- ******************************************************/
-typedef gulong         GType;
-
-typedef struct
-{
-  GType         g_type;
-
-  union {
-    gint        v_int;
-    guint       v_uint;
-    glong       v_long;
-    gulong      v_ulong;
-    gint64      v_int64;
-    guint64     v_uint64;
-    gfloat      v_float;
-    gdouble     v_double;
-    gpointer    v_pointer;
-  } data[2];
-} GValue;
-
-typedef struct
-{
-  GTypeInstance  g_type_instance;
-
-  gchar         *name;
-  GParamFlags    flags;
-  GType          value_type;
-  GType          owner_type;
-} GParamSpec;
-
-typedef struct {
-  GTypeInstance g_type_instance;
-  guint         ref_count;
-  void         *qdata;
-} GObject;
-
-typedef struct {
-  GObject parent_instance;
-  guint32 flags;
-} GtkObject;
-
-typedef struct
-{
-  GObject parent_instance;
-
-  GdkColor fg[5];
-  GdkColor bg[5];
-  GdkColor light[5];
-  GdkColor dark[5];
-  GdkColor mid[5];
-  GdkColor text[5];
-  GdkColor base[5];
-  GdkColor text_aa[5];          /* Halfway between text/base */
-
-  GdkColor black;
-  GdkColor white;
-  PangoFontDescription *font_desc;
-
-  gint xthickness;
-  gint ythickness;
-
-  GdkGC *fg_gc[5];
-  GdkGC *bg_gc[5];
-  GdkGC *light_gc[5];
-  GdkGC *dark_gc[5];
-  GdkGC *mid_gc[5];
-  GdkGC *text_gc[5];
-  GdkGC *base_gc[5];
-  GdkGC *text_aa_gc[5];
-  GdkGC *black_gc;
-  GdkGC *white_gc;
-
-  GdkPixmap *bg_pixmap[5];
-} GtkStyle;
-
-typedef struct _GtkWidget GtkWidget;
-struct _GtkWidget
-{
-  GtkObject object;
-  guint16 private_flags;
-  guint8 state;
-  guint8 saved_state;
-  gchar *name;
-  GtkStyle *style;
-  GtkRequisition requisition;
-  GtkAllocation allocation;
-  GdkWindow *window;
-  GtkWidget *parent;
-};
-
-typedef struct
-{
-  GtkWidget widget;
-
-  gfloat xalign;
-  gfloat yalign;
-
-  guint16 xpad;
-  guint16 ypad;
-} GtkMisc;
-
-typedef struct {
-  GtkWidget widget;
-  GtkWidget *focus_child;
-  guint border_width : 16;
-  guint need_resize : 1;
-  guint resize_mode : 2;
-  guint reallocate_redraws : 1;
-  guint has_focus_chain : 1;
-} GtkContainer;
-
-typedef struct {
-  GtkContainer container;
-  GtkWidget *child;
-} GtkBin;
-
-typedef struct {
-  GtkBin bin;
-  GdkWindow *event_window;
-  gchar *label_text;
-  guint activate_timeout;
-  guint constructed : 1;
-  guint in_button : 1;
-  guint button_down : 1;
-  guint relief : 2;
-  guint use_underline : 1;
-  guint use_stock : 1;
-  guint depressed : 1;
-  guint depress_on_activate : 1;
-  guint focus_on_click : 1;
-} GtkButton;
-
-typedef struct {
-  GtkButton button;
-  guint active : 1;
-  guint draw_indicator : 1;
-  guint inconsistent : 1;
-} GtkToggleButton;
-
-typedef struct _GtkAdjustment GtkAdjustment;
-struct _GtkAdjustment
-{
-  GtkObject parent_instance;
-
-  gdouble lower;
-  gdouble upper;
-  gdouble value;
-  gdouble step_increment;
-  gdouble page_increment;
-  gdouble page_size;
-};
-
-typedef enum
-{
-  GTK_UPDATE_CONTINUOUS,
-  GTK_UPDATE_DISCONTINUOUS,
-  GTK_UPDATE_DELAYED
-} GtkUpdateType;
-
-typedef struct _GtkRange GtkRange;
-struct _GtkRange
-{
-  GtkWidget widget;
-  GtkAdjustment *adjustment;
-  GtkUpdateType update_policy;
-  guint inverted : 1;
-  /*< protected >*/
-  guint flippable : 1;
-  guint has_stepper_a : 1;
-  guint has_stepper_b : 1;
-  guint has_stepper_c : 1;
-  guint has_stepper_d : 1;
-  guint need_recalc : 1;
-  guint slider_size_fixed : 1;
-  gint min_slider_size;
-  GtkOrientation orientation;
-  GdkRectangle range_rect;
-  gint slider_start, slider_end;
-  gint round_digits;
-  /*< private >*/
-  guint trough_click_forward : 1;
-  guint update_pending : 1;
-  /*GtkRangeLayout * */ void *layout;
-  /*GtkRangeStepTimer * */ void* timer;
-  gint slide_initial_slider_position;
-  gint slide_initial_coordinate;
-  guint update_timeout_id;
-  GdkWindow *event_window;
-};
-
-typedef struct _GtkProgressBar       GtkProgressBar;
-
-typedef enum
-{
-  GTK_PROGRESS_CONTINUOUS,
-  GTK_PROGRESS_DISCRETE
-} GtkProgressBarStyle;
-
-typedef enum
-{
-  GTK_PROGRESS_LEFT_TO_RIGHT,
-  GTK_PROGRESS_RIGHT_TO_LEFT,
-  GTK_PROGRESS_BOTTOM_TO_TOP,
-  GTK_PROGRESS_TOP_TO_BOTTOM
-} GtkProgressBarOrientation;
-
-typedef struct _GtkProgress       GtkProgress;
-
-struct _GtkProgress
-{
-  GtkWidget widget;
-  GtkAdjustment *adjustment;
-  GdkPixmap     *offscreen_pixmap;
-  gchar         *format;
-  gfloat         x_align;
-  gfloat         y_align;
-  guint          show_text : 1;
-  guint          activity_mode : 1;
-  guint          use_text_format : 1;
-};
-
-struct _GtkProgressBar
-{
-  GtkProgress progress;
-  GtkProgressBarStyle bar_style;
-  GtkProgressBarOrientation orientation;
-  guint blocks;
-  gint  in_block;
-  gint  activity_pos;
-  guint activity_step;
-  guint activity_blocks;
-  gdouble pulse_fraction;
-  guint activity_dir : 1;
-  guint ellipsize : 3;
-};
-
-typedef enum {
-  GTK_RESPONSE_NONE = -1,
-  GTK_RESPONSE_REJECT = -2,
-  GTK_RESPONSE_ACCEPT = -3,
-  GTK_RESPONSE_DELETE_EVENT = -4,
-  GTK_RESPONSE_OK = -5,
-  GTK_RESPONSE_CANCEL = -6,
-  GTK_RESPONSE_CLOSE = -7,
-  GTK_RESPONSE_YES = -8,
-  GTK_RESPONSE_NO = -9,
-  GTK_RESPONSE_APPLY = -10,
-  GTK_RESPONSE_HELP = -11
-} GtkResponseType;
-
-typedef struct _GtkWindow GtkWindow;
-
-typedef struct _GtkFileChooser GtkFileChooser;
-
-typedef enum {
-  GTK_FILE_CHOOSER_ACTION_OPEN,
-  GTK_FILE_CHOOSER_ACTION_SAVE,
-  GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
-  GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
-} GtkFileChooserAction;
-
-typedef struct _GtkFileFilter GtkFileFilter;
-
-typedef enum {
-  GTK_FILE_FILTER_FILENAME = 1 << 0,
-  GTK_FILE_FILTER_URI = 1 << 1,
-  GTK_FILE_FILTER_DISPLAY_NAME = 1 << 2,
-  GTK_FILE_FILTER_MIME_TYPE = 1 << 3
-} GtkFileFilterFlags;
-
-typedef struct {
-  GtkFileFilterFlags contains;
-  const gchar *filename;
-  const gchar *uri;
-  const gchar *display_name;
-  const gchar *mime_type;
-} GtkFileFilterInfo;
-
-typedef gboolean (*GtkFileFilterFunc)(const GtkFileFilterInfo *filter_info,
-    gpointer data);
-
-typedef void (*GDestroyNotify)(gpointer data);
-
-typedef void (*GCallback)(void);
-
-typedef struct _GClosure GClosure;
-
-typedef void (*GClosureNotify)(gpointer data, GClosure *closure);
-
-typedef enum {
-  G_CONNECT_AFTER = 1 << 0, G_CONNECT_SWAPPED = 1 << 1
-} GConnectFlags;
-
-typedef struct _GThreadFunctions GThreadFunctions;
-
 /*
  * Converts java.lang.String object to UTF-8 character string.
  */
 const char *getStrFor(JNIEnv *env, jstring value);
 
 /*
- * Check whether the gtk2 library is available and meets the minimum
- * version requirement.  If the library is already loaded this method has no
- * effect and returns success.
- * Returns FALSE on failure and TRUE on success.
- */
-gboolean gtk2_check_version();
-
-/**
- * Returns :
- * NULL if the GTK+ library is compatible with the given version, or a string
- * describing the version mismatch.
- */
-gchar* (*fp_gtk_check_version)(guint required_major, guint required_minor,
-                       guint required_micro);
-/*
  * Load the gtk2 library.  If the library is already loaded this method has no
  * effect and returns success.
  * Returns FALSE on failure and TRUE on success.
@@ -738,61 +223,4 @@
 void gtk2_set_range_value(WidgetType widget_type, jdouble value,
                           jdouble min, jdouble max, jdouble visible);
 
-void (*fp_g_free)(gpointer mem);
-void (*fp_g_object_unref)(gpointer object);
-int (*fp_gdk_pixbuf_get_bits_per_sample)(const GdkPixbuf *pixbuf);
-guchar *(*fp_gdk_pixbuf_get_pixels)(const GdkPixbuf *pixbuf);
-gboolean (*fp_gdk_pixbuf_get_has_alpha)(const GdkPixbuf *pixbuf);
-int (*fp_gdk_pixbuf_get_height)(const GdkPixbuf *pixbuf);
-int (*fp_gdk_pixbuf_get_n_channels)(const GdkPixbuf *pixbuf);
-int (*fp_gdk_pixbuf_get_rowstride)(const GdkPixbuf *pixbuf);
-int (*fp_gdk_pixbuf_get_width)(const GdkPixbuf *pixbuf);
-GdkPixbuf *(*fp_gdk_pixbuf_new_from_file)(const char *filename, GError **error);
-void (*fp_gtk_widget_destroy)(GtkWidget *widget);
-void (*fp_gtk_window_present)(GtkWindow *window);
-void (*fp_gtk_window_move)(GtkWindow *window, gint x, gint y);
-void (*fp_gtk_window_resize)(GtkWindow *window, gint width, gint height);
-
-/**
- * Function Pointers for GtkFileChooser
- */
-gchar* (*fp_gtk_file_chooser_get_filename)(GtkFileChooser *chooser);
-void (*fp_gtk_widget_hide)(GtkWidget *widget);
-void (*fp_gtk_main_quit)(void);
-GtkWidget* (*fp_gtk_file_chooser_dialog_new)(const gchar *title,
-    GtkWindow *parent, GtkFileChooserAction action,
-    const gchar *first_button_text, ...);
-gboolean (*fp_gtk_file_chooser_set_current_folder)(GtkFileChooser *chooser,
-    const gchar *filename);
-gboolean (*fp_gtk_file_chooser_set_filename)(GtkFileChooser *chooser,
-    const char *filename);
-void (*fp_gtk_file_chooser_set_current_name)(GtkFileChooser *chooser,
-    const gchar *name);
-void (*fp_gtk_file_filter_add_custom)(GtkFileFilter *filter,
-    GtkFileFilterFlags needed, GtkFileFilterFunc func, gpointer data,
-    GDestroyNotify notify);
-void (*fp_gtk_file_chooser_set_filter)(GtkFileChooser *chooser,
-    GtkFileFilter *filter);
-GType (*fp_gtk_file_chooser_get_type)(void);
-GtkFileFilter* (*fp_gtk_file_filter_new)(void);
-void (*fp_gtk_file_chooser_set_do_overwrite_confirmation)(
-    GtkFileChooser *chooser, gboolean do_overwrite_confirmation);
-void (*fp_gtk_file_chooser_set_select_multiple)(
-    GtkFileChooser *chooser, gboolean select_multiple);
-gchar* (*fp_gtk_file_chooser_get_current_folder)(GtkFileChooser *chooser);
-GSList* (*fp_gtk_file_chooser_get_filenames)(GtkFileChooser *chooser);
-guint (*fp_gtk_g_slist_length)(GSList *list);
-gulong (*fp_g_signal_connect_data)(gpointer instance,
-    const gchar *detailed_signal, GCallback c_handler, gpointer data,
-    GClosureNotify destroy_data, GConnectFlags connect_flags);
-void (*fp_gtk_widget_show)(GtkWidget *widget);
-void (*fp_gtk_main)(void);
-guint (*fp_gtk_main_level)(void);
-
-
-void (*fp_g_thread_init)(GThreadFunctions *vtable);
-void (*fp_gdk_threads_init)(void);
-void (*fp_gdk_threads_enter)(void);
-void (*fp_gdk_threads_leave)(void);
-
 #endif /* !_GTK2_INTERFACE_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/sun/awt/gtk2_interface_check.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2005, 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.
+ */
+#include "gtk2_interface_check.h"
+
+gboolean gtk2_check_version()
+{
+#ifdef USE_SYSTEM_GTK
+    return TRUE;
+#else
+    return gtk2_check_dlversion();
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/sun/awt/gtk2_interface_check.h	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2005, 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.
+ */
+#ifndef _GTK2_INTERFACE_CHECK_H
+#define _GTK2_INTERFACE_CHECK_H
+
+#include <gtk/gtk.h>
+
+#ifndef USE_SYSTEM_GTK
+#include <gtk_fp_check.h>
+#endif
+
+/*
+ * Check whether the gtk2 library is available and meets the minimum
+ * version requirement.  If the library is already loaded this method has no
+ * effect and returns success.
+ * Returns FALSE on failure and TRUE on success.
+ */
+gboolean gtk2_check_version();
+
+#endif
--- a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c	Tue Aug 22 02:03:52 2017 +0100
@@ -52,20 +52,20 @@
     {
         // Callbacks from GTK signals are made within the GTK lock
         // So, within a signal handler there is no need to call
-        // gdk_threads_enter() / fp_gdk_threads_leave()
+        // gdk_threads_enter() / gdk_threads_leave()
         if (!isSignalHandler) {
-            fp_gdk_threads_enter();
+            gdk_threads_enter();
         }
 
-        fp_gtk_widget_hide (dialog);
-        fp_gtk_widget_destroy (dialog);
+        gtk_widget_hide (dialog);
+        gtk_widget_destroy (dialog);
 
-        fp_gtk_main_quit ();
+        gtk_main_quit ();
 
         (*env)->SetLongField(env, jpeer, widgetFieldID, 0);
 
         if (!isSignalHandler) {
-            fp_gdk_threads_leave();
+            gdk_threads_leave();
         }
     }
 }
@@ -91,16 +91,16 @@
 {
     GtkWidget * dialog;
 
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
 
     dialog = (GtkWidget*)jlong_to_ptr(
             (*env)->GetLongField(env, jpeer, widgetFieldID));
 
     if (dialog != NULL) {
-        fp_gtk_window_present((GtkWindow*)dialog);
+        gtk_window_present((GtkWindow*)dialog);
     }
 
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -113,21 +113,21 @@
 {
     GtkWindow* dialog;
 
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
 
     dialog = (GtkWindow*)jlong_to_ptr(
         (*env)->GetLongField(env, jpeer, widgetFieldID));
 
     if (dialog != NULL) {
         if (x >= 0 && y >= 0) {
-            fp_gtk_window_move(dialog, (gint)x, (gint)y);
+            gtk_window_move(dialog, (gint)x, (gint)y);
         }
         if (width > 0 && height > 0) {
-            fp_gtk_window_resize(dialog, (gint)width, (gint)height);
+            gtk_window_resize(dialog, (gint)width, (gint)height);
         }
     }
 
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /**
@@ -152,7 +152,7 @@
         return NULL;
     }
 
-    array = (*env)->NewObjectArray(env, fp_gtk_g_slist_length(list), stringCls,
+    array = (*env)->NewObjectArray(env, g_slist_length(list), stringCls,
             NULL);
     if (array == NULL) {
         JNU_ThrowInternalError(env, "Could not instantiate array files array");
@@ -185,9 +185,9 @@
     filenames = NULL;
 
     if (responseId == GTK_RESPONSE_ACCEPT) {
-        current_folder = fp_gtk_file_chooser_get_current_folder(
+        current_folder = gtk_file_chooser_get_current_folder(
                 GTK_FILE_CHOOSER(aDialog));
-        filenames = fp_gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(aDialog));
+        filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(aDialog));
     }
 
     jcurrent_folder = (*env)->NewStringUTF(env, current_folder);
@@ -195,7 +195,7 @@
 
     (*env)->CallVoidMethod(env, obj, setFileInternalMethodID, jcurrent_folder,
             jfilenames);
-    fp_g_free(current_folder);
+    g_free(current_folder);
 
     quit(env, (jobject)obj, TRUE);
 }
@@ -217,25 +217,25 @@
         (*env)->GetJavaVM(env, &jvm);
     }
 
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
 
     const char *title = jtitle == NULL? "": (*env)->GetStringUTFChars(env, jtitle, 0);
 
     if (mode == java_awt_FileDialog_SAVE) {
         /* Save action */
-        dialog = fp_gtk_file_chooser_dialog_new(title, NULL,
+        dialog = gtk_file_chooser_dialog_new(title, NULL,
                 GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL,
                 GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
     }
     else {
         /* Default action OPEN */
-        dialog = fp_gtk_file_chooser_dialog_new(title, NULL,
+        dialog = gtk_file_chooser_dialog_new(title, NULL,
                 GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL,
                 GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
 
         /* Set multiple selection mode, that is allowed only in OPEN action */
         if (multiple) {
-            fp_gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog),
+            gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog),
                     multiple);
         }
     }
@@ -247,7 +247,7 @@
     /* Set the directory */
     if (jdir != NULL) {
         const char *dir = (*env)->GetStringUTFChars(env, jdir, 0);
-        fp_gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir);
+        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir);
         (*env)->ReleaseStringUTFChars(env, jdir, dir);
     }
 
@@ -255,43 +255,43 @@
     if (jfile != NULL) {
         const char *filename = (*env)->GetStringUTFChars(env, jfile, 0);
         if (mode == java_awt_FileDialog_SAVE) {
-            fp_gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename);
+            gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename);
         } else {
-            fp_gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), filename);
+            gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), filename);
         }
         (*env)->ReleaseStringUTFChars(env, jfile, filename);
     }
 
     /* Set the file filter */
     if (jfilter != NULL) {
-        filter = fp_gtk_file_filter_new();
-        fp_gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME,
+        filter = gtk_file_filter_new();
+        gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME,
                 filenameFilterCallback, jpeer, NULL);
-        fp_gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
+        gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
     }
 
     /* Other Properties */
-    if (fp_gtk_check_version(2, 8, 0) == NULL) {
-        fp_gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(
+    if (gtk_check_version(2, 8, 0) == NULL) {
+        gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(
                 dialog), TRUE);
     }
 
     /* Set the initial location */
     if (x >= 0 && y >= 0) {
-        fp_gtk_window_move((GtkWindow*)dialog, (gint)x, (gint)y);
+        gtk_window_move((GtkWindow*)dialog, (gint)x, (gint)y);
 
         // NOTE: it doesn't set the initial size for the file chooser
         // as it seems like the file chooser overrides the size internally
     }
 
-    fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
+    g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
             handle_response), jpeer);
 
     (*env)->SetLongField(env, jpeer, widgetFieldID, ptr_to_jlong(dialog));
 
-    fp_gtk_widget_show(dialog);
+    gtk_widget_show(dialog);
 
-    fp_gtk_main();
-    fp_gdk_threads_leave();
+    gtk_main();
+    gdk_threads_leave();
 }
 
--- a/src/solaris/native/sun/awt/swing_GTKEngine.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/swing_GTKEngine.c	Tue Aug 22 02:03:52 2017 +0100
@@ -38,10 +38,10 @@
         jint widget_type, jint state, jint shadow_type, jstring detail,
         jint x, jint y, jint w, jint h, jint arrow_type)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_arrow(widget_type, state, shadow_type, getStrFor(env, detail),
             x, y, w, h, arrow_type, TRUE);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -56,10 +56,10 @@
         jint x, jint y, jint w, jint h,
         jint synth_state, jint dir)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_box(widget_type, state, shadow_type, getStrFor(env, detail),
                    x, y, w, h, synth_state, dir);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -74,10 +74,10 @@
         jint x, jint y, jint w, jint h,
         jint gap_side, jint gap_x, jint gap_w)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_box_gap(widget_type, state, shadow_type, getStrFor(env, detail),
             x, y, w, h, gap_side, gap_x, gap_w);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -91,10 +91,10 @@
         jint widget_type, jint synth_state, jstring detail,
         jint x, jint y, jint w, jint h)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_check(widget_type, synth_state, getStrFor(env, detail),
                      x, y, w, h);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -108,10 +108,10 @@
         jint widget_type, jint state, jstring detail,
         jint x, jint y, jint w, jint h, jint expander_style)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_expander(widget_type, state, getStrFor(env, detail),
             x, y, w, h, expander_style);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -125,10 +125,10 @@
         jint widget_type, jint state, jint shadow_type, jstring detail,
         jint x, jint y, jint w, jint h, jint placement)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_extension(widget_type, state, shadow_type,
             getStrFor(env, detail), x, y, w, h, placement);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -142,10 +142,10 @@
         jint widget_type, jint state, jint shadow_type, jstring detail,
         jint x, jint y, jint w, jint h, jboolean has_focus)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_flat_box(widget_type, state, shadow_type,
             getStrFor(env, detail), x, y, w, h, has_focus);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -159,10 +159,10 @@
         jint widget_type, jint state, jstring detail,
         jint x, jint y, jint w, jint h)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_focus(widget_type, state, getStrFor(env, detail),
             x, y, w, h);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -176,10 +176,10 @@
         jint widget_type, jint state, jint shadow_type, jstring detail,
         jint x, jint y, jint w, jint h, jint orientation)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_handle(widget_type, state, shadow_type, getStrFor(env, detail),
             x, y, w, h, orientation);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -193,10 +193,10 @@
         jint widget_type, jint state, jstring detail,
         jint x, jint y, jint w, jint h)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_hline(widget_type, state, getStrFor(env, detail),
             x, y, w, h);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -210,10 +210,10 @@
         jint widget_type, jint synth_state, jstring detail,
         jint x, jint y, jint w, jint h)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_option(widget_type, synth_state, getStrFor(env, detail),
                       x, y, w, h);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -228,10 +228,10 @@
         jint x, jint y, jint w, jint h,
         jint synth_state, jint dir)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_shadow(widget_type, state, shadow_type, getStrFor(env, detail),
                       x, y, w, h, synth_state, dir);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -245,10 +245,10 @@
         jint widget_type, jint state, jint shadow_type, jstring detail,
         jint x, jint y, jint w, jint h, jint orientation)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_slider(widget_type, state, shadow_type, getStrFor(env, detail),
             x, y, w, h, orientation);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -262,10 +262,10 @@
         jint widget_type, jint state, jstring detail,
         jint x, jint y, jint w, jint h)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_paint_vline(widget_type, state, getStrFor(env, detail),
             x, y, w, h);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -278,9 +278,9 @@
         JNIEnv *env, jobject this, jint widget_type, jint state,
         jint x, jint y, jint w, jint h)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk_paint_background(widget_type, state, x, y, w, h);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -292,9 +292,9 @@
 Java_com_sun_java_swing_plaf_gtk_GTKEngine_nativeStartPainting(
         JNIEnv *env, jobject this, jint w, jint h)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_init_painting(env, w, h);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
 
 /*
@@ -308,9 +308,9 @@
 {
     jint transparency;
     gint *buffer = (gint*) (*env)->GetPrimitiveArrayCritical(env, dest, 0);
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     transparency = gtk2_copy_image(buffer, width, height);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
     (*env)->ReleasePrimitiveArrayCritical(env, dest, buffer, 0);
     return transparency;
 }
@@ -336,9 +336,9 @@
         JNIEnv *env, jobject this, jint property)
 {
     jobject obj;
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     obj = gtk2_get_setting(env, property);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
     return obj;
 }
 
@@ -352,7 +352,7 @@
         JNIEnv *env, jobject this, jint widget_type,
         jdouble value, jdouble min, jdouble max, jdouble visible)
 {
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     gtk2_set_range_value(widget_type, value, min, max, visible);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
 }
--- a/src/solaris/native/sun/awt/swing_GTKStyle.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/awt/swing_GTKStyle.c	Tue Aug 22 02:03:52 2017 +0100
@@ -37,9 +37,9 @@
     JNIEnv *env, jclass klass, jint widget_type)
 {
     jint ret;
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     ret = gtk2_get_xthickness(env, widget_type);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
     return ret;
 }
 
@@ -53,9 +53,9 @@
     JNIEnv *env, jclass klass, jint widget_type)
 {
     jint ret;
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     ret = gtk2_get_ythickness(env, widget_type);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
     return ret;
 }
 
@@ -70,9 +70,9 @@
     jint state_type, jint type_id)
 {
     jint ret;
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     ret = gtk2_get_color_for_state(env, widget_type, state_type, type_id);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
     return ret;
 }
 
@@ -86,9 +86,9 @@
     JNIEnv *env, jclass klass, jint widget_type, jstring key)
 {
     jobject ret;
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     ret = gtk2_get_class_value(env, widget_type, key);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
     return ret;
 }
 
@@ -102,8 +102,8 @@
     JNIEnv *env, jclass klass, jint widget_type)
 {
     jstring ret;
-    fp_gdk_threads_enter();
+    gdk_threads_enter();
     ret = gtk2_get_pango_font_name(env, widget_type);
-    fp_gdk_threads_leave();
+    gdk_threads_leave();
     return ret;
 }
--- a/src/solaris/native/sun/net/spi/DefaultProxySelector.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/net/spi/DefaultProxySelector.c	Tue Aug 22 02:03:52 2017 +0100
@@ -26,10 +26,8 @@
 #include "jni.h"
 #include "jni_util.h"
 #include "jvm.h"
-#include "jvm_md.h"
 #include "jlong.h"
 #include "sun_net_spi_DefaultProxySelector.h"
-#include <dlfcn.h>
 #include <stdio.h>
 #if defined(__linux__) || defined(_ALLBSD_SOURCE)
 #include <string.h>
@@ -37,11 +35,34 @@
 #include <strings.h>
 #endif
 
+#include <gconf/gconf-client.h>
+
+#ifdef USE_SYSTEM_GSETTINGS
+#include <gio/gio.h>
+#else
+#include <gio_fp.h>
+#endif
+
+#ifndef USE_SYSTEM_GCONF
+#include <gconf_fp.h>
+#endif
+
+static jclass proxy_class;
+static jclass isaddr_class;
+static jclass ptype_class;
+static jmethodID isaddr_createUnresolvedID;
+static jmethodID proxy_ctrID;
+static jfieldID pr_no_proxyID;
+static jfieldID ptype_httpID;
+static jfieldID ptype_socksID;
+
+static int gconf_ver = 0;
+static void* gconf_client = NULL;
+static jboolean use_gio;
+
+#define CHECK_NULL(X) { if ((X) == NULL) fprintf (stderr,"JNI errror at line %d\n", __LINE__); }
+
 /**
- * These functions are used by the sun.net.spi.DefaultProxySelector class
- * to access some platform specific settings.
- * This is the Solaris/Linux Gnome 2.x code using the GConf-2 library.
- * Everything is loaded dynamically so no hard link with any library exists.
  * The GConf-2 settings used are:
  * - /system/http_proxy/use_http_proxy          boolean
  * - /system/http_proxy/use_authentcation       boolean
@@ -60,33 +81,7 @@
  * - /system/proxy/no_proxy_for                 list
  * - /system/proxy/gopher_host                  string
  * - /system/proxy/gopher_port                  int
- */
-typedef void* gconf_client_get_default_func();
-typedef char* gconf_client_get_string_func(void *, char *, void**);
-typedef int   gconf_client_get_int_func(void*, char *, void**);
-typedef int   gconf_client_get_bool_func(void*, char *, void**);
-typedef int   gconf_init_func(int, char**, void**);
-typedef void  g_type_init_func ();
-gconf_client_get_default_func* my_get_default_func = NULL;
-gconf_client_get_string_func* my_get_string_func = NULL;
-gconf_client_get_int_func* my_get_int_func = NULL;
-gconf_client_get_bool_func* my_get_bool_func = NULL;
-gconf_init_func* my_gconf_init_func = NULL;
-g_type_init_func* my_g_type_init_func = NULL;
-
-static jclass proxy_class;
-static jclass isaddr_class;
-static jclass ptype_class;
-static jmethodID isaddr_createUnresolvedID;
-static jmethodID proxy_ctrID;
-static jfieldID pr_no_proxyID;
-static jfieldID ptype_httpID;
-static jfieldID ptype_socksID;
-
-static int gconf_ver = 0;
-static void* gconf_client = NULL;
-
-#define CHECK_NULL(X) { if ((X) == NULL) fprintf (stderr,"JNI errror at line %d\n", __LINE__); }
+*/
 
 /*
  * Class:     sun_net_spi_DefaultProxySelector
@@ -108,44 +103,26 @@
   ptype_socksID = (*env)->GetStaticFieldID(env, ptype_class, "SOCKS", "Ljava/net/Proxy$Type;");
   isaddr_createUnresolvedID = (*env)->GetStaticMethodID(env, isaddr_class, "createUnresolved", "(Ljava/lang/String;I)Ljava/net/InetSocketAddress;");
 
-  /**
-   * Let's try to load le GConf-2 library
-   */
-  if (dlopen(JNI_LIB_NAME("gconf-2"), RTLD_GLOBAL | RTLD_LAZY) != NULL ||
-      dlopen(VERSIONED_JNI_LIB_NAME("gconf-2", "4"),
-             RTLD_GLOBAL | RTLD_LAZY) != NULL) {
+#ifdef USE_SYSTEM_GSETTINGS
+  use_gio = JNI_TRUE;
+  g_type_init ();
+#else
+  use_gio = gsettings_init();
+#endif
+
+  if (use_gio == JNI_TRUE) {
+    return use_gio;
+  } else {
+#ifdef USE_SYSTEM_GCONF
     gconf_ver = 2;
+    return JNI_TRUE;
+#else
+    return init_gconf (&gconf_ver, &gconf_client);
+#endif
   }
-  if (gconf_ver > 0) {
-    /*
-     * Now let's get pointer to the functions we need.
-     */
-    my_g_type_init_func = (g_type_init_func*) dlsym(RTLD_DEFAULT, "g_type_init");
-    my_get_default_func = (gconf_client_get_default_func*) dlsym(RTLD_DEFAULT, "gconf_client_get_default");
-    if (my_g_type_init_func != NULL && my_get_default_func != NULL) {
-      /**
-       * Try to connect to GConf.
-       */
-      (*my_g_type_init_func)();
-      gconf_client = (*my_get_default_func)();
-      if (gconf_client != NULL) {
-        my_get_string_func = (gconf_client_get_string_func*) dlsym(RTLD_DEFAULT, "gconf_client_get_string");
-        my_get_int_func = (gconf_client_get_int_func*) dlsym(RTLD_DEFAULT, "gconf_client_get_int");
-        my_get_bool_func = (gconf_client_get_bool_func*) dlsym(RTLD_DEFAULT, "gconf_client_get_bool");
-        if (my_get_int_func != NULL && my_get_string_func != NULL &&
-            my_get_bool_func != NULL) {
-          /**
-           * We did get all we need. Let's enable the System Proxy Settings.
-           */
-          return JNI_TRUE;
-        }
-      }
-    }
-  }
-  return JNI_FALSE;
+
 }
 
-
 /*
  * Class:     sun_net_spi_DefaultProxySelector
  * Method:    getSystemProxy
@@ -160,176 +137,254 @@
   char *phost = NULL;
   char *mode = NULL;
   int pport = 0;
-  int use_proxy = 0;
-  int use_same_proxy = 0;
+  gboolean use_proxy = 0;
+  gboolean use_same_proxy = 0;
   const char* urlhost;
   jobject isa = NULL;
   jobject proxy = NULL;
   jobject type_proxy = NULL;
   jobject no_proxy = NULL;
-  const char *cproto;
   jboolean isCopy;
 
-  if (gconf_ver > 0) {
-    if (gconf_client == NULL) {
-      (*my_g_type_init_func)();
-      gconf_client = (*my_get_default_func)();
-    }
-    if (gconf_client != NULL) {
-      cproto = (*env)->GetStringUTFChars(env, proto, &isCopy);
-      if (cproto != NULL) {
-        /**
-         * We will have to check protocol by protocol as they do use different
-         * entries.
-         */
+  if (use_gio == JNI_TRUE || gconf_ver > 0) {
+    jstring jhost;
+    const char *cproto;
+
+    cproto = (*env)->GetStringUTFChars(env, proto, &isCopy);
+
+    if (use_gio == JNI_TRUE && cproto != NULL) {
+      GSettings *settings, *child_settings;
+      gchar **ignored;
+
+      settings = g_settings_new ("org.gnome.system.proxy");
+
+      if (settings != NULL) {
+	mode = g_settings_get_string (settings, "mode");
+	use_proxy = (mode != NULL && strcasecmp (mode, "manual") == 0);
 
-        use_same_proxy = (*my_get_bool_func)(gconf_client, "/system/http_proxy/use_same_proxy", NULL);
-        if (use_same_proxy) {
-          use_proxy = (*my_get_bool_func)(gconf_client, "/system/http_proxy/use_http_proxy", NULL);
-          if (use_proxy) {
-            phost = (*my_get_string_func)(gconf_client, "/system/http_proxy/host", NULL);
-            pport = (*my_get_int_func)(gconf_client, "/system/http_proxy/port", NULL);
-          }
-        }
+	if (use_proxy) {
+	  child_settings = g_settings_get_child (settings, cproto);
+	  if (child_settings != NULL) {
+	    phost = g_settings_get_string (child_settings, "host");
+	    pport = g_settings_get_int (child_settings, "port");
+	    g_object_unref (child_settings);
+	  }
+
+	  /** No specific proxy specified; check fallbacks **/
+
+	  /** A http proxy is used for https if https is not set **/
+	  if (phost == NULL || strlen(phost) == 0 || pport == 0) {
+	    if (strcasecmp(cproto, "https") == 0) {
+	      child_settings = g_settings_get_child (settings, "http");
+	      if (child_settings != NULL) {
+		phost = g_settings_get_string (child_settings, "host");
+		pport = g_settings_get_int (child_settings, "port");
+		g_object_unref (child_settings);
+	      }
+	    }
+	  }
 
-        /**
-         * HTTP:
-         * /system/http_proxy/use_http_proxy (boolean)
-         * /system/http_proxy/host (string)
-         * /system/http_proxy/port (integer)
-         */
-        if (strcasecmp(cproto, "http") == 0) {
-          use_proxy = (*my_get_bool_func)(gconf_client, "/system/http_proxy/use_http_proxy", NULL);
-          if (use_proxy) {
-            if (!use_same_proxy) {
-              phost = (*my_get_string_func)(gconf_client, "/system/http_proxy/host", NULL);
-              pport = (*my_get_int_func)(gconf_client, "/system/http_proxy/port", NULL);
-            }
-            CHECK_NULL(type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_httpID));
-          }
-        }
+	  /** If we requested something else, but have SOCKS, use that **/
+	  if (phost == NULL || strlen(phost) == 0 || pport == 0) {
+	    if (strcasecmp(cproto, "socks") != 0) {
+	      child_settings = g_settings_get_child (settings, "socks");
+	      if (child_settings != NULL) {
+		phost = g_settings_get_string (child_settings, "host");
+		pport = g_settings_get_int (child_settings, "port");
+		g_object_unref (child_settings);
+	      }
+	    }
+	  }
+
+	  /** No proxy set at all **/
+	  if (phost == NULL || strlen(phost) == 0 || pport == 0) {
+	    use_proxy = 0;
+	  }
+	}
 
-        /**
-         * HTTPS:
-         * /system/proxy/mode (string) [ "manual" means use proxy settings ]
-         * /system/proxy/secure_host (string)
-         * /system/proxy/secure_port (integer)
-         */
-        if (strcasecmp(cproto, "https") == 0) {
-          mode =  (*my_get_string_func)(gconf_client, "/system/proxy/mode", NULL);
-          if (mode != NULL && (strcasecmp(mode,"manual") == 0)) {
-            if (!use_same_proxy) {
-              phost = (*my_get_string_func)(gconf_client, "/system/proxy/secure_host", NULL);
-              pport = (*my_get_int_func)(gconf_client, "/system/proxy/secure_port", NULL);
-            }
-            use_proxy = (phost != NULL);
-            if (use_proxy)
-              type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_httpID);
-          }
-        }
+	/** Disable proxy if this is listed as an ignored host **/
+	ignored = g_settings_get_strv (settings, "ignore-hosts");
+	if (ignored != NULL) {
+	  char **ptr;
+	  size_t urlhost_len, s_len;
+	  
+	  urlhost = (*env)->GetStringUTFChars(env, host, &isCopy);
+	  urlhost_len = strlen (urlhost);
+	  if (urlhost != NULL) {
+	    for (ptr = ignored; *ptr != NULL; ++ptr) {
+	      s_len = strlen (*ptr);
+	      if (s_len <= urlhost_len) {
+		if (strcasecmp (urlhost + (urlhost_len - s_len), *ptr) == 0) {
+		  use_proxy = 0;
+		  break;
+		}
+	      }
+	    }
+	    if (isCopy == JNI_TRUE)
+	      (*env)->ReleaseStringUTFChars(env, host, urlhost);
+	  }
+	
+	  g_strfreev (ignored);
+	}
 
-        /**
-         * FTP:
-         * /system/proxy/mode (string) [ "manual" means use proxy settings ]
-         * /system/proxy/ftp_host (string)
-         * /system/proxy/ftp_port (integer)
-         */
-        if (strcasecmp(cproto, "ftp") == 0) {
-          mode =  (*my_get_string_func)(gconf_client, "/system/proxy/mode", NULL);
-          if (mode != NULL && (strcasecmp(mode,"manual") == 0)) {
-            if (!use_same_proxy) {
-              phost = (*my_get_string_func)(gconf_client, "/system/proxy/ftp_host", NULL);
-              pport = (*my_get_int_func)(gconf_client, "/system/proxy/ftp_port", NULL);
-            }
-            use_proxy = (phost != NULL);
-            if (use_proxy)
-              type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_httpID);
-          }
-        }
+	g_object_unref (settings);
+      }
+    } else {
+      if (gconf_client == NULL) {
+#ifdef NATIVE_SUPPORT_DEBUG
+	printf("g_type_init=%p\n", g_type_init);
+#endif
+	g_type_init();
+	gconf_client = gconf_client_get_default();
+      }
+
+      if (gconf_client != NULL) {
+	char *noproxyfor;
+	char *s;
 
-        /**
-         * GOPHER:
-         * /system/proxy/mode (string) [ "manual" means use proxy settings ]
-         * /system/proxy/gopher_host (string)
-         * /system/proxy/gopher_port (integer)
-         */
-        if (strcasecmp(cproto, "gopher") == 0) {
-          mode =  (*my_get_string_func)(gconf_client, "/system/proxy/mode", NULL);
-          if (mode != NULL && (strcasecmp(mode,"manual") == 0)) {
-            if (!use_same_proxy) {
-              phost = (*my_get_string_func)(gconf_client, "/system/proxy/gopher_host", NULL);
-              pport = (*my_get_int_func)(gconf_client, "/system/proxy/gopher_port", NULL);
-            }
-            use_proxy = (phost != NULL);
-            if (use_proxy)
-              type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_httpID);
-          }
-        }
-
-        /**
-         * SOCKS:
-         * /system/proxy/mode (string) [ "manual" means use proxy settings ]
-         * /system/proxy/socks_host (string)
-         * /system/proxy/socks_port (integer)
-         */
-        if (strcasecmp(cproto, "socks") == 0) {
-          mode =  (*my_get_string_func)(gconf_client, "/system/proxy/mode", NULL);
-          if (mode != NULL && (strcasecmp(mode,"manual") == 0)) {
-            if (!use_same_proxy) {
-              phost = (*my_get_string_func)(gconf_client, "/system/proxy/socks_host", NULL);
-              pport = (*my_get_int_func)(gconf_client, "/system/proxy/socks_port", NULL);
-            }
-            use_proxy = (phost != NULL);
-            if (use_proxy)
-              type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_socksID);
-          }
-        }
+	if (cproto != NULL) {
+	  /**
+	   * We will have to check protocol by protocol as they do use different
+	   * entries.
+	   */
+	  
+	  use_same_proxy = gconf_client_get_bool (gconf_client, "/system/http_proxy/use_same_proxy", NULL);
+	  if (use_same_proxy) {
+	    use_proxy = gconf_client_get_bool (gconf_client, "/system/http_proxy/use_http_proxy", NULL);
+	    if (use_proxy) {
+	      phost = gconf_client_get_string(gconf_client, "/system/http_proxy/host", NULL);
+	      pport = gconf_client_get_int(gconf_client, "/system/http_proxy/port", NULL);
+	    }
+	  }
+	  
+	  /**
+	   * HTTP:
+	   * /system/http_proxy/use_http_proxy (boolean)
+	   * /system/http_proxy/host (string)
+	   * /system/http_proxy/port (integer)
+	   */
+	  if (strcasecmp(cproto, "http") == 0) {
+	    use_proxy = gconf_client_get_bool (gconf_client, "/system/http_proxy/use_http_proxy", NULL);
+	    if (use_proxy) {
+	      if (!use_same_proxy) {
+		phost = gconf_client_get_string(gconf_client, "/system/http_proxy/host", NULL);
+		pport = gconf_client_get_int(gconf_client, "/system/http_proxy/port", NULL);
+	      }
+	    }
+	  }
+	  
+	  /**
+	   * HTTPS:
+	   * /system/proxy/mode (string) [ "manual" means use proxy settings ]
+	   * /system/proxy/secure_host (string)
+	   * /system/proxy/secure_port (integer)
+	   */
+	  if (strcasecmp(cproto, "https") == 0) {
+	    mode =  gconf_client_get_string(gconf_client, "/system/proxy/mode", NULL);
+	    if (mode != NULL && (strcasecmp(mode,"manual") == 0)) {
+	      if (!use_same_proxy) {
+		phost = gconf_client_get_string(gconf_client, "/system/proxy/secure_host", NULL);
+		pport = gconf_client_get_int(gconf_client, "/system/proxy/secure_port", NULL);
+	      }
+	      use_proxy = (phost != NULL);
+	    }
+	  }
+	  
+	  /**
+	   * FTP:
+	   * /system/proxy/mode (string) [ "manual" means use proxy settings ]
+	   * /system/proxy/ftp_host (string)
+	   * /system/proxy/ftp_port (integer)
+	   */
+	  if (strcasecmp(cproto, "ftp") == 0) {
+	    mode =  gconf_client_get_string(gconf_client, "/system/proxy/mode", NULL);
+	    if (mode != NULL && (strcasecmp(mode,"manual") == 0)) {
+	      if (!use_same_proxy) {
+		phost = gconf_client_get_string(gconf_client, "/system/proxy/ftp_host", NULL);
+		pport = gconf_client_get_int(gconf_client, "/system/proxy/ftp_port", NULL);
+	      }
+	      use_proxy = (phost != NULL);
+	    }
+	  }
+	  
+	  /**
+	   * GOPHER:
+	   * /system/proxy/mode (string) [ "manual" means use proxy settings ]
+	   * /system/proxy/gopher_host (string)
+	   * /system/proxy/gopher_port (integer)
+	   */
+	  if (strcasecmp(cproto, "gopher") == 0) {
+	    mode =  gconf_client_get_string(gconf_client, "/system/proxy/mode", NULL);
+	    if (mode != NULL && (strcasecmp(mode,"manual") == 0)) {
+	      if (!use_same_proxy) {
+		phost = gconf_client_get_string(gconf_client, "/system/proxy/gopher_host", NULL);
+		pport = gconf_client_get_int(gconf_client, "/system/proxy/gopher_port", NULL);
+	      }
+	      use_proxy = (phost != NULL);
+	    }
+	  }
+	  
+	  /**
+	   * SOCKS:
+	   * /system/proxy/mode (string) [ "manual" means use proxy settings ]
+	   * /system/proxy/socks_host (string)
+	   * /system/proxy/socks_port (integer)
+	   */
+	  if (strcasecmp(cproto, "socks") == 0) {
+	    mode =  gconf_client_get_string(gconf_client, "/system/proxy/mode", NULL);
+	    if (mode != NULL && (strcasecmp(mode,"manual") == 0)) {
+	      if (!use_same_proxy) {
+		phost = gconf_client_get_string(gconf_client, "/system/proxy/socks_host", NULL);
+		pport = gconf_client_get_int(gconf_client, "/system/proxy/socks_port", NULL);
+	      }
+	      use_proxy = (phost != NULL);
+	    }
+	  }
 
-        if (isCopy == JNI_TRUE)
-          (*env)->ReleaseStringUTFChars(env, proto, cproto);
-
-        if (use_proxy && (phost != NULL)) {
-          jstring jhost;
-          char *noproxyfor;
-          char *s;
-
-          /**
-           * check for the exclude list (aka "No Proxy For" list).
-           * It's a list of comma separated suffixes (e.g. domain name).
-           */
-          noproxyfor = (*my_get_string_func)(gconf_client, "/system/proxy/no_proxy_for", NULL);
-          if (noproxyfor != NULL) {
-            char *tmpbuf[512];
-
-            s = strtok_r(noproxyfor, ", ", tmpbuf);
-            urlhost = (*env)->GetStringUTFChars(env, host, &isCopy);
-            if (urlhost != NULL) {
-              while (s != NULL && strlen(s) <= strlen(urlhost)) {
-                if (strcasecmp(urlhost+(strlen(urlhost) - strlen(s)), s) == 0) {
-                  /**
-                   * the URL host name matches with one of the sufixes,
-                   * therefore we have to use a direct connection.
-                   */
-                  use_proxy = 0;
-                  break;
-                }
-                s = strtok_r(NULL, ", ", tmpbuf);
-              }
-              if (isCopy == JNI_TRUE)
-                (*env)->ReleaseStringUTFChars(env, host, urlhost);
-            }
-          }
-          if (use_proxy) {
-            jhost = (*env)->NewStringUTF(env, phost);
-            isa = (*env)->CallStaticObjectMethod(env, isaddr_class, isaddr_createUnresolvedID, jhost, pport);
-            proxy = (*env)->NewObject(env, proxy_class, proxy_ctrID, type_proxy, isa);
-            return proxy;
-          }
-        }
+	}
+	noproxyfor = gconf_client_get_string(gconf_client, "/system/proxy/no_proxy_for", NULL);
+	
+	/**
+	 * check for the exclude list (aka "No Proxy For" list).
+	 * It's a list of comma separated suffixes (e.g. domain name).
+	 */
+	if (noproxyfor != NULL) {
+	  char *tmpbuf[512];
+	  
+	  s = strtok_r(noproxyfor, ", ", tmpbuf);
+	  urlhost = (*env)->GetStringUTFChars(env, host, &isCopy);
+	  if (urlhost != NULL) {
+	    while (s != NULL && strlen(s) <= strlen(urlhost)) {
+	      if (strcasecmp(urlhost+(strlen(urlhost) - strlen(s)), s) == 0) {
+		/**
+		 * the URL host name matches with one of the sufixes,
+		 * therefore we have to use a direct connection.
+		 */
+		use_proxy = 0;
+		break;
+	      }
+	      s = strtok_r(NULL, ", ", tmpbuf);
+	    }
+	    if (isCopy == JNI_TRUE)
+	      (*env)->ReleaseStringUTFChars(env, host, urlhost);
+	  }
+	}
       }
+    } 
+    if (isCopy == JNI_TRUE)
+      (*env)->ReleaseStringUTFChars(env, proto, cproto);
+    g_free (mode);
+    
+    if (use_proxy && (phost != NULL)) {
+      CHECK_NULL(type_proxy = (*env)->GetStaticObjectField(env, ptype_class, ptype_httpID));
+      jhost = (*env)->NewStringUTF(env, phost);
+      isa = (*env)->CallStaticObjectMethod(env, isaddr_class, isaddr_createUnresolvedID, jhost, pport);
+      proxy = (*env)->NewObject(env, proxy_class, proxy_ctrID, type_proxy, isa);
+      g_free (phost);
+      return proxy;
     }
   }
-
-  CHECK_NULL(no_proxy = (*env)->GetStaticObjectField(env, proxy_class, pr_no_proxyID));
-  return no_proxy;
+   
+ CHECK_NULL(no_proxy = (*env)->GetStaticObjectField(env, proxy_class, pr_no_proxyID));
+ return no_proxy;
 }
--- a/src/solaris/native/sun/nio/ch/EPollArrayWrapper.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/nio/ch/EPollArrayWrapper.c	Tue Aug 22 02:03:52 2017 +0100
@@ -40,7 +40,6 @@
   } while((_result == -1) && (errno == EINTR)); \
 } while(0)
 
-
 static int
 iepoll(int epfd, struct epoll_event *events, int numfds, jlong timeout)
 {
--- a/src/solaris/native/sun/nio/ch/Sctp.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/nio/ch/Sctp.h	Tue Aug 22 02:03:52 2017 +0100
@@ -74,19 +74,20 @@
 #include <netinet/in.h>
 #include "jni.h"
 
-//Causes compiler error if not found, should make warning and uncomment
-/*#include <netinet/sctp.h>*/
-
-#ifndef IPPROTO_SCTP
-#define IPPROTO_SCTP    132
-#endif
-
 /* The current version of lksctp does
  * not define the following option that the Java API (optionally) supports */
 #ifndef SCTP_EXPLICIT_EOR
 #define SCTP_EXPLICIT_EOR -1
 #endif
 
+#ifdef USE_SYSTEM_SCTP
+#include <netinet/sctp.h>
+#else
+
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP    132
+#endif
+
 /* Definitions taken from lksctp-tools-1.0.8/src/include/netinet/sctp.h */
 #ifndef SCTP_INITMSG
 
@@ -319,15 +320,25 @@
 typedef int sctp_bindx_func(int sd, struct sockaddr *addrs, int addrcnt, int flags);
 typedef int sctp_peeloff_func(int sock, sctp_assoc_t id);
 
+#endif
 
 #endif /* __linux__ */
 
+#ifdef USE_SYSTEM_SCTP
+#define nio_sctp_getladdrs sctp_getladdrs
+#define nio_sctp_freeladdrs sctp_freeladdrs
+#define nio_sctp_getpaddrs sctp_getpaddrs
+#define nio_sctp_freepaddrs sctp_freepaddrs
+#define nio_sctp_bindx sctp_bindx
+#define nio_sctp_peeloff sctp_peeloff
+#else
 sctp_getladdrs_func* nio_sctp_getladdrs;
 sctp_freeladdrs_func* nio_sctp_freeladdrs;
 sctp_getpaddrs_func* nio_sctp_getpaddrs;
 sctp_freepaddrs_func* nio_sctp_freepaddrs;
 sctp_bindx_func* nio_sctp_bindx;
 sctp_peeloff_func* nio_sctp_peeloff;
+#endif
 
 jboolean loadSocketExtensionFuncs(JNIEnv* env);
 
--- a/src/solaris/native/sun/nio/ch/SctpNet.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/nio/ch/SctpNet.c	Tue Aug 22 02:03:52 2017 +0100
@@ -25,7 +25,10 @@
 
 #include <stdlib.h>
 #include <string.h>
+
+#ifndef USE_SYSTEM_SCTP
 #include <dlfcn.h>
+#endif
 
 #include "Sctp.h"
 #include "jni.h"
@@ -58,6 +61,7 @@
  */
 jboolean loadSocketExtensionFuncs
   (JNIEnv* env) {
+#ifndef USE_SYSTEM_SCTP
     if (dlopen(nativeSctpLib, RTLD_GLOBAL | RTLD_LAZY) == NULL) {
         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
               dlerror());
@@ -105,7 +109,7 @@
               dlerror());
         return JNI_FALSE;
     }
-
+#endif
     funcsLoaded = JNI_TRUE;
     return JNI_TRUE;
 }
--- a/src/solaris/native/sun/nio/fs/GnomeFileTypeDetector.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/nio/fs/GnomeFileTypeDetector.c	Tue Aug 22 02:03:52 2017 +0100
@@ -39,39 +39,14 @@
 #include <string.h>
 #endif
 
-/* Definitions for GIO */
-
-#define G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "standard::content-type"
-
-typedef void* gpointer;
-typedef struct _GFile GFile;
-typedef struct _GFileInfo GFileInfo;
-typedef struct _GCancellable GCancellable;
-typedef struct _GError GError;
-
-typedef enum {
-  G_FILE_QUERY_INFO_NONE = 0
-} GFileQueryInfoFlags;
-
-typedef void (*g_type_init_func)(void);
-typedef void (*g_object_unref_func)(gpointer object);
-typedef GFile* (*g_file_new_for_path_func)(const char* path);
-typedef GFileInfo* (*g_file_query_info_func)(GFile *file,
-    const char *attributes, GFileQueryInfoFlags flags,
-    GCancellable *cancellable, GError **error);
-typedef char* (*g_file_info_get_content_type_func)(GFileInfo *info);
-
-static g_type_init_func g_type_init;
-static g_object_unref_func g_object_unref;
-static g_file_new_for_path_func g_file_new_for_path;
-static g_file_query_info_func g_file_query_info;
-static g_file_info_get_content_type_func g_file_info_get_content_type;
-
+#ifdef USE_SYSTEM_GIO
+#include <gio/gio.h>
+#else
+#include <gio_fp.h>
+#endif
 
 /* Definitions for GNOME VFS */
 
-typedef int gboolean;
-
 typedef gboolean (*gnome_vfs_init_function)(void);
 typedef const char* (*gnome_vfs_mime_type_from_name_function)
     (const char* filename);
@@ -79,51 +54,33 @@
 static gnome_vfs_init_function gnome_vfs_init;
 static gnome_vfs_mime_type_from_name_function gnome_vfs_mime_type_from_name;
 
-
 #include "sun_nio_fs_GnomeFileTypeDetector.h"
 
-
 JNIEXPORT jboolean JNICALL
 Java_sun_nio_fs_GnomeFileTypeDetector_initializeGio
     (JNIEnv* env, jclass this)
 {
-    void* gio_handle;
+    jboolean ret;
+
+#ifdef USE_SYSTEM_GIO
+    ret = JNI_TRUE;
+#else
+    ret = gio_init();
+#endif
 
-    gio_handle = dlopen("libgio-2.0.so", RTLD_LAZY);
-    if (gio_handle == NULL) {
-        gio_handle = dlopen("libgio-2.0.so.0", RTLD_LAZY);
-        if (gio_handle == NULL) {
-            return JNI_FALSE;
-        }
+#ifdef NATIVE_SUPPORT_DEBUG
+    printf("initializeGio: gio_init returned %s\n",
+	   ret == JNI_FALSE ? "false" : "true");
+#endif
+
+    // If there was an error initializing GIO, return false immediately
+    if (ret == JNI_FALSE)
+    {
+        return ret;
     }
 
-    g_type_init = (g_type_init_func)dlsym(gio_handle, "g_type_init");
-    (*g_type_init)();
-
-    g_object_unref = (g_object_unref_func)dlsym(gio_handle, "g_object_unref");
-
-    g_file_new_for_path =
-        (g_file_new_for_path_func)dlsym(gio_handle, "g_file_new_for_path");
-
-    g_file_query_info =
-        (g_file_query_info_func)dlsym(gio_handle, "g_file_query_info");
-
-    g_file_info_get_content_type = (g_file_info_get_content_type_func)
-        dlsym(gio_handle, "g_file_info_get_content_type");
-
-
-    if (g_type_init == NULL ||
-        g_object_unref == NULL ||
-        g_file_new_for_path == NULL ||
-        g_file_query_info == NULL ||
-        g_file_info_get_content_type == NULL)
-    {
-        dlclose(gio_handle);
-        return JNI_FALSE;
-    }
-
-    (*g_type_init)();
-    return JNI_TRUE;
+    g_type_init ();
+    return ret;
 }
 
 JNIEXPORT jbyteArray JNICALL
@@ -133,23 +90,40 @@
     char* path = (char*)jlong_to_ptr(pathAddress);
     GFile* gfile;
     GFileInfo* gfileinfo;
+    GError *error = NULL;
     jbyteArray result = NULL;
 
-    gfile = (*g_file_new_for_path)(path);
-    gfileinfo = (*g_file_query_info)(gfile, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
-        G_FILE_QUERY_INFO_NONE, NULL, NULL);
-    if (gfileinfo != NULL) {
-        const char* mime = (*g_file_info_get_content_type)(gfileinfo);
-        if (mime != NULL) {
-            jsize len = strlen(mime);
-            result = (*env)->NewByteArray(env, len);
-            if (result != NULL) {
-                (*env)->SetByteArrayRegion(env, result, 0, len, (jbyte*)mime);
-            }
-        }
-        (*g_object_unref)(gfileinfo);
+    gfile = g_file_new_for_path (path);
+    gfileinfo = g_file_query_info (gfile, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+        G_FILE_QUERY_INFO_NONE, NULL, &error);
+
+#ifdef NATIVE_SUPPORT_DEBUG
+    printf("gfile=%p, gfileinfo=%p\n", gfile, gfileinfo);
+#endif
+
+    if (error != NULL) {
+	JNU_ThrowIOException(env, error->message);
+	g_object_unref (gfile);
+	g_error_free (error);
+	return NULL;
     }
-    (*g_object_unref)(gfile);
+
+    const char* mime = g_file_info_get_content_type (gfileinfo);
+
+#ifdef NATIVE_SUPPORT_DEBUG
+    printf("mime=%p(%s)\n", mime, mime);
+#endif
+
+    if (mime != NULL) {
+	jsize len = strlen(mime);
+	result = (*env)->NewByteArray(env, len);
+	if (result != NULL) {
+	    (*env)->SetByteArrayRegion(env, result, 0, len, (jbyte*)mime);
+	}
+    }
+
+    g_object_unref (gfileinfo);
+    g_object_unref (gfile);
 
     return result;
 }
--- a/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c	Tue Aug 22 02:03:52 2017 +0100
@@ -36,15 +36,12 @@
 
 #include "sun_nio_fs_LinuxNativeDispatcher.h"
 
-typedef size_t fgetxattr_func(int fd, const char* name, void* value, size_t size);
-typedef int fsetxattr_func(int fd, const char* name, void* value, size_t size, int flags);
-typedef int fremovexattr_func(int fd, const char* name);
-typedef int flistxattr_func(int fd, char* list, size_t size);
-
-fgetxattr_func* my_fgetxattr_func = NULL;
-fsetxattr_func* my_fsetxattr_func = NULL;
-fremovexattr_func* my_fremovexattr_func = NULL;
-flistxattr_func* my_flistxattr_func = NULL;
+#ifdef COMPILE_AGAINST_SYSCALLS
+#include <sys/types.h>
+#include <attr/xattr.h>
+#else
+#include <syscalls_fp.h>
+#endif
 
 static jfieldID entry_name;
 static jfieldID entry_dir;
@@ -62,10 +59,9 @@
 JNIEXPORT void JNICALL
 Java_sun_nio_fs_LinuxNativeDispatcher_init(JNIEnv *env, jclass clazz)
 {
-    my_fgetxattr_func = (fgetxattr_func*)dlsym(RTLD_DEFAULT, "fgetxattr");
-    my_fsetxattr_func = (fsetxattr_func*)dlsym(RTLD_DEFAULT, "fsetxattr");
-    my_fremovexattr_func = (fremovexattr_func*)dlsym(RTLD_DEFAULT, "fremovexattr");
-    my_flistxattr_func = (flistxattr_func*)dlsym(RTLD_DEFAULT, "flistxattr");
+#ifndef COMPILE_AGAINST_SYSCALLS
+    syscalls_init();
+#endif
 
     clazz = (*env)->FindClass(env, "sun/nio/fs/UnixMountEntry");
     if (clazz == NULL)
@@ -85,12 +81,7 @@
     const char* name = jlong_to_ptr(nameAddress);
     void* value = jlong_to_ptr(valueAddress);
 
-    if (my_fgetxattr_func == NULL) {
-        errno = ENOTSUP;
-    } else {
-        /* EINTR not documented */
-        res = (*my_fgetxattr_func)(fd, name, value, valueLen);
-    }
+    res = fgetxattr (fd, name, value, valueLen);
     if (res == (size_t)-1)
         throwUnixException(env, errno);
     return (jint)res;
@@ -104,12 +95,7 @@
     const char* name = jlong_to_ptr(nameAddress);
     void* value = jlong_to_ptr(valueAddress);
 
-    if (my_fsetxattr_func == NULL) {
-        errno = ENOTSUP;
-    } else {
-        /* EINTR not documented */
-        res = (*my_fsetxattr_func)(fd, name, value, valueLen, 0);
-    }
+    res = fsetxattr (fd, name, value, valueLen, 0);
     if (res == -1)
         throwUnixException(env, errno);
 }
@@ -121,12 +107,7 @@
     int res = -1;
     const char* name = jlong_to_ptr(nameAddress);
 
-    if (my_fremovexattr_func == NULL) {
-        errno = ENOTSUP;
-    } else {
-        /* EINTR not documented */
-        res = (*my_fremovexattr_func)(fd, name);
-    }
+    res = fremovexattr (fd, name);
     if (res == -1)
         throwUnixException(env, errno);
 }
@@ -138,12 +119,7 @@
     size_t res = -1;
     char* list = jlong_to_ptr(listAddress);
 
-    if (my_flistxattr_func == NULL) {
-        errno = ENOTSUP;
-    } else {
-        /* EINTR not documented */
-        res = (*my_flistxattr_func)(fd, list, (size_t)size);
-    }
+    res = flistxattr (fd, list, (size_t)size);
     if (res == (size_t)-1)
         throwUnixException(env, errno);
     return (jint)res;
--- a/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c	Tue Aug 22 02:03:52 2017 +0100
@@ -23,6 +23,13 @@
  * questions.
  */
 
+/**
+ * fstatat in glibc requires _ATFILE_SOURCE to be defined.
+ */
+#if defined(__linux__)
+#define _ATFILE_SOURCE
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <limits.h>
@@ -70,6 +77,10 @@
 
 #include "sun_nio_fs_UnixNativeDispatcher.h"
 
+#ifndef COMPILE_AGAINST_SYSCALLS
+#include <syscalls_fp.h>
+#endif
+
 /**
  * Size of password or group entry when not available via sysconf
  */
@@ -118,51 +129,6 @@
 #endif
 
 /**
- * System calls that may not be available at run time.
- */
-typedef int openat64_func(int, const char *, int, ...);
-typedef int fstatat64_func(int, const char *, struct stat64 *, int);
-typedef int unlinkat_func(int, const char*, int);
-typedef int renameat_func(int, const char*, int, const char*);
-typedef int futimesat_func(int, const char *, const struct timeval *);
-typedef DIR* fdopendir_func(int);
-
-static openat64_func* my_openat64_func = NULL;
-static fstatat64_func* my_fstatat64_func = NULL;
-static unlinkat_func* my_unlinkat_func = NULL;
-static renameat_func* my_renameat_func = NULL;
-static futimesat_func* my_futimesat_func = NULL;
-static fdopendir_func* my_fdopendir_func = NULL;
-
-/**
- * fstatat missing from glibc on Linux. Temporary workaround
- * for x86/x64.
- */
-#if defined(__linux__) && defined(__i386)
-#define FSTATAT64_SYSCALL_AVAILABLE
-static int fstatat64_wrapper(int dfd, const char *path,
-                             struct stat64 *statbuf, int flag)
-{
-    #ifndef __NR_fstatat64
-    #define __NR_fstatat64  300
-    #endif
-    return syscall(__NR_fstatat64, dfd, path, statbuf, flag);
-}
-#endif
-
-#if defined(__linux__) && defined(__x86_64__)
-#define FSTATAT64_SYSCALL_AVAILABLE
-static int fstatat64_wrapper(int dfd, const char *path,
-                             struct stat64 *statbuf, int flag)
-{
-    #ifndef __NR_newfstatat
-    #define __NR_newfstatat  262
-    #endif
-    return syscall(__NR_newfstatat, dfd, path, statbuf, flag);
-}
-#endif
-
-/**
  * Call this to throw an internal UnixException when a system/library
  * call fails
  */
@@ -180,8 +146,9 @@
 JNIEXPORT jint JNICALL
 Java_sun_nio_fs_UnixNativeDispatcher_init(JNIEnv* env, jclass this)
 {
+    jclass clazz;
     jint flags = 0;
-    jclass clazz;
+    int ret;
 
     clazz = (*env)->FindClass(env, "sun/nio/fs/UnixFileAttributes");
     if (clazz == NULL) {
@@ -231,31 +198,14 @@
 
     /* system calls that might not be available at run time */
 
-#if (defined(__solaris__) && defined(_LP64)) || defined(_ALLBSD_SOURCE)
-    /* Solaris 64-bit does not have openat64/fstatat64 */
-    my_openat64_func = (openat64_func*)dlsym(RTLD_DEFAULT, "openat");
-    my_fstatat64_func = (fstatat64_func*)dlsym(RTLD_DEFAULT, "fstatat");
+#ifdef COMPILE_AGAINST_SYSCALLS
+    ret = 0;
 #else
-    my_openat64_func = (openat64_func*) dlsym(RTLD_DEFAULT, "openat64");
-    my_fstatat64_func = (fstatat64_func*) dlsym(RTLD_DEFAULT, "fstatat64");
-#endif
-    my_unlinkat_func = (unlinkat_func*) dlsym(RTLD_DEFAULT, "unlinkat");
-    my_renameat_func = (renameat_func*) dlsym(RTLD_DEFAULT, "renameat");
-    my_futimesat_func = (futimesat_func*) dlsym(RTLD_DEFAULT, "futimesat");
-    my_fdopendir_func = (fdopendir_func*) dlsym(RTLD_DEFAULT, "fdopendir");
-
-#if defined(FSTATAT64_SYSCALL_AVAILABLE)
-    /* fstatat64 missing from glibc */
-    if (my_fstatat64_func == NULL)
-        my_fstatat64_func = (fstatat64_func*)&fstatat64_wrapper;
+    ret = atsyscalls_init();
 #endif
 
-    if (my_openat64_func != NULL &&  my_fstatat64_func != NULL &&
-        my_unlinkat_func != NULL && my_renameat_func != NULL &&
-        my_futimesat_func != NULL && my_fdopendir_func != NULL)
-    {
+    if (ret == 0)
         flags |= sun_nio_fs_UnixNativeDispatcher_HAS_AT_SYSCALLS;
-    }
 
     return flags;
 }
@@ -368,12 +318,14 @@
     jint fd;
     const char* path = (const char*)jlong_to_ptr(pathAddress);
 
+#ifndef COMPILE_AGAINST_SYSCALLS
     if (my_openat64_func == NULL) {
         JNU_ThrowInternalError(env, "should not reach here");
         return -1;
     }
+#endif
 
-    RESTARTABLE((*my_openat64_func)(dfd, path, (int)oflags, (mode_t)mode), fd);
+    RESTARTABLE(openat64 (dfd, path, (int)oflags, (mode_t)mode), fd);
     if (fd == -1) {
         throwUnixException(env, errno);
     }
@@ -485,11 +437,13 @@
     struct stat64 buf;
     const char* path = (const char*)jlong_to_ptr(pathAddress);
 
+#ifndef COMPILE_AGAINST_SYSCALLS
     if (my_fstatat64_func == NULL) {
         JNU_ThrowInternalError(env, "should not reach here");
         return;
     }
-    RESTARTABLE((*my_fstatat64_func)((int)dfd, path, &buf, (int)flag), err);
+#endif
+    RESTARTABLE(fstatat64 ((int)dfd, path, &buf, (int)flag), err);
     if (err == -1) {
         throwUnixException(env, errno);
     } else {
@@ -595,38 +549,27 @@
 
 #ifdef _ALLBSD_SOURCE
     RESTARTABLE(futimes(filedes, &times[0]), err);
+#else
+    if (futimesat == NULL) {
+    /* AIX and HP-UX does not provide futimes as system call => use utimes instead */
+#if defined(_AIX) || defined (__hpux__)
+        jobject buffer = (*env)->CallStaticObjectMethod(env, this, disp_copy2buf, path);
+        jlong path_address = (*env)->GetLongField(env, buffer, buffer_address);
+        const char* path = (const char*)jlong_to_ptr(path_address);
+        RESTARTABLE(utimes(path, &times[0]), err);
+        (*env)->CallVoidMethod(env, buffer, buffer_release);
+#else
+        JNU_ThrowInternalError(env, "futimesat is NULL");
+        return;
+#endif
+    } else {
+      RESTARTABLE(futimesat (filedes, NULL, &times[0]), err);
+    }
+#endif
 
     if (err == -1) {
         throwUnixException(env, errno);
     }
-#else
-    if (my_futimesat_func != NULL) {
-        RESTARTABLE((*my_futimesat_func)(filedes, NULL, &times[0]), err);
-
-        if (err == -1) {
-            throwUnixException(env, errno);
-        }
-    }
-    /* AIX and HP-UX does not provide futimes as system call => use utimes instead */
-#if defined(_AIX) || defined (__hpux__)
-    else {
-        jobject buffer = (*env)->CallStaticObjectMethod(env, this, disp_copy2buf, path);
-        jlong path_address = (*env)->GetLongField(env, buffer, buffer_address);
-        const char* path = (const char*)jlong_to_ptr(path_address);
-        RESTARTABLE(utimes(path, &times[0]), err);
-        if (err == -1) {
-            throwUnixException(env, errno);
-        }
-        (*env)->CallVoidMethod(env, buffer, buffer_release);
-    }
-#else
-    else {
-        JNU_ThrowInternalError(env, "my_ftimesat_func is NULL");
-        return;
-    }
-#endif
-
-#endif
 }
 
 JNIEXPORT jlong JNICALL
@@ -648,13 +591,15 @@
 Java_sun_nio_fs_UnixNativeDispatcher_fdopendir(JNIEnv* env, jclass this, int dfd) {
     DIR* dir;
 
+#ifndef COMPILE_AGAINST_SYSCALLS
     if (my_fdopendir_func == NULL) {
         JNU_ThrowInternalError(env, "should not reach here");
         return (jlong)-1;
     }
+#endif
 
     /* EINTR not listed as a possible error */
-    dir = (*my_fdopendir_func)((int)dfd);
+    dir = fdopendir ((int)dfd);
     if (dir == NULL) {
         throwUnixException(env, errno);
     }
@@ -767,13 +712,15 @@
 {
     const char* path = (const char*)jlong_to_ptr(pathAddress);
 
+#ifndef COMPILE_AGAINST_SYSCALLS
     if (my_unlinkat_func == NULL) {
         JNU_ThrowInternalError(env, "should not reach here");
         return;
     }
+#endif
 
     /* EINTR not listed as a possible error */
-    if ((*my_unlinkat_func)((int)dfd, path, (int)flags) == -1) {
+    if (unlinkat ((int)dfd, path, (int)flags) == -1) {
         throwUnixException(env, errno);
     }
 }
@@ -798,13 +745,15 @@
     const char* from = (const char*)jlong_to_ptr(fromAddress);
     const char* to = (const char*)jlong_to_ptr(toAddress);
 
+#ifndef COMPILE_AGAINST_SYSCALLS
     if (my_renameat_func == NULL) {
         JNU_ThrowInternalError(env, "should not reach here");
         return;
     }
+#endif
 
     /* EINTR not listed as a possible error */
-    if ((*my_renameat_func)((int)fromfd, from, (int)tofd, to) == -1) {
+    if (renameat ((int)fromfd, from, (int)tofd, to) == -1) {
         throwUnixException(env, errno);
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/native/sun/security/krb5/internal/ccache/krb5ccache.c	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2013 Red Hat Inc. and/or its affiliates.
+ * 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 _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <krb5.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "sun_security_krb5_internal_ccache_FileCredentialsCache.h"
+
+static void handle_error(JNIEnv *env, krb5_context context, krb5_error_code err, const char *func_name);
+static jint throw_Exception(JNIEnv *env, const char *class_name, const char *message);
+
+/*
+ * Class:     sun_security_krb5_internal_ccache_FileCredentialsCache
+ * Method:    nativeGetDefaultCacheName
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_sun_security_krb5_internal_ccache_FileCredentialsCache_nativeGetDefaultCacheName
+(JNIEnv *env, jclass krbcredsClass)
+{
+    krb5_context context;
+    krb5_error_code err;
+    krb5_ccache cache;
+    const char *cc_type, *cc_name;
+    char *cc_full_name;
+    jstring result;
+
+    /* Need a krb5_context to proceed further */
+    err = krb5_init_context(&context);
+    if (err) {
+        handle_error(env, context, err, "krb5_init_context");
+        return NULL;
+    }
+
+    /* Get the default credential cache.
+     * We intentionally do not use krb5_cc_default_name because when the cache
+     * is a collection, krb5_cc_default_name returns the collection directory.
+     * By using krb5_cc_default and then krb5_cc_get_name, we get the primary
+     * cache file within the collection. */
+    err = krb5_cc_default(context, &cache);
+    if (err) {
+        handle_error(env, context, err, "krb5_cc_default");
+        krb5_free_context(context);
+        return NULL;
+    }
+
+    /* Get the type and name of the default cache and construct a string
+     * of the form 'type:name'. */
+    cc_type = krb5_cc_get_type(context, cache);
+    cc_name = krb5_cc_get_name(context, cache);
+    if (asprintf(&cc_full_name, "%s:%s", cc_type, cc_name) < 0) {
+        throw_Exception(env, "java/lang/OutOfMemoryError", "Unable to construct credential cache string");
+        krb5_free_context(context);
+        return NULL;
+    }
+
+    result = (*env)->NewStringUTF(env, cc_full_name);
+
+    free(cc_full_name);
+    krb5_free_context(context);
+    return result;
+}
+
+static void handle_error(JNIEnv *env, krb5_context context, krb5_error_code err, const char *func_name) {
+    const char *err_msg;
+    char *result;
+
+    err_msg = krb5_get_error_message(context, err);
+    if (asprintf(&result, "%s: %s", func_name, err_msg) < 0) {
+        throw_Exception(env, "java/lang/OutOfMemoryError", "Unable to construct error message");
+        return;
+    }
+    throw_Exception(env, "java/lang/Exception", result);
+
+    free(result);
+    krb5_free_error_message(context, err_msg);
+}
+
+static jint throw_Exception(JNIEnv *env, const char *class_name, const char *message) {
+    jclass class;
+
+    class = (*env)->FindClass(env, class_name);
+    if (class == NULL) {
+        return -1;
+    }
+    return (*env)->ThrowNew(env, class, message);
+}
--- a/src/solaris/native/sun/security/pkcs11/j2secmod_md.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/security/pkcs11/j2secmod_md.c	Tue Aug 22 02:03:52 2017 +0100
@@ -31,6 +31,7 @@
 
 #include <jni_util.h>
 
+#include "pkcs11wrapper.h"
 #include "j2secmod.h"
 
 void *findFunction(JNIEnv *env, jlong jHandle, const char *functionName) {
@@ -39,7 +40,7 @@
     if (fAddress == NULL) {
         char errorMessage[256];
         snprintf(errorMessage, sizeof(errorMessage), "Symbol not found: %s", functionName);
-        JNU_ThrowNullPointerException(env, errorMessage);
+        throwNullPointerException(env, errorMessage);
         return NULL;
     }
     return fAddress;
@@ -72,7 +73,7 @@
     dprintf2("-handle: %u (0X%X)\n", hModule, hModule);
 
     if (hModule == NULL) {
-        JNU_ThrowIOException(env, dlerror());
+        throwIOException(env, dlerror());
         return 0;
     }
 
--- a/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.h	Tue Aug 22 02:03:52 2017 +0100
@@ -56,6 +56,9 @@
 
 /* defines for UNIX platforms *************************************************/
 
+#ifndef __P11_MD_H__
+#define __P11_MD_H__
+
 #define CK_PTR *
 #define CK_DEFINE_FUNCTION(returnType, name) returnType name
 #define CK_DECLARE_FUNCTION(returnType, name) returnType name
@@ -83,3 +86,5 @@
 
 };
 typedef struct ModuleData ModuleData;
+
+#endif
--- a/src/solaris/native/sun/security/smartcardio/pcsc_md.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/security/smartcardio/pcsc_md.c	Tue Aug 22 02:03:52 2017 +0100
@@ -36,6 +36,7 @@
 
 #include "pcsc_md.h"
 
+#ifndef USE_SYSTEM_PCSC
 void *hModule;
 FPTR_SCardEstablishContext scardEstablishContext;
 FPTR_SCardConnect scardConnect;
@@ -47,6 +48,7 @@
 FPTR_SCardBeginTransaction scardBeginTransaction;
 FPTR_SCardEndTransaction scardEndTransaction;
 FPTR_SCardControl scardControl;
+#endif
 
 /*
  * Throws a Java Exception by name
@@ -75,7 +77,7 @@
     throwByName(env, "java/io/IOException", msg);
 }
 
-
+#ifndef USE_SYSTEM_PCSC
 void *findFunction(JNIEnv *env, void *hModule, char *functionName) {
     void *fAddress = dlsym(hModule, functionName);
     if (fAddress == NULL) {
@@ -86,9 +88,11 @@
     }
     return fAddress;
 }
+#endif
 
 JNIEXPORT void JNICALL Java_sun_security_smartcardio_PlatformPCSC_initialize
         (JNIEnv *env, jclass thisClass, jstring jLibName) {
+#ifndef USE_SYSTEM_PCSC
     const char *libName = (*env)->GetStringUTFChars(env, jLibName, NULL);
     if (libName == NULL) {
         throwNullPointerException(env, "PCSC library name is null");
@@ -142,4 +146,5 @@
 #else
     scardControl          = (FPTR_SCardControl)         findFunction(env, hModule, "SCardControl132");
 #endif // __APPLE__
+#endif
 }
--- a/src/solaris/native/sun/security/smartcardio/pcsc_md.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/security/smartcardio/pcsc_md.h	Tue Aug 22 02:03:52 2017 +0100
@@ -23,6 +23,8 @@
  * questions.
  */
 
+#ifndef USE_SYSTEM_PCSC
+
 typedef LONG (*FPTR_SCardEstablishContext)(ULONG dwScope,
                 const void *pvReserved1,
                 const void *pvReserved2,
@@ -110,3 +112,41 @@
 extern FPTR_SCardBeginTransaction scardBeginTransaction;
 extern FPTR_SCardEndTransaction scardEndTransaction;
 extern FPTR_SCardControl scardControl;
+
+#else
+
+#define CALL_SCardEstablishContext(dwScope, pvReserved1, pvReserved2, phContext) \
+    (SCardEstablishContext(dwScope, pvReserved1, pvReserved2, phContext))
+
+#define CALL_SCardConnect(hContext, szReader, dwSharedMode, dwPreferredProtocols, phCard, pdwActiveProtocols) \
+    (SCardConnect(hContext, szReader, dwSharedMode, dwPreferredProtocols, phCard, pdwActiveProtocols))
+
+#define CALL_SCardDisconnect(hCard, dwDisposition) \
+    (SCardDisconnect(hCard, dwDisposition))
+
+#define CALL_SCardStatus(hCard, mszReaderNames, pcchReaderLen, pdwState, pdwProtocol, pbAtr, pcbAtrLen) \
+    (SCardStatus(hCard, mszReaderNames, pcchReaderLen, pdwState, pdwProtocol, pbAtr, pcbAtrLen))
+
+#define CALL_SCardGetStatusChange(hContext, dwTimeout, rgReaderStates, cReaders) \
+    (SCardGetStatusChange(hContext, dwTimeout, rgReaderStates, cReaders))
+
+#define CALL_SCardTransmit(hCard, pioSendPci, pbSendBuffer, cbSendLength, \
+                            pioRecvPci, pbRecvBuffer, pcbRecvLength) \
+    (SCardTransmit(hCard, pioSendPci, pbSendBuffer, cbSendLength, \
+                            pioRecvPci, pbRecvBuffer, pcbRecvLength))
+
+#define CALL_SCardListReaders(hContext, mszGroups, mszReaders, pcchReaders) \
+    (SCardListReaders(hContext, mszGroups, mszReaders, pcchReaders))
+
+#define CALL_SCardBeginTransaction(hCard) \
+    (SCardBeginTransaction(hCard))
+
+#define CALL_SCardEndTransaction(hCard, dwDisposition) \
+    (SCardEndTransaction(hCard, dwDisposition))
+
+#define CALL_SCardControl(hCard, dwControlCode, pbSendBuffer, cbSendLength, \
+            pbRecvBuffer, pcbRecvLength, lpBytesReturned) \
+    (SCardControl(hCard, dwControlCode, pbSendBuffer, cbSendLength, \
+            pbRecvBuffer, pcbRecvLength, lpBytesReturned))
+
+#endif
--- a/src/solaris/native/sun/xawt/awt_Desktop.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/solaris/native/sun/xawt/awt_Desktop.c	Tue Aug 22 02:03:52 2017 +0100
@@ -27,63 +27,84 @@
 #include <jvm_md.h>
 #include <dlfcn.h>
 
-typedef int gboolean;
+#ifdef USE_SYSTEM_GIO
+#include <gio/gio.h>
+#else
+#include <gio_fp.h>
+#endif
 
 typedef gboolean (GNOME_URL_SHOW_TYPE)(const char *, void **);
 typedef gboolean (GNOME_VFS_INIT_TYPE)(void);
-
+				      
 GNOME_URL_SHOW_TYPE *gnome_url_show;
 GNOME_VFS_INIT_TYPE *gnome_vfs_init;
 
+jboolean use_gio;
+
 int init(){
     void *vfs_handle;
     void *gnome_handle;
     const char *errmsg;
 
-    vfs_handle = dlopen(VERSIONED_JNI_LIB_NAME("gnomevfs-2", "0"), RTLD_LAZY);
-    if (vfs_handle == NULL) {
-        vfs_handle = dlopen(JNI_LIB_NAME("gnomevfs-2"), RTLD_LAZY);
-        if (vfs_handle == NULL) {
-#ifdef INTERNAL_BUILD
-            fprintf(stderr, "can not load libgnomevfs-2.so\n");
+#ifdef USE_SYSTEM_GIO
+    use_gio = JNI_TRUE;
+#else
+    use_gio = gio_init();
+#endif
+
+#ifdef NATIVE_SUPPORT_DEBUG
+    fprintf(stderr, "awt_Desktop: use_gio = %s\n",
+	    use_gio == JNI_TRUE ? "true" : "false");
 #endif
-            return 0;
-        }
-    }
-    dlerror(); /* Clear errors */
-    gnome_vfs_init = (GNOME_VFS_INIT_TYPE*)dlsym(vfs_handle, "gnome_vfs_init");
-    if (gnome_vfs_init == NULL){
+
+    if (use_gio == JNI_TRUE) {
+        g_type_init();
+    } else {
+        vfs_handle = dlopen(VERSIONED_JNI_LIB_NAME("gnomevfs-2", "0"), RTLD_LAZY);
+	if (vfs_handle == NULL) {
+	    vfs_handle = dlopen(JNI_LIB_NAME("gnomevfs-2"), RTLD_LAZY);
+	    if (vfs_handle == NULL) {
 #ifdef INTERNAL_BUILD
-        fprintf(stderr, "dlsym( gnome_vfs_init) returned NULL\n");
+	        fprintf(stderr, "can not load libgnomevfs-2.so\n");
 #endif
-        return 0;
-    }
-    if ((errmsg = dlerror()) != NULL) {
+		return 0;
+	    }
+	}
+	dlerror(); /* Clear errors */
+	gnome_vfs_init = (GNOME_VFS_INIT_TYPE*)dlsym(vfs_handle, "gnome_vfs_init");
+	if (gnome_vfs_init == NULL){
 #ifdef INTERNAL_BUILD
-        fprintf(stderr, "can not find symbol gnome_vfs_init %s \n", errmsg);
+	    fprintf(stderr, "dlsym( gnome_vfs_init) returned NULL\n");
 #endif
-        return 0;
-    }
-    // call gonme_vfs_init()
-    (*gnome_vfs_init)();
-
-    gnome_handle = dlopen(VERSIONED_JNI_LIB_NAME("gnome-2", "0"), RTLD_LAZY);
-    if (gnome_handle == NULL) {
-        gnome_handle = dlopen(JNI_LIB_NAME("gnome-2"), RTLD_LAZY);
-        if (gnome_handle == NULL) {
+	    return 0;
+	}
+	if ((errmsg = dlerror()) != NULL) {
+#ifdef INTERNAL_BUILD
+	    fprintf(stderr, "can not find symbol gnome_vfs_init %s \n", errmsg);
+#endif
+	    return 0;
+	}
+	// call gonme_vfs_init()
+	(*gnome_vfs_init)();
+	
+	gnome_handle = dlopen(VERSIONED_JNI_LIB_NAME("gnome-2", "0"), RTLD_LAZY);
+	if (gnome_handle == NULL) {
+	  gnome_handle = dlopen(JNI_LIB_NAME("gnome-2"), RTLD_LAZY);
+	  if (gnome_handle == NULL) {
 #ifdef INTERNAL_BUILD
             fprintf(stderr, "can not load libgnome-2.so\n");
 #endif
-            return 0;
-        }
-    }
-    dlerror(); /* Clear errors */
-    gnome_url_show = (GNOME_URL_SHOW_TYPE*)dlsym(gnome_handle, "gnome_url_show");
-    if ((errmsg = dlerror()) != NULL) {
+	    return 0;
+	  }
+	}
+	dlerror(); /* Clear errors */
+	gnome_url_show = (GNOME_URL_SHOW_TYPE*)dlsym(gnome_handle, "gnome_url_show");
+	if ((errmsg = dlerror()) != NULL) {
 #ifdef INTERNAL_BUILD
-        fprintf(stderr, "can not find symble gnome_url_show\n");
+	    fprintf(stderr, "can not find symbol gnome_url_show\n");
 #endif
-        return 0;
+	    return 0;
+	}
     }
 
     return 1;
@@ -112,14 +133,17 @@
     gboolean success;
     const char* url_c;
 
-    if (gnome_url_show == NULL) {
-        return JNI_FALSE;
-    }
+    url_c = (char*)(*env)->GetByteArrayElements(env, url_j, NULL);
+    if (use_gio) {
+	success = g_app_info_launch_default_for_uri (url_c, NULL, NULL);
+    } else {
+	if (gnome_url_show == NULL) {
+	    return JNI_FALSE;
+	}
 
-    url_c = (char*)(*env)->GetByteArrayElements(env, url_j, NULL);
-    // call gnome_url_show(const char* , GError**)
-    success = (*gnome_url_show)(url_c, NULL);
+	// call gnome_url_show(const char* , GError**)
+	success = (*gnome_url_show)(url_c, NULL);
+    }
     (*env)->ReleaseByteArrayElements(env, url_j, (signed char*)url_c, 0);
-
     return success ? JNI_TRUE : JNI_FALSE;
 }
--- a/src/windows/classes/java/net/DefaultDatagramSocketImplFactory.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/classes/java/net/DefaultDatagramSocketImplFactory.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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,7 +45,7 @@
 
 class DefaultDatagramSocketImplFactory
 {
-    static Class<?> prefixImplClass = null;
+    private final static Class<?> prefixImplClass;
 
     /* the windows version. */
     private static float version;
@@ -54,16 +54,19 @@
     private static boolean preferIPv4Stack = false;
 
     /* If the version supports a dual stack TCP implementation */
-    private static boolean useDualStackImpl = false;
+    private final static boolean useDualStackImpl;
 
     /* sun.net.useExclusiveBind */
     private static String exclBindProp;
 
     /* True if exclusive binding is on for Windows */
-    private static boolean exclusiveBind = true;
-
+    private final static boolean exclusiveBind;
 
     static {
+        Class<?> prefixImplClassLocal = null;
+        boolean useDualStackImplLocal = false;
+        boolean exclusiveBindLocal = true;
+
         // Determine Windows Version.
         java.security.AccessController.doPrivileged(
                 new PrivilegedAction<Object>() {
@@ -78,7 +81,7 @@
                                                    "java.net.preferIPv4Stack"));
                             exclBindProp = System.getProperty(
                                     "sun.net.useExclusiveBind");
-                        } catch (NumberFormatException e ) {
+                        } catch (NumberFormatException e) {
                             assert false : e;
                         }
                         return null; // nothing to return
@@ -87,14 +90,14 @@
 
         // (version >= 6.0) implies Vista or greater.
         if (version >= 6.0 && !preferIPv4Stack) {
-                useDualStackImpl = true;
+            useDualStackImplLocal = true;
         }
         if (exclBindProp != null) {
             // sun.net.useExclusiveBind is true
-            exclusiveBind = exclBindProp.length() == 0 ? true
+            exclusiveBindLocal = exclBindProp.length() == 0 ? true
                     : Boolean.parseBoolean(exclBindProp);
         } else if (version < 6.0) {
-            exclusiveBind = false;
+            exclusiveBindLocal = false;
         }
 
         // impl.prefix
@@ -103,12 +106,16 @@
             prefix = AccessController.doPrivileged(
                 new sun.security.action.GetPropertyAction("impl.prefix", null));
             if (prefix != null)
-                prefixImplClass = Class.forName("java.net."+prefix+"DatagramSocketImpl");
+                prefixImplClassLocal = Class.forName("java.net."+prefix+"DatagramSocketImpl");
         } catch (Exception e) {
             System.err.println("Can't find class: java.net." +
                                 prefix +
                                 "DatagramSocketImpl: check impl.prefix property");
         }
+
+        prefixImplClass = prefixImplClassLocal;
+        useDualStackImpl = useDualStackImplLocal;
+        exclusiveBind = exclusiveBindLocal;
     }
 
     /**
@@ -126,12 +133,10 @@
                 throw new SocketException("can't instantiate DatagramSocketImpl");
             }
         } else {
-            if (isMulticast)
-                exclusiveBind = false;
             if (useDualStackImpl && !isMulticast)
                 return new DualStackPlainDatagramSocketImpl(exclusiveBind);
             else
-                return new TwoStacksPlainDatagramSocketImpl(exclusiveBind);
+                return new TwoStacksPlainDatagramSocketImpl(exclusiveBind && !isMulticast);
         }
     }
 }
--- a/src/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007,2011 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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,6 +45,10 @@
 {
     static JavaIOFileDescriptorAccess fdAccess = SharedSecrets.getJavaIOFileDescriptorAccess();
 
+    static {
+        initIDs();
+    }
+
     // true if this socket is exclusively bound
     private final boolean exclusiveBind;
 
@@ -288,4 +292,6 @@
         int optionValue) throws SocketException;
 
     private static native int socketGetIntOption(int fd, int cmd) throws SocketException;
+
+    native int dataAvailable();
 }
--- a/src/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -204,6 +204,8 @@
 
     protected native void disconnect0(int family);
 
+    native int dataAvailable();
+
     /**
      * Perform class load-time initializations.
      */
--- a/src/windows/classes/sun/nio/fs/WindowsConstants.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/classes/sun/nio/fs/WindowsConstants.java	Tue Aug 22 02:03:52 2017 +0100
@@ -98,6 +98,7 @@
     public static final int ERROR_DISK_FULL             = 112;
     public static final int ERROR_INSUFFICIENT_BUFFER   = 122;
     public static final int ERROR_INVALID_LEVEL         = 124;
+    public static final int ERROR_DIR_NOT_ROOT          = 144;
     public static final int ERROR_DIR_NOT_EMPTY         = 145;
     public static final int ERROR_ALREADY_EXISTS        = 183;
     public static final int ERROR_MORE_DATA             = 234;
--- a/src/windows/classes/sun/nio/fs/WindowsFileStore.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/classes/sun/nio/fs/WindowsFileStore.java	Tue Aug 22 02:03:52 2017 +0100
@@ -86,14 +86,28 @@
                 WindowsFileAttributes.get(file, true);
                 target = file.getPathForWin32Calls();
             }
-            String root = GetVolumePathName(target);
-            return new WindowsFileStore(root);
+            try {
+                return createFromPath(target);
+            } catch (WindowsException e) {
+                if (e.lastError() != ERROR_DIR_NOT_ROOT)
+                    throw e;
+                target = WindowsLinkSupport.getFinalPath(file);
+                if (target == null)
+                    throw new FileSystemException(file.getPathForExceptionMessage(),
+                            null, "Couldn't resolve path");
+                return createFromPath(target);
+            }
         } catch (WindowsException x) {
             x.rethrowAsIOException(file);
             return null; // keep compiler happy
         }
     }
 
+    private static WindowsFileStore createFromPath(String target) throws WindowsException {
+        String root = GetVolumePathName(target);
+        return new WindowsFileStore(root);
+    }
+
     VolumeInformation volumeInformation() {
         return volInfo;
     }
--- a/src/windows/classes/sun/nio/fs/WindowsLinkSupport.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/classes/sun/nio/fs/WindowsLinkSupport.java	Tue Aug 22 02:03:52 2017 +0100
@@ -66,7 +66,7 @@
      * Returns the final path (all symbolic links resolved) or null if this
      * operation is not supported.
      */
-    private static String getFinalPath(WindowsPath input) throws IOException {
+    static String getFinalPath(WindowsPath input) throws IOException {
         long h = 0;
         try {
             h = input.openForReadAttributeAccess(true);
--- a/src/windows/native/java/net/AbstractPlainDatagramSocketImpl.c	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/*
- * 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.
- */
-
-#include <windows.h>
-#include <winsock2.h>
-
-#include "jvm.h"
-#include "jni_util.h"
-#include "net_util.h"
-
-#include "java_net_AbstractPlainDatagramSocketImpl.h"
-
-static jfieldID IO_fd_fdID = NULL;
-static jfieldID apdsi_fdID = NULL;
-
-static jfieldID apdsi_fd1ID = NULL;
-static jclass two_stacks_clazz = NULL;
-
-
-/*
- * Class:     java_net_AbstractPlainDatagramSocketImpl
- * Method:    init
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
-
-    apdsi_fdID = (*env)->GetFieldID(env, cls, "fd",
-                                   "Ljava/io/FileDescriptor;");
-    CHECK_NULL(apdsi_fdID);
-    IO_fd_fdID = NET_GetFileDescriptorID(env);
-    CHECK_NULL(IO_fd_fdID);
-
-    two_stacks_clazz = (*env)->FindClass(env, "java/net/TwoStacksPlainDatagramSocketImpl");
-    CHECK_NULL(two_stacks_clazz);
-
-    /* Handle both TwoStacks and DualStack here */
-
-    if (JNU_Equals(env, cls, two_stacks_clazz)) {
-        /* fd1 present only in TwoStack.. */
-        apdsi_fd1ID = (*env)->GetFieldID(env, cls, "fd1",
-                                   "Ljava/io/FileDescriptor;");
-        CHECK_NULL(apdsi_fd1ID);
-    }
-}
-
-/*
- * Class:     java_net_AbstractPlainDatagramSocketImpl
- * Method:    dataAvailable
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
-(JNIEnv *env, jobject this) {
-    SOCKET fd;
-    SOCKET fd1;
-    int  rv = -1, rv1 = -1;
-    jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID);
-
-    if (!IS_NULL(fdObj)) {
-        int retval = 0;
-        fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
-        rv = ioctlsocket(fd, FIONREAD, &retval);
-        if (retval > 0) {
-            return retval;
-        }
-    }
-
-    if (!IS_NULL(apdsi_fd1ID)) {
-        /* TwoStacks */
-        jobject fd1Obj = (*env)->GetObjectField(env, this, apdsi_fd1ID);
-        if (!IS_NULL(fd1Obj)) {
-            int retval = 0;
-            fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID);
-            rv1 = ioctlsocket(fd1, FIONREAD, &retval);
-            if (retval > 0) {
-                return retval;
-            }
-        }
-    }
-
-    if (rv < 0 && rv1 < 0) {
-        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
-                            "Socket closed");
-        return -1;
-    }
-
-    return 0;
-}
-
--- a/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -70,6 +70,25 @@
     return got_icmp;
 }
 
+static jfieldID IO_fd_fdID = NULL;
+static jfieldID pdsi_fdID = NULL;
+
+/*
+ * Class:     java_net_DualStackPlainDatagramSocketImpl
+ * Method:    initIDs
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_initIDs
+  (JNIEnv *env, jclass clazz)
+{
+    pdsi_fdID = (*env)->GetFieldID(env, clazz, "fd",
+                                   "Ljava/io/FileDescriptor;");
+    CHECK_NULL(pdsi_fdID);
+    IO_fd_fdID = NET_GetFileDescriptorID(env);
+    CHECK_NULL(IO_fd_fdID);
+    JNU_CHECK_EXCEPTION(env);
+}
+
 /*
  * Class:     java_net_DualStackPlainDatagramSocketImpl
  * Method:    socketCreate
@@ -494,3 +513,32 @@
 
     return result;
 }
+
+/*
+ * Class:     java_net_DualStackPlainDatagramSocketImpl
+ * Method:    dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_dataAvailable
+(JNIEnv *env, jobject this) {
+    SOCKET fd;
+    int  rv = -1;
+    jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
+
+    if (!IS_NULL(fdObj)) {
+        int retval = 0;
+        fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
+        rv = ioctlsocket(fd, FIONREAD, &retval);
+        if (retval > 0) {
+            return retval;
+        }
+    }
+
+    if (rv < 0) {
+        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+                        "Socket closed");
+        return -1;
+    }
+
+    return 0;
+}
--- a/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -2546,3 +2546,44 @@
 {
     mcast_join_leave (env, this, iaObj, niObj, JNI_FALSE);
 }
+
+/*
+ * Class:     java_net_TwoStacksPlainDatagramSocketImpl
+ * Method:    dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_java_net_TwoStacksPlainDatagramSocketImpl_dataAvailable
+(JNIEnv *env, jobject this) {
+    SOCKET fd;
+    SOCKET fd1;
+    int  rv = -1, rv1 = -1;
+    jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
+    jobject fd1Obj;
+
+    if (!IS_NULL(fdObj)) {
+        int retval = 0;
+        fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
+        rv = ioctlsocket(fd, FIONREAD, &retval);
+        if (retval > 0) {
+            return retval;
+        }
+    }
+
+    fd1Obj = (*env)->GetObjectField(env, this, pdsi_fd1ID);
+    if (!IS_NULL(fd1Obj)) {
+        int retval = 0;
+        fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID);
+        rv1 = ioctlsocket(fd1, FIONREAD, &retval);
+        if (retval > 0) {
+            return retval;
+        }
+    }
+
+    if (rv < 0 && rv1 < 0) {
+        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+                        "Socket closed");
+        return -1;
+    }
+
+    return 0;
+}
--- a/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -114,8 +114,9 @@
         // which may've been disposed by this time, and we have
         // no means of checking against it.
         if (oldhDC != NULL) {
-            MoveDCToPassiveList(oldhDC);
+            MoveDCToPassiveList(oldhDC, info->hWnd);
             info->hDC = NULL;
+            info->hWnd = NULL;
         }
 
         if (wsdo->window != NULL){
@@ -150,6 +151,7 @@
 
             // Finally, set these new values in the info for this thread
             info->hDC = hDC;
+            info->hWnd = wsdo->window;
         }
 
         // cached brush and pen are not associated with any DC, and can be
@@ -187,7 +189,7 @@
         if (info->hDC != NULL) {
             // move the DC from the active dcs list to
             // the passive dc list to be released later
-            MoveDCToPassiveList(info->hDC);
+            MoveDCToPassiveList(info->hDC, info->hWnd);
         }
 
         if (info->clip != NULL) {
--- a/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -196,6 +196,7 @@
  */
 typedef struct {
     HDC         hDC;
+    HWND        hWnd;
     GDIWinSDOps *wsdo;
     LONG        wsdoTimeStamp; // wsdo creation time stamp.
                                // Other threads may deallocate wsdo
--- a/src/windows/native/sun/security/krb5/NativeCreds.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/sun/security/krb5/NativeCreds.c	Tue Aug 22 02:03:52 2017 +0100
@@ -389,7 +389,7 @@
     jobject authTime, renewTillTime, hostAddresses = NULL;
     KERB_EXTERNAL_TICKET *msticket;
     int found = 0;
-    FILETIME Now, EndTime, LocalEndTime;
+    FILETIME Now, EndTime;
 
     int i, netypes;
     jint *etypes = NULL;
@@ -472,8 +472,7 @@
             GetSystemTimeAsFileTime(&Now);
             EndTime.dwLowDateTime = msticket->EndTime.LowPart;
             EndTime.dwHighDateTime = msticket->EndTime.HighPart;
-            FileTimeToLocalFileTime(&EndTime, &LocalEndTime);
-            if (CompareFileTime(&Now, &LocalEndTime) < 0) {
+            if (CompareFileTime(&Now, &EndTime) < 0) {
                 for (i=0; i<netypes; i++) {
                     if (etypes[i] == msticket->SessionKey.KeyType) {
                         found = 1;
--- a/src/windows/native/sun/security/pkcs11/j2secmod_md.c	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/sun/security/pkcs11/j2secmod_md.c	Tue Aug 22 02:03:52 2017 +0100
@@ -37,7 +37,7 @@
     if (fAddress == NULL) {
         char errorMessage[256];
         _snprintf(errorMessage, sizeof(errorMessage), "Symbol not found: %s", functionName);
-        JNU_ThrowNullPointerException(env, errorMessage);
+        throwNullPointerException(env, errorMessage);
         return NULL;
     }
     return fAddress;
@@ -78,7 +78,7 @@
             NULL
         );
         dprintf1("-error: %s\n", lpMsgBuf);
-        JNU_ThrowIOException(env, (char*)lpMsgBuf);
+        throwIOException(env, (char*)lpMsgBuf);
         LocalFree(lpMsgBuf);
         return 0;
     }
--- a/src/windows/native/sun/security/pkcs11/wrapper/p11_md.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/sun/security/pkcs11/wrapper/p11_md.h	Tue Aug 22 02:03:52 2017 +0100
@@ -55,6 +55,8 @@
  */
 
 /* defines for WIN32 platform *************************************************/
+#ifndef __P11_MD_H__
+#define __P11_MD_H__
 
 #include <windows.h>
 
@@ -96,3 +98,5 @@
 
 };
 typedef struct ModuleData ModuleData;
+
+#endif
--- a/src/windows/native/sun/windows/awt_Component.cpp	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/sun/windows/awt_Component.cpp	Tue Aug 22 02:03:52 2017 +0100
@@ -1362,7 +1362,7 @@
       case WM_AWT_RELEASEDC:
       {
             HDC hDC = (HDC)wParam;
-            MoveDCToPassiveList(hDC);
+            MoveDCToPassiveList(hDC, GetHWnd());
             ReleaseDCList(GetHWnd(), passiveDCList);
             mr = mrConsume;
             break;
@@ -7108,8 +7108,8 @@
 }
 
 /**
- * Given a DC, remove it from the DC list and return
- * TRUE if it exists on the current list.  Otherwise
+ * Given a DC and window handle, remove the DC from the DC list
+ * and return TRUE if it exists on the current list.  Otherwise
  * return FALSE.
  * A DC may not exist on the list because it has already
  * been released elsewhere (for example, the window
@@ -7117,14 +7117,14 @@
  * thread may also want to release a DC when it notices that
  * its DC is obsolete for the current window).
  */
-DCItem *DCList::RemoveDC(HDC hDC)
+DCItem *DCList::RemoveDC(HDC hDC, HWND hWnd)
 {
     listLock.Enter();
     DCItem **prevPtrPtr = &head;
     DCItem *listPtr = head;
     while (listPtr) {
         DCItem *nextPtr = listPtr->next;
-        if (listPtr->hDC == hDC) {
+        if (listPtr->hDC == hDC && listPtr->hWnd == hWnd) {
             *prevPtrPtr = nextPtr;
             break;
         }
@@ -7178,9 +7178,9 @@
     listLock.Leave();
 }
 
-void MoveDCToPassiveList(HDC hDC) {
+void MoveDCToPassiveList(HDC hDC, HWND hWnd) {
     DCItem *removedDC;
-    if ((removedDC = activeDCList.RemoveDC(hDC)) != NULL) {
+    if ((removedDC = activeDCList.RemoveDC(hDC, hWnd)) != NULL) {
         passiveDCList.AddDCItem(removedDC);
     }
 }
--- a/src/windows/native/sun/windows/awt_Component.h	Thu Aug 03 07:28:01 2017 +0100
+++ b/src/windows/native/sun/windows/awt_Component.h	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -901,13 +901,13 @@
 
     void            AddDC(HDC hDC, HWND hWnd);
     void            AddDCItem(DCItem *newItem);
-    DCItem          *RemoveDC(HDC hDC);
+    DCItem          *RemoveDC(HDC hDC, HWND hWnd);
     DCItem          *RemoveAllDCs(HWND hWnd);
     void            RealizePalettes(int screen);
 };
 
 void ReleaseDCList(HWND hwnd, DCList &list);
-void MoveDCToPassiveList(HDC hDC);
+void MoveDCToPassiveList(HDC hDC, HWND hWnd);
 
 namespace TimeHelper{
     jlong getMessageTimeUTC();
--- a/test/ProblemList.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/ProblemList.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -325,6 +325,9 @@
 
 # jdk_security
 
+# 7157786
+sun/security/pkcs11/ec/TestKeyFactory.java                      generic-all
+
 # Failing on Solaris i586, 3/9/2010, not a -samevm issue (jdk_security3)
 sun/security/pkcs11/Secmod/AddPrivateKey.java                   solaris-i586
 sun/security/pkcs11/ec/ReadCertificates.java                    solaris-i586
--- a/test/com/oracle/security/ucrypto/TestAES.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/oracle/security/ucrypto/TestAES.java	Tue Aug 22 02:03:52 2017 +0100
@@ -55,21 +55,24 @@
         main(new TestAES(), null);
     }
 
-    public void doTest(Provider prov) throws Exception {
+    public boolean doTest(Provider prov)
+    throws NoSuchAlgorithmException {
         // Provider for testing Interoperability
         Provider sunJCEProv = Security.getProvider("SunJCE");
 
-        testCipherInterop(CIPHER_ALGOS, CIPHER_KEY, prov, sunJCEProv);
-        testCipherInterop(PADDEDCIPHER_ALGOS, CIPHER_KEY, prov, sunJCEProv);
+        boolean result1 = testCipherInterop(CIPHER_ALGOS, CIPHER_KEY, prov, sunJCEProv);
+        boolean result2 = testCipherInterop(PADDEDCIPHER_ALGOS, CIPHER_KEY, prov, sunJCEProv);
 
-        testCipherOffset(CIPHER_ALGOS, CIPHER_KEY, prov);
-        testCipherOffset(PADDEDCIPHER_ALGOS, CIPHER_KEY, prov);
+        boolean result3 = testCipherOffset(CIPHER_ALGOS, CIPHER_KEY, prov);
+        boolean result4 = testCipherOffset(PADDEDCIPHER_ALGOS, CIPHER_KEY, prov);
 
-        testCipherKeyWrapping(PADDEDCIPHER_ALGOS, CIPHER_KEY, prov, sunJCEProv);
-        testCipherGCM(CIPHER_KEY, prov);
+        boolean result5 = testCipherKeyWrapping(PADDEDCIPHER_ALGOS, CIPHER_KEY, prov, sunJCEProv);
+        boolean result6 = testCipherGCM(CIPHER_KEY, prov);
+
+        return result1 && result2 && result3 && result4 && result5 && result6;
     }
 
-    private static void testCipherInterop(String[] algos, SecretKey key,
+    private static boolean testCipherInterop(String[] algos, SecretKey key,
                                           Provider p,
                                           Provider interopP) {
         boolean testPassed = true;
@@ -83,7 +86,7 @@
                 try {
                     c = Cipher.getInstance(algo, p);
                 } catch (NoSuchAlgorithmException nsae) {
-                    System.out.println("Skipping Unsupported CIP algo: " + algo);
+                    System.err.println("Skipping Unsupported CIP algo: " + algo);
                     continue;
                 }
                 c.init(Cipher.ENCRYPT_MODE, key, (AlgorithmParameters)null, null);
@@ -95,10 +98,10 @@
                 byte[] eout2 = c2.doFinal(in, 0, in.length);
 
                 if (!Arrays.equals(eout, eout2)) {
-                    System.out.println(algo + ": DIFF FAILED");
+                    System.err.println(algo + ": DIFF FAILED");
                     testPassed = false;
                 } else {
-                    System.out.println(algo + ": ENC Passed");
+                    System.err.println(algo + ": ENC Passed");
                 }
 
                 // check DEC
@@ -108,34 +111,36 @@
                 byte[] dout2 = c2.doFinal(eout2);
 
                 if (!Arrays.equals(dout, dout2)) {
-                    System.out.println(algo + ": DIFF FAILED");
+                    System.err.println(algo + ": DIFF FAILED");
                     testPassed = false;
                 } else {
-                    System.out.println(algo + ": DEC Passed");
+                    System.err.println(algo + ": DEC Passed");
                 }
             } catch(Exception ex) {
-                System.out.println("Unexpected Exception: " + algo);
+                System.err.println("Unexpected Exception: " + algo);
                 ex.printStackTrace();
                 testPassed = false;
             }
         }
 
-        if (!testPassed) {
-            throw new RuntimeException("One or more CIPHER test failed!");
+        if (testPassed) {
+            System.err.println("CIPHER Interop Tests Passed");
         } else {
-            System.out.println("CIPHER Interop Tests Passed");
+            System.err.println("One or more CIPHER Interop tests failed!");
         }
+
+        return testPassed;
     }
 
-    private static void testCipherOffset(String[] algos, SecretKey key,
-                                         Provider p) {
+    private static boolean testCipherOffset(String[] algos, SecretKey key,
+                                            Provider p) {
         boolean testPassed = true;
         byte[] in = new byte[16];
         (new SecureRandom()).nextBytes(in);
         int blockSize = 16;
 
         for (int j = 1; j < (in.length - 1); j++) {
-            System.out.println("Input offset size: " + j);
+            System.err.println("Input offset size: " + j);
             for (int i = 0; i < algos.length; i++) {
                 try {
                     // check ENC
@@ -143,13 +148,13 @@
                     try {
                         c = Cipher.getInstance(algos[i], p);
                     } catch (NoSuchAlgorithmException nsae) {
-                        System.out.println("Skip Unsupported CIP algo: " + algos[i]);
+                        System.err.println("Skip Unsupported CIP algo: " + algos[i]);
                         continue;
                     }
                     c.init(Cipher.ENCRYPT_MODE, key, (AlgorithmParameters)null, null);
                     byte[] eout = new byte[c.getOutputSize(in.length)];
                     int firstPartLen = in.length - j - 1;
-                    //System.out.print("1st UPDATE: " + firstPartLen);
+                    //System.err.print("1st UPDATE: " + firstPartLen);
                     int k = c.update(in, 0, firstPartLen, eout, 0);
                     k += c.update(in, firstPartLen, 1, eout, k);
                     k += c.doFinal(in, firstPartLen+1, j, eout, k);
@@ -173,21 +178,23 @@
                     k += c.doFinal(eout, firstPartLen+1, eout.length - firstPartLen - 1, dout, k);
                     if (!checkArrays(in, in.length, dout, k)) testPassed = false;
                 } catch(Exception ex) {
-                    System.out.println("Unexpected Exception: " + algos[i]);
+                    System.err.println("Unexpected Exception: " + algos[i]);
                     ex.printStackTrace();
                     testPassed = false;
                 }
             }
         }
-        if (!testPassed) {
-            throw new RuntimeException("One or more CIPHER test failed!");
+        if (testPassed) {
+            System.err.println("CIPHER Offset Tests Passed");
         } else {
-            System.out.println("CIPHER Offset Tests Passed");
+            System.err.println("One or more CIPHER offset tests failed!");
         }
+
+        return testPassed;
     }
 
-    private static void testCipherKeyWrapping(String[] algos, SecretKey key,
-                                              Provider p, Provider interopP)
+    private static boolean testCipherKeyWrapping(String[] algos, SecretKey key,
+                                                 Provider p, Provider interopP)
         throws NoSuchAlgorithmException {
         boolean testPassed = true;
 
@@ -203,16 +210,21 @@
 
         for (int i = 0; i < algos.length; i++) {
             try {
-                System.out.println(algos[i] + " - Native WRAP/Java UNWRAP");
+                System.err.println(algos[i] + " - Native WRAP/Java UNWRAP");
 
                 Cipher c1;
                 try {
                     c1 = Cipher.getInstance(algos[i], p);
                 } catch (NoSuchAlgorithmException nsae) {
-                    System.out.println("Skipping Unsupported CIP algo: " + algos[i]);
+                    System.err.println("Skipping Unsupported CIP algo: " + algos[i]);
                     continue;
                 }
-                c1.init(Cipher.WRAP_MODE, key, (AlgorithmParameters)null, null);
+                try {
+                    c1.init(Cipher.WRAP_MODE, key, (AlgorithmParameters)null, null);
+                } catch (InvalidAlgorithmParameterException e) {
+                    System.err.println("Skipping due to lack of WRAP_MODE support.");
+                    continue;
+                }
                 AlgorithmParameters params = c1.getParameters();
                 Cipher c2 = Cipher.getInstance(algos[i], interopP);
                 c2.init(Cipher.UNWRAP_MODE, key, params, null);
@@ -224,7 +236,7 @@
                     if (!checkKeys(tbwKeys[j], recovered)) testPassed = false;
                 }
 
-                System.out.println(algos[i] + " - Java WRAP/Native UNWRAP");
+                System.err.println(algos[i] + " - Java WRAP/Native UNWRAP");
                 c1 = Cipher.getInstance(algos[i], interopP);
                 c1.init(Cipher.WRAP_MODE, key, (AlgorithmParameters)null, null);
                 params = c1.getParameters();
@@ -239,21 +251,23 @@
                 }
 
             } catch(Exception ex) {
-                System.out.println("Unexpected Exception: " + algos[i]);
+                System.err.println("Unexpected Exception: " + algos[i]);
                 ex.printStackTrace();
                 testPassed = false;
             }
         }
-        if (!testPassed) {
-            throw new RuntimeException("One or more CIPHER test failed!");
+        if (testPassed) {
+            System.err.println("CIPHER KeyWrapping Tests Passed");
         } else {
-            System.out.println("CIPHER KeyWrapping Tests Passed");
+            System.err.println("One or more CIPHER keywrapping tests failed!");
         }
+
+        return testPassed;
     }
 
 
-    private static void testCipherGCM(SecretKey key,
-                                      Provider p) {
+    private static boolean testCipherGCM(SecretKey key,
+                                         Provider p) {
         boolean testPassed = true;
         byte[] in = new byte[16];
         (new SecureRandom()).nextBytes(in);
@@ -270,8 +284,8 @@
             try {
                 c = Cipher.getInstance(algo, p);
             } catch (NoSuchAlgorithmException nsae) {
-                System.out.println("Skipping Unsupported CIP algo: " + algo);
-                return;
+                System.err.println("Skipping Unsupported CIP algo: " + algo);
+                return true;
             }
             for (int i = 0; i < tagLen.length; i++) {
                 AlgorithmParameterSpec paramSpec = new GCMParameterSpec(tagLen[i], iv);
@@ -287,33 +301,35 @@
                 byte[] dout = c.doFinal(eout, 0, eout.length);
 
                 if (!Arrays.equals(dout, in)) {
-                    System.out.println(algo + ": PT and RT DIFF FAILED");
+                    System.err.println(algo + ": PT and RT DIFF FAILED");
                     testPassed = false;
                 } else {
-                    System.out.println(algo + ": tagLen " + tagLen[i] + " done");
+                    System.err.println(algo + ": tagLen " + tagLen[i] + " done");
                 }
             }
         } catch(Exception ex) {
-            System.out.println("Unexpected Exception: " + algo);
+            System.err.println("Unexpected Exception: " + algo);
             ex.printStackTrace();
             testPassed = false;
         }
-        if (!testPassed) {
-            throw new RuntimeException("One or more CIPHER test failed!");
+        if (testPassed) {
+            System.err.println("CIPHER GCM Tests Passed");
         } else {
-            System.out.println("CIPHER GCM Tests Passed");
+            System.err.println("One or more CIPHER GCM tests failed!");
         }
+
+        return testPassed;
     }
 
     private static boolean checkArrays(byte[] a1, int a1Len, byte[] a2, int a2Len) {
         boolean equal = true;
         if (a1Len != a2Len) {
-            System.out.println("DIFFERENT OUT LENGTH");
+            System.err.println("DIFFERENT OUT LENGTH");
             equal = false;
         } else {
             for (int p = 0; p < a1Len; p++) {
                 if (a1[p] != a2[p]) {
-                    System.out.println("DIFF FAILED");
+                    System.err.println("DIFF FAILED");
                     equal = false;
                     break;
                 }
@@ -325,13 +341,13 @@
     private static boolean checkKeys(Key k1, Key k2) {
         boolean equal = true;
         if (!k1.getAlgorithm().equalsIgnoreCase(k2.getAlgorithm())) {
-            System.out.println("DIFFERENT Key Algorithm");
+            System.err.println("DIFFERENT Key Algorithm");
             equal = false;
         } else if (!k1.getFormat().equalsIgnoreCase(k2.getFormat())) {
-            System.out.println("DIFFERENT Key Format");
+            System.err.println("DIFFERENT Key Format");
             equal = false;
         } else if (!Arrays.equals(k1.getEncoded(), k2.getEncoded())) {
-            System.out.println("DIFFERENT Key Encoding");
+            System.err.println("DIFFERENT Key Encoding");
             equal = false;
         }
         return equal;
--- a/test/com/oracle/security/ucrypto/TestDigest.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/oracle/security/ucrypto/TestDigest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -47,7 +47,7 @@
         main(new TestDigest(), null);
     }
 
-    public void doTest(Provider p) {
+    public boolean doTest(Provider p) {
         boolean testPassed = true;
         byte[] msg = new byte[200];
         (new SecureRandom()).nextBytes(msg);
@@ -59,7 +59,7 @@
                 try {
                     md = MessageDigest.getInstance(a, p);
                 } catch (NoSuchAlgorithmException nsae) {
-                    System.out.println("Skipping Unsupported MD algo: " + a);
+                    System.err.println("Skipping Unsupported MD algo: " + a);
                     continue;
                 }
                 md2 = MessageDigest.getInstance(a, interopProvName);
@@ -70,7 +70,7 @@
                     md2.update(msg);
                     byte[] digest2 = md2.digest();
                     if (!Arrays.equals(digest, digest2)) {
-                        System.out.println("DIFF1 FAILED for: " + a + " at iter " + i);
+                        System.err.println("DIFF1 FAILED for: " + a + " at iter " + i);
                         testPassed = false;
                     }
                 }
@@ -83,7 +83,7 @@
                     byte[] digest = md.digest();
                     byte[] digest2 = md2.digest();
                     if (!Arrays.equals(digest, digest2)) {
-                        System.out.println("DIFF2 FAILED for: " + a + " at iter " + i);
+                        System.err.println("DIFF2 FAILED for: " + a + " at iter " + i);
                         testPassed = false;
                     }
                 }
@@ -94,7 +94,7 @@
                 byte[] digest = md.digest();
                 byte[] digest2 = md2.digest();
                 if (!Arrays.equals(digest, digest2)) {
-                    System.out.println("DIFF-3.1 FAILED for: " + a);
+                    System.err.println("DIFF-3.1 FAILED for: " + a);
                     testPassed = false;
                 }
                 md.update(msg);
@@ -102,26 +102,28 @@
                 digest = md.digest();
                 digest2 = md2.digest();
                 if (!Arrays.equals(digest, digest2)) {
-                    System.out.println("DIFF-3.2 FAILED for: " + a);
+                    System.err.println("DIFF-3.2 FAILED for: " + a);
                     testPassed = false;
                 }
                 md2 = (MessageDigest) md.clone(); // clone after digest
                 digest = md.digest();
                 digest2 = md2.digest();
                 if (!Arrays.equals(digest, digest2)) {
-                    System.out.println("DIFF-3.3 FAILED for: " + a);
+                    System.err.println("DIFF-3.3 FAILED for: " + a);
                     testPassed = false;
                 }
             } catch(Exception ex) {
-                System.out.println("Unexpected Exception: " + a);
+                System.err.println("Unexpected Exception: " + a);
                 ex.printStackTrace();
                 testPassed = false;
             }
         }
-        if (!testPassed) {
-            throw new RuntimeException("One or more MD test failed!");
+        if (testPassed) {
+            System.err.println("MD Tests Passed");
         } else {
-            System.out.println("MD Tests Passed");
+            System.err.println("One or more MD test failed!");
         }
+
+        return testPassed;
     }
 }
--- a/test/com/oracle/security/ucrypto/TestRSA.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/oracle/security/ucrypto/TestRSA.java	Tue Aug 22 02:03:52 2017 +0100
@@ -164,25 +164,35 @@
         (byte)0x04, (byte)0x85, (byte)0x73, (byte)0xd1
     };
 
-    private static KeyPair genRSAKey(int keyLength) throws Exception {
-        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
-        kpg.initialize(keyLength);
-        return kpg.generateKeyPair();
+    private static KeyPair genRSAKey(int keyLength) {
+        try {
+            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
+            kpg.initialize(keyLength);
+            return kpg.generateKeyPair();
+        } catch (NoSuchAlgorithmException e) {
+            System.err.println("Couldn't generate key: " + e);
+            return null;
+        }
     }
 
-    private static KeyPair genPredefinedRSAKeyPair() throws Exception {
-        KeyFactory kf = KeyFactory.getInstance("RSA");
-        BigInteger mod = new BigInteger(MOD);
-        BigInteger pub = new BigInteger(PUB_EXP);
+    private static KeyPair genPredefinedRSAKeyPair() {
+        try {
+            KeyFactory kf = KeyFactory.getInstance("RSA");
+            BigInteger mod = new BigInteger(MOD);
+            BigInteger pub = new BigInteger(PUB_EXP);
 
-        PrivateKey privKey = kf.generatePrivate
-            (new RSAPrivateCrtKeySpec
-             (mod, pub, new BigInteger(PRIV_EXP),
-              new BigInteger(PRIME_P), new BigInteger(PRIME_Q),
-              new BigInteger(EXP_P), new BigInteger(EXP_Q),
-              new BigInteger(CRT_COEFF)));
-        PublicKey pubKey = kf.generatePublic(new RSAPublicKeySpec(mod, pub));
-        return new KeyPair(pubKey, privKey);
+            PrivateKey privKey = kf.generatePrivate
+                (new RSAPrivateCrtKeySpec
+                 (mod, pub, new BigInteger(PRIV_EXP),
+                  new BigInteger(PRIME_P), new BigInteger(PRIME_Q),
+                  new BigInteger(EXP_P), new BigInteger(EXP_Q),
+                  new BigInteger(CRT_COEFF)));
+            PublicKey pubKey = kf.generatePublic(new RSAPublicKeySpec(mod, pub));
+            return new KeyPair(pubKey, privKey);
+        } catch (NoSuchAlgorithmException|InvalidKeySpecException ex) {
+            System.err.println("Couldn't generate predefined key pair: " + ex);
+            return null;
+        }
     }
 
     private static final String CIP_ALGOS[] = {
@@ -207,106 +217,152 @@
         main(new TestRSA(), null);
     }
 
-    public void doTest(Provider prov) throws Exception {
+    public boolean doTest(Provider prov) {
         // first test w/ predefine KeyPair
         KeyPair pkp = genPredefinedRSAKeyPair();
-        System.out.println("Test against Predefined RSA Key Pair");
-        testCipher(pkp, 128, true, prov);
-        testSignature(pkp, true, prov);
+        if (pkp == null)
+            return true;
+        System.err.println("Test against Predefined RSA Key Pair");
+        boolean result1 = testCipher(pkp, 128, true, prov);
+        boolean result2 = testSignature(pkp, true, prov);
 
+        boolean[] cResults = new boolean[10];
+        boolean[] sResults = new boolean[10];
         for (int i = 0; i < 10; i++) {
             // then test w/ various key lengths
             int keyLens[] = { 1024, 2048 };
             kp = new KeyPair[keyLens.length];
 
-            testCipher(keyLens, false, prov);
-            testSignature(keyLens, false, prov);
+            cResults[i] = testCipher(keyLens, false, prov);
+            sResults[i] = testSignature(keyLens, false, prov);
         }
+        boolean result3 = true;
+        boolean result4 = true;
+        for (int i = 0; i < 10; i++) {
+            if (!cResults[i])
+                result3 = false;
+            if (!sResults[i])
+                result4 = false;
+        }
+        return result1 && result2 && result3 && result4;
     }
 
 
-    private static void testCipher(KeyPair kp, int inputSizeInBytes,
-                                   boolean checkInterop, Provider prov)
-        throws Exception {
+    private static boolean testCipher(KeyPair kp, int inputSizeInBytes,
+                                      boolean checkInterop, Provider prov) {
         Cipher c1, c2;
+        boolean[] results = new boolean[CIP_ALGOS.length];
         for (int i = 0; i < CIP_ALGOS.length; i++) {
             String algo = CIP_ALGOS[i];
             try {
                 c1 = Cipher.getInstance(algo, prov);
-            } catch (NoSuchAlgorithmException nsae) {
-                System.out.println("Skip unsupported Cipher algo: " + algo);
+            } catch (NoSuchAlgorithmException|NoSuchPaddingException nsae) {
+                System.err.println("Skip unsupported Cipher algo: " + algo);
+                results[i] = true;
                 continue;
             }
 
-            if (checkInterop) {
-                c2 = Cipher.getInstance(algo, "SunJCE");
-            } else {
-                c2 = Cipher.getInstance(algo, prov);
+            try {
+                if (checkInterop) {
+                    c2 = Cipher.getInstance(algo, "SunJCE");
+                } else {
+                    c2 = Cipher.getInstance(algo, prov);
+                }
+            } catch (NoSuchAlgorithmException|NoSuchPaddingException|NoSuchProviderException nsae) {
+                System.err.println("Skip unsupported Cipher algo: " + algo);
+                results[i] = true;
+                continue;
             }
+
             byte[] data = Arrays.copyOf
                  (PLAINTEXT, inputSizeInBytes - INPUT_SIZE_REDUCTION[i]);
 
-            testEncryption(c1, c2, kp, data);
+            results[i] = testEncryption(c1, c2, kp, data);
         }
+        for (int i = 0; i < CIP_ALGOS.length; i++)
+            if (!results[i])
+                return false;
+        return true;
     }
 
-    private static void testCipher(int keyLens[], boolean checkInterop,
-                                   Provider prov)
-        throws Exception {
+    private static boolean testCipher(int keyLens[], boolean checkInterop,
+                                      Provider prov) {
         // RSA CipherText will always differ due to the random nonce in padding
         // so we check whether both
         // 1) Java Encrypt/C Decrypt
         // 2) C Encrypt/Java Decrypt
         // works
         Cipher c1, c2;
+        boolean[] results = new boolean[CIP_ALGOS.length];
         for (int i = 0; i < CIP_ALGOS.length; i++) {
             String algo = CIP_ALGOS[i];
+            results[i] = true;
             try {
                 c1 = Cipher.getInstance(algo, prov);
-            } catch (NoSuchAlgorithmException nsae) {
-                System.out.println("Skip unsupported Cipher algo: " + algo);
+            } catch (NoSuchAlgorithmException|NoSuchPaddingException nsae) {
+                System.err.println("Skip unsupported Cipher algo: " + algo);
                 continue;
             }
 
-            if (checkInterop) {
-                c2 = Cipher.getInstance(algo, "SunJCE");
-            } else {
-                c2 = Cipher.getInstance(algo, prov);
+            try {
+                if (checkInterop) {
+                    c2 = Cipher.getInstance(algo, "SunJCE");
+                } else {
+                    c2 = Cipher.getInstance(algo, prov);
+                }
+            } catch (NoSuchAlgorithmException|NoSuchPaddingException|NoSuchProviderException nsae) {
+                System.err.println("Skip unsupported Cipher algo: " + algo);
+                continue;
             }
 
+            boolean[] encResults = new boolean[keyLens.length];
             for (int h = 0; h < keyLens.length; h++) {
                 // Defer key pair generation until now when it'll soon be used.
                 if (kp[h] == null) {
                     kp[h] = genRSAKey(keyLens[h]);
+                    if (kp[h] == null) {
+                        encResults[h] = true;
+                        continue;
+                    }
                 }
-                System.out.println("\tTesting Cipher " + algo + " w/ KeySize " + keyLens[h]);
+                System.err.println("Testing Cipher " + algo + " w/ KeySize " + keyLens[h]);
                 byte[] data = Arrays.copyOf
                     (PLAINTEXT, keyLens[h]/8 - INPUT_SIZE_REDUCTION[i]);
-                testEncryption(c1, c2, kp[h], data);
+                encResults[h] = testEncryption(c1, c2, kp[h], data);
             }
+            for (int h = 0; h < keyLens.length; h++)
+                if (!encResults[h])
+                    results[i] = false;
         }
+        for (int i = 0; i < CIP_ALGOS.length; i++)
+            if (!results[i])
+                return false;
+        return true;
     }
 
-    private static void testEncryption(Cipher c1, Cipher c2, KeyPair kp, byte[] data)
-        throws Exception {
+    private static boolean testEncryption(Cipher c1, Cipher c2, KeyPair kp, byte[] data) {
         // C1 Encrypt + C2 Decrypt
         byte[] out1 = null;
         byte[] recoveredText = null;
+        boolean result1 = true;
         try {
             c1.init(Cipher.ENCRYPT_MODE, kp.getPublic());
             out1 = c1.doFinal(data);
             c2.init(Cipher.DECRYPT_MODE, kp.getPrivate());
             recoveredText = c2.doFinal(out1);
         } catch (Exception ex) {
-            System.out.println("\tDEC ERROR: unexpected exception");
+            System.err.println("DEC ERROR: unexpected exception: " + ex);
             ex.printStackTrace();
-            throw ex;
+            result1 = false;
         }
+        boolean result2 = true;
         if(!Arrays.equals(recoveredText, data)) {
-            throw new RuntimeException("\tDEC ERROR: different PT bytes!");
+            System.err.println("DEC ERROR: different PT bytes");
+            result2 = false;
         }
         // C2 Encrypt + C1 Decrypt
         byte[] cipherText = null;
+        boolean result3 = true;
         try {
             c2.init(Cipher.ENCRYPT_MODE, kp.getPublic());
             cipherText = c2.doFinal(data);
@@ -314,108 +370,158 @@
             try {
                 out1 = c1.doFinal(cipherText);
             } catch (Exception ex) {
-                System.out.println("\tENC ERROR: invalid encrypted output");
+                System.err.println("\tENC ERROR: invalid encrypted output: " + ex);
                 ex.printStackTrace();
-                throw ex;
+                result3 = false;
             }
         } catch (Exception ex) {
-            System.out.println("\tENC ERROR: unexpected exception");
+            System.err.println("ENC ERROR: unexpected exception: " + ex);
             ex.printStackTrace();
-            throw ex;
+            result3 = false;
         }
-        if (!Arrays.equals(out1, data)) {
-            throw new RuntimeException("\tENC ERROR: Decrypted result DIFF!");
+        boolean result4 = Arrays.equals(out1, data);
+        if (!result4) {
+            System.err.println("ENC ERROR: Decrypted result DIFF");
         }
-        System.out.println("\t=> PASS");
+        if (result1 && result2 && result3 && result4) {
+            System.err.println("=> PASS");
+            return true;
+        }
+        return false;
     }
 
-    private static void testSignature(KeyPair kp, boolean checkInterop,
-                                      Provider prov) throws Exception {
+    private static boolean testSignature(KeyPair kp, boolean checkInterop,
+                                         Provider prov) {
         byte[] data = PLAINTEXT;
         Signature sig1, sig2;
-        for (int i = 0; i < SIG_ALGOS.length; i++) {
-            String algo = SIG_ALGOS[i];
-            try {
-                sig1 = Signature.getInstance(algo, prov);
-            } catch (NoSuchAlgorithmException nsae) {
-                System.out.println("Skip unsupported Signature algo: " + algo);
-                continue;
-            }
-
-            if (checkInterop) {
-                sig2 = Signature.getInstance(algo, "SunRsaSign");
-            } else {
-                sig2 = Signature.getInstance(algo, prov);
-            }
-            testSigning(sig1, sig2, kp, data);
-        }
-    }
-
-    private static void testSignature(int keyLens[], boolean checkInterop,
-                                      Provider prov) throws Exception {
-        byte[] data = PLAINTEXT;
-        Signature sig1, sig2;
+        boolean[] results = new boolean[SIG_ALGOS.length];
         for (int i = 0; i < SIG_ALGOS.length; i++) {
             String algo = SIG_ALGOS[i];
             try {
                 sig1 = Signature.getInstance(algo, prov);
             } catch (NoSuchAlgorithmException nsae) {
-                System.out.println("Skip unsupported Signature algo: " + algo);
+                System.err.println("Skip unsupported Signature algo: " + algo);
+                results[i] = true;
                 continue;
             }
 
-            if (checkInterop) {
-                sig2 = Signature.getInstance(algo, "SunRsaSign");
-            } else {
-                sig2 = Signature.getInstance(algo, prov);
+            try {
+                if (checkInterop) {
+                    sig2 = Signature.getInstance(algo, "SunRsaSign");
+                } else {
+                    sig2 = Signature.getInstance(algo, prov);
+                }
+            } catch (NoSuchAlgorithmException|NoSuchProviderException nsae) {
+                System.err.println("Skip unsupported interop Signature algo: " + algo);
+                results[i] = true;
+                continue;
+            }
+            results[i] = testSigning(sig1, sig2, kp, data);
+        }
+        for (int i = 0; i < SIG_ALGOS.length; i++)
+            if (!results[i])
+                return false;
+        return true;
+    }
+
+    private static boolean testSignature(int keyLens[], boolean checkInterop,
+                                         Provider prov) {
+        byte[] data = PLAINTEXT;
+        Signature sig1, sig2;
+        boolean[] results = new boolean[SIG_ALGOS.length];
+        for (int i = 0; i < SIG_ALGOS.length; i++) {
+            String algo = SIG_ALGOS[i];
+            results[i] = true;
+            try {
+                sig1 = Signature.getInstance(algo, prov);
+            } catch (NoSuchAlgorithmException nsae) {
+                System.err.println("Skip unsupported Signature algo: " + algo);
+                continue;
             }
 
+            try {
+                if (checkInterop) {
+                    sig2 = Signature.getInstance(algo, "SunRsaSign");
+                } else {
+                    sig2 = Signature.getInstance(algo, prov);
+                }
+            } catch (NoSuchAlgorithmException|NoSuchProviderException nsae) {
+                System.err.println("Skip unsupported Signature algo: " + algo);
+                continue;
+            }
+
+            boolean[] subResults = new boolean[keyLens.length];
             for (int h = 0; h < keyLens.length; h++) {
                 // Defer key pair generation until now when it'll soon be used.
                 if (kp[h] == null) {
                     kp[h] = genRSAKey(keyLens[h]);
+                    if (kp[h] == null) {
+                        subResults[h] = true;
+                        continue;
+                    }
                 }
-                System.out.println("\tTesting Signature " + algo + " w/ KeySize " + keyLens[h]);
+                System.err.println("Testing Signature " + algo + " w/ KeySize " + keyLens[h]);
 
-                testSigning(sig1, sig2, kp[h], data);
+                subResults[h] = testSigning(sig1, sig2, kp[h], data);
             }
+            for (int h = 0; h < keyLens.length; h++)
+                if (!subResults[h])
+                    results[i] = false;
         }
+        for (int i = 0; i < SIG_ALGOS.length; i++)
+            if (!results[i])
+                return false;
+        return true;
     }
 
-    private static void testSigning(Signature sig1, Signature sig2, KeyPair kp, byte[] data)
-            throws Exception {
+    private static boolean testSigning(Signature sig1, Signature sig2, KeyPair kp, byte[] data) {
         boolean sameSig = false;
         byte[] out = null;
+        boolean testInit = true;
         try {
             sig1.initSign(kp.getPrivate());
             sig1.update(data);
             out = sig1.sign();
         } catch (Exception ex) {
-            System.out.println("\tSIGN ERROR: unexpected exception!");
+            System.err.println("SIGN ERROR: unexpected exception: " + ex);
             ex.printStackTrace();
+            testInit = false;
         }
 
-        sig2.initSign(kp.getPrivate());
-        sig2.update(data);
-        byte[] out2 = sig2.sign();
-        if (!Arrays.equals(out2, out)) {
-            throw new RuntimeException("\tSIGN ERROR: Signature DIFF!");
+        boolean testInit2 = true;
+        byte[] out2 = null;
+        try {
+            sig2.initSign(kp.getPrivate());
+            sig2.update(data);
+            out2 = sig2.sign();
+        } catch (InvalidKeyException|SignatureException ex) {
+            System.err.println("SIGN ERROR: unexpected exception " + ex);
+            ex.printStackTrace();
+            testInit2 = false;
+        }
+        boolean sigTestPassed = true;
+        if (out2 == null || !Arrays.equals(out2, out)) {
+            System.err.println("SIGN ERROR: Signature DIFF!");
+            sigTestPassed = false;
         }
 
         boolean verify = false;
         try {
-            System.out.println("\tVERIFY1 using native out");
+            System.err.println("VERIFY1 using native out");
             sig1.initVerify(kp.getPublic());
             sig1.update(data);
             verify = sig1.verify(out);
             if (!verify) {
-                throw new RuntimeException("VERIFY1 FAIL!");
+                System.err.println("VERIFY1 FAIL!");
             }
         } catch (Exception ex) {
-            System.out.println("\tVERIFY1 ERROR: unexpected exception!");
+            System.err.println("VERIFY1 ERROR: unexpected exception: " + ex);
             ex.printStackTrace();
-            throw ex;
         }
-        System.out.println("\t=> PASS");
+        if (verify && sigTestPassed && testInit && testInit2) {
+            System.err.println("=> PASS");
+            return true;
+        }
+        return false;
     }
 }
--- a/test/com/oracle/security/ucrypto/UcryptoTest.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/oracle/security/ucrypto/UcryptoTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -44,22 +44,26 @@
         return (Provider)obj;
     }
 
-    public abstract void doTest(Provider p) throws Exception;
+    public abstract boolean doTest(Provider p) throws Exception;
 
     public static void main(UcryptoTest test, String config) throws Exception {
         Provider prov = null;
-        if (hasUcrypto) {
-            if (config != null) {
-                prov = getCustomizedUcrypto(config);
-            } else {
-                prov = Security.getProvider("OracleUcrypto");
-            }
+        if (hasUcrypto && config != null) {
+            prov = getCustomizedUcrypto(config);
         }
-        if (prov == null) {
-            // un-available, skip testing...
-            System.out.println("No OracleUcrypto provider found, skipping test");
-            return;
+        List<Provider> providers = Arrays.asList(Security.getProviders());
+        if (prov != null)
+            providers.add(prov);
+        List<String> failures = new ArrayList<String>();
+        for (Provider p : providers) {
+            System.err.println("Testing provider: " + p);
+            if (!test.doTest(p))
+                failures.add(p.getName());
         }
-        test.doTest(prov);
+        if (failures.size() != 0)
+            throw new RuntimeException("The following providers failed: " +
+                                       failures);
+        System.err.println("All providers passed.");
     }
+
 }
--- a/test/com/sun/crypto/provider/Cipher/UTIL/TestUtil.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/crypto/provider/Cipher/UTIL/TestUtil.java	Tue Aug 22 02:03:52 2017 +0100
@@ -44,18 +44,9 @@
         }
     }
 
-    private static boolean isUnlimitedPolicy() throws IOException {
+    private static boolean isUnlimitedPolicy() {
         if (instance == null) {
-            String jreDir = System.getProperty("java.home");
-            String localPolicyPath = jreDir + File.separator + "lib" +
-                File.separator + "security" + File.separator +
-                "local_policy.jar";
-            JarFile localPolicy = new JarFile(localPolicyPath);
-            if (localPolicy.getEntry("exempt_local.policy") == null) {
-                return true;
-            } else {
-                return false;
-            }
+            return true;
         } else {
             return instance.isUnlimited;
         }
--- a/test/com/sun/crypto/provider/KeyAgreement/TestExponentSize.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/crypto/provider/KeyAgreement/TestExponentSize.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014 Red Hat Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -58,7 +59,7 @@
      */
     private enum Sizes {
         two56(256), three84(384), five12(512), seven68(768), ten24(1024),
-        twenty48(2048);
+        twenty48(2048), forty96(4096);
 
         private final int intSize;
         private final BigInteger bigIntValue;
@@ -130,6 +131,19 @@
         kp = kpg.generateKeyPair();
         checkKeyPair(kp, Sizes.twenty48, Sizes.five12);
 
+        kpg.initialize(Sizes.forty96.getIntSize());
+        kp = kpg.generateKeyPair();
+        checkKeyPair(kp, Sizes.forty96, Sizes.twenty48);
+
+        publicKey = (DHPublicKey)kp.getPublic();
+        p = publicKey.getParams().getP();
+        g = publicKey.getParams().getG();
+
+        // test w/ all values specified
+        kpg.initialize(new DHParameterSpec(p, g, Sizes.ten24.getIntSize()));
+        kp = kpg.generateKeyPair();
+        checkKeyPair(kp, Sizes.forty96, Sizes.ten24);
+
         System.out.println("OK");
     }
 
--- a/test/com/sun/crypto/provider/KeyFactory/TestProviderLeak.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/crypto/provider/KeyFactory/TestProviderLeak.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -23,55 +23,118 @@
 
 /*
  * @test
- * @bug 6578538
+ * @bug 6578538 8027624
  * @summary com.sun.crypto.provider.SunJCE instance leak using KRB5 and
  *     LoginContext
  * @author Brad Wetmore
  *
- * @run main/othervm -Xmx2m -XX:OldSize=1m -XX:NewSize=512k TestProviderLeak
+ * @run main/othervm -Xmx20m TestProviderLeak
  *
- * The original test invocation is below, but had to use the above
- * workaround for bug 6923123.
- *
- * run main/othervm -Xmx2m TestProviderLeak
  */
 
 /*
- * We force the leak to become a problem by specifying the minimum
- * size heap we can (above).  In current runs on a server and client
- * machine, it took roughly 220-240 iterations to have the memory leak
- * shut down other operations.  It complained about "Unable to verify
- * the SunJCE provider."
+ * We force the leak to become a problem by eating up most JVM free memory.
+ * In current runs on a server and client machine, it took roughly 50-150
+ * iterations to have the memory leak or time-out shut down other operations.
+ * It complained about "JCE cannot authenticate the provider SunJCE" or timed
+ * out.
  */
 
 import javax.crypto.*;
 import javax.crypto.spec.*;
 
+import java.util.*;
+import java.util.concurrent.*;
+
 public class TestProviderLeak {
+    private static final int MB = 1024 * 1024;
+    // Currently, 3MB heap size is reserved for running testing iterations.
+    // It is tweaked to make sure the test quickly triggers the memory leak
+    // or throws out TimeoutException.
+    private static final int RESERVATION = 3;
+    // The maximum time, 5 seconds, to wait for each iteration.
+    private static final int TIME_OUT = 5;
+
+    private static Deque<byte []> eatupMemory() throws Exception {
+        dumpMemoryStats("Before memory allocation");
+
+        Deque<byte []> data = new ArrayDeque<byte []>();
+        boolean hasException = false;
+        while (!hasException) {
+            byte [] megaByte;
+            try {
+                megaByte = new byte [MB];
+                data.add(megaByte);
+            } catch (OutOfMemoryError e) {
+                megaByte = null;    // Free memory ASAP
+
+                int size = data.size();
+
+                for (int j = 0; j < RESERVATION && !data.isEmpty(); j++) {
+                    data.removeLast();
+                }
+                System.gc();
+                hasException = true;
+                System.out.println("OOME is thrown when allocating "
+                        + size + "MB memory.");
+            }
+        }
+        dumpMemoryStats("After memory allocation");
+
+        return data;
+    }
+
     private static void dumpMemoryStats(String s) throws Exception {
         Runtime rt = Runtime.getRuntime();
-        System.out.println(s + ":\t" +
-            rt.freeMemory() + " bytes free");
+        System.out.println(s + ":\t"
+            + rt.freeMemory() + " bytes free");
     }
 
     public static void main(String [] args) throws Exception {
-        SecretKeyFactory skf =
+        // Prepare the test
+        final SecretKeyFactory skf =
             SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1", "SunJCE");
-        PBEKeySpec pbeKS = new PBEKeySpec(
+        final PBEKeySpec pbeKS = new PBEKeySpec(
             "passPhrase".toCharArray(), new byte [] { 0 }, 5, 512);
-        for (int i = 0; i <= 1000; i++) {
-            try {
-                skf.generateSecret(pbeKS);
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        Callable<SecretKey> task = new Callable<SecretKey>() {
+            @Override
+            public SecretKey call() throws Exception {
+                return skf.generateSecret(pbeKS);
+            }
+        };
+
+        // Eat up memory
+        Deque<byte []> dummyData = eatupMemory();
+        assert (dummyData != null);
+
+        // Start testing iteration
+        try {
+            for (int i = 0; i <= 1000; i++) {
                 if ((i % 20) == 0) {
-                     // Calling gc() isn't dependable, but doesn't hurt.
-                     // Gives better output in leak cases.
+                    // Calling gc() isn't dependable, but doesn't hurt.
+                    // Gives better output in leak cases.
                     System.gc();
                     dumpMemoryStats("Iteration " + i);
                 }
-            } catch (Exception e) {
-                dumpMemoryStats("\nException seen at iteration " + i);
-                throw e;
+
+                Future<SecretKey> future = executor.submit(task);
+
+                try {
+                    future.get(TIME_OUT, TimeUnit.SECONDS);
+                } catch (Exception e) {
+                    dumpMemoryStats("\nException seen at iteration " + i);
+                    throw e;
+                }
             }
+        } finally {
+            // JTReg will time out after two minutes. Proactively release
+            // the memory to avoid JTReg time-out situation.
+            dummyData = null;
+            System.gc();
+            dumpMemoryStats("Memory dereference");
+            executor.shutdownNow();
         }
     }
 }
--- a/test/com/sun/jdi/AllLineLocations.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/AllLineLocations.java	Tue Aug 22 02:03:52 2017 +0100
@@ -27,7 +27,6 @@
  *  @summary Test ReferenceType.allLineLocations
  *  @author Gordon Hirsch
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g RefTypes.java
  *  @run build AllLineLocations
--- a/test/com/sun/jdi/ClassesByName.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/ClassesByName.java	Tue Aug 22 02:03:52 2017 +0100
@@ -26,7 +26,6 @@
  *  @bug 4287992
  *  @author Robert Field
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g HelloWorld.java
  *  @run build ClassesByName
--- a/test/com/sun/jdi/ExceptionEvents.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/ExceptionEvents.java	Tue Aug 22 02:03:52 2017 +0100
@@ -28,7 +28,6 @@
  *
  *  @author Robert Field
  *
- *  @library scaffold
  *  @run build TestScaffold VMConnection
  *  @run compile -g ExceptionEvents.java
  *
--- a/test/com/sun/jdi/FilterMatch.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/FilterMatch.java	Tue Aug 22 02:03:52 2017 +0100
@@ -28,7 +28,6 @@
  *
  *  @author Robert Field/Jim Holmlund
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g HelloWorld.java
  *  @run main/othervm FilterMatch
--- a/test/com/sun/jdi/FilterNoMatch.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/FilterNoMatch.java	Tue Aug 22 02:03:52 2017 +0100
@@ -28,7 +28,6 @@
  *
  *  @author Robert Field/Jim Holmlund
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g HelloWorld.java
  *  @run main/othervm FilterNoMatch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jdi/GetUninitializedStringValue.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,91 @@
+/*
+ * 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.
+ *
+ * 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 8021897
+ *  @summary Test getting the value for an uninitialized String object
+ *
+ *  @author Staffan Larsen
+ *
+ *  @run build TestScaffold VMConnection TargetListener TargetAdapter
+ *  @run compile -g GetUninitializedStringValue.java
+ *  @run main GetUninitializedStringValue
+ */
+import com.sun.jdi.ReferenceType;
+import com.sun.jdi.StackFrame;
+import com.sun.jdi.StringReference;
+import com.sun.jdi.ThreadReference;
+import com.sun.jdi.event.BreakpointEvent;
+
+ /********** target program **********/
+
+class GetUninitializedStringValueTarg {
+    public static void main(String[] args) {
+        new String("foo");
+        System.out.println("Goodbye from GetUninitializedStringValueTarg!");
+    }
+}
+
+ /********** test program **********/
+
+public class GetUninitializedStringValue extends TestScaffold {
+    ReferenceType targetClass;
+    ThreadReference mainThread;
+
+    GetUninitializedStringValue (String args[]) {
+        super(args);
+    }
+
+    public static void main(String[] args)
+        throws Exception
+    {
+        new GetUninitializedStringValue (args).startTests();
+    }
+
+    /********** test core **********/
+
+    protected void runTests()
+        throws Exception
+    {
+        /*
+         * Run to String.<init>
+         */
+        startUp("GetUninitializedStringValueTarg");
+        BreakpointEvent bpe = resumeTo("java.lang.String", "<init>", "(Ljava/lang/String;)V");
+
+        /*
+         * We've arrived. Look at 'this' - it will be uninitialized (the value field will not be set yet).
+         */
+        StackFrame frame = bpe.thread().frame(0);
+        StringReference sr = (StringReference)frame.thisObject();
+        if (!sr.value().equals("")) {
+            throw new Exception("Unexpected value for the uninitialized String");
+        }
+
+        /*
+         * resume the target listening for events
+         */
+        listenUntilVMDisconnect();
+    }
+}
--- a/test/com/sun/jdi/LaunchCommandLine.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/LaunchCommandLine.java	Tue Aug 22 02:03:52 2017 +0100
@@ -27,7 +27,6 @@
  *  @summary Test launcher command line construction
  *  @author Gordon Hirsch
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g HelloWorld.java
  *  @run build LaunchCommandLine
--- a/test/com/sun/jdi/ModificationWatchpoints.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/ModificationWatchpoints.java	Tue Aug 22 02:03:52 2017 +0100
@@ -29,7 +29,6 @@
  *  @author Daniel Prusa (or someone in the FFJ group)
  *  @author Robert Field (modified to JDIScaffold)
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g ModificationWatchpoints.java
  *  @run main/othervm ModificationWatchpoints
--- a/test/com/sun/jdi/NativeInstanceFilter.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/NativeInstanceFilter.java	Tue Aug 22 02:03:52 2017 +0100
@@ -28,7 +28,6 @@
  *
  *  @author Keith McGuigan
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @compile -XDignore.symbol.file NativeInstanceFilterTarg.java
  *  @run main/othervm NativeInstanceFilter
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jdi/NullThreadGroupNameTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,112 @@
+/*
+ * 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.
+ *
+ * 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 7105883
+ *  @summary Ensure that JDWP doesn't crash with a null thread group name
+ *
+ *  @run build TestScaffold VMConnection TargetListener TargetAdapter
+ *  @run main NullThreadGroupNameTest
+ */
+import com.sun.jdi.*;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.event.*;
+import com.sun.jdi.request.*;
+import com.sun.jdi.VMDisconnectedException;
+import java.util.concurrent.CountDownLatch;
+import java.util.*;
+
+class DebugTarget {
+    public final static String DEBUG_THREAD_NAME = "DebugThread";
+
+    public static void main(String[] args) throws Exception {
+        DebugThread thread = new DebugThread();
+        thread.start();
+        thread.runningLatch.await();
+        breakpointHere();
+        thread.breakpointLatch.countDown();
+    }
+
+    public static void breakpointHere() {
+        System.out.println("Breakpoint finished!");
+    }
+
+    static class DebugThread extends Thread {
+        final CountDownLatch runningLatch = new CountDownLatch(1);
+        final CountDownLatch breakpointLatch = new CountDownLatch(1);
+
+        public DebugThread() {
+            super(new ThreadGroup(null), DEBUG_THREAD_NAME);
+        }
+
+        public void run() {
+            runningLatch.countDown();
+            try {
+                breakpointLatch.await();
+            } catch (InterruptedException ie) {
+                ie.printStackTrace();
+            }
+        }
+    }
+}
+
+public class NullThreadGroupNameTest extends TestScaffold {
+
+    NullThreadGroupNameTest(String args[]) {
+        super(args);
+    }
+
+    public static void main(String[] args) throws Exception {
+        new NullThreadGroupNameTest(args).startTests();
+    }
+
+    protected void runTests() throws Exception {
+        startTo("DebugTarget", "breakpointHere", "()V");
+
+        ThreadReference thread = findThread(DebugTarget.DEBUG_THREAD_NAME);
+        assertThreadGroupName(thread.threadGroup(), "");
+
+        listenUntilVMDisconnect();
+    }
+
+    private ThreadReference findThread(String name) {
+        for (ThreadReference thread : vm().allThreads()) {
+            if (name.equals(thread.name())) {
+                return thread;
+            }
+        }
+        throw new NoSuchElementException("Couldn't find " + name);
+    }
+
+    private void assertThreadGroupName(ThreadGroupReference threadGroup, String expectedName) {
+        try {
+            String name = threadGroup.name();
+            if (!expectedName.equals(name)) {
+                throw new AssertionError("Unexpected thread group name '" + name + "'");
+            }
+        } catch (VMDisconnectedException vmde) {
+            throw new AssertionError("Likely JVM crash with null thread group name", vmde);
+        }
+    }
+}
--- a/test/com/sun/jdi/UnpreparedByName.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/UnpreparedByName.java	Tue Aug 22 02:03:52 2017 +0100
@@ -28,7 +28,6 @@
  *  won't be returned by classesByName.
  *  @author Robert Field
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g InnerTarg.java
  *  @run build UnpreparedByName
--- a/test/com/sun/jdi/UnpreparedClasses.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/UnpreparedClasses.java	Tue Aug 22 02:03:52 2017 +0100
@@ -28,7 +28,6 @@
  *  loaded class list are prepared classes.
  *  @author Robert Field
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g InnerTarg.java
  *  @run build UnpreparedClasses
--- a/test/com/sun/jdi/Vars.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/com/sun/jdi/Vars.java	Tue Aug 22 02:03:52 2017 +0100
@@ -27,7 +27,6 @@
  *
  *  @author Robert Field
  *
- *  @library scaffold
  *  @run build JDIScaffold VMConnection
  *  @run compile -g Vars.java
  *  @run main/othervm Vars
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jdi/oom/@debuggeeVMOptions	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,1 @@
+-Xmx40m
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jdi/oom/OomDebugTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,417 @@
+/*
+ * Copyright (c) 2016 Red Hat Inc.
+ *
+ * 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 8153711
+ *  @summary JDWP: Memory Leak (global references not deleted after invokeMethod).
+ *
+ *  @author Severin Gehwolf <sgehwolf@redhat.com>
+ *
+ *  @library ..
+ *  @run build TestScaffold VMConnection TargetListener TargetAdapter
+ *  @run compile -g OomDebugTest.java
+ *  @run shell OomDebugTestSetup.sh
+ *  @run main OomDebugTest OomDebugTestTarget test1
+ *  @run main OomDebugTest OomDebugTestTarget test2
+ *  @run main OomDebugTest OomDebugTestTarget test3
+ *  @run main OomDebugTest OomDebugTestTarget test4
+ *  @run main OomDebugTest OomDebugTestTarget test5
+ */
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
+import com.sun.jdi.ArrayReference;
+import com.sun.jdi.ArrayType;
+import com.sun.jdi.ClassType;
+import com.sun.jdi.Field;
+import com.sun.jdi.InvocationException;
+import com.sun.jdi.Method;
+import com.sun.jdi.ObjectReference;
+import com.sun.jdi.ReferenceType;
+import com.sun.jdi.StackFrame;
+import com.sun.jdi.VMOutOfMemoryException;
+import com.sun.jdi.Value;
+import com.sun.jdi.event.BreakpointEvent;
+import com.sun.jdi.event.ExceptionEvent;
+
+/***************** Target program **********************/
+
+class OomDebugTestTarget {
+
+    OomDebugTestTarget() {
+        System.out.println("DEBUG: invoked constructor");
+    }
+    static class FooCls {
+        @SuppressWarnings("unused")
+        private byte[] bytes = new byte[3000000];
+    };
+
+    FooCls fooCls = new FooCls();
+    byte[] byteArray = new byte[0];
+
+    void testMethod(FooCls foo) {
+        System.out.println("DEBUG: invoked 'void testMethod(FooCls)', foo == " + foo);
+    }
+
+    void testPrimitive(byte[] foo) {
+        System.out.println("DEBUG: invoked 'void testPrimitive(byte[])', foo == " + foo);
+    }
+
+    byte[] testPrimitiveArrRetval() {
+        System.out.println("DEBUG: invoked 'byte[] testPrimitiveArrRetval()'");
+        return new byte[3000000];
+    }
+
+    FooCls testFooClsRetval() {
+        System.out.println("DEBUG: invoked 'FooCls testFooClsRetval()'");
+        return new FooCls();
+    }
+
+    public void entry() {}
+
+    public static void main(String[] args){
+        System.out.println("DEBUG: OomDebugTestTarget.main");
+        new OomDebugTestTarget().entry();
+    }
+}
+
+/***************** Test program ************************/
+
+public class OomDebugTest extends TestScaffold {
+
+    private static final String[] ALL_TESTS = new String[] {
+            "test1", "test2", "test3", "test4", "test5"
+    };
+    private static final Set<String> ALL_TESTS_SET = new HashSet<String>();
+    static {
+        ALL_TESTS_SET.addAll(Arrays.asList(ALL_TESTS));
+    }
+    private static final String TEST_CLASSES = System.getProperty("test.classes", ".");
+    private static final File RESULT_FILE = new File(TEST_CLASSES, "results.properties");
+    private static final String LAST_TEST = ALL_TESTS[ALL_TESTS.length - 1];
+    private ReferenceType targetClass;
+    private ObjectReference thisObject;
+    private int failedTests;
+    private final String testMethod;
+
+    public OomDebugTest(String[] args) {
+        super(args);
+        if (args.length != 2) {
+            throw new RuntimeException("Wrong number of command-line arguments specified.");
+        }
+        this.testMethod = args[1];
+    }
+
+    @Override
+    protected void runTests() throws Exception {
+        try {
+            addListener(new TargetAdapter() {
+
+                @Override
+                public void exceptionThrown(ExceptionEvent event) {
+                    String name = event.exception().referenceType().name();
+                    System.err.println("DEBUG: Exception thrown in debuggee was: " + name);
+                }
+            });
+            /*
+             * Get to the top of entry()
+             * to determine targetClass and mainThread
+             */
+            BreakpointEvent bpe = startTo("OomDebugTestTarget", "entry", "()V");
+            targetClass = bpe.location().declaringType();
+
+            mainThread = bpe.thread();
+
+            StackFrame frame = mainThread.frame(0);
+            thisObject = frame.thisObject();
+            java.lang.reflect.Method m = findTestMethod();
+            m.invoke(this);
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+            failure();
+        } catch (SecurityException e) {
+            e.printStackTrace();
+            failure();
+        }
+        /*
+         * resume the target, listening for events
+         */
+        listenUntilVMDisconnect();
+    }
+
+    private java.lang.reflect.Method findTestMethod()
+            throws NoSuchMethodException, SecurityException {
+        return OomDebugTest.class.getDeclaredMethod(testMethod);
+    }
+
+    private void failure() {
+        failedTests++;
+    }
+
+    /*
+     * Test case: Object reference as method parameter.
+     */
+    @SuppressWarnings("unused") // called via reflection
+    private void test1() throws Exception {
+        System.out.println("DEBUG: ------------> Running test1");
+        try {
+            Field field = targetClass.fieldByName("fooCls");
+            ClassType clsType = (ClassType)field.type();
+            Method constructor = getConstructorForClass(clsType);
+            for (int i = 0; i < 15; i++) {
+                @SuppressWarnings({ "rawtypes", "unchecked" })
+                ObjectReference objRef = clsType.newInstance(mainThread,
+                                                             constructor,
+                                                             new ArrayList(0),
+                                                             ObjectReference.INVOKE_NONVIRTUAL);
+                if (objRef.isCollected()) {
+                    System.out.println("DEBUG: Object got GC'ed before we can use it. NO-OP.");
+                    continue;
+                }
+                invoke("testMethod", "(LOomDebugTestTarget$FooCls;)V", objRef);
+            }
+        } catch (InvocationException e) {
+            handleFailure(e);
+        }
+    }
+
+    /*
+     * Test case: Array reference as method parameter.
+     */
+    @SuppressWarnings("unused") // called via reflection
+    private void test2() throws Exception {
+        System.out.println("DEBUG: ------------> Running test2");
+        try {
+            Field field = targetClass.fieldByName("byteArray");
+            ArrayType arrType = (ArrayType)field.type();
+
+            for (int i = 0; i < 15; i++) {
+                ArrayReference byteArrayVal = arrType.newInstance(3000000);
+                if (byteArrayVal.isCollected()) {
+                    System.out.println("DEBUG: Object got GC'ed before we can use it. NO-OP.");
+                    continue;
+                }
+                invoke("testPrimitive", "([B)V", byteArrayVal);
+            }
+        } catch (VMOutOfMemoryException e) {
+            defaultHandleOOMFailure(e);
+        }
+    }
+
+    /*
+     * Test case: Array reference as return value.
+     */
+    @SuppressWarnings("unused") // called via reflection
+    private void test3() throws Exception {
+        System.out.println("DEBUG: ------------> Running test3");
+        try {
+            for (int i = 0; i < 15; i++) {
+                invoke("testPrimitiveArrRetval",
+                       "()[B",
+                       Collections.EMPTY_LIST,
+                       vm().mirrorOfVoid());
+            }
+        } catch (InvocationException e) {
+            handleFailure(e);
+        }
+    }
+
+    /*
+     * Test case: Object reference as return value.
+     */
+    @SuppressWarnings("unused") // called via reflection
+    private void test4() throws Exception {
+        System.out.println("DEBUG: ------------> Running test4");
+        try {
+            for (int i = 0; i < 15; i++) {
+                invoke("testFooClsRetval",
+                       "()LOomDebugTestTarget$FooCls;",
+                       Collections.EMPTY_LIST,
+                       vm().mirrorOfVoid());
+            }
+        } catch (InvocationException e) {
+            handleFailure(e);
+        }
+    }
+
+    /*
+     * Test case: Constructor
+     */
+    @SuppressWarnings({ "unused", "unchecked", "rawtypes" }) // called via reflection
+    private void test5() throws Exception {
+        System.out.println("DEBUG: ------------> Running test5");
+        try {
+            ClassType type = (ClassType)thisObject.type();
+            for (int i = 0; i < 15; i++) {
+                type.newInstance(mainThread,
+                                 findMethod(targetClass, "<init>", "()V"),
+                                 new ArrayList(0),
+                                 ObjectReference.INVOKE_NONVIRTUAL);
+            }
+        } catch (InvocationException e) {
+            handleFailure(e);
+        }
+    }
+
+    private Method getConstructorForClass(ClassType clsType) {
+        List<Method> methods = clsType.methodsByName("<init>");
+        if (methods.size() != 1) {
+            throw new RuntimeException("FAIL. Expected only one, the default, constructor");
+        }
+        return methods.get(0);
+    }
+
+    private void handleFailure(InvocationException e) {
+        // There is no good way to see the OOME diagnostic message in the target since the
+        // TestScaffold might throw an exception while trying to print the stack trace. I.e
+        // it might get a a VMDisconnectedException before the stack trace printing finishes.
+        System.err.println("FAILURE: InvocationException thrown. Trying to determine cause...");
+        defaultHandleOOMFailure(e);
+    }
+
+    private void defaultHandleOOMFailure(Exception e) {
+        e.printStackTrace();
+        failure();
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    void invoke(String methodName, String methodSig, Value value)
+            throws Exception {
+        List args = new ArrayList(1);
+        args.add(value);
+        invoke(methodName, methodSig, args, value);
+    }
+
+    void invoke(String methodName,
+                String methodSig,
+                @SuppressWarnings("rawtypes") List args,
+                Value value) throws Exception {
+        Method method = findMethod(targetClass, methodName, methodSig);
+        if ( method == null) {
+            failure("FAILED: Can't find method: "
+                    + methodName  + " for class = " + targetClass);
+            return;
+        }
+        invoke(method, args, value);
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    void invoke(Method method, List args, Value value) throws Exception {
+        thisObject.invokeMethod(mainThread, method, args, 0);
+        System.out.println("DEBUG: Done invoking method via debugger.");
+    }
+
+    Value fieldValue(String fieldName) {
+        Field field = targetClass.fieldByName(fieldName);
+        return thisObject.getValue(field);
+    }
+
+    // Determine the pass/fail status on some heuristic and don't fail the
+    // test if < 3 of the total number of tests (currently 5) fail. This also
+    // has the nice side effect that all tests are first attempted and only
+    // all tests ran an overall pass/fail status is determined.
+    private static void determineOverallTestStatus(OomDebugTest oomTest)
+                                   throws IOException, FileNotFoundException {
+        Properties resultProps = new Properties();
+        if (!RESULT_FILE.exists()) {
+            RESULT_FILE.createNewFile();
+        }
+        FileInputStream fin = null;
+        try {
+            fin = new FileInputStream(RESULT_FILE);
+            resultProps.load(fin);
+            resultProps.put(oomTest.testMethod,
+                            Integer.toString(oomTest.failedTests));
+        } finally {
+            if (fin != null) {
+                fin.close();
+            }
+        }
+        System.out.println("DEBUG: Finished running test '"
+                           + oomTest.testMethod + "'.");
+        if (LAST_TEST.equals(oomTest.testMethod)) {
+            System.out.println("DEBUG: Determining overall test status.");
+            Set<String> actualTestsRun = new HashSet<String>();
+            int totalTests = ALL_TESTS.length;
+            int failedTests = 0;
+            for (Object key: resultProps.keySet()) {
+                actualTestsRun.add((String)key);
+                Object propVal = resultProps.get(key);
+                int value = Integer.parseInt((String)propVal);
+                failedTests += value;
+            }
+            if (!ALL_TESTS_SET.equals(actualTestsRun)) {
+                String errorMsg = "Test failed! Expected to run tests '"
+                        + ALL_TESTS_SET + "', but only these were run '"
+                        + actualTestsRun + "'";
+                throw new RuntimeException(errorMsg);
+            }
+            if (failedTests >= 3) {
+                String errorMsg = "Test failed. Expected < 3 sub-tests to fail "
+                                  + "for a pass. Got " + failedTests
+                                  + " failed tests out of " + totalTests + ".";
+                throw new RuntimeException(errorMsg);
+            }
+            RESULT_FILE.delete();
+            System.out.println("All " + totalTests + " tests passed.");
+        } else {
+            System.out.println("DEBUG: More tests to run. Continuing.");
+            FileOutputStream fout = null;
+            try {
+                fout = new FileOutputStream(RESULT_FILE);
+                resultProps.store(fout, "Storing results after test "
+                                         + oomTest.testMethod);
+            } finally {
+                if (fout != null) {
+                    fout.close();
+                }
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        System.setProperty("test.vm.opts", "-Xmx40m"); // Set debuggee VM option
+        OomDebugTest oomTest = new OomDebugTest(args);
+        try {
+            oomTest.startTests();
+        } catch (Throwable e) {
+            System.out.println("DEBUG: Got exception for test run. " + e);
+            e.printStackTrace();
+            oomTest.failure();
+        }
+        determineOverallTestStatus(oomTest);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jdi/oom/OomDebugTestSetup.sh	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,46 @@
+#!/bin/sh
+#
+# Copyright (c) 2016 Red Hat Inc.
+# 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.
+#
+
+
+if [ "${TESTSRC}" = "" ]
+then
+  echo "TESTSRC not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+echo "TESTSRC=${TESTSRC}"
+
+if [ "${TESTJAVA}" = "" ]
+then
+  echo "TESTJAVA not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+echo "TESTJAVA=${TESTJAVA}"
+
+if [ "${TESTCLASSES}" = "" ]
+then
+  echo "TESTCLASSES not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+
+cp ${TESTSRC}/@debuggeeVMOptions ${TESTCLASSES}/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jndi/dns/IPv6NameserverPlatformParsingTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2015, Red Hat, Inc.
+ * 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.Field;
+import java.util.Hashtable;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.NamingManager;
+
+import com.sun.jndi.dns.DnsContext;
+
+/**
+ * @test
+ * @bug 6991580
+ * @summary IPv6 Nameservers in resolv.conf throws NumberFormatException
+ * @run main/manual IPv6NameserverPlatformParsingTest
+ *
+ * In order to run this test be sure to place, for example, the following
+ * snippet into your platform's {@code /etc/resolv.conf}:
+ * <pre>
+ * nameserver 127.0.0.1
+ * nameserver 2001:4860:4860::8888
+ * nameserver [::1]:5353
+ * nameserver 127.0.0.1:5353
+ * </pre>
+ *
+ * Then, run this test as manual jtreg test.
+ *
+ * @author Severin Gehwolf
+ *
+ */
+public class IPv6NameserverPlatformParsingTest {
+
+    private static boolean foundIPv6 = false;
+
+    public static void main(String[] args) {
+        Hashtable<String, String> env = new Hashtable<>();
+        env.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.dns.DnsContextFactory.class.getName());
+
+        String[] servers;
+        try {
+            Context ctx = NamingManager.getInitialContext(env);
+            if (!com.sun.jndi.dns.DnsContextFactory.platformServersAvailable()) {
+                throw new RuntimeException("FAIL: no platform servers available, test does not make sense");
+            }
+            DnsContext context = (DnsContext)ctx;
+            servers = getServersFromContext(context);
+        } catch (NamingException e) {
+            throw new RuntimeException(e);
+        }
+        for (String server: servers) {
+            System.out.println("DEBUG: 'nameserver = " + server + "'");
+            if (server.indexOf(':') >= 0 && server.indexOf('.') < 0) {
+                System.out.println("DEBUG: ==> Found IPv6 address in servers list: " + server);
+                foundIPv6 = true;
+            }
+        }
+        try {
+            new com.sun.jndi.dns.DnsClient(servers, 100, 1);
+        } catch (NumberFormatException e) {
+            throw new RuntimeException("FAIL: Tried to parse non-[]-encapsulated IPv6 address.", e);
+        } catch (Exception e) {
+            throw new RuntimeException("ERROR: Something unexpected happened.");
+        }
+        if (!foundIPv6) {
+            // This is a manual test, since it requires changing /etc/resolv.conf on Linux/Unix
+            // platforms. See comment as to how to run this test.
+            throw new RuntimeException("ERROR: No IPv6 address returned from platform.");
+        }
+        System.out.println("PASS: Found IPv6 address and DnsClient parsed it correctly.");
+    }
+
+    private static String[] getServersFromContext(DnsContext context) {
+        try {
+            Field serversField = DnsContext.class.getDeclaredField("servers");
+            serversField.setAccessible(true);
+            return (String[])serversField.get(context);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jndi/ldap/LdapURLOptionalFields.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015, Red Hat, Inc.
+ * 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 8074761
+ * @summary RFC-2255 allows attribute, scope and filter to be empty.
+ */
+
+import com.sun.jndi.ldap.LdapURL;
+
+public class LdapURLOptionalFields {
+
+    private static final String[] TEST_URLS = {
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com",
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com?",
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com??",
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com???",
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com????"
+    };
+
+    public static void main(String[] args) throws Exception {
+        for (int i = 0; i < TEST_URLS.length; i++) {
+            String url = TEST_URLS[i];
+            checkEmptyAttributes(url);
+        }
+    }
+
+    private static void checkEmptyAttributes(String urlString) throws Exception {
+        LdapURL url = new LdapURL(urlString);
+        if (url.getAttributes() != null) {
+            throw new Exception("Expected null attributes for url: '" + urlString + "'");
+        }
+        if (url.getScope() != null) {
+            throw new Exception("Expected null scope for url: '" + urlString + "'");
+        }
+        if (url.getFilter() != null) {
+            throw new Exception("Expected null filter for url: '" + urlString + "'");
+        }
+    }
+
+}
--- a/test/java/awt/Component/PrintAllXcheckJNI/PrintAllXcheckJNI.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/awt/Component/PrintAllXcheckJNI/PrintAllXcheckJNI.java	Tue Aug 22 02:03:52 2017 +0100
@@ -39,6 +39,15 @@
         Frame frame = new Frame();
         frame.setVisible(true);
 
+        // wait until frame is really displayed
+        while (frame.getWidth() == 0 || frame.getHeight() == 0) {
+            System.out.println("Still not displayed...");
+            try {
+                Thread.currentThread().sleep(1);
+            }
+            catch (InterruptedException ie) {}
+        }
+
         BufferedImage img = new BufferedImage(frame.getWidth(),
                                               frame.getHeight(),
                                               BufferedImage.TYPE_INT_RGB);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/Focus/8073453/AWTFocusTransitionTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,115 @@
+/*
+ * 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.
+ */
+
+/* @test
+ * @bug 8073453
+ * @summary Focus doesn't move when pressing Shift + Tab keys
+ * @author Dmitry Markov
+ * @compile AWTFocusTransitionTest.java
+ * @run main/othervm AWTFocusTransitionTest
+ */
+import sun.awt.SunToolkit;
+
+import java.awt.*;
+import java.awt.event.KeyEvent;
+
+public class AWTFocusTransitionTest {
+    private static SunToolkit toolkit;
+    private static Robot robot;
+
+    private static Frame frame;
+    private static TextField textField;
+    private static Button button;
+
+    public static void main(String[] args) throws Exception {
+        toolkit = (SunToolkit)Toolkit.getDefaultToolkit();
+        robot = new Robot();
+        robot.setAutoDelay(50);
+
+        try {
+            createAndShowGUI();
+
+            toolkit.realSync();
+
+            checkFocusOwner(textField);
+
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            toolkit.realSync();
+
+            checkFocusOwner(button);
+
+            robot.keyPress(KeyEvent.VK_SHIFT);
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_SHIFT);
+            toolkit.realSync();
+
+            checkFocusOwner(textField);
+
+            robot.keyPress(KeyEvent.VK_SHIFT);
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_SHIFT);
+            toolkit.realSync();
+
+            checkFocusOwner(button);
+        } finally {
+            if (frame != null) {
+                frame.dispose();
+            }
+        }
+        System.out.println("Test Passed!");
+    }
+
+    private static void createAndShowGUI() {
+        frame = new Frame("AWTFocusTransitionTest");
+        frame.setSize(300, 300);
+        frame.setFocusTraversalPolicyProvider(true);
+        frame.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy());
+
+        textField = new TextField();
+        button = new Button();
+
+        Panel panel = new Panel();
+        panel.setFocusTraversalPolicyProvider(true);
+        panel.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy());
+
+        Panel p = new Panel();
+        p.setLayout(new GridLayout(3, 1));
+        p.add(textField);
+        p.add(button);
+        p.add(panel);
+
+        frame.add(p);
+        frame.setVisible(true);
+    }
+
+    private static void checkFocusOwner(Component component) {
+        if (component != frame.getFocusOwner()) {
+            throw new RuntimeException("Test Failed! Incorrect focus owner: " + frame.getFocusOwner() +
+                    ", but expected: " + component);
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/Focus/8073453/SwingFocusTransitionTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ */
+
+/* @test
+ * @bug 8073453
+ * @summary Focus doesn't move when pressing Shift + Tab keys
+ * @author Dmitry Markov
+ * @compile SwingFocusTransitionTest.java
+ * @run main/othervm SwingFocusTransitionTest
+ */
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.KeyEvent;
+
+public class SwingFocusTransitionTest {
+    private static SunToolkit toolkit;
+    private static Robot robot;
+
+    private static JFrame frame;
+    private static JTextField textField;
+    private static JButton button;
+
+    public static void main(String[] args) throws Exception {
+        toolkit = (SunToolkit)Toolkit.getDefaultToolkit();
+        robot = new Robot();
+        robot.setAutoDelay(50);
+
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                @Override
+                public void run() {
+                    createAndShowGUI();
+                }
+            });
+
+            toolkit.realSync();
+
+            checkFocusOwner(textField);
+
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            toolkit.realSync();
+
+            checkFocusOwner(button);
+
+            robot.keyPress(KeyEvent.VK_SHIFT);
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_SHIFT);
+            toolkit.realSync();
+
+            checkFocusOwner(textField);
+
+            robot.keyPress(KeyEvent.VK_SHIFT);
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_SHIFT);
+            toolkit.realSync();
+
+            checkFocusOwner(button);
+        } finally {
+            SwingUtilities.invokeLater(new Runnable() {
+                @Override
+                public void run() {
+                    if (frame != null) {
+                        frame.dispose();
+                    }
+                }
+            });
+        }
+        System.out.println("Test Passed!");
+    }
+
+    private static void createAndShowGUI() {
+        frame = new JFrame("SwingFocusTransitionTest");
+        frame.setSize(300, 300);
+        frame.setFocusTraversalPolicyProvider(true);
+        frame.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
+
+        textField = new JTextField();
+        button = new JButton();
+
+        JPanel panel = new JPanel();
+        panel.setFocusTraversalPolicyProvider(true);
+        panel.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy());
+
+        JPanel p = new JPanel();
+        p.setLayout(new GridLayout(3, 1));
+        p.add(textField);
+        p.add(button);
+        p.add(panel);
+
+        frame.add(p);
+        frame.setVisible(true);
+    }
+
+    private static void checkFocusOwner(final Component component) throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                if (component != frame.getFocusOwner()) {
+                    throw new RuntimeException("Test Failed! Incorrect focus owner: " + frame.getFocusOwner() +
+                            ", but expected: " + component);
+                }
+            }
+        });
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ *
+ * 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 8020443
+  @summary Frame is not created on the specified GraphicsDevice with two
+monitors
+  @author Oleg Pekhovskiy
+  @run main MultiScreenInsetsTest
+ */
+
+import java.awt.Frame;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import sun.awt.OSInfo;
+
+public class MultiScreenInsetsTest {
+    private static final int SIZE = 100;
+
+    public static void main(String[] args) throws InterruptedException {
+        OSInfo.OSType type = OSInfo.getOSType();
+        if (type != OSInfo.OSType.LINUX && type != OSInfo.OSType.SOLARIS) {
+            System.out.println("This test is for Solaris and Linux only..." +
+                               "skipping!");
+            return;
+        }
+
+        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        GraphicsDevice[] gds = ge.getScreenDevices();
+        if (gds.length < 2) {
+            System.out.println("It's a multi-screen test... skipping!");
+            return;
+        }
+
+        for (int screen = 0; screen < gds.length; ++screen) {
+            GraphicsDevice gd = gds[screen];
+            GraphicsConfiguration gc = gd.getDefaultConfiguration();
+            Rectangle bounds = gc.getBounds();
+            Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
+
+            Frame frame = new Frame(gc);
+            frame.setLocation(bounds.x + (bounds.width - SIZE) / 2,
+                              bounds.y + (bounds.height - SIZE) / 2);
+            frame.setSize(SIZE, SIZE);
+            frame.setUndecorated(true);
+            frame.setVisible(true);
+
+            // Maximize Frame to reach the struts
+            frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
+            Thread.sleep(2000);
+
+            Rectangle frameBounds = frame.getBounds();
+            frame.dispose();
+            if (bounds.x + insets.left != frameBounds.x
+                || bounds.y + insets.top != frameBounds.y
+                || bounds.width - insets.right - insets.left != frameBounds.width
+                || bounds.height - insets.bottom - insets.top != frameBounds.height) {
+                throw new RuntimeException("Test FAILED! Wrong screen #" +
+                                           screen + " insets: " + insets);
+            }
+        }
+        System.out.println("Test PASSED!");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/ScrollPane/bug8077409Test.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,115 @@
+/*
+ * 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.
+ */
+
+/* @test
+   @bug 8077409
+   @summary Drawing deviates when validate() is invoked on java.awt.ScrollPane
+   @author mikhail.cherkasov@oracle.com
+   @run main bug8077409Test
+*/
+
+
+import java.awt.*;
+import java.awt.event.*;
+
+public class bug8077409Test extends Frame {
+  ScrollPane pane;
+  MyCanvas myCanvas;
+
+  class MyCanvas extends Canvas {
+    public Dimension getPreferredSize() {
+      return new Dimension(400, 800);
+    }
+
+    public void paint(Graphics g) {
+      g.setColor(Color.BLACK);
+      g.drawLine(0, 0, 399, 0);
+      g.setColor(Color.RED);
+      g.drawLine(0, 1, 399, 1);
+      g.setColor(Color.BLUE);
+      g.drawLine(0, 2, 399, 2);
+      g.setColor(Color.GREEN);
+      g.drawLine(0, 3, 399, 3);
+    }
+
+  }
+
+  public bug8077409Test() {
+    super();
+    setLayout(new BorderLayout());
+    pane = new ScrollPane();
+
+    myCanvas = new MyCanvas();
+    pane.add(myCanvas);
+
+    add(pane, BorderLayout.CENTER);
+    setSize(320, 480);
+
+  }
+
+  @Override
+  protected void processKeyEvent(KeyEvent e) {
+    super.processKeyEvent(e);
+
+  }
+
+  public static void main(String[] args) throws AWTException, InterruptedException {
+    final bug8077409Test obj = new bug8077409Test();
+    obj.setVisible(true);
+    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
+      @Override
+      public void eventDispatched(AWTEvent e) {
+        KeyEvent keyEvent = (KeyEvent) e;
+        if(keyEvent.getID() == KeyEvent.KEY_RELEASED) {
+            if (keyEvent.getKeyCode() == KeyEvent.VK_1) {
+              System.out.println(obj.pane.toString());
+              System.out.println("obj.myCanvas.pos: " + obj.myCanvas.getBounds());
+              System.out.println(obj.myCanvas.toString());
+            }  else if (keyEvent.getKeyCode() == KeyEvent.VK_2) {
+              obj.repaint();
+           } else if (keyEvent.getKeyCode() == KeyEvent.VK_DOWN) {
+              Point scrollPosition = obj.pane.getScrollPosition();
+              scrollPosition.translate(0, 1);
+              obj.pane.setScrollPosition(scrollPosition);
+            } else if (keyEvent.getKeyCode() == KeyEvent.VK_UP) {
+              Point scrollPosition = obj.pane.getScrollPosition();
+              scrollPosition.translate(0, -1);
+              obj.pane.setScrollPosition(scrollPosition);
+            } else if (keyEvent.getKeyCode() == KeyEvent.VK_SPACE) {
+              obj.pane.validate();
+            }
+          }
+        }
+    }, AWTEvent.KEY_EVENT_MASK);
+      Point scrollPosition = obj.pane.getScrollPosition();
+      scrollPosition.translate(0, 1);
+      obj.pane.setScrollPosition(scrollPosition);
+
+      int y = obj.pane.getComponent(0).getLocation().y;
+      obj.pane.validate();
+      if(y != obj.pane.getComponent(0).getLocation().y){
+          throw new RuntimeException("Wrong position of component in ScrollPane");
+      }
+  }
+
+}
\ No newline at end of file
--- a/test/java/lang/Math/Tests.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/lang/Math/Tests.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -35,20 +35,30 @@
 public class Tests {
     private Tests(){}; // do not instantiate
 
-    private static String toHexString(float f) {
+    public static String toHexString(float f) {
         if (!Float.isNaN(f))
             return Float.toHexString(f);
         else
             return "NaN(0x" + Integer.toHexString(Float.floatToRawIntBits(f)) + ")";
     }
 
-    private static String toHexString(double d) {
+    public static String toHexString(double d) {
         if (!Double.isNaN(d))
             return Double.toHexString(d);
         else
             return "NaN(0x" + Long.toHexString(Double.doubleToRawLongBits(d)) + ")";
     }
 
+    /**
+     * Return the floating-point value next larger in magnitude.
+     */
+    public static double nextOut(double d) {
+        if (d > 0.0)
+            return Math.nextUp(d);
+        else
+            return -Math.nextUp(-d);
+    }
+
     public static int test(String testName, float input,
                            boolean result, boolean expected) {
         if (expected != result) {
@@ -338,4 +348,24 @@
         else
             return 0;
     }
+
+    // For a successful test, the result must be within the upper and
+    // lower bounds.
+    public static int testBounds(String testName, double input, double result,
+                                 double bound1, double bound2) {
+        if ((result >= bound1 && result <= bound2) ||
+            (result <= bound1 && result >= bound2))
+            return 0;
+        else {
+            double lowerBound = Math.min(bound1, bound2);
+            double upperBound = Math.max(bound1, bound2);
+            System.err.println("Failure for " + testName + ":\n" +
+                               "\tFor input " + input    + "\t(" + toHexString(input) + ")\n" +
+                               "\tgot       " + result   + "\t(" + toHexString(result) + ");\n" +
+                               "\toutside of range\n" +
+                               "\t[" + lowerBound    + "\t(" + toHexString(lowerBound) + "), " +
+                               upperBound    + "\t(" + toHexString(upperBound) + ")]");
+            return 1;
+        }
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/lang/Math/WorstCaseTests.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,435 @@
+/*
+ * Copyright (c) 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.
+ *
+ * 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 4900206
+ * @summary Test worst case behavior of exp, log, sin, cos, etc.
+ * @build Tests
+ * @build WorstCaseTests
+ * @run main WorstCaseTests
+ * @run main/othervm -Xcomp WorstCaseTests
+ * @author Joseph D. Darcy
+ */
+
+/**
+ * Use "Table Maker's Dilemma" results from Jean-Michel Muller and
+ * Vincent Lef&egrave;vre, to test the math library.  See
+ * http://perso.ens-lyon.fr/jean-michel.muller/TMD.html for original
+ * test vectors from 2000 and see
+ * http://perso.ens-lyon.fr/jean-michel.muller/TMDworstcases.pdf with
+ * additional test vectors from 2003.  The latter link also contains
+ * some information about the methodology used to produce the test
+ * vectors.
+ *
+ * Most of the Java math library methods tested here have a 1-ulp
+ * error bound from their specifications.  This implies the returned
+ * value must be one of the two representable floating-point numbers
+ * bracketing the exact result.  The expected value in the test
+ * vectors below is the truncation of the exact value.  Therefore, the
+ * computed result must either be that value or the value next larger
+ * in magnitude.  The hyperbolic transcendental functions sinh and cosh
+ * have a larger 2.5 ulp error bound in their specification, but the
+ * JDK implementation complies with a 1 ulp bound on the worst-case
+ * values.  Therefore, no addition leeway is afforded when testing
+ * sinh and cosh.
+ */
+public class WorstCaseTests {
+    private WorstCaseTests() {throw new AssertionError("No instances for you.");}
+
+    public static void main(String... args) {
+        int failures = 0;
+
+        failures += testWorstExp();
+        failures += testWorstLog();
+        failures += testWorstSin();
+        failures += testWorstAsin();
+        failures += testWorstCos();
+        failures += testWorstAcos();
+        failures += testWorstTan();
+        failures += testWorstAtan();
+        failures += testWorstPow2();
+        failures += testWorstSinh();
+        failures += testWorstCosh();
+
+        if (failures > 0) {
+            System.err.printf("Testing worst cases incurred %d failures.%n", failures);
+            throw new RuntimeException();
+        }
+    }
+
+    private static int testWorstExp() {
+        int failures = 0;
+        double [][] testCases = {
+            {-0x1.E8BDBFCD9144Ep3,      0x1.F3E558CF4DE54p-23},
+            {-0x1.71E0B869B5E79p2,      0x1.951C6DC5D24E2p-9},
+            {-0x1.02393D5976769p1,      0x1.1064B2C103DDAp-3},
+            {-0x1.2A9CAD9998262p0,      0x1.3EF1E9B3A81C7p-2},
+            {-0x1.CC37EF7DE7501p0,      0x1.534D4DE870713p-3},
+            {-0x1.22E24FA3D5CF9p-1,     0x1.2217147B85EA9p-1},
+            {-0x1.DC2B5DF1F7D3Dp-1,     0x1.9403FD0EE51C8p-2},
+            {-0x1.290EA09E36479p-3,     0x1.BADED30CBF1C3p-1},
+            {-0x1.A2FEFEFD580DFp-13,    0x1.FFE5D0BB7EABFp-1},
+            {-0x1.ED318EFB627EAp-27,    0x1.FFFFFF84B39C4p-1},
+            {-0x1.4BD46601AE1EFp-31,    0x1.FFFFFFFAD0AE6p-1},
+            {-0x1.1000000000242p-42,    0x1.FFFFFFFFFF780p-1},
+            {-0x1.2000000000288p-42,    0x1.FFFFFFFFFF700p-1},
+            {-0x1.8000000000012p-48,    0x1.FFFFFFFFFFFD0p-1},
+            {-0x1.0000000000001p-51,    0x1.FFFFFFFFFFFFCp-1},
+
+            {+0x1.FFFFFFFFFFFFFp-53,    0x1.0000000000000p0},
+            {+0x1.FFFFFFFFFFFE0p-48,    0x1.000000000001Fp0},
+            {+0x1.7FFE7FFEE0024p-32,    0x1.000000017FFE8p0},
+            {+0x1.80017FFEDFFDCp-32,    0x1.0000000180017p0},
+            {+0x1.9E9CBBFD6080Bp-31,    0x1.000000033D397p0},
+            {+0x1.D7A7D893609E5p-26,    0x1.00000075E9F64p0},
+            {+0x1.BA07D73250DE7p-14,    0x1.0006E83736F8Cp0},
+            {+0x1.D77FD13D27FFFp-11,    0x1.003AF6C37C1D3p0},
+            {+0x1.6A4D1AF9CC989p-8,     0x1.016B4DF3299D7p0},
+            {+0x1.ACCFBE46B4EF0p-1,     0x2.4F85C9783DCE0p0},
+            {+0x1.ACA7AE8DA5A7Bp0,      0x5.55F52B35F955Ap0},
+            {+0x1.D6336A88077AAp0,      0x6.46A37FD503FDCp0},
+            {+0x2.85DC78FB8928Cp0,      0xC.76F2496CB038Fp0},
+            {+0x1.76E7E5D7B6EACp3,      0x1.DE7CD6751029Ap16},
+            {+0x1.A8EAD058BC6B8p3,      0x1.1D71965F516ADp19},
+            {+0x1.1D5C2DAEBE367p4,      0x1.A8C02E974C314p25},
+            {+0x1.C44CE0D716A1Ap4,      0x1.B890CA8637AE1p40},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testExpCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testExpCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.exp",       input, Math.exp(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.exp", input, StrictMath.exp(input), expected, out);
+        return failures;
+    }
+
+    private static int testWorstLog() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.0000000000001p0,      +0x1.FFFFFFFFFFFFFp-53},
+            {+0x2.0012ECB039C9Cp0,      +0x1.62F71C4656B60p-1},
+            {+0x6.46A37FD503FDCp0,      +0x1.D6336A88077A9p+0},
+            {+0x7.78DFECC7F57Fp0,       +0x2.02DD059DB46Bp+0},
+            {+0x9.588CCF24BB9C8p0,      +0x2.3C24DEBB2BE7p+0},
+            {+0xA.AF87550D97E4p0,       +0x2.5E706595A7ABEp+0},
+            {+0xC.76F2496CB039p0,       +0x2.85DC78FB8928Cp+0},
+            {+0x11.1867637CBD03p0,      +0x2.D6BBEFC79A842p+0},
+            {+0x13.D9D7D597A9DDp0,      +0x2.FCFE12AE07DDCp+0},
+            {+0x17.F3825778AAAFp0,      +0x3.2D0F907F5E00Cp+0},
+            {+0x1AC.50B409C8AEEp0,      +0x6.0F52F37AECFCCp+0},
+            {+0x1.DE7CD6751029Ap16,     +0x1.76E7E5D7B6EABp+3},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testLogCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testLogCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.log",       input, Math.log(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.log", input, StrictMath.log(input), expected, out);
+        return failures;
+    }
+
+    private static int testWorstSin() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.E0000000001C2p-20,    +0x1.DFFFFFFFFF02Ep-20},
+            {+0x1.598BAE9E632F6p-7,     +0x1.598A0AEA48996p-7},
+
+            {+0x1.9283586503FEp-5,      +0x1.9259E3708BD39p-5},
+            {+0x1.D7BDCD778049Fp-5,     +0x1.D77B117F230D5p-5},
+            {+0x1.A202B3FB84788p-4,     +0x1.A1490C8C06BA6p-4},
+            {+0x1.D037CB27EE6DFp-3,     +0x1.CC40C3805229Ap-3},
+            {+0x1.D5064E6FE82C5p-3,     +0x1.D0EF799001BA9p-3},
+            {+0x1.FE767739D0F6Dp-2,     +0x1.E9950730C4695p-2},
+            {+0x1.D98C4C612718Dp-1,     +0x1.98DCD09337792p-1},
+            {+0x1.921FB54442D18p-0,     +0x1.FFFFFFFFFFFFFp-1},
+
+            {+0x1.6756745770A51p+1,     +0x1.4FF350E412821p-2},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testSinCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testSinCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.sin",       input, Math.sin(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.sin", input, StrictMath.sin(input), expected, out);
+        return failures;
+    }
+
+    private static int testWorstAsin() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.DFFFFFFFFF02Ep-20,    +0x1.E0000000001C1p-20},
+            {+0x1.DFFFFFFFFC0B8p-19,    +0x1.E000000000707p-19},
+
+            {+0x1.9259E3708BD3Ap-5,     +0x1.9283586503FEp-5},
+            {+0x1.D77B117F230D6p-5,     +0x1.D7BDCD778049Fp-5},
+            {+0x1.A1490C8C06BA7p-4,     +0x1.A202B3FB84788p-4},
+            {+0x1.9697CB602C582p-3,     +0x1.994FFB5DAF0F9p-3},
+            {+0x1.D0EF799001BA9p-3,     +0x1.D5064E6FE82C4p-3},
+            {+0x1.E9950730C4696p-2,     +0x1.FE767739D0F6Dp-2},
+            {+0x1.1ED06D50F7E88p-1,     +0x1.30706F699466Dp-1},
+            {+0x1.D5B05A89D3E77p-1,     +0x1.29517AB4C132Ap+0},
+            {+0x1.E264357EA0E29p-1,     +0x1.3AA301F6EBB1Dp+0},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testAsinCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testAsinCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.asin",       input, Math.asin(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.asin", input, StrictMath.asin(input), expected, out);
+        return failures;
+    }
+
+    private static int testWorstCos() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.8000000000009p-23,    +0x0.FFFFFFFFFFFB8p+0},
+            {+0x1.8000000000024p-22,    +0x0.FFFFFFFFFFEE0p+0},
+            {+0x1.2000000000F30p-18,    +0x0.FFFFFFFFF5E00p+0},
+            {+0x1.06B505550E6B2p-9,     +0x0.FFFFDE4D1FDFFp+0},
+            {+0x1.97CCD3D2C438Fp-6,     +0x0.FFEBB35D43854p+0},
+
+            {+0x1.549EC0C0C5AFAp-5,     +0x1.FF8EB6A91ECB0p-1},
+            {+0x1.16E534EE36580p-4,     +0x1.FED0476FC75C9p-1},
+            {+0x1.EFEEF61D39AC2p-3,     +0x1.F10FC61E2C78Ep-1},
+            {+0x1.FEB1F7920E248p-2,     +0x1.C1A27AE836F12p-1},
+            {+0x1.7CB7648526F99p-1,     +0x1.78DAF01036D0Cp-1},
+            {+0x1.C65A170474549p-1,     +0x1.434A3645BE208p-1},
+            {+0x1.6B8A6273D7C21p+0,     +0x1.337FC5B072C52p-3},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testCosCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testCosCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.cos",       input, Math.cos(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.cos", input, StrictMath.cos(input), expected, out);
+        return failures;
+    }
+
+    private static int testWorstAcos() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.FD737BE914578p-11,    +0x1.91E006D41D8D8p+0},
+            {+0x1.4182199998587p-1,     +0x1.C8A538AE83D1Fp-1},
+            {+0x1.E45A1C93651ECp-1,     +0x1.520DC553F6B23p-2},
+            {+0x1.F10FC61E2C78Fp-1,     +0x1.EFEEF61D39AC1p-3},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testAcosCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testAcosCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.acos",       input, Math.acos(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.acos", input, StrictMath.acos(input), expected, out);
+        return failures;
+    }
+
+    private static int testWorstTan() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.DFFFFFFFFFF1Fp-22,    +0x1.E000000000151p-22},
+            {+0x1.67FFFFFFFA114p-18,    +0x1.6800000008E61p-18},
+
+            {+0x1.50486B2F87014p-5,     +0x1.5078CEBFF9C72p-5},
+            {+0x1.52C39EF070CADp-4,     +0x1.5389E6DF41978p-4},
+            {+0x1.A33F32AC5CEB5p-3,     +0x1.A933FE176B375p-3},
+            {+0x1.D696BFA988DB9p-2,     +0x1.FAC71CD34EEA6p-2},
+            {+0x1.46AC372243536p-1,     +0x1.7BA49F739829Ep-1},
+            {+0x0.A3561B9121A9Bp+0,     +0x0.BDD24FB9CC14Fp+0},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testTanCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testTanCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.tan",       input, Math.tan(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.tan", input, StrictMath.tan(input), expected, out);
+        return failures;
+    }
+
+    private static int testWorstAtan() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.E000000000546p-21,     +0x1.DFFFFFFFFFC7Cp-21},
+            {+0x1.22E8D75E2BC7Fp-11,     +0x1.22E8D5694AD2Bp-11},
+
+            {+0x1.0FC9F1FABE658p-5,     +0x1.0FB06EDE9973Ap-5},
+            {+0x1.1BBE9C255698Dp-5,     +0x1.1BA1951DB1D6Dp-5},
+            {+0x1.8DDD25AB90CA1p-5,     +0x1.8D8D2D4BD6FA2p-5},
+            {+0x1.5389E6DF41979p-4,     +0x1.52C39EF070CADp-4},
+            {+0x1.A933FE176B375p-3,     +0x1.A33F32AC5CEB4p-3},
+            {+0x1.0F6E5D9960397p-2,     +0x1.09544B71AD4A6p-2},
+            {+0x1.7BA49F739829Fp-1,     +0x1.46AC372243536p-1},
+
+            {+0x0.BDD24FB9CC14F8p+0,    +0x0.A3561B9121A9Bp+0},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testAtanCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testAtanCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.atan",       input, Math.atan(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.atan", input, StrictMath.atan(input), expected, out);
+        return failures;
+    }
+
+    private static int testWorstPow2() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.16A76EC41B516p-1,     +0x1.7550685A42C63p+0},
+            {+0x1.3E34FA6AB969Ep-1,     +0x1.89D948A94FE16p+0},
+            {+0x1.4A63FF1D53F53p-1,     +0x1.90661DA12D528p+0},
+            {+0x1.B32A6C92D1185p-1,     +0x1.CD6B37EDECEAFp+0},
+
+            {+0x1.25DD9EEDAC79Ap+0,     +0x1.1BA39FF28E3E9p+1},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testPow2Case(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testPow2Case(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.pow2",       input, Math.pow(2, input),       expected, out);
+        failures += Tests.testBounds("StrictMath.pow2", input, StrictMath.pow(2, input), expected, out);
+        return failures;
+    }
+
+    // 2.5 ulp error bound in the specification; the implementation
+    // does better on the tested values.
+    private static int testWorstSinh() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.DFFFFFFFFFE3Ep-20,     +0x1.E000000000FD1p-20},
+            {+0x1.DFFFFFFFFE3E0p-18,     +0x1.E00000000FD1Fp-18},
+            {+0x1.135E31FDD05D3p-5,      +0x1.136B78B25CC57p-5},
+            {+0x1.0DC68D5E8F959p-3,      +0x1.0E8E73DC4FEE3p-3},
+            {+0x1.616CC75D49226p-2,      +0x1.687BD068C1C1Ep-2},
+            {+0x1.3FFC12B81CBC2p+0,      +0x1.9A0FF413A1AF2p+0},
+            {+0x2.FE008C44BACA2p+0,      +0x9.F08A43ED03AEp+0},
+            {+0x1.C089FCF166171p+4,      +0x1.5C452E0E37569p+39},
+            {+0x1.E07E71BFCF06Fp+5,      +0x1.91EC4412C344Fp+85},
+            {+0x1.54CD1FEA7663Ap+7,      +0x1.C90810D354618p+244},
+            {+0x1.D6479EBA7C971p+8,      +0x1.62A88613629B5p+677},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testSinhCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testSinhCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.sinh",       input, Math.sinh(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.sinh", input, StrictMath.sinh(input), expected, out);
+        return failures;
+    }
+
+    // 2.5 ulp error bound in the specification; the implementation
+    // does better on the tested values.
+    private static int testWorstCosh() {
+        int failures = 0;
+        double [][] testCases = {
+            {+0x1.17D8A9F206217p-6,     +0x1.00098F5F09BE3p+0},
+            {+0x1.BF0305E2C6C37p-3,     +0x1.061F4C39E16F2p+0},
+            {+0x1.03923F2B47C07p-1,     +0x1.219C1989E3372p+0},
+            {+0x1.A6031CD5F93BAp-1,     +0x1.5BFF041B260FDp+0},
+            {+0x1.104B648F113A1p+0,     +0x1.9EFDCA62B7009p+0},
+            {+0x1.EA5F2F2E4B0C5p+1,     +0x17.10DB0CD0FED5p+0},
+        };
+
+        for(double[] testCase: testCases) {
+            failures += testCoshCase(testCase[0], testCase[1]);
+        }
+
+        return failures;
+    }
+
+    private static int testCoshCase(double input, double expected) {
+        int failures = 0;
+        double out = Tests.nextOut(expected);
+        failures += Tests.testBounds("Math.cosh",       input, Math.cosh(input),       expected, out);
+        failures += Tests.testBounds("StrictMath.cosh", input, StrictMath.cosh(input), expected, out);
+        return failures;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/net/InetAddress/getOriginalHostName.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8133196
+ * @summary test functionality of getOriginalHostName(InetAddress)
+ */
+
+import java.io.*;
+import java.net.InetAddress;
+
+import sun.misc.JavaNetAccess;
+import sun.misc.SharedSecrets;
+
+public class getOriginalHostName {
+
+    private static final JavaNetAccess jna = SharedSecrets.getJavaNetAccess();
+
+    public static void main(String[] args) throws Exception {
+        final String HOST = "dummyserver.java.net";
+        InetAddress ia = null;
+        ia = InetAddress.getByName(HOST);
+        testInetAddress(ia, HOST);
+        ia = InetAddress.getByName("255.255.255.0");
+        testInetAddress(ia, null);
+        ia = InetAddress.getByAddress(new byte[]{1,1,1,1});
+        testInetAddress(ia, null);
+        ia = InetAddress.getLocalHost();
+        testInetAddress(ia, ia.getHostName());
+        ia = InetAddress.getLoopbackAddress();
+        testInetAddress(ia, ia.getHostName());
+    }
+
+
+    private static void testInetAddress(InetAddress ia, String expected)
+        throws Exception {
+
+        System.out.println("Testing InetAddress: " + ia);
+        System.out.println("Expecting original hostname of : " + expected);
+        String origHostName = jna.getOriginalHostName(ia);
+        System.out.println("via JavaNetAccess: " + origHostName);
+        if (origHostName == null && expected != null) {
+            throw new RuntimeException("Unexpected null. Testing:" + expected);
+        } else if (expected != null && !origHostName.equals(expected)) {
+            throw new RuntimeException("Unexpected hostname :" + origHostName);
+        } else if (expected == null && origHostName != null) {
+            throw new RuntimeException("Unexpected origHostName: " + origHostName);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/net/MulticastSocket/MultiDead.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,134 @@
+/*
+ * 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.
+ */
+
+/**
+ * @test
+ * @bug 8072466
+ * @summary Deadlock when initializing MulticastSocket and DatagramSocket
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @run main/othervm MultiDead
+ */
+
+import java.net.DatagramSocket;
+import java.net.MulticastSocket;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.CountDownLatch;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import jdk.testlibrary.JDKToolLauncher;
+import jdk.testlibrary.Utils;
+
+public class MultiDead {
+    private static final int THREAD_PAIR_COUNT = 4;
+    private static final int CHILDREN_COUNT = 20;
+    // at least 2.5 seconds for a child to complete
+    private static final long CHILD_TIMEOUT = 2500;
+    private static final long TIMEOUT =
+        Utils.adjustTimeout(CHILDREN_COUNT * CHILD_TIMEOUT * 2);
+
+    public static void main(String[] args) throws Throwable {
+        if (args.length == 0 || args[0].equals("parent")) {
+            parentProcess();
+        }
+
+        if (args.length > 0 && args[0].equals("child")) {
+            childProcess();
+        }
+    }
+
+    private static void parentProcess() throws Throwable {
+        JDKToolLauncher launcher = JDKToolLauncher
+                .createUsingTestJDK("java")
+                .addToolArg("MultiDead")
+                .addToolArg("child");
+        final ProcessBuilder pb = new ProcessBuilder(launcher.getCommand());
+
+        final AtomicReference<Process> child = new AtomicReference<>();
+        final AtomicBoolean stopFlag = new AtomicBoolean(false);
+
+        Thread th = new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    for (int i = 0; i < CHILDREN_COUNT; ++i) {
+                        System.out.println("child #" + (i + 1) + " of " +
+                                           CHILDREN_COUNT);
+                        long start = System.nanoTime();
+                        try {
+                            child.set(pb.start());
+                            child.get().waitFor();
+                            if (stopFlag.get()) {
+                                break;
+                            }
+                        } catch (Exception e) {
+                            throw new RuntimeException(e);
+                        }
+                        if (System.nanoTime() - start >
+                            MILLISECONDS.toNanos(CHILD_TIMEOUT)) {
+                            System.err.println("Machine is too slow, " +
+                                               "skipping the test...");
+                            break;
+                        }
+                    }
+                }
+            });
+        th.start();
+        th.join(TIMEOUT);
+
+        stopFlag.set(true);
+        if (th.isAlive()) {
+            if (child.get() != null) {
+                child.get().destroy();
+            }
+            throw new RuntimeException("Failed to complete on time.");
+        }
+    }
+
+    private static void childProcess() {
+        final CountDownLatch latch = new CountDownLatch(1);
+        for (int i = 0; i < THREAD_PAIR_COUNT; ++i) {
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        latch.await();
+                        try (MulticastSocket a = new MulticastSocket(6000)) {
+                        }
+                    } catch (Exception ignore) {}
+                }
+            }).start();
+
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        latch.await();
+                        try (DatagramSocket b = new DatagramSocket(6000)) {
+                        }
+                    } catch (Exception ignore) {}
+                }
+            }).start();
+        }
+        latch.countDown();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/net/URL/TestHttps.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2010 Red Hat, 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.
+ *
+ * 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.
+ */
+
+
+/* @test
+ * @summary This test check if the cacerts keytool database is configured properly and SSL is really working. The test should not fail if SSL is working.
+ */
+
+import java.io.IOException;
+
+import java.net.URL;
+import java.net.URLConnection;
+
+public class TestHttps {
+    public static void main(String[] args) throws IOException {
+        new URL("https://www.verisign.com/").openConnection().connect();
+    }
+}
--- a/test/java/nio/MappedByteBuffer/Basic.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/nio/MappedByteBuffer/Basic.java	Tue Aug 22 02:03:52 2017 +0100
@@ -35,50 +35,61 @@
         byte[] srcData = new byte[20];
         for (int i=0; i<20; i++)
             srcData[i] = 3;
-        File blah = File.createTempFile("blah", null);
-        blah.deleteOnExit();
-        FileOutputStream fos = new FileOutputStream(blah);
-        FileChannel fc = fos.getChannel();
-        fc.write(ByteBuffer.wrap(srcData));
-        fc.close();
-        fos.close();
+        File blah = null;
+        try {
+            blah = File.createTempFile("blah", null);
+            blah.deleteOnExit();
+            FileOutputStream fos = new FileOutputStream(blah);
+            FileChannel fc = fos.getChannel();
+            fc.write(ByteBuffer.wrap(srcData));
+            fc.close();
+            fos.close();
 
-        FileInputStream fis = new FileInputStream(blah);
-        fc = fis.getChannel();
-        MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, 10);
-        mbb.load();
-        mbb.isLoaded();
-        mbb.force();
-        if (!mbb.isReadOnly())
-            throw new RuntimeException("Incorrect isReadOnly");
+            FileInputStream fis = new FileInputStream(blah);
+            fc = fis.getChannel();
+            MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, 10);
+            mbb.load();
+            mbb.isLoaded();
+            mbb.force();
+            if (!mbb.isReadOnly()) {
+                throw new RuntimeException("Incorrect isReadOnly");
+            }
+
+            // repeat with unaligned position in file
+            mbb = fc.map(FileChannel.MapMode.READ_ONLY, 1, 10);
+            mbb.load();
+            mbb.isLoaded();
+            mbb.force();
+            fc.close();
+            fis.close();
 
-        // repeat with unaligned position in file
-        mbb = fc.map(FileChannel.MapMode.READ_ONLY, 1, 10);
-        mbb.load();
-        mbb.isLoaded();
-        mbb.force();
-        fc.close();
-        fis.close();
+            RandomAccessFile raf = new RandomAccessFile(blah, "r");
+            fc = raf.getChannel();
+            mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, 10);
+            if (!mbb.isReadOnly()) {
+                throw new RuntimeException("Incorrect isReadOnly");
+            }
+            fc.close();
+            raf.close();
 
-        RandomAccessFile raf = new RandomAccessFile(blah, "r");
-        fc = raf.getChannel();
-        mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, 10);
-        if (!mbb.isReadOnly())
-            throw new RuntimeException("Incorrect isReadOnly");
-        fc.close();
-        raf.close();
+            raf = new RandomAccessFile(blah, "rw");
+            fc = raf.getChannel();
+            mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 10);
+            if (mbb.isReadOnly()) {
+                throw new RuntimeException("Incorrect isReadOnly");
+            }
+            fc.close();
+            raf.close();
 
-        raf = new RandomAccessFile(blah, "rw");
-        fc = raf.getChannel();
-        mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 10);
-        if (mbb.isReadOnly())
-            throw new RuntimeException("Incorrect isReadOnly");
-        fc.close();
-        raf.close();
-
-        // clean-up
-        mbb = null;
-        System.gc();
-        Thread.sleep(500);
+            // clean-up
+            mbb = null;
+            System.gc();
+            Thread.sleep(500);
+        }
+        finally {
+            if (blah != null) {
+                blah.delete();
+            }
+        }
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/nio/channels/FileChannel/LoopingTruncate.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+/**
+ * @test
+ * @bug 8137121 8137230
+ * @summary (fc) Infinite loop FileChannel.truncate
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.Utils
+ * @run main/othervm LoopingTruncate
+ */
+
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import static java.nio.file.StandardOpenOption.*;
+import static jdk.testlibrary.Utils.adjustTimeout;
+
+public class LoopingTruncate {
+
+    // (int)FATEFUL_SIZE == -3 == IOStatus.INTERRUPTED
+    static long FATEFUL_SIZE = 0x1FFFFFFFDL;
+
+    // At least 20 seconds
+    static long TIMEOUT = adjustTimeout(20_000);
+
+    public static void main(String[] args) throws Throwable {
+        final Path path = Files.createTempFile("LoopingTruncate.tmp", null);
+        try (FileChannel fc = FileChannel.open(path, CREATE, WRITE)) {
+            fc.position(FATEFUL_SIZE + 1L);
+            fc.write(ByteBuffer.wrap(new byte[] {0}));
+
+            Thread th = new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+			try {
+                            fc.truncate(FATEFUL_SIZE);
+			} catch (ClosedByInterruptException ignore) {
+                        } catch (Exception e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                });
+            th.start();
+            th.join(TIMEOUT);
+
+            if (th.isAlive()) {
+                System.err.println("=== Stack trace of the guilty thread:");
+                for (StackTraceElement el : th.getStackTrace()) {
+                    System.err.println("\t" + el);
+                }
+                System.err.println("===");
+
+                th.interrupt();
+                th.join();
+                throw new RuntimeException("Failed to complete on time");
+            }
+        } finally {
+            Files.deleteIfExists(path);
+        }
+    }
+}
Binary file test/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/linux-i586/libLauncher.so has changed
Binary file test/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-i586/libLauncher.so has changed
Binary file test/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-sparc/libLauncher.so has changed
Binary file test/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-sparcv9/libLauncher.so has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/nio/file/Files/probeContentType/ParallelProbes.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,96 @@
+/*
+ * 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.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+
+/* @test
+ * @summary Test probing content type simultaneously from multiple threads.
+ * @requires (os.family == "linux") | (os.family == "solaris")
+ * @run main ParallelProbes 10
+ */
+public class ParallelProbes {
+
+    private static final int REPEATS = 1000;
+
+    private int numThreads = 0;
+    private ArrayList<Thread> threads;
+
+    public ParallelProbes(int numThreads) {
+        System.out.println("Using <" + numThreads + "> threads.");
+        this.numThreads = numThreads;
+        this.threads = new ArrayList<Thread>(numThreads);
+    }
+
+    private Path createTmpFile() throws IOException {
+        final Path p = Files.createTempFile("prefix", ".json");
+        Files.write(p, "{\"test\"}".getBytes());
+        System.out.println("Write test file <" + p + ">");
+        return p;
+    }
+
+    private Runnable createRunnable(final Path p) {
+        Runnable r = new Runnable() {
+            public void run() {
+                for (int i = 0; i < REPEATS; i++) {
+                    try {
+                        System.out.println(Thread.currentThread().getName()
+                            + " -> " + Files.probeContentType(p));
+                    } catch (IOException ioException) {
+                        ioException.printStackTrace();
+                    }
+                }
+            }
+        };
+        return r;
+    }
+
+    public void start() throws IOException {
+        for (int i = 0; i < numThreads; i++) {
+            final Path p = createTmpFile();
+            Runnable r = createRunnable(p);
+            Thread thread = new Thread(r, "thread-" + i);
+            thread.start();
+            threads.add(thread);
+        }
+    }
+
+    public void join() {
+        for (Thread thread : threads) {
+            try {
+                thread.join();
+            } catch (InterruptedException e) {
+                // ignore it and proceed to the next one
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        ParallelProbes probes =
+            new ParallelProbes(args.length < 1 ? 1 : Integer.parseInt(args[0]));
+        probes.start();
+        probes.join();
+    }
+}
--- a/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java	Tue Aug 22 02:03:52 2017 +0100
@@ -34,6 +34,7 @@
  */
 
 import java.io.IOException;
+import java.net.ProtocolFamily;
 import java.net.Socket;
 import java.net.ProtocolFamily;
 import java.nio.channels.Channel;
@@ -137,11 +138,9 @@
             return provider.openDatagramChannel();
         }
 
-        public DatagramChannel openDatagramChannel(ProtocolFamily family)
-            throws IOException
-        {
-            return provider.openDatagramChannel(family);
-        }
+        public DatagramChannel openDatagramChannel(ProtocolFamily family) throws IOException {
+	    return provider.openDatagramChannel(family);
+	}
 
         public Pipe openPipe() throws IOException {
             return provider.openPipe();
--- a/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java	Tue Aug 22 02:03:52 2017 +0100
@@ -34,6 +34,7 @@
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.ProtocolFamily;
 import java.net.ServerSocket;
 import java.net.ProtocolFamily;
 import java.nio.channels.*;
@@ -138,11 +139,9 @@
             return provider.openDatagramChannel();
         }
 
-        public DatagramChannel openDatagramChannel(ProtocolFamily family)
-            throws IOException
-        {
-            return provider.openDatagramChannel(family);
-        }
+        public DatagramChannel openDatagramChannel(ProtocolFamily family) throws IOException {
+	    return provider.openDatagramChannel(family);
+	}
 
         public Pipe openPipe()
             throws IOException
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/text/Format/DateFormat/Bug8081794.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8081794
+ * @summary ParsePosition getErrorIndex should return correct index
+ */
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+public class Bug8081794 {
+
+    public static void main(String[] args) {
+        String date = "13 Jan 2005 21:45:34 ABC";
+        String format = "dd MMM yyyy HH:mm:ss z";
+        ParsePosition pp = new ParsePosition(0);
+        pp.setIndex(0);
+        SimpleDateFormat sd = new SimpleDateFormat(format, Locale.ENGLISH);
+        Date d = sd.parse(date, pp);
+        int errorIndex = pp.getErrorIndex();
+        if (errorIndex == 21) {
+            System.out.println(": passed");
+        } else {
+            System.out.println(": failed");
+            throw new RuntimeException("Failed with wrong index: " + errorIndex);
+        }
+    }
+}
--- a/test/java/util/Currency/CurrencyTest.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/util/Currency/CurrencyTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -23,7 +23,7 @@
 /*
  * @test
  * @bug 4290801 4692419 4693631 5101540 5104960 6296410 6336600 6371531
- *    6488442 7036905
+ *    6488442 7036905 8074350 8074351
  * @summary Basic tests for Currency class.
  */
 
@@ -49,6 +49,7 @@
         testFractionDigits();
         testSerialization();
         testDisplayNames();
+        testFundsCodes();
     }
 
     static void testCurrencyCodeValidation() {
@@ -263,4 +264,41 @@
         }
     }
 
+    static void testFundsCodes() {
+        testValidCurrency("BOV");
+        testValidCurrency("CHE");
+        testValidCurrency("CHW");
+        testValidCurrency("CLF");
+        testValidCurrency("COU");
+        testValidCurrency("MXV");
+        testValidCurrency("USN");
+        testValidCurrency("UYI");
+
+        testFractionDigits("BOV", 2);
+        testFractionDigits("CHE", 2);
+        testFractionDigits("CHW", 2);
+        testFractionDigits("CLF", 4);
+        testFractionDigits("COU", 2);
+        testFractionDigits("MXV", 2);
+        testFractionDigits("USN", 2);
+        testFractionDigits("UYI", 0);
+
+        testNumericCode("BOV", 984);
+        testNumericCode("CHE", 947);
+        testNumericCode("CHW", 948);
+        testNumericCode("CLF", 990);
+        testNumericCode("COU", 970);
+        testNumericCode("MXV", 979);
+        testNumericCode("USN", 997);
+        testNumericCode("UYI", 940);
+    }
+
+    static void testNumericCode(String currencyCode, int expectedNumeric) {
+        int numeric = Currency.getInstance(currencyCode).getNumericCode();
+        if (numeric != expectedNumeric) {
+            throw new RuntimeException("Wrong numeric code for currency " +
+                    currencyCode +": expected " + expectedNumeric +
+                    ", got " + numeric);
+        }
+    }
 }
--- a/test/java/util/Currency/PropertiesTest.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/util/Currency/PropertiesTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -114,7 +114,7 @@
         // test each replacements
         keys = p.stringPropertyNames();
         Pattern propertiesPattern =
-            Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*([0-3])");
+            Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*(\\d+)");
         for (String key: keys) {
             String val = p.getProperty(key);
             String afterVal = after.getProperty(key);
@@ -132,6 +132,14 @@
                 continue;
             }
 
+            String code = m.group(1);
+            int numeric = Integer.parseInt(m.group(2));
+            int fraction = Integer.parseInt(m.group(3));
+            if (fraction > 9) {
+                System.out.println("Skipping since the fraction is greater than 9");
+                continue;
+            }
+
             Matcher mAfter = propertiesPattern.matcher(afterVal);
             mAfter.find();
 
--- a/test/java/util/Currency/PropertiesTest.sh	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/util/Currency/PropertiesTest.sh	Tue Aug 22 02:03:52 2017 +0100
@@ -1,7 +1,29 @@
 #!/bin/sh
+
+# Copyright (c) 2007, 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.
+#
+
 # @test
-# @bug 6332666
+# @bug 6332666 8074350 8074351
 # @summary tests the capability of replacing the currency data with user
 #     specified currency properties file
 # @build PropertiesTest
--- a/test/java/util/Currency/ValidateISO4217.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/util/Currency/ValidateISO4217.java	Tue Aug 22 02:03:52 2017 +0100
@@ -23,6 +23,7 @@
 /*
  * @test
  * @bug 4691089 4819436 4942982 5104960 6544471 6627549 7066203 7195759
+ *      8074350 8074351
  * @summary Validate ISO 4217 data for Currency class.
  */
 
@@ -92,7 +93,7 @@
 
     /* Codes that are obsolete, do not have related country */
     static final String otherCodes =
-        "ADP-AFA-ATS-AYM-AZM-BEF-BGL-BOV-BYB-CLF-CUC-CYP-DEM-EEK-ESP-FIM-FRF-GHC-GRD-GWP-IEP-ITL-LUF-MGF-MTL-MXV-MZM-NLG-PTE-ROL-RUR-SDD-SIT-SKK-SRG-TMM-TPE-TRL-VEF-USN-USS-VEB-XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-XPT-XSU-XTS-XUA-XXX-YUM-ZMK-ZWD-ZWN-ZWR";
+        "ADP-AFA-ATS-AYM-AZM-BEF-BGL-BOV-BYB-CHE-CHW-CLF-COU-CUC-CYP-DEM-EEK-ESP-FIM-FRF-GHC-GRD-GWP-IEP-ITL-LUF-MGF-MTL-MXV-MZM-NLG-PTE-ROL-RUR-SDD-SIT-SKK-SRG-TMM-TPE-TRL-VEF-UYI-USN-USS-VEB-XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-XPT-XSU-XTS-XUA-XXX-YUM-ZMK-ZWD-ZWN-ZWR";
 
     static boolean err = false;
 
--- a/test/java/util/Currency/currency.properties	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/util/Currency/currency.properties	Tue Aug 22 02:03:52 2017 +0100
@@ -1,10 +1,25 @@
 #
 # Test data for replacing the currency data
 #
++
+# valid entries
+CL=CLF,990,4
+CM=IED,111,2
 JP=JPZ,123,2
+MA=MAA,555,5
+MC=MCC,555,6
+MD=MDD,555,7
+ME=MEE,555,8
+MF=MFF,555,9
 US=euR,978,2
 ZZ	=	ZZZ	,	999	,	3
 
 # invalid entries
+DE=2009-01-01T00:00:00,EUR,111,2
+FM=DED,194,2
+FR=zzzzz.123
 GB=123
-FR=zzzzz.123
+MG=MGG,990,10
+MX=SSS,493,2
+PE=EUR   ,978  ,2
+MG=MGG,990,10
--- a/test/java/util/Currency/tablea1.txt	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/java/util/Currency/tablea1.txt	Tue Aug 22 02:03:52 2017 +0100
@@ -5,7 +5,7 @@
 #
 
 # Version
-FILEVERSION=1
+FILEVERSION=2
 DATAVERSION=159
 
 # ISO 4217 currency data
@@ -55,7 +55,7 @@
 CF	XAF	950	0
 TD	XAF	950	0
 CL	CLP	152	0
-#CL	CLF	990	0
+#CL	CLF	990	4
 CN	CNY	156	2
 CX	AUD	36	2
 CC	AUD	36	2
@@ -265,6 +265,7 @@
 #US	USN	997	2
 UM	USD	840	2
 UY	UYU	858	2
+#UY	UYI	940	0
 UZ	UZS	860	2
 VU	VUV	548	0
 VE	VEF	937	2
--- a/test/java/util/Locale/data/deflocale.rhel5	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3924 +0,0 @@
-Red Hat Enterprise Linux Server release 5.3 (Tikanga)
-Linux localhost.localdomain 2.6.18-128.el5 #1 SMP Wed Dec 17 11:42:39 EST 2008 i686 i686 i386 GNU/Linux
-Testing all available locales
-
-OS Locale:  C
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: US-ASCII
-
-OS Locale:  POSIX
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: US-ASCII
-
-OS Locale:  aa_DJ
-default locale: ID: aa_DJ, Name: Afar (Djibouti)
-display locale: ID: aa_DJ, Name: Afar (Djibouti)
-format locale: ID: aa_DJ, Name: Afar (Djibouti)
-default charset: ISO-8859-1
-
-OS Locale:  aa_DJ.iso88591
-default locale: ID: aa_DJ, Name: Afar (Djibouti)
-display locale: ID: aa_DJ, Name: Afar (Djibouti)
-format locale: ID: aa_DJ, Name: Afar (Djibouti)
-default charset: ISO-8859-1
-
-OS Locale:  aa_DJ.utf8
-default locale: ID: aa_DJ, Name: Afar (Djibouti)
-display locale: ID: aa_DJ, Name: Afar (Djibouti)
-format locale: ID: aa_DJ, Name: Afar (Djibouti)
-default charset: UTF-8
-
-OS Locale:  aa_ER
-default locale: ID: aa_ER, Name: Afar (Eritrea)
-display locale: ID: aa_ER, Name: Afar (Eritrea)
-format locale: ID: aa_ER, Name: Afar (Eritrea)
-default charset: UTF-8
-
-OS Locale:  aa_ER.utf8
-default locale: ID: aa_ER, Name: Afar (Eritrea)
-display locale: ID: aa_ER, Name: Afar (Eritrea)
-format locale: ID: aa_ER, Name: Afar (Eritrea)
-default charset: UTF-8
-
-OS Locale:  aa_ER.utf8@saaho
-default locale: ID: aa_ER, Name: Afar (Eritrea)
-display locale: ID: aa_ER, Name: Afar (Eritrea)
-format locale: ID: aa_ER, Name: Afar (Eritrea)
-default charset: UTF-8
-
-OS Locale:  aa_ER@saaho
-default locale: ID: aa_ER, Name: Afar (Eritrea)
-display locale: ID: aa_ER, Name: Afar (Eritrea)
-format locale: ID: aa_ER, Name: Afar (Eritrea)
-default charset: UTF-8
-
-OS Locale:  aa_ET
-default locale: ID: aa_ET, Name: Afar (Ethiopia)
-display locale: ID: aa_ET, Name: Afar (Ethiopia)
-format locale: ID: aa_ET, Name: Afar (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  aa_ET.utf8
-default locale: ID: aa_ET, Name: Afar (Ethiopia)
-display locale: ID: aa_ET, Name: Afar (Ethiopia)
-format locale: ID: aa_ET, Name: Afar (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  af_ZA
-default locale: ID: af_ZA, Name: Afrikaans (South Africa)
-display locale: ID: af_ZA, Name: Afrikaans (South Africa)
-format locale: ID: af_ZA, Name: Afrikaans (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  af_ZA.iso88591
-default locale: ID: af_ZA, Name: Afrikaans (South Africa)
-display locale: ID: af_ZA, Name: Afrikaans (South Africa)
-format locale: ID: af_ZA, Name: Afrikaans (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  af_ZA.utf8
-default locale: ID: af_ZA, Name: Afrikaans (South Africa)
-display locale: ID: af_ZA, Name: Afrikaans (South Africa)
-format locale: ID: af_ZA, Name: Afrikaans (South Africa)
-default charset: UTF-8
-
-OS Locale:  am_ET
-default locale: ID: am_ET, Name: Amharic (Ethiopia)
-display locale: ID: am_ET, Name: Amharic (Ethiopia)
-format locale: ID: am_ET, Name: Amharic (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  am_ET.utf8
-default locale: ID: am_ET, Name: Amharic (Ethiopia)
-display locale: ID: am_ET, Name: Amharic (Ethiopia)
-format locale: ID: am_ET, Name: Amharic (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  an_ES
-default locale: ID: an_ES, Name: Aragonese (Spain)
-display locale: ID: an_ES, Name: Aragonese (Spain)
-format locale: ID: an_ES, Name: Aragonese (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  an_ES.iso885915
-default locale: ID: an_ES, Name: Aragonese (Spain)
-display locale: ID: an_ES, Name: Aragonese (Spain)
-format locale: ID: an_ES, Name: Aragonese (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  an_ES.utf8
-default locale: ID: an_ES, Name: Aragonese (Spain)
-display locale: ID: an_ES, Name: Aragonese (Spain)
-format locale: ID: an_ES, Name: Aragonese (Spain)
-default charset: UTF-8
-
-OS Locale:  ar_AE
-default locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-display locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-format locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-default charset: ISO-8859-6
-
-OS Locale:  ar_AE.iso88596
-default locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-display locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-format locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-default charset: ISO-8859-6
-
-OS Locale:  ar_AE.utf8
-default locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-display locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-format locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-default charset: UTF-8
-
-OS Locale:  ar_BH
-default locale: ID: ar_BH, Name: Arabic (Bahrain)
-display locale: ID: ar_BH, Name: Arabic (Bahrain)
-format locale: ID: ar_BH, Name: Arabic (Bahrain)
-default charset: ISO-8859-6
-
-OS Locale:  ar_BH.iso88596
-default locale: ID: ar_BH, Name: Arabic (Bahrain)
-display locale: ID: ar_BH, Name: Arabic (Bahrain)
-format locale: ID: ar_BH, Name: Arabic (Bahrain)
-default charset: ISO-8859-6
-
-OS Locale:  ar_BH.utf8
-default locale: ID: ar_BH, Name: Arabic (Bahrain)
-display locale: ID: ar_BH, Name: Arabic (Bahrain)
-format locale: ID: ar_BH, Name: Arabic (Bahrain)
-default charset: UTF-8
-
-OS Locale:  ar_DZ
-default locale: ID: ar_DZ, Name: Arabic (Algeria)
-display locale: ID: ar_DZ, Name: Arabic (Algeria)
-format locale: ID: ar_DZ, Name: Arabic (Algeria)
-default charset: ISO-8859-6
-
-OS Locale:  ar_DZ.iso88596
-default locale: ID: ar_DZ, Name: Arabic (Algeria)
-display locale: ID: ar_DZ, Name: Arabic (Algeria)
-format locale: ID: ar_DZ, Name: Arabic (Algeria)
-default charset: ISO-8859-6
-
-OS Locale:  ar_DZ.utf8
-default locale: ID: ar_DZ, Name: Arabic (Algeria)
-display locale: ID: ar_DZ, Name: Arabic (Algeria)
-format locale: ID: ar_DZ, Name: Arabic (Algeria)
-default charset: UTF-8
-
-OS Locale:  ar_EG
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: ISO-8859-6
-
-OS Locale:  ar_EG.iso88596
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: ISO-8859-6
-
-OS Locale:  ar_EG.utf8
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: UTF-8
-
-OS Locale:  ar_IN
-default locale: ID: ar_IN, Name: Arabic (India)
-display locale: ID: ar_IN, Name: Arabic (India)
-format locale: ID: ar_IN, Name: Arabic (India)
-default charset: UTF-8
-
-OS Locale:  ar_IN.utf8
-default locale: ID: ar_IN, Name: Arabic (India)
-display locale: ID: ar_IN, Name: Arabic (India)
-format locale: ID: ar_IN, Name: Arabic (India)
-default charset: UTF-8
-
-OS Locale:  ar_IQ
-default locale: ID: ar_IQ, Name: Arabic (Iraq)
-display locale: ID: ar_IQ, Name: Arabic (Iraq)
-format locale: ID: ar_IQ, Name: Arabic (Iraq)
-default charset: ISO-8859-6
-
-OS Locale:  ar_IQ.iso88596
-default locale: ID: ar_IQ, Name: Arabic (Iraq)
-display locale: ID: ar_IQ, Name: Arabic (Iraq)
-format locale: ID: ar_IQ, Name: Arabic (Iraq)
-default charset: ISO-8859-6
-
-OS Locale:  ar_IQ.utf8
-default locale: ID: ar_IQ, Name: Arabic (Iraq)
-display locale: ID: ar_IQ, Name: Arabic (Iraq)
-format locale: ID: ar_IQ, Name: Arabic (Iraq)
-default charset: UTF-8
-
-OS Locale:  ar_JO
-default locale: ID: ar_JO, Name: Arabic (Jordan)
-display locale: ID: ar_JO, Name: Arabic (Jordan)
-format locale: ID: ar_JO, Name: Arabic (Jordan)
-default charset: ISO-8859-6
-
-OS Locale:  ar_JO.iso88596
-default locale: ID: ar_JO, Name: Arabic (Jordan)
-display locale: ID: ar_JO, Name: Arabic (Jordan)
-format locale: ID: ar_JO, Name: Arabic (Jordan)
-default charset: ISO-8859-6
-
-OS Locale:  ar_JO.utf8
-default locale: ID: ar_JO, Name: Arabic (Jordan)
-display locale: ID: ar_JO, Name: Arabic (Jordan)
-format locale: ID: ar_JO, Name: Arabic (Jordan)
-default charset: UTF-8
-
-OS Locale:  ar_KW
-default locale: ID: ar_KW, Name: Arabic (Kuwait)
-display locale: ID: ar_KW, Name: Arabic (Kuwait)
-format locale: ID: ar_KW, Name: Arabic (Kuwait)
-default charset: ISO-8859-6
-
-OS Locale:  ar_KW.iso88596
-default locale: ID: ar_KW, Name: Arabic (Kuwait)
-display locale: ID: ar_KW, Name: Arabic (Kuwait)
-format locale: ID: ar_KW, Name: Arabic (Kuwait)
-default charset: ISO-8859-6
-
-OS Locale:  ar_KW.utf8
-default locale: ID: ar_KW, Name: Arabic (Kuwait)
-display locale: ID: ar_KW, Name: Arabic (Kuwait)
-format locale: ID: ar_KW, Name: Arabic (Kuwait)
-default charset: UTF-8
-
-OS Locale:  ar_LB
-default locale: ID: ar_LB, Name: Arabic (Lebanon)
-display locale: ID: ar_LB, Name: Arabic (Lebanon)
-format locale: ID: ar_LB, Name: Arabic (Lebanon)
-default charset: ISO-8859-6
-
-OS Locale:  ar_LB.iso88596
-default locale: ID: ar_LB, Name: Arabic (Lebanon)
-display locale: ID: ar_LB, Name: Arabic (Lebanon)
-format locale: ID: ar_LB, Name: Arabic (Lebanon)
-default charset: ISO-8859-6
-
-OS Locale:  ar_LB.utf8
-default locale: ID: ar_LB, Name: Arabic (Lebanon)
-display locale: ID: ar_LB, Name: Arabic (Lebanon)
-format locale: ID: ar_LB, Name: Arabic (Lebanon)
-default charset: UTF-8
-
-OS Locale:  ar_LY
-default locale: ID: ar_LY, Name: Arabic (Libya)
-display locale: ID: ar_LY, Name: Arabic (Libya)
-format locale: ID: ar_LY, Name: Arabic (Libya)
-default charset: ISO-8859-6
-
-OS Locale:  ar_LY.iso88596
-default locale: ID: ar_LY, Name: Arabic (Libya)
-display locale: ID: ar_LY, Name: Arabic (Libya)
-format locale: ID: ar_LY, Name: Arabic (Libya)
-default charset: ISO-8859-6
-
-OS Locale:  ar_LY.utf8
-default locale: ID: ar_LY, Name: Arabic (Libya)
-display locale: ID: ar_LY, Name: Arabic (Libya)
-format locale: ID: ar_LY, Name: Arabic (Libya)
-default charset: UTF-8
-
-OS Locale:  ar_MA
-default locale: ID: ar_MA, Name: Arabic (Morocco)
-display locale: ID: ar_MA, Name: Arabic (Morocco)
-format locale: ID: ar_MA, Name: Arabic (Morocco)
-default charset: ISO-8859-6
-
-OS Locale:  ar_MA.iso88596
-default locale: ID: ar_MA, Name: Arabic (Morocco)
-display locale: ID: ar_MA, Name: Arabic (Morocco)
-format locale: ID: ar_MA, Name: Arabic (Morocco)
-default charset: ISO-8859-6
-
-OS Locale:  ar_MA.utf8
-default locale: ID: ar_MA, Name: Arabic (Morocco)
-display locale: ID: ar_MA, Name: Arabic (Morocco)
-format locale: ID: ar_MA, Name: Arabic (Morocco)
-default charset: UTF-8
-
-OS Locale:  ar_OM
-default locale: ID: ar_OM, Name: Arabic (Oman)
-display locale: ID: ar_OM, Name: Arabic (Oman)
-format locale: ID: ar_OM, Name: Arabic (Oman)
-default charset: ISO-8859-6
-
-OS Locale:  ar_OM.iso88596
-default locale: ID: ar_OM, Name: Arabic (Oman)
-display locale: ID: ar_OM, Name: Arabic (Oman)
-format locale: ID: ar_OM, Name: Arabic (Oman)
-default charset: ISO-8859-6
-
-OS Locale:  ar_OM.utf8
-default locale: ID: ar_OM, Name: Arabic (Oman)
-display locale: ID: ar_OM, Name: Arabic (Oman)
-format locale: ID: ar_OM, Name: Arabic (Oman)
-default charset: UTF-8
-
-OS Locale:  ar_QA
-default locale: ID: ar_QA, Name: Arabic (Qatar)
-display locale: ID: ar_QA, Name: Arabic (Qatar)
-format locale: ID: ar_QA, Name: Arabic (Qatar)
-default charset: ISO-8859-6
-
-OS Locale:  ar_QA.iso88596
-default locale: ID: ar_QA, Name: Arabic (Qatar)
-display locale: ID: ar_QA, Name: Arabic (Qatar)
-format locale: ID: ar_QA, Name: Arabic (Qatar)
-default charset: ISO-8859-6
-
-OS Locale:  ar_QA.utf8
-default locale: ID: ar_QA, Name: Arabic (Qatar)
-display locale: ID: ar_QA, Name: Arabic (Qatar)
-format locale: ID: ar_QA, Name: Arabic (Qatar)
-default charset: UTF-8
-
-OS Locale:  ar_SA
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SA.iso88596
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SA.utf8
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: UTF-8
-
-OS Locale:  ar_SD
-default locale: ID: ar_SD, Name: Arabic (Sudan)
-display locale: ID: ar_SD, Name: Arabic (Sudan)
-format locale: ID: ar_SD, Name: Arabic (Sudan)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SD.iso88596
-default locale: ID: ar_SD, Name: Arabic (Sudan)
-display locale: ID: ar_SD, Name: Arabic (Sudan)
-format locale: ID: ar_SD, Name: Arabic (Sudan)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SD.utf8
-default locale: ID: ar_SD, Name: Arabic (Sudan)
-display locale: ID: ar_SD, Name: Arabic (Sudan)
-format locale: ID: ar_SD, Name: Arabic (Sudan)
-default charset: UTF-8
-
-OS Locale:  ar_SY
-default locale: ID: ar_SY, Name: Arabic (Syria)
-display locale: ID: ar_SY, Name: Arabic (Syria)
-format locale: ID: ar_SY, Name: Arabic (Syria)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SY.iso88596
-default locale: ID: ar_SY, Name: Arabic (Syria)
-display locale: ID: ar_SY, Name: Arabic (Syria)
-format locale: ID: ar_SY, Name: Arabic (Syria)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SY.utf8
-default locale: ID: ar_SY, Name: Arabic (Syria)
-display locale: ID: ar_SY, Name: Arabic (Syria)
-format locale: ID: ar_SY, Name: Arabic (Syria)
-default charset: UTF-8
-
-OS Locale:  ar_TN
-default locale: ID: ar_TN, Name: Arabic (Tunisia)
-display locale: ID: ar_TN, Name: Arabic (Tunisia)
-format locale: ID: ar_TN, Name: Arabic (Tunisia)
-default charset: ISO-8859-6
-
-OS Locale:  ar_TN.iso88596
-default locale: ID: ar_TN, Name: Arabic (Tunisia)
-display locale: ID: ar_TN, Name: Arabic (Tunisia)
-format locale: ID: ar_TN, Name: Arabic (Tunisia)
-default charset: ISO-8859-6
-
-OS Locale:  ar_TN.utf8
-default locale: ID: ar_TN, Name: Arabic (Tunisia)
-display locale: ID: ar_TN, Name: Arabic (Tunisia)
-format locale: ID: ar_TN, Name: Arabic (Tunisia)
-default charset: UTF-8
-
-OS Locale:  ar_YE
-default locale: ID: ar_YE, Name: Arabic (Yemen)
-display locale: ID: ar_YE, Name: Arabic (Yemen)
-format locale: ID: ar_YE, Name: Arabic (Yemen)
-default charset: ISO-8859-6
-
-OS Locale:  ar_YE.iso88596
-default locale: ID: ar_YE, Name: Arabic (Yemen)
-display locale: ID: ar_YE, Name: Arabic (Yemen)
-format locale: ID: ar_YE, Name: Arabic (Yemen)
-default charset: ISO-8859-6
-
-OS Locale:  ar_YE.utf8
-default locale: ID: ar_YE, Name: Arabic (Yemen)
-display locale: ID: ar_YE, Name: Arabic (Yemen)
-format locale: ID: ar_YE, Name: Arabic (Yemen)
-default charset: UTF-8
-
-OS Locale:  as_IN.utf8
-default locale: ID: as_IN, Name: Assamese (India)
-display locale: ID: as_IN, Name: Assamese (India)
-format locale: ID: as_IN, Name: Assamese (India)
-default charset: UTF-8
-
-OS Locale:  az_AZ.utf8
-default locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan)
-display locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan)
-format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan)
-default charset: UTF-8
-
-OS Locale:  be_BY
-default locale: ID: be_BY, Name: Belarusian (Belarus)
-display locale: ID: be_BY, Name: Belarusian (Belarus)
-format locale: ID: be_BY, Name: Belarusian (Belarus)
-default charset: windows-1251
-
-OS Locale:  be_BY.cp1251
-default locale: ID: be_BY, Name: Belarusian (Belarus)
-display locale: ID: be_BY, Name: Belarusian (Belarus)
-format locale: ID: be_BY, Name: Belarusian (Belarus)
-default charset: windows-1251
-
-OS Locale:  be_BY.utf8
-default locale: ID: be_BY, Name: Belarusian (Belarus)
-display locale: ID: be_BY, Name: Belarusian (Belarus)
-format locale: ID: be_BY, Name: Belarusian (Belarus)
-default charset: UTF-8
-
-OS Locale:  be_BY.utf8@latin
-default locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-display locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-format locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-default charset: UTF-8
-
-OS Locale:  be_BY@latin
-default locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-display locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-format locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-default charset: UTF-8
-
-OS Locale:  bg_BG
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: windows-1251
-
-OS Locale:  bg_BG.cp1251
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: windows-1251
-
-OS Locale:  bg_BG.utf8
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: UTF-8
-
-OS Locale:  bn_BD
-default locale: ID: bn_BD, Name: Bengali (Bangladesh)
-display locale: ID: bn_BD, Name: Bengali (Bangladesh)
-format locale: ID: bn_BD, Name: Bengali (Bangladesh)
-default charset: UTF-8
-
-OS Locale:  bn_BD.utf8
-default locale: ID: bn_BD, Name: Bengali (Bangladesh)
-display locale: ID: bn_BD, Name: Bengali (Bangladesh)
-format locale: ID: bn_BD, Name: Bengali (Bangladesh)
-default charset: UTF-8
-
-OS Locale:  bn_IN
-default locale: ID: bn_IN, Name: Bengali (India)
-display locale: ID: bn_IN, Name: Bengali (India)
-format locale: ID: bn_IN, Name: Bengali (India)
-default charset: UTF-8
-
-OS Locale:  bn_IN.utf8
-default locale: ID: bn_IN, Name: Bengali (India)
-display locale: ID: bn_IN, Name: Bengali (India)
-format locale: ID: bn_IN, Name: Bengali (India)
-default charset: UTF-8
-
-OS Locale:  bokmål
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  bokmal
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  br_FR
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: ISO-8859-1
-
-OS Locale:  br_FR.iso88591
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: ISO-8859-1
-
-OS Locale:  br_FR.iso885915@euro
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: ISO-8859-15
-
-OS Locale:  br_FR.utf8
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: UTF-8
-
-OS Locale:  br_FR@euro
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: ISO-8859-15
-
-OS Locale:  bs_BA
-default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-default charset: ISO-8859-2
-
-OS Locale:  bs_BA.iso88592
-default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-default charset: ISO-8859-2
-
-OS Locale:  bs_BA.utf8
-default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-default charset: UTF-8
-
-OS Locale:  byn_ER
-default locale: ID: byn_ER, Name: Blin (Eritrea)
-display locale: ID: byn_ER, Name: Blin (Eritrea)
-format locale: ID: byn_ER, Name: Blin (Eritrea)
-default charset: UTF-8
-
-OS Locale:  byn_ER.utf8
-default locale: ID: byn_ER, Name: Blin (Eritrea)
-display locale: ID: byn_ER, Name: Blin (Eritrea)
-format locale: ID: byn_ER, Name: Blin (Eritrea)
-default charset: UTF-8
-
-OS Locale:  ca_AD
-default locale: ID: ca_AD, Name: Catalan (Andorra)
-display locale: ID: ca_AD, Name: Catalan (Andorra)
-format locale: ID: ca_AD, Name: Catalan (Andorra)
-default charset: ISO-8859-15
-
-OS Locale:  ca_AD.iso885915
-default locale: ID: ca_AD, Name: Catalan (Andorra)
-display locale: ID: ca_AD, Name: Catalan (Andorra)
-format locale: ID: ca_AD, Name: Catalan (Andorra)
-default charset: ISO-8859-15
-
-OS Locale:  ca_AD.utf8
-default locale: ID: ca_AD, Name: Catalan (Andorra)
-display locale: ID: ca_AD, Name: Catalan (Andorra)
-format locale: ID: ca_AD, Name: Catalan (Andorra)
-default charset: UTF-8
-
-OS Locale:  ca_ES
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES.iso88591
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES.iso885915@euro
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  ca_ES.utf8
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: UTF-8
-
-OS Locale:  ca_ES@euro
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  ca_FR
-default locale: ID: ca_FR, Name: Catalan (France)
-display locale: ID: ca_FR, Name: Catalan (France)
-format locale: ID: ca_FR, Name: Catalan (France)
-default charset: ISO-8859-15
-
-OS Locale:  ca_FR.iso885915
-default locale: ID: ca_FR, Name: Catalan (France)
-display locale: ID: ca_FR, Name: Catalan (France)
-format locale: ID: ca_FR, Name: Catalan (France)
-default charset: ISO-8859-15
-
-OS Locale:  ca_FR.utf8
-default locale: ID: ca_FR, Name: Catalan (France)
-display locale: ID: ca_FR, Name: Catalan (France)
-format locale: ID: ca_FR, Name: Catalan (France)
-default charset: UTF-8
-
-OS Locale:  ca_IT
-default locale: ID: ca_IT, Name: Catalan (Italy)
-display locale: ID: ca_IT, Name: Catalan (Italy)
-format locale: ID: ca_IT, Name: Catalan (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  ca_IT.iso885915
-default locale: ID: ca_IT, Name: Catalan (Italy)
-display locale: ID: ca_IT, Name: Catalan (Italy)
-format locale: ID: ca_IT, Name: Catalan (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  ca_IT.utf8
-default locale: ID: ca_IT, Name: Catalan (Italy)
-display locale: ID: ca_IT, Name: Catalan (Italy)
-format locale: ID: ca_IT, Name: Catalan (Italy)
-default charset: UTF-8
-
-OS Locale:  catalan
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  croatian
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ.iso88592
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ.utf8
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: UTF-8
-
-OS Locale:  csb_PL
-default locale: ID: csb_PL, Name: Kashubian (Poland)
-display locale: ID: csb_PL, Name: Kashubian (Poland)
-format locale: ID: csb_PL, Name: Kashubian (Poland)
-default charset: UTF-8
-
-OS Locale:  csb_PL.utf8
-default locale: ID: csb_PL, Name: Kashubian (Poland)
-display locale: ID: csb_PL, Name: Kashubian (Poland)
-format locale: ID: csb_PL, Name: Kashubian (Poland)
-default charset: UTF-8
-
-OS Locale:  cy_GB
-default locale: ID: cy_GB, Name: Welsh (United Kingdom)
-display locale: ID: cy_GB, Name: Welsh (United Kingdom)
-format locale: ID: cy_GB, Name: Welsh (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  cy_GB.iso885914
-default locale: ID: cy_GB, Name: Welsh (United Kingdom)
-display locale: ID: cy_GB, Name: Welsh (United Kingdom)
-format locale: ID: cy_GB, Name: Welsh (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  cy_GB.utf8
-default locale: ID: cy_GB, Name: Welsh (United Kingdom)
-display locale: ID: cy_GB, Name: Welsh (United Kingdom)
-format locale: ID: cy_GB, Name: Welsh (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  czech
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  da_DK
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da_DK.iso88591
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da_DK.iso885915
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-15
-
-OS Locale:  da_DK.utf8
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: UTF-8
-
-OS Locale:  danish
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  dansk
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT.iso88591
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT.iso885915@euro
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-15
-
-OS Locale:  de_AT.utf8
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: UTF-8
-
-OS Locale:  de_AT@euro
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-15
-
-OS Locale:  de_BE
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  de_BE.iso88591
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  de_BE.iso885915@euro
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  de_BE.utf8
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: UTF-8
-
-OS Locale:  de_BE@euro
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  de_CH
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  de_CH.iso88591
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  de_CH.utf8
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: UTF-8
-
-OS Locale:  de_DE
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE.iso88591
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE.iso885915@euro
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de_DE.utf8
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: UTF-8
-
-OS Locale:  de_DE@euro
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de_LU
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: ISO-8859-1
-
-OS Locale:  de_LU.iso88591
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: ISO-8859-1
-
-OS Locale:  de_LU.iso885915@euro
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: ISO-8859-15
-
-OS Locale:  de_LU.utf8
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: UTF-8
-
-OS Locale:  de_LU@euro
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: ISO-8859-15
-
-OS Locale:  deutsch
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  dutch
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  dz_BT
-default locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-display locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-format locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-default charset: UTF-8
-
-OS Locale:  dz_BT.utf8
-default locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-display locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-format locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-default charset: UTF-8
-
-OS Locale:  eesti
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-1
-
-OS Locale:  el_CY
-default locale: ID: el_CY, Name: Greek (Cyprus)
-display locale: ID: el_CY, Name: Greek (Cyprus)
-format locale: ID: el_CY, Name: Greek (Cyprus)
-default charset: ISO-8859-7
-
-OS Locale:  el_CY.iso88597
-default locale: ID: el_CY, Name: Greek (Cyprus)
-display locale: ID: el_CY, Name: Greek (Cyprus)
-format locale: ID: el_CY, Name: Greek (Cyprus)
-default charset: ISO-8859-7
-
-OS Locale:  el_CY.utf8
-default locale: ID: el_CY, Name: Greek (Cyprus)
-display locale: ID: el_CY, Name: Greek (Cyprus)
-format locale: ID: el_CY, Name: Greek (Cyprus)
-default charset: UTF-8
-
-OS Locale:  el_GR
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR.iso88597
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR.utf8
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: UTF-8
-
-OS Locale:  en_AU
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: ISO-8859-1
-
-OS Locale:  en_AU.iso88591
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: ISO-8859-1
-
-OS Locale:  en_AU.utf8
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: UTF-8
-
-OS Locale:  en_BW
-default locale: ID: en_BW, Name: English (Botswana)
-display locale: ID: en_BW, Name: English (Botswana)
-format locale: ID: en_BW, Name: English (Botswana)
-default charset: ISO-8859-1
-
-OS Locale:  en_BW.iso88591
-default locale: ID: en_BW, Name: English (Botswana)
-display locale: ID: en_BW, Name: English (Botswana)
-format locale: ID: en_BW, Name: English (Botswana)
-default charset: ISO-8859-1
-
-OS Locale:  en_BW.utf8
-default locale: ID: en_BW, Name: English (Botswana)
-display locale: ID: en_BW, Name: English (Botswana)
-format locale: ID: en_BW, Name: English (Botswana)
-default charset: UTF-8
-
-OS Locale:  en_CA
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA.iso88591
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA.utf8
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: UTF-8
-
-OS Locale:  en_DK
-default locale: ID: en_DK, Name: English (Denmark)
-display locale: ID: en_DK, Name: English (Denmark)
-format locale: ID: en_DK, Name: English (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  en_DK.iso88591
-default locale: ID: en_DK, Name: English (Denmark)
-display locale: ID: en_DK, Name: English (Denmark)
-format locale: ID: en_DK, Name: English (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  en_DK.utf8
-default locale: ID: en_DK, Name: English (Denmark)
-display locale: ID: en_DK, Name: English (Denmark)
-format locale: ID: en_DK, Name: English (Denmark)
-default charset: UTF-8
-
-OS Locale:  en_GB
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  en_GB.iso88591
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  en_GB.iso885915
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  en_GB.utf8
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  en_HK
-default locale: ID: en_HK, Name: English (Hong Kong)
-display locale: ID: en_HK, Name: English (Hong Kong)
-format locale: ID: en_HK, Name: English (Hong Kong)
-default charset: ISO-8859-1
-
-OS Locale:  en_HK.iso88591
-default locale: ID: en_HK, Name: English (Hong Kong)
-display locale: ID: en_HK, Name: English (Hong Kong)
-format locale: ID: en_HK, Name: English (Hong Kong)
-default charset: ISO-8859-1
-
-OS Locale:  en_HK.utf8
-default locale: ID: en_HK, Name: English (Hong Kong)
-display locale: ID: en_HK, Name: English (Hong Kong)
-format locale: ID: en_HK, Name: English (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  en_IE
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  en_IE.iso88591
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  en_IE.iso885915@euro
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  en_IE.utf8
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: UTF-8
-
-OS Locale:  en_IE@euro
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  en_IN
-default locale: ID: en_IN, Name: English (India)
-display locale: ID: en_IN, Name: English (India)
-format locale: ID: en_IN, Name: English (India)
-default charset: UTF-8
-
-OS Locale:  en_IN.utf8
-default locale: ID: en_IN, Name: English (India)
-display locale: ID: en_IN, Name: English (India)
-format locale: ID: en_IN, Name: English (India)
-default charset: UTF-8
-
-OS Locale:  en_NZ
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: ISO-8859-1
-
-OS Locale:  en_NZ.iso88591
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: ISO-8859-1
-
-OS Locale:  en_NZ.utf8
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: UTF-8
-
-OS Locale:  en_PH
-default locale: ID: en_PH, Name: English (Philippines)
-display locale: ID: en_PH, Name: English (Philippines)
-format locale: ID: en_PH, Name: English (Philippines)
-default charset: ISO-8859-1
-
-OS Locale:  en_PH.iso88591
-default locale: ID: en_PH, Name: English (Philippines)
-display locale: ID: en_PH, Name: English (Philippines)
-format locale: ID: en_PH, Name: English (Philippines)
-default charset: ISO-8859-1
-
-OS Locale:  en_PH.utf8
-default locale: ID: en_PH, Name: English (Philippines)
-display locale: ID: en_PH, Name: English (Philippines)
-format locale: ID: en_PH, Name: English (Philippines)
-default charset: UTF-8
-
-OS Locale:  en_SG
-default locale: ID: en_SG, Name: English (Singapore)
-display locale: ID: en_SG, Name: English (Singapore)
-format locale: ID: en_SG, Name: English (Singapore)
-default charset: ISO-8859-1
-
-OS Locale:  en_SG.iso88591
-default locale: ID: en_SG, Name: English (Singapore)
-display locale: ID: en_SG, Name: English (Singapore)
-format locale: ID: en_SG, Name: English (Singapore)
-default charset: ISO-8859-1
-
-OS Locale:  en_SG.utf8
-default locale: ID: en_SG, Name: English (Singapore)
-display locale: ID: en_SG, Name: English (Singapore)
-format locale: ID: en_SG, Name: English (Singapore)
-default charset: UTF-8
-
-OS Locale:  en_US
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-1
-
-OS Locale:  en_US.iso88591
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-1
-
-OS Locale:  en_US.iso885915
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-15
-
-OS Locale:  en_US.utf8
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: UTF-8
-
-OS Locale:  en_ZA
-default locale: ID: en_ZA, Name: English (South Africa)
-display locale: ID: en_ZA, Name: English (South Africa)
-format locale: ID: en_ZA, Name: English (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  en_ZA.iso88591
-default locale: ID: en_ZA, Name: English (South Africa)
-display locale: ID: en_ZA, Name: English (South Africa)
-format locale: ID: en_ZA, Name: English (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  en_ZA.utf8
-default locale: ID: en_ZA, Name: English (South Africa)
-display locale: ID: en_ZA, Name: English (South Africa)
-format locale: ID: en_ZA, Name: English (South Africa)
-default charset: UTF-8
-
-OS Locale:  en_ZW
-default locale: ID: en_ZW, Name: English (Zimbabwe)
-display locale: ID: en_ZW, Name: English (Zimbabwe)
-format locale: ID: en_ZW, Name: English (Zimbabwe)
-default charset: ISO-8859-1
-
-OS Locale:  en_ZW.iso88591
-default locale: ID: en_ZW, Name: English (Zimbabwe)
-display locale: ID: en_ZW, Name: English (Zimbabwe)
-format locale: ID: en_ZW, Name: English (Zimbabwe)
-default charset: ISO-8859-1
-
-OS Locale:  en_ZW.utf8
-default locale: ID: en_ZW, Name: English (Zimbabwe)
-display locale: ID: en_ZW, Name: English (Zimbabwe)
-format locale: ID: en_ZW, Name: English (Zimbabwe)
-default charset: UTF-8
-
-OS Locale:  es_AR
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: ISO-8859-1
-
-OS Locale:  es_AR.iso88591
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: ISO-8859-1
-
-OS Locale:  es_AR.utf8
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: UTF-8
-
-OS Locale:  es_BO
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: ISO-8859-1
-
-OS Locale:  es_BO.iso88591
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: ISO-8859-1
-
-OS Locale:  es_BO.utf8
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: UTF-8
-
-OS Locale:  es_CL
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: ISO-8859-1
-
-OS Locale:  es_CL.iso88591
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: ISO-8859-1
-
-OS Locale:  es_CL.utf8
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: UTF-8
-
-OS Locale:  es_CO
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CO.iso88591
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CO.utf8
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: UTF-8
-
-OS Locale:  es_CR
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: ISO-8859-1
-
-OS Locale:  es_CR.iso88591
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: ISO-8859-1
-
-OS Locale:  es_CR.utf8
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: UTF-8
-
-OS Locale:  es_DO
-default locale: ID: es_DO, Name: Spanish (Dominican Republic)
-display locale: ID: es_DO, Name: Spanish (Dominican Republic)
-format locale: ID: es_DO, Name: Spanish (Dominican Republic)
-default charset: ISO-8859-1
-
-OS Locale:  es_DO.iso88591
-default locale: ID: es_DO, Name: Spanish (Dominican Republic)
-display locale: ID: es_DO, Name: Spanish (Dominican Republic)
-format locale: ID: es_DO, Name: Spanish (Dominican Republic)
-default charset: ISO-8859-1
-
-OS Locale:  es_DO.utf8
-default locale: ID: es_DO, Name: Spanish (Dominican Republic)
-display locale: ID: es_DO, Name: Spanish (Dominican Republic)
-format locale: ID: es_DO, Name: Spanish (Dominican Republic)
-default charset: UTF-8
-
-OS Locale:  es_EC
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: ISO-8859-1
-
-OS Locale:  es_EC.iso88591
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: ISO-8859-1
-
-OS Locale:  es_EC.utf8
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: UTF-8
-
-OS Locale:  es_ES
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES.iso88591
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES.iso885915@euro
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es_ES.utf8
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: UTF-8
-
-OS Locale:  es_ES@euro
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es_GT
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: ISO-8859-1
-
-OS Locale:  es_GT.iso88591
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: ISO-8859-1
-
-OS Locale:  es_GT.utf8
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: UTF-8
-
-OS Locale:  es_HN
-default locale: ID: es_HN, Name: Spanish (Honduras)
-display locale: ID: es_HN, Name: Spanish (Honduras)
-format locale: ID: es_HN, Name: Spanish (Honduras)
-default charset: ISO-8859-1
-
-OS Locale:  es_HN.iso88591
-default locale: ID: es_HN, Name: Spanish (Honduras)
-display locale: ID: es_HN, Name: Spanish (Honduras)
-format locale: ID: es_HN, Name: Spanish (Honduras)
-default charset: ISO-8859-1
-
-OS Locale:  es_HN.utf8
-default locale: ID: es_HN, Name: Spanish (Honduras)
-display locale: ID: es_HN, Name: Spanish (Honduras)
-format locale: ID: es_HN, Name: Spanish (Honduras)
-default charset: UTF-8
-
-OS Locale:  es_MX
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX.iso88591
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX.utf8
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: UTF-8
-
-OS Locale:  es_NI
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: ISO-8859-1
-
-OS Locale:  es_NI.iso88591
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: ISO-8859-1
-
-OS Locale:  es_NI.utf8
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: UTF-8
-
-OS Locale:  es_PA
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: ISO-8859-1
-
-OS Locale:  es_PA.iso88591
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: ISO-8859-1
-
-OS Locale:  es_PA.utf8
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: UTF-8
-
-OS Locale:  es_PE
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: ISO-8859-1
-
-OS Locale:  es_PE.iso88591
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: ISO-8859-1
-
-OS Locale:  es_PE.utf8
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: UTF-8
-
-OS Locale:  es_PR
-default locale: ID: es_PR, Name: Spanish (Puerto Rico)
-display locale: ID: es_PR, Name: Spanish (Puerto Rico)
-format locale: ID: es_PR, Name: Spanish (Puerto Rico)
-default charset: ISO-8859-1
-
-OS Locale:  es_PR.iso88591
-default locale: ID: es_PR, Name: Spanish (Puerto Rico)
-display locale: ID: es_PR, Name: Spanish (Puerto Rico)
-format locale: ID: es_PR, Name: Spanish (Puerto Rico)
-default charset: ISO-8859-1
-
-OS Locale:  es_PR.utf8
-default locale: ID: es_PR, Name: Spanish (Puerto Rico)
-display locale: ID: es_PR, Name: Spanish (Puerto Rico)
-format locale: ID: es_PR, Name: Spanish (Puerto Rico)
-default charset: UTF-8
-
-OS Locale:  es_PY
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_PY.iso88591
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_PY.utf8
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: UTF-8
-
-OS Locale:  es_SV
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: ISO-8859-1
-
-OS Locale:  es_SV.iso88591
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: ISO-8859-1
-
-OS Locale:  es_SV.utf8
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: UTF-8
-
-OS Locale:  es_US
-default locale: ID: es_US, Name: Spanish (United States)
-display locale: ID: es_US, Name: Spanish (United States)
-format locale: ID: es_US, Name: Spanish (United States)
-default charset: ISO-8859-1
-
-OS Locale:  es_US.iso88591
-default locale: ID: es_US, Name: Spanish (United States)
-display locale: ID: es_US, Name: Spanish (United States)
-format locale: ID: es_US, Name: Spanish (United States)
-default charset: ISO-8859-1
-
-OS Locale:  es_US.utf8
-default locale: ID: es_US, Name: Spanish (United States)
-display locale: ID: es_US, Name: Spanish (United States)
-format locale: ID: es_US, Name: Spanish (United States)
-default charset: UTF-8
-
-OS Locale:  es_UY
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_UY.iso88591
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_UY.utf8
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: UTF-8
-
-OS Locale:  es_VE
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: ISO-8859-1
-
-OS Locale:  es_VE.iso88591
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: ISO-8859-1
-
-OS Locale:  es_VE.utf8
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: UTF-8
-
-OS Locale:  estonian
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-1
-
-OS Locale:  et_EE
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-1
-
-OS Locale:  et_EE.iso88591
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-1
-
-OS Locale:  et_EE.iso885915
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-15
-
-OS Locale:  et_EE.utf8
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: UTF-8
-
-OS Locale:  eu_ES
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  eu_ES.iso88591
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  eu_ES.iso885915@euro
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  eu_ES.utf8
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: UTF-8
-
-OS Locale:  eu_ES@euro
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  fa_IR
-default locale: ID: fa_IR, Name: Persian (Iran)
-display locale: ID: fa_IR, Name: Persian (Iran)
-format locale: ID: fa_IR, Name: Persian (Iran)
-default charset: UTF-8
-
-OS Locale:  fa_IR.utf8
-default locale: ID: fa_IR, Name: Persian (Iran)
-display locale: ID: fa_IR, Name: Persian (Iran)
-format locale: ID: fa_IR, Name: Persian (Iran)
-default charset: UTF-8
-
-OS Locale:  fi_FI
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi_FI.iso88591
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi_FI.iso885915@euro
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  fi_FI.utf8
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: UTF-8
-
-OS Locale:  fi_FI@euro
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  finnish
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fo_FO
-default locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-display locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-format locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-default charset: ISO-8859-1
-
-OS Locale:  fo_FO.iso88591
-default locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-display locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-format locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-default charset: ISO-8859-1
-
-OS Locale:  fo_FO.utf8
-default locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-display locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-format locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-default charset: UTF-8
-
-OS Locale:  fr_BE
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  fr_BE.iso88591
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  fr_BE.iso885915@euro
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  fr_BE.utf8
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: UTF-8
-
-OS Locale:  fr_BE@euro
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  fr_CA
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CA.iso88591
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CA.utf8
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: UTF-8
-
-OS Locale:  fr_CH
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CH.iso88591
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CH.utf8
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: UTF-8
-
-OS Locale:  fr_FR
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR.iso88591
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR.iso885915@euro
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr_FR.utf8
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: UTF-8
-
-OS Locale:  fr_FR@euro
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr_LU
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: ISO-8859-1
-
-OS Locale:  fr_LU.iso88591
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: ISO-8859-1
-
-OS Locale:  fr_LU.iso885915@euro
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: ISO-8859-15
-
-OS Locale:  fr_LU.utf8
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: UTF-8
-
-OS Locale:  fr_LU@euro
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: ISO-8859-15
-
-OS Locale:  français
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  french
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fy_NL
-default locale: ID: fy_NL, Name: Frisian (Netherlands)
-display locale: ID: fy_NL, Name: Frisian (Netherlands)
-format locale: ID: fy_NL, Name: Frisian (Netherlands)
-default charset: UTF-8
-
-OS Locale:  fy_NL.utf8
-default locale: ID: fy_NL, Name: Frisian (Netherlands)
-display locale: ID: fy_NL, Name: Frisian (Netherlands)
-format locale: ID: fy_NL, Name: Frisian (Netherlands)
-default charset: UTF-8
-
-OS Locale:  ga_IE
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  ga_IE.iso88591
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  ga_IE.iso885915@euro
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  ga_IE.utf8
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: UTF-8
-
-OS Locale:  ga_IE@euro
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  galego
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  galician
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  gd_GB
-default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  gd_GB.iso885915
-default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  gd_GB.utf8
-default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  german
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  gez_ER
-default locale: ID: gez_ER, Name: Geez (Eritrea)
-display locale: ID: gez_ER, Name: Geez (Eritrea)
-format locale: ID: gez_ER, Name: Geez (Eritrea)
-default charset: UTF-8
-
-OS Locale:  gez_ER.utf8
-default locale: ID: gez_ER, Name: Geez (Eritrea)
-display locale: ID: gez_ER, Name: Geez (Eritrea)
-format locale: ID: gez_ER, Name: Geez (Eritrea)
-default charset: UTF-8
-
-OS Locale:  gez_ER.utf8@abegede
-default locale: ID: gez_ER, Name: Geez (Eritrea)
-display locale: ID: gez_ER, Name: Geez (Eritrea)
-format locale: ID: gez_ER, Name: Geez (Eritrea)
-default charset: UTF-8
-
-OS Locale:  gez_ER@abegede
-default locale: ID: gez_ER, Name: Geez (Eritrea)
-display locale: ID: gez_ER, Name: Geez (Eritrea)
-format locale: ID: gez_ER, Name: Geez (Eritrea)
-default charset: UTF-8
-
-OS Locale:  gez_ET
-default locale: ID: gez_ET, Name: Geez (Ethiopia)
-display locale: ID: gez_ET, Name: Geez (Ethiopia)
-format locale: ID: gez_ET, Name: Geez (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  gez_ET.utf8
-default locale: ID: gez_ET, Name: Geez (Ethiopia)
-display locale: ID: gez_ET, Name: Geez (Ethiopia)
-format locale: ID: gez_ET, Name: Geez (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  gez_ET.utf8@abegede
-default locale: ID: gez_ET, Name: Geez (Ethiopia)
-display locale: ID: gez_ET, Name: Geez (Ethiopia)
-format locale: ID: gez_ET, Name: Geez (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  gez_ET@abegede
-default locale: ID: gez_ET, Name: Geez (Ethiopia)
-display locale: ID: gez_ET, Name: Geez (Ethiopia)
-format locale: ID: gez_ET, Name: Geez (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  gl_ES
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  gl_ES.iso88591
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  gl_ES.iso885915@euro
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  gl_ES.utf8
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: UTF-8
-
-OS Locale:  gl_ES@euro
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  greek
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  gu_IN
-default locale: ID: gu_IN, Name: Gujarati (India)
-display locale: ID: gu_IN, Name: Gujarati (India)
-format locale: ID: gu_IN, Name: Gujarati (India)
-default charset: UTF-8
-
-OS Locale:  gu_IN.utf8
-default locale: ID: gu_IN, Name: Gujarati (India)
-display locale: ID: gu_IN, Name: Gujarati (India)
-format locale: ID: gu_IN, Name: Gujarati (India)
-default charset: UTF-8
-
-OS Locale:  gv_GB
-default locale: ID: gv_GB, Name: Manx (United Kingdom)
-display locale: ID: gv_GB, Name: Manx (United Kingdom)
-format locale: ID: gv_GB, Name: Manx (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  gv_GB.iso88591
-default locale: ID: gv_GB, Name: Manx (United Kingdom)
-display locale: ID: gv_GB, Name: Manx (United Kingdom)
-format locale: ID: gv_GB, Name: Manx (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  gv_GB.utf8
-default locale: ID: gv_GB, Name: Manx (United Kingdom)
-display locale: ID: gv_GB, Name: Manx (United Kingdom)
-format locale: ID: gv_GB, Name: Manx (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  he_IL
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  he_IL.iso88598
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  he_IL.utf8
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: UTF-8
-
-OS Locale:  hebrew
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  hi_IN
-default locale: ID: hi_IN, Name: Hindi (India)
-display locale: ID: hi_IN, Name: Hindi (India)
-format locale: ID: hi_IN, Name: Hindi (India)
-default charset: UTF-8
-
-OS Locale:  hi_IN.utf8
-default locale: ID: hi_IN, Name: Hindi (India)
-display locale: ID: hi_IN, Name: Hindi (India)
-format locale: ID: hi_IN, Name: Hindi (India)
-default charset: UTF-8
-
-OS Locale:  hr_HR
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hr_HR.iso88592
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hr_HR.utf8
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: UTF-8
-
-OS Locale:  hrvatski
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hsb_DE
-default locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-display locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: ISO-8859-2
-
-OS Locale:  hsb_DE.iso88592
-default locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-display locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: ISO-8859-2
-
-OS Locale:  hsb_DE.utf8
-default locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-display locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: UTF-8
-
-OS Locale:  hu_HU
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU.iso88592
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU.utf8
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: UTF-8
-
-OS Locale:  hungarian
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hy_AM
-default locale: ID: hy_AM, Name: Armenian (Armenia)
-display locale: ID: hy_AM, Name: Armenian (Armenia)
-format locale: ID: hy_AM, Name: Armenian (Armenia)
-default charset: UTF-8
-
-OS Locale:  hy_AM.armscii8
-default locale: ID: hy_AM, Name: Armenian (Armenia)
-display locale: ID: hy_AM, Name: Armenian (Armenia)
-format locale: ID: hy_AM, Name: Armenian (Armenia)
-default charset: UTF-8
-
-OS Locale:  hy_AM.utf8
-default locale: ID: hy_AM, Name: Armenian (Armenia)
-display locale: ID: hy_AM, Name: Armenian (Armenia)
-format locale: ID: hy_AM, Name: Armenian (Armenia)
-default charset: UTF-8
-
-OS Locale:  icelandic
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  id_ID
-default locale: ID: in_ID, Name: Indonesian (Indonesia)
-display locale: ID: in_ID, Name: Indonesian (Indonesia)
-format locale: ID: in_ID, Name: Indonesian (Indonesia)
-default charset: ISO-8859-1
-
-OS Locale:  id_ID.iso88591
-default locale: ID: in_ID, Name: Indonesian (Indonesia)
-display locale: ID: in_ID, Name: Indonesian (Indonesia)
-format locale: ID: in_ID, Name: Indonesian (Indonesia)
-default charset: ISO-8859-1
-
-OS Locale:  id_ID.utf8
-default locale: ID: in_ID, Name: Indonesian (Indonesia)
-display locale: ID: in_ID, Name: Indonesian (Indonesia)
-format locale: ID: in_ID, Name: Indonesian (Indonesia)
-default charset: UTF-8
-
-OS Locale:  is_IS
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  is_IS.iso88591
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  is_IS.utf8
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: UTF-8
-
-OS Locale:  it_CH
-default locale: ID: it_CH, Name: Italian (Switzerland)
-display locale: ID: it_CH, Name: Italian (Switzerland)
-format locale: ID: it_CH, Name: Italian (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  it_CH.iso88591
-default locale: ID: it_CH, Name: Italian (Switzerland)
-display locale: ID: it_CH, Name: Italian (Switzerland)
-format locale: ID: it_CH, Name: Italian (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  it_CH.utf8
-default locale: ID: it_CH, Name: Italian (Switzerland)
-display locale: ID: it_CH, Name: Italian (Switzerland)
-format locale: ID: it_CH, Name: Italian (Switzerland)
-default charset: UTF-8
-
-OS Locale:  it_IT
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it_IT.iso88591
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it_IT.iso885915@euro
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  it_IT.utf8
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: UTF-8
-
-OS Locale:  it_IT@euro
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  italian
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  iw_IL
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  iw_IL.iso88598
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  iw_IL.utf8
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: UTF-8
-
-OS Locale:  ja_JP
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  ja_JP.eucjp
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  ja_JP.ujis
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  ja_JP.utf8
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: UTF-8
-
-OS Locale:  japanese
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  japanese.euc
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  ka_GE
-default locale: ID: ka_GE, Name: Georgian (Georgia)
-display locale: ID: ka_GE, Name: Georgian (Georgia)
-format locale: ID: ka_GE, Name: Georgian (Georgia)
-default charset: UTF-8
-
-OS Locale:  ka_GE.georgianps
-default locale: ID: ka_GE, Name: Georgian (Georgia)
-display locale: ID: ka_GE, Name: Georgian (Georgia)
-format locale: ID: ka_GE, Name: Georgian (Georgia)
-default charset: UTF-8
-
-OS Locale:  ka_GE.utf8
-default locale: ID: ka_GE, Name: Georgian (Georgia)
-display locale: ID: ka_GE, Name: Georgian (Georgia)
-format locale: ID: ka_GE, Name: Georgian (Georgia)
-default charset: UTF-8
-
-OS Locale:  kk_KZ
-default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-default charset: UTF-8
-
-OS Locale:  kk_KZ.pt154
-default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-default charset: UTF-8
-
-OS Locale:  kk_KZ.utf8
-default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-default charset: UTF-8
-
-OS Locale:  kl_GL
-default locale: ID: kl_GL, Name: Greenlandic (Greenland)
-display locale: ID: kl_GL, Name: Greenlandic (Greenland)
-format locale: ID: kl_GL, Name: Greenlandic (Greenland)
-default charset: ISO-8859-1
-
-OS Locale:  kl_GL.iso88591
-default locale: ID: kl_GL, Name: Greenlandic (Greenland)
-display locale: ID: kl_GL, Name: Greenlandic (Greenland)
-format locale: ID: kl_GL, Name: Greenlandic (Greenland)
-default charset: ISO-8859-1
-
-OS Locale:  kl_GL.utf8
-default locale: ID: kl_GL, Name: Greenlandic (Greenland)
-display locale: ID: kl_GL, Name: Greenlandic (Greenland)
-format locale: ID: kl_GL, Name: Greenlandic (Greenland)
-default charset: UTF-8
-
-OS Locale:  km_KH
-default locale: ID: km_KH, Name: Khmer (Cambodia)
-display locale: ID: km_KH, Name: Khmer (Cambodia)
-format locale: ID: km_KH, Name: Khmer (Cambodia)
-default charset: UTF-8
-
-OS Locale:  km_KH.utf8
-default locale: ID: km_KH, Name: Khmer (Cambodia)
-display locale: ID: km_KH, Name: Khmer (Cambodia)
-format locale: ID: km_KH, Name: Khmer (Cambodia)
-default charset: UTF-8
-
-OS Locale:  kn_IN
-default locale: ID: kn_IN, Name: Kannada (India)
-display locale: ID: kn_IN, Name: Kannada (India)
-format locale: ID: kn_IN, Name: Kannada (India)
-default charset: UTF-8
-
-OS Locale:  kn_IN.utf8
-default locale: ID: kn_IN, Name: Kannada (India)
-display locale: ID: kn_IN, Name: Kannada (India)
-format locale: ID: kn_IN, Name: Kannada (India)
-default charset: UTF-8
-
-OS Locale:  ko_KR
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko_KR.euckr
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko_KR.utf8
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: UTF-8
-
-OS Locale:  korean
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  korean.euc
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ku_TR
-default locale: ID: ku_TR, Name: Kurdish (Turkey)
-display locale: ID: ku_TR, Name: Kurdish (Turkey)
-format locale: ID: ku_TR, Name: Kurdish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  ku_TR.iso88599
-default locale: ID: ku_TR, Name: Kurdish (Turkey)
-display locale: ID: ku_TR, Name: Kurdish (Turkey)
-format locale: ID: ku_TR, Name: Kurdish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  ku_TR.utf8
-default locale: ID: ku_TR, Name: Kurdish (Turkey)
-display locale: ID: ku_TR, Name: Kurdish (Turkey)
-format locale: ID: ku_TR, Name: Kurdish (Turkey)
-default charset: UTF-8
-
-OS Locale:  kw_GB
-default locale: ID: kw_GB, Name: Cornish (United Kingdom)
-display locale: ID: kw_GB, Name: Cornish (United Kingdom)
-format locale: ID: kw_GB, Name: Cornish (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  kw_GB.iso88591
-default locale: ID: kw_GB, Name: Cornish (United Kingdom)
-display locale: ID: kw_GB, Name: Cornish (United Kingdom)
-format locale: ID: kw_GB, Name: Cornish (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  kw_GB.utf8
-default locale: ID: kw_GB, Name: Cornish (United Kingdom)
-display locale: ID: kw_GB, Name: Cornish (United Kingdom)
-format locale: ID: kw_GB, Name: Cornish (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  ky_KG
-default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-display locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-default charset: UTF-8
-
-OS Locale:  ky_KG.utf8
-default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-display locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-default charset: UTF-8
-
-OS Locale:  lg_UG
-default locale: ID: lg_UG, Name: Ganda (Uganda)
-display locale: ID: lg_UG, Name: Ganda (Uganda)
-format locale: ID: lg_UG, Name: Ganda (Uganda)
-default charset: UTF-8
-
-OS Locale:  lg_UG.iso885910
-default locale: ID: lg_UG, Name: Ganda (Uganda)
-display locale: ID: lg_UG, Name: Ganda (Uganda)
-format locale: ID: lg_UG, Name: Ganda (Uganda)
-default charset: UTF-8
-
-OS Locale:  lg_UG.utf8
-default locale: ID: lg_UG, Name: Ganda (Uganda)
-display locale: ID: lg_UG, Name: Ganda (Uganda)
-format locale: ID: lg_UG, Name: Ganda (Uganda)
-default charset: UTF-8
-
-OS Locale:  lithuanian
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lo_LA
-default locale: ID: lo_LA, Name: Lao (Laos)
-display locale: ID: lo_LA, Name: Lao (Laos)
-format locale: ID: lo_LA, Name: Lao (Laos)
-default charset: UTF-8
-
-OS Locale:  lo_LA.utf8
-default locale: ID: lo_LA, Name: Lao (Laos)
-display locale: ID: lo_LA, Name: Lao (Laos)
-format locale: ID: lo_LA, Name: Lao (Laos)
-default charset: UTF-8
-
-OS Locale:  lt_LT
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lt_LT.iso885913
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lt_LT.utf8
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: UTF-8
-
-OS Locale:  lv_LV
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  lv_LV.iso885913
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  lv_LV.utf8
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: UTF-8
-
-OS Locale:  mai_IN
-default locale: ID: mai_IN, Name: Maithili (India)
-display locale: ID: mai_IN, Name: Maithili (India)
-format locale: ID: mai_IN, Name: Maithili (India)
-default charset: UTF-8
-
-OS Locale:  mai_IN.utf8
-default locale: ID: mai_IN, Name: Maithili (India)
-display locale: ID: mai_IN, Name: Maithili (India)
-format locale: ID: mai_IN, Name: Maithili (India)
-default charset: UTF-8
-
-OS Locale:  mg_MG
-default locale: ID: mg_MG, Name: Malagasy (Madagascar)
-display locale: ID: mg_MG, Name: Malagasy (Madagascar)
-format locale: ID: mg_MG, Name: Malagasy (Madagascar)
-default charset: ISO-8859-15
-
-OS Locale:  mg_MG.iso885915
-default locale: ID: mg_MG, Name: Malagasy (Madagascar)
-display locale: ID: mg_MG, Name: Malagasy (Madagascar)
-format locale: ID: mg_MG, Name: Malagasy (Madagascar)
-default charset: ISO-8859-15
-
-OS Locale:  mg_MG.utf8
-default locale: ID: mg_MG, Name: Malagasy (Madagascar)
-display locale: ID: mg_MG, Name: Malagasy (Madagascar)
-format locale: ID: mg_MG, Name: Malagasy (Madagascar)
-default charset: UTF-8
-
-OS Locale:  mi_NZ
-default locale: ID: mi_NZ, Name: Maori (New Zealand)
-display locale: ID: mi_NZ, Name: Maori (New Zealand)
-format locale: ID: mi_NZ, Name: Maori (New Zealand)
-default charset: ISO-8859-13
-
-OS Locale:  mi_NZ.iso885913
-default locale: ID: mi_NZ, Name: Maori (New Zealand)
-display locale: ID: mi_NZ, Name: Maori (New Zealand)
-format locale: ID: mi_NZ, Name: Maori (New Zealand)
-default charset: ISO-8859-13
-
-OS Locale:  mi_NZ.utf8
-default locale: ID: mi_NZ, Name: Maori (New Zealand)
-display locale: ID: mi_NZ, Name: Maori (New Zealand)
-format locale: ID: mi_NZ, Name: Maori (New Zealand)
-default charset: UTF-8
-
-OS Locale:  mk_MK
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: ISO-8859-5
-
-OS Locale:  mk_MK.iso88595
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: ISO-8859-5
-
-OS Locale:  mk_MK.utf8
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: UTF-8
-
-OS Locale:  ml_IN
-default locale: ID: ml_IN, Name: Malayalam (India)
-display locale: ID: ml_IN, Name: Malayalam (India)
-format locale: ID: ml_IN, Name: Malayalam (India)
-default charset: UTF-8
-
-OS Locale:  ml_IN.utf8
-default locale: ID: ml_IN, Name: Malayalam (India)
-display locale: ID: ml_IN, Name: Malayalam (India)
-format locale: ID: ml_IN, Name: Malayalam (India)
-default charset: UTF-8
-
-OS Locale:  mn_MN
-default locale: ID: mn_MN, Name: Mongolian (Mongolia)
-display locale: ID: mn_MN, Name: Mongolian (Mongolia)
-format locale: ID: mn_MN, Name: Mongolian (Mongolia)
-default charset: UTF-8
-
-OS Locale:  mn_MN.utf8
-default locale: ID: mn_MN, Name: Mongolian (Mongolia)
-display locale: ID: mn_MN, Name: Mongolian (Mongolia)
-format locale: ID: mn_MN, Name: Mongolian (Mongolia)
-default charset: UTF-8
-
-OS Locale:  mr_IN
-default locale: ID: mr_IN, Name: Marathi (India)
-display locale: ID: mr_IN, Name: Marathi (India)
-format locale: ID: mr_IN, Name: Marathi (India)
-default charset: UTF-8
-
-OS Locale:  mr_IN.utf8
-default locale: ID: mr_IN, Name: Marathi (India)
-display locale: ID: mr_IN, Name: Marathi (India)
-format locale: ID: mr_IN, Name: Marathi (India)
-default charset: UTF-8
-
-OS Locale:  ms_MY
-default locale: ID: ms_MY, Name: Malay (Malaysia)
-display locale: ID: ms_MY, Name: Malay (Malaysia)
-format locale: ID: ms_MY, Name: Malay (Malaysia)
-default charset: ISO-8859-1
-
-OS Locale:  ms_MY.iso88591
-default locale: ID: ms_MY, Name: Malay (Malaysia)
-display locale: ID: ms_MY, Name: Malay (Malaysia)
-format locale: ID: ms_MY, Name: Malay (Malaysia)
-default charset: ISO-8859-1
-
-OS Locale:  ms_MY.utf8
-default locale: ID: ms_MY, Name: Malay (Malaysia)
-display locale: ID: ms_MY, Name: Malay (Malaysia)
-format locale: ID: ms_MY, Name: Malay (Malaysia)
-default charset: UTF-8
-
-OS Locale:  mt_MT
-default locale: ID: mt_MT, Name: Maltese (Malta)
-display locale: ID: mt_MT, Name: Maltese (Malta)
-format locale: ID: mt_MT, Name: Maltese (Malta)
-default charset: ISO-8859-3
-
-OS Locale:  mt_MT.iso88593
-default locale: ID: mt_MT, Name: Maltese (Malta)
-display locale: ID: mt_MT, Name: Maltese (Malta)
-format locale: ID: mt_MT, Name: Maltese (Malta)
-default charset: ISO-8859-3
-
-OS Locale:  mt_MT.utf8
-default locale: ID: mt_MT, Name: Maltese (Malta)
-display locale: ID: mt_MT, Name: Maltese (Malta)
-format locale: ID: mt_MT, Name: Maltese (Malta)
-default charset: UTF-8
-
-OS Locale:  nb_NO
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nb_NO.iso88591
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nb_NO.utf8
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: UTF-8
-
-OS Locale:  ne_NP
-default locale: ID: ne_NP, Name: Nepali (Nepal)
-display locale: ID: ne_NP, Name: Nepali (Nepal)
-format locale: ID: ne_NP, Name: Nepali (Nepal)
-default charset: UTF-8
-
-OS Locale:  ne_NP.utf8
-default locale: ID: ne_NP, Name: Nepali (Nepal)
-display locale: ID: ne_NP, Name: Nepali (Nepal)
-format locale: ID: ne_NP, Name: Nepali (Nepal)
-default charset: UTF-8
-
-OS Locale:  nl_BE
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  nl_BE.iso88591
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  nl_BE.iso885915@euro
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  nl_BE.utf8
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: UTF-8
-
-OS Locale:  nl_BE@euro
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  nl_NL
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl_NL.iso88591
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl_NL.iso885915@euro
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  nl_NL.utf8
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: UTF-8
-
-OS Locale:  nl_NL@euro
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  nn_NO
-default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nn_NO.iso88591
-default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nn_NO.utf8
-default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-default charset: UTF-8
-
-OS Locale:  no_NO
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO.iso88591
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO.utf8
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: UTF-8
-
-OS Locale:  norwegian
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nr_ZA
-default locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-display locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-format locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-default charset: UTF-8
-
-OS Locale:  nr_ZA.utf8
-default locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-display locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-format locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-default charset: UTF-8
-
-OS Locale:  nso_ZA
-default locale: ID: nso_ZA, Name: Pedi (South Africa)
-display locale: ID: nso_ZA, Name: Pedi (South Africa)
-format locale: ID: nso_ZA, Name: Pedi (South Africa)
-default charset: UTF-8
-
-OS Locale:  nso_ZA.utf8
-default locale: ID: nso_ZA, Name: Pedi (South Africa)
-display locale: ID: nso_ZA, Name: Pedi (South Africa)
-format locale: ID: nso_ZA, Name: Pedi (South Africa)
-default charset: UTF-8
-
-OS Locale:  nynorsk
-default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  oc_FR
-default locale: ID: oc_FR, Name: Occitan (France)
-display locale: ID: oc_FR, Name: Occitan (France)
-format locale: ID: oc_FR, Name: Occitan (France)
-default charset: ISO-8859-1
-
-OS Locale:  oc_FR.iso88591
-default locale: ID: oc_FR, Name: Occitan (France)
-display locale: ID: oc_FR, Name: Occitan (France)
-format locale: ID: oc_FR, Name: Occitan (France)
-default charset: ISO-8859-1
-
-OS Locale:  oc_FR.utf8
-default locale: ID: oc_FR, Name: Occitan (France)
-display locale: ID: oc_FR, Name: Occitan (France)
-format locale: ID: oc_FR, Name: Occitan (France)
-default charset: UTF-8
-
-OS Locale:  om_ET
-default locale: ID: om_ET, Name: Oromo (Ethiopia)
-display locale: ID: om_ET, Name: Oromo (Ethiopia)
-format locale: ID: om_ET, Name: Oromo (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  om_ET.utf8
-default locale: ID: om_ET, Name: Oromo (Ethiopia)
-display locale: ID: om_ET, Name: Oromo (Ethiopia)
-format locale: ID: om_ET, Name: Oromo (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  om_KE
-default locale: ID: om_KE, Name: Oromo (Kenya)
-display locale: ID: om_KE, Name: Oromo (Kenya)
-format locale: ID: om_KE, Name: Oromo (Kenya)
-default charset: ISO-8859-1
-
-OS Locale:  om_KE.iso88591
-default locale: ID: om_KE, Name: Oromo (Kenya)
-display locale: ID: om_KE, Name: Oromo (Kenya)
-format locale: ID: om_KE, Name: Oromo (Kenya)
-default charset: ISO-8859-1
-
-OS Locale:  om_KE.utf8
-default locale: ID: om_KE, Name: Oromo (Kenya)
-display locale: ID: om_KE, Name: Oromo (Kenya)
-format locale: ID: om_KE, Name: Oromo (Kenya)
-default charset: UTF-8
-
-OS Locale:  or_IN
-default locale: ID: or_IN, Name: Oriya (India)
-display locale: ID: or_IN, Name: Oriya (India)
-format locale: ID: or_IN, Name: Oriya (India)
-default charset: UTF-8
-
-OS Locale:  or_IN.utf8
-default locale: ID: or_IN, Name: Oriya (India)
-display locale: ID: or_IN, Name: Oriya (India)
-format locale: ID: or_IN, Name: Oriya (India)
-default charset: UTF-8
-
-OS Locale:  pa_IN
-default locale: ID: pa_IN, Name: Panjabi (India)
-display locale: ID: pa_IN, Name: Panjabi (India)
-format locale: ID: pa_IN, Name: Panjabi (India)
-default charset: UTF-8
-
-OS Locale:  pa_IN.utf8
-default locale: ID: pa_IN, Name: Panjabi (India)
-display locale: ID: pa_IN, Name: Panjabi (India)
-format locale: ID: pa_IN, Name: Panjabi (India)
-default charset: UTF-8
-
-OS Locale:  pa_PK
-default locale: ID: pa_PK, Name: Panjabi (Pakistan)
-display locale: ID: pa_PK, Name: Panjabi (Pakistan)
-format locale: ID: pa_PK, Name: Panjabi (Pakistan)
-default charset: UTF-8
-
-OS Locale:  pa_PK.utf8
-default locale: ID: pa_PK, Name: Panjabi (Pakistan)
-display locale: ID: pa_PK, Name: Panjabi (Pakistan)
-format locale: ID: pa_PK, Name: Panjabi (Pakistan)
-default charset: UTF-8
-
-OS Locale:  pl_PL
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl_PL.iso88592
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl_PL.utf8
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: UTF-8
-
-OS Locale:  polish
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  portuguese
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR.iso88591
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR.utf8
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: UTF-8
-
-OS Locale:  pt_PT
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_PT.iso88591
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_PT.iso885915@euro
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  pt_PT.utf8
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: UTF-8
-
-OS Locale:  pt_PT@euro
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  ro_RO
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ro_RO.iso88592
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ro_RO.utf8
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: UTF-8
-
-OS Locale:  romanian
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ru_RU
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru_RU.iso88595
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru_RU.koi8r
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: KOI8-R
-
-OS Locale:  ru_RU.utf8
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: UTF-8
-
-OS Locale:  ru_UA
-default locale: ID: ru_UA, Name: Russian (Ukraine)
-display locale: ID: ru_UA, Name: Russian (Ukraine)
-format locale: ID: ru_UA, Name: Russian (Ukraine)
-default charset: KOI8-U
-
-OS Locale:  ru_UA.koi8u
-default locale: ID: ru_UA, Name: Russian (Ukraine)
-display locale: ID: ru_UA, Name: Russian (Ukraine)
-format locale: ID: ru_UA, Name: Russian (Ukraine)
-default charset: KOI8-U
-
-OS Locale:  ru_UA.utf8
-default locale: ID: ru_UA, Name: Russian (Ukraine)
-display locale: ID: ru_UA, Name: Russian (Ukraine)
-format locale: ID: ru_UA, Name: Russian (Ukraine)
-default charset: UTF-8
-
-OS Locale:  russian
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  rw_RW
-default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-display locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-default charset: UTF-8
-
-OS Locale:  rw_RW.utf8
-default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-display locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-default charset: UTF-8
-
-OS Locale:  se_NO
-default locale: ID: se_NO, Name: Northern Sami (Norway)
-display locale: ID: se_NO, Name: Northern Sami (Norway)
-format locale: ID: se_NO, Name: Northern Sami (Norway)
-default charset: UTF-8
-
-OS Locale:  se_NO.utf8
-default locale: ID: se_NO, Name: Northern Sami (Norway)
-display locale: ID: se_NO, Name: Northern Sami (Norway)
-format locale: ID: se_NO, Name: Northern Sami (Norway)
-default charset: UTF-8
-
-OS Locale:  si_LK
-default locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-display locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-format locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-default charset: UTF-8
-
-OS Locale:  si_LK.utf8
-default locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-display locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-format locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-default charset: UTF-8
-
-OS Locale:  sid_ET
-default locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-display locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-format locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  sid_ET.utf8
-default locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-display locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-format locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  sk_SK
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  sk_SK.iso88592
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  sk_SK.utf8
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: UTF-8
-
-OS Locale:  sl_SI
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  sl_SI.iso88592
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  sl_SI.utf8
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: UTF-8
-
-OS Locale:  slovak
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  slovene
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  slovenian
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  so_DJ
-default locale: ID: so_DJ, Name: Somali (Djibouti)
-display locale: ID: so_DJ, Name: Somali (Djibouti)
-format locale: ID: so_DJ, Name: Somali (Djibouti)
-default charset: ISO-8859-1
-
-OS Locale:  so_DJ.iso88591
-default locale: ID: so_DJ, Name: Somali (Djibouti)
-display locale: ID: so_DJ, Name: Somali (Djibouti)
-format locale: ID: so_DJ, Name: Somali (Djibouti)
-default charset: ISO-8859-1
-
-OS Locale:  so_DJ.utf8
-default locale: ID: so_DJ, Name: Somali (Djibouti)
-display locale: ID: so_DJ, Name: Somali (Djibouti)
-format locale: ID: so_DJ, Name: Somali (Djibouti)
-default charset: UTF-8
-
-OS Locale:  so_ET
-default locale: ID: so_ET, Name: Somali (Ethiopia)
-display locale: ID: so_ET, Name: Somali (Ethiopia)
-format locale: ID: so_ET, Name: Somali (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  so_ET.utf8
-default locale: ID: so_ET, Name: Somali (Ethiopia)
-display locale: ID: so_ET, Name: Somali (Ethiopia)
-format locale: ID: so_ET, Name: Somali (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  so_KE
-default locale: ID: so_KE, Name: Somali (Kenya)
-display locale: ID: so_KE, Name: Somali (Kenya)
-format locale: ID: so_KE, Name: Somali (Kenya)
-default charset: ISO-8859-1
-
-OS Locale:  so_KE.iso88591
-default locale: ID: so_KE, Name: Somali (Kenya)
-display locale: ID: so_KE, Name: Somali (Kenya)
-format locale: ID: so_KE, Name: Somali (Kenya)
-default charset: ISO-8859-1
-
-OS Locale:  so_KE.utf8
-default locale: ID: so_KE, Name: Somali (Kenya)
-display locale: ID: so_KE, Name: Somali (Kenya)
-format locale: ID: so_KE, Name: Somali (Kenya)
-default charset: UTF-8
-
-OS Locale:  so_SO
-default locale: ID: so_SO, Name: Somali (Somalia)
-display locale: ID: so_SO, Name: Somali (Somalia)
-format locale: ID: so_SO, Name: Somali (Somalia)
-default charset: ISO-8859-1
-
-OS Locale:  so_SO.iso88591
-default locale: ID: so_SO, Name: Somali (Somalia)
-display locale: ID: so_SO, Name: Somali (Somalia)
-format locale: ID: so_SO, Name: Somali (Somalia)
-default charset: ISO-8859-1
-
-OS Locale:  so_SO.utf8
-default locale: ID: so_SO, Name: Somali (Somalia)
-display locale: ID: so_SO, Name: Somali (Somalia)
-format locale: ID: so_SO, Name: Somali (Somalia)
-default charset: UTF-8
-
-OS Locale:  spanish
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  sq_AL
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: ISO-8859-1
-
-OS Locale:  sq_AL.iso88591
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: ISO-8859-1
-
-OS Locale:  sq_AL.utf8
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: UTF-8
-
-OS Locale:  sr_CS
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sr_CS.iso88595
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sr_CS.utf8
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: UTF-8
-
-OS Locale:  sr_ME
-default locale: ID: sr_ME, Name: Serbian (Montenegro)
-display locale: ID: sr_ME, Name: Serbian (Montenegro)
-format locale: ID: sr_ME, Name: Serbian (Montenegro)
-default charset: UTF-8
-
-OS Locale:  sr_ME.utf8
-default locale: ID: sr_ME, Name: Serbian (Montenegro)
-display locale: ID: sr_ME, Name: Serbian (Montenegro)
-format locale: ID: sr_ME, Name: Serbian (Montenegro)
-default charset: UTF-8
-
-OS Locale:  sr_RS
-default locale: ID: sr_RS, Name: Serbian (Serbia)
-display locale: ID: sr_RS, Name: Serbian (Serbia)
-format locale: ID: sr_RS, Name: Serbian (Serbia)
-default charset: UTF-8
-
-OS Locale:  sr_RS.utf8
-default locale: ID: sr_RS, Name: Serbian (Serbia)
-display locale: ID: sr_RS, Name: Serbian (Serbia)
-format locale: ID: sr_RS, Name: Serbian (Serbia)
-default charset: UTF-8
-
-OS Locale:  sr_RS.utf8@latin
-default locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-display locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-format locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-default charset: UTF-8
-
-OS Locale:  sr_RS@latin
-default locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-display locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-format locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-default charset: UTF-8
-
-OS Locale:  ss_ZA
-default locale: ID: ss_ZA, Name: Swati (South Africa)
-display locale: ID: ss_ZA, Name: Swati (South Africa)
-format locale: ID: ss_ZA, Name: Swati (South Africa)
-default charset: UTF-8
-
-OS Locale:  ss_ZA.utf8
-default locale: ID: ss_ZA, Name: Swati (South Africa)
-display locale: ID: ss_ZA, Name: Swati (South Africa)
-format locale: ID: ss_ZA, Name: Swati (South Africa)
-default charset: UTF-8
-
-OS Locale:  st_ZA
-default locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-display locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-format locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  st_ZA.iso88591
-default locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-display locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-format locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  st_ZA.utf8
-default locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-display locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-format locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-default charset: UTF-8
-
-OS Locale:  sv_FI
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  sv_FI.iso88591
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  sv_FI.iso885915@euro
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  sv_FI.utf8
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: UTF-8
-
-OS Locale:  sv_FI@euro
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  sv_SE
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv_SE.iso88591
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv_SE.iso885915
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-15
-
-OS Locale:  sv_SE.utf8
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: UTF-8
-
-OS Locale:  swedish
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  ta_IN
-default locale: ID: ta_IN, Name: Tamil (India)
-display locale: ID: ta_IN, Name: Tamil (India)
-format locale: ID: ta_IN, Name: Tamil (India)
-default charset: UTF-8
-
-OS Locale:  ta_IN.utf8
-default locale: ID: ta_IN, Name: Tamil (India)
-display locale: ID: ta_IN, Name: Tamil (India)
-format locale: ID: ta_IN, Name: Tamil (India)
-default charset: UTF-8
-
-OS Locale:  te_IN
-default locale: ID: te_IN, Name: Telugu (India)
-display locale: ID: te_IN, Name: Telugu (India)
-format locale: ID: te_IN, Name: Telugu (India)
-default charset: UTF-8
-
-OS Locale:  te_IN.utf8
-default locale: ID: te_IN, Name: Telugu (India)
-display locale: ID: te_IN, Name: Telugu (India)
-format locale: ID: te_IN, Name: Telugu (India)
-default charset: UTF-8
-
-OS Locale:  tg_TJ
-default locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-display locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-format locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-default charset: UTF-8
-
-OS Locale:  tg_TJ.koi8t
-default locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-display locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-format locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-default charset: UTF-8
-
-OS Locale:  tg_TJ.utf8
-default locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-display locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-format locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-default charset: UTF-8
-
-OS Locale:  th_TH
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.tis620
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.utf8
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: UTF-8
-
-OS Locale:  thai
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  ti_ER
-default locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-display locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-format locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-default charset: UTF-8
-
-OS Locale:  ti_ER.utf8
-default locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-display locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-format locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-default charset: UTF-8
-
-OS Locale:  ti_ET
-default locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-display locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-format locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  ti_ET.utf8
-default locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-display locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-format locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  tig_ER
-default locale: ID: tig_ER, Name: Tigre (Eritrea)
-display locale: ID: tig_ER, Name: Tigre (Eritrea)
-format locale: ID: tig_ER, Name: Tigre (Eritrea)
-default charset: UTF-8
-
-OS Locale:  tig_ER.utf8
-default locale: ID: tig_ER, Name: Tigre (Eritrea)
-display locale: ID: tig_ER, Name: Tigre (Eritrea)
-format locale: ID: tig_ER, Name: Tigre (Eritrea)
-default charset: UTF-8
-
-OS Locale:  tl_PH
-default locale: ID: tl_PH, Name: Tagalog (Philippines)
-display locale: ID: tl_PH, Name: Tagalog (Philippines)
-format locale: ID: tl_PH, Name: Tagalog (Philippines)
-default charset: ISO-8859-1
-
-OS Locale:  tl_PH.iso88591
-default locale: ID: tl_PH, Name: Tagalog (Philippines)
-display locale: ID: tl_PH, Name: Tagalog (Philippines)
-format locale: ID: tl_PH, Name: Tagalog (Philippines)
-default charset: ISO-8859-1
-
-OS Locale:  tl_PH.utf8
-default locale: ID: tl_PH, Name: Tagalog (Philippines)
-display locale: ID: tl_PH, Name: Tagalog (Philippines)
-format locale: ID: tl_PH, Name: Tagalog (Philippines)
-default charset: UTF-8
-
-OS Locale:  tn_ZA
-default locale: ID: tn_ZA, Name: Tswana (South Africa)
-display locale: ID: tn_ZA, Name: Tswana (South Africa)
-format locale: ID: tn_ZA, Name: Tswana (South Africa)
-default charset: UTF-8
-
-OS Locale:  tn_ZA.utf8
-default locale: ID: tn_ZA, Name: Tswana (South Africa)
-display locale: ID: tn_ZA, Name: Tswana (South Africa)
-format locale: ID: tn_ZA, Name: Tswana (South Africa)
-default charset: UTF-8
-
-OS Locale:  tr_CY
-default locale: ID: tr_CY, Name: Turkish (Cyprus)
-display locale: ID: tr_CY, Name: Turkish (Cyprus)
-format locale: ID: tr_CY, Name: Turkish (Cyprus)
-default charset: ISO-8859-9
-
-OS Locale:  tr_CY.iso88599
-default locale: ID: tr_CY, Name: Turkish (Cyprus)
-display locale: ID: tr_CY, Name: Turkish (Cyprus)
-format locale: ID: tr_CY, Name: Turkish (Cyprus)
-default charset: ISO-8859-9
-
-OS Locale:  tr_CY.utf8
-default locale: ID: tr_CY, Name: Turkish (Cyprus)
-display locale: ID: tr_CY, Name: Turkish (Cyprus)
-format locale: ID: tr_CY, Name: Turkish (Cyprus)
-default charset: UTF-8
-
-OS Locale:  tr_TR
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR.iso88599
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR.utf8
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: UTF-8
-
-OS Locale:  ts_ZA
-default locale: ID: ts_ZA, Name: Tsonga (South Africa)
-display locale: ID: ts_ZA, Name: Tsonga (South Africa)
-format locale: ID: ts_ZA, Name: Tsonga (South Africa)
-default charset: UTF-8
-
-OS Locale:  ts_ZA.utf8
-default locale: ID: ts_ZA, Name: Tsonga (South Africa)
-display locale: ID: ts_ZA, Name: Tsonga (South Africa)
-format locale: ID: ts_ZA, Name: Tsonga (South Africa)
-default charset: UTF-8
-
-OS Locale:  tt_RU.utf8
-default locale: ID: tt_RU, Name: Tatar (Russia)
-display locale: ID: tt_RU, Name: Tatar (Russia)
-format locale: ID: tt_RU, Name: Tatar (Russia)
-default charset: UTF-8
-
-OS Locale:  turkish
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  uk_UA
-default locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-display locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-format locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-default charset: KOI8-U
-
-OS Locale:  uk_UA.koi8u
-default locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-display locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-format locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-default charset: KOI8-U
-
-OS Locale:  uk_UA.utf8
-default locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-display locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-format locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-default charset: UTF-8
-
-OS Locale:  ur_PK
-default locale: ID: ur_PK, Name: Urdu (Pakistan)
-display locale: ID: ur_PK, Name: Urdu (Pakistan)
-format locale: ID: ur_PK, Name: Urdu (Pakistan)
-default charset: UTF-8
-
-OS Locale:  ur_PK.utf8
-default locale: ID: ur_PK, Name: Urdu (Pakistan)
-display locale: ID: ur_PK, Name: Urdu (Pakistan)
-format locale: ID: ur_PK, Name: Urdu (Pakistan)
-default charset: UTF-8
-
-OS Locale:  uz_UZ
-default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-default charset: ISO-8859-1
-
-OS Locale:  uz_UZ.iso88591
-default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-default charset: ISO-8859-1
-
-OS Locale:  uz_UZ.utf8@cyrillic
-default locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-display locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-format locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-default charset: UTF-8
-
-OS Locale:  uz_UZ@cyrillic
-default locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-display locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-format locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-default charset: UTF-8
-
-OS Locale:  ve_ZA
-default locale: ID: ve_ZA, Name: Venda (South Africa)
-display locale: ID: ve_ZA, Name: Venda (South Africa)
-format locale: ID: ve_ZA, Name: Venda (South Africa)
-default charset: UTF-8
-
-OS Locale:  ve_ZA.utf8
-default locale: ID: ve_ZA, Name: Venda (South Africa)
-display locale: ID: ve_ZA, Name: Venda (South Africa)
-format locale: ID: ve_ZA, Name: Venda (South Africa)
-default charset: UTF-8
-
-OS Locale:  vi_VN
-default locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-display locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-format locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-default charset: UTF-8
-
-OS Locale:  vi_VN.tcvn
-default locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-display locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-format locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-default charset: UTF-8
-
-OS Locale:  vi_VN.utf8
-default locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-display locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-format locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-default charset: UTF-8
-
-OS Locale:  wa_BE
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  wa_BE.iso88591
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  wa_BE.iso885915@euro
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  wa_BE.utf8
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: UTF-8
-
-OS Locale:  wa_BE@euro
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  xh_ZA
-default locale: ID: xh_ZA, Name: Xhosa (South Africa)
-display locale: ID: xh_ZA, Name: Xhosa (South Africa)
-format locale: ID: xh_ZA, Name: Xhosa (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  xh_ZA.iso88591
-default locale: ID: xh_ZA, Name: Xhosa (South Africa)
-display locale: ID: xh_ZA, Name: Xhosa (South Africa)
-format locale: ID: xh_ZA, Name: Xhosa (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  xh_ZA.utf8
-default locale: ID: xh_ZA, Name: Xhosa (South Africa)
-display locale: ID: xh_ZA, Name: Xhosa (South Africa)
-format locale: ID: xh_ZA, Name: Xhosa (South Africa)
-default charset: UTF-8
-
-OS Locale:  yi_US
-default locale: ID: ji_US, Name: Yiddish (United States)
-display locale: ID: ji_US, Name: Yiddish (United States)
-format locale: ID: ji_US, Name: Yiddish (United States)
-default charset: windows-1255
-
-OS Locale:  yi_US.cp1255
-default locale: ID: ji_US, Name: Yiddish (United States)
-display locale: ID: ji_US, Name: Yiddish (United States)
-format locale: ID: ji_US, Name: Yiddish (United States)
-default charset: windows-1255
-
-OS Locale:  yi_US.utf8
-default locale: ID: ji_US, Name: Yiddish (United States)
-display locale: ID: ji_US, Name: Yiddish (United States)
-format locale: ID: ji_US, Name: Yiddish (United States)
-default charset: UTF-8
-
-OS Locale:  zh_CN
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.gb18030
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.gb2312
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.gbk
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.utf8
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_HK
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: Big5-HKSCS
-
-OS Locale:  zh_HK.big5hkscs
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: Big5-HKSCS
-
-OS Locale:  zh_HK.utf8
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  zh_SG
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: zh_SG, Name: Chinese (Singapore)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: GB2312
-
-OS Locale:  zh_SG.gb2312
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: zh_SG, Name: Chinese (Singapore)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: GB2312
-
-OS Locale:  zh_SG.gbk
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: zh_SG, Name: Chinese (Singapore)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: GBK
-
-OS Locale:  zh_SG.utf8
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: zh_SG, Name: Chinese (Singapore)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: UTF-8
-
-OS Locale:  zh_TW
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: Big5
-
-OS Locale:  zh_TW.big5
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: Big5
-
-OS Locale:  zh_TW.euctw
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.utf8
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zu_ZA
-default locale: ID: zu_ZA, Name: Zulu (South Africa)
-display locale: ID: zu_ZA, Name: Zulu (South Africa)
-format locale: ID: zu_ZA, Name: Zulu (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  zu_ZA.iso88591
-default locale: ID: zu_ZA, Name: Zulu (South Africa)
-display locale: ID: zu_ZA, Name: Zulu (South Africa)
-format locale: ID: zu_ZA, Name: Zulu (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  zu_ZA.utf8
-default locale: ID: zu_ZA, Name: Zulu (South Africa)
-display locale: ID: zu_ZA, Name: Zulu (South Africa)
-format locale: ID: zu_ZA, Name: Zulu (South Africa)
-default charset: UTF-8
-
-Testing some typical combinations
-
-
-OS Locale (LC_CTYPE: ja_JP.UTF-8, LC_MESSAGES: zh_CN.UTF-8)
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: UTF-8
-
-OS Locale (LC_CTYPE: zh_CN.UTF-8, LC_MESSAGES: en_US.UTF-8)
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale (LC_CTYPE: C, LC_MESSAGES: zh_CN.UTF-8)
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: en_US, Name: English (United States)
-default charset: US-ASCII
--- a/test/java/util/Locale/data/deflocale.rhel5.fmtasdefault	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3924 +0,0 @@
-Red Hat Enterprise Linux Server release 5.3 (Tikanga)
-Linux localhost.localdomain 2.6.18-128.el5 #1 SMP Wed Dec 17 11:42:39 EST 2008 i686 i686 i386 GNU/Linux
-Testing all available locales
-
-OS Locale:  C
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: US-ASCII
-
-OS Locale:  POSIX
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: US-ASCII
-
-OS Locale:  aa_DJ
-default locale: ID: aa_DJ, Name: Afar (Djibouti)
-display locale: ID: aa_DJ, Name: Afar (Djibouti)
-format locale: ID: aa_DJ, Name: Afar (Djibouti)
-default charset: ISO-8859-1
-
-OS Locale:  aa_DJ.iso88591
-default locale: ID: aa_DJ, Name: Afar (Djibouti)
-display locale: ID: aa_DJ, Name: Afar (Djibouti)
-format locale: ID: aa_DJ, Name: Afar (Djibouti)
-default charset: ISO-8859-1
-
-OS Locale:  aa_DJ.utf8
-default locale: ID: aa_DJ, Name: Afar (Djibouti)
-display locale: ID: aa_DJ, Name: Afar (Djibouti)
-format locale: ID: aa_DJ, Name: Afar (Djibouti)
-default charset: UTF-8
-
-OS Locale:  aa_ER
-default locale: ID: aa_ER, Name: Afar (Eritrea)
-display locale: ID: aa_ER, Name: Afar (Eritrea)
-format locale: ID: aa_ER, Name: Afar (Eritrea)
-default charset: UTF-8
-
-OS Locale:  aa_ER.utf8
-default locale: ID: aa_ER, Name: Afar (Eritrea)
-display locale: ID: aa_ER, Name: Afar (Eritrea)
-format locale: ID: aa_ER, Name: Afar (Eritrea)
-default charset: UTF-8
-
-OS Locale:  aa_ER.utf8@saaho
-default locale: ID: aa_ER, Name: Afar (Eritrea)
-display locale: ID: aa_ER, Name: Afar (Eritrea)
-format locale: ID: aa_ER, Name: Afar (Eritrea)
-default charset: UTF-8
-
-OS Locale:  aa_ER@saaho
-default locale: ID: aa_ER, Name: Afar (Eritrea)
-display locale: ID: aa_ER, Name: Afar (Eritrea)
-format locale: ID: aa_ER, Name: Afar (Eritrea)
-default charset: UTF-8
-
-OS Locale:  aa_ET
-default locale: ID: aa_ET, Name: Afar (Ethiopia)
-display locale: ID: aa_ET, Name: Afar (Ethiopia)
-format locale: ID: aa_ET, Name: Afar (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  aa_ET.utf8
-default locale: ID: aa_ET, Name: Afar (Ethiopia)
-display locale: ID: aa_ET, Name: Afar (Ethiopia)
-format locale: ID: aa_ET, Name: Afar (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  af_ZA
-default locale: ID: af_ZA, Name: Afrikaans (South Africa)
-display locale: ID: af_ZA, Name: Afrikaans (South Africa)
-format locale: ID: af_ZA, Name: Afrikaans (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  af_ZA.iso88591
-default locale: ID: af_ZA, Name: Afrikaans (South Africa)
-display locale: ID: af_ZA, Name: Afrikaans (South Africa)
-format locale: ID: af_ZA, Name: Afrikaans (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  af_ZA.utf8
-default locale: ID: af_ZA, Name: Afrikaans (South Africa)
-display locale: ID: af_ZA, Name: Afrikaans (South Africa)
-format locale: ID: af_ZA, Name: Afrikaans (South Africa)
-default charset: UTF-8
-
-OS Locale:  am_ET
-default locale: ID: am_ET, Name: Amharic (Ethiopia)
-display locale: ID: am_ET, Name: Amharic (Ethiopia)
-format locale: ID: am_ET, Name: Amharic (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  am_ET.utf8
-default locale: ID: am_ET, Name: Amharic (Ethiopia)
-display locale: ID: am_ET, Name: Amharic (Ethiopia)
-format locale: ID: am_ET, Name: Amharic (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  an_ES
-default locale: ID: an_ES, Name: Aragonese (Spain)
-display locale: ID: an_ES, Name: Aragonese (Spain)
-format locale: ID: an_ES, Name: Aragonese (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  an_ES.iso885915
-default locale: ID: an_ES, Name: Aragonese (Spain)
-display locale: ID: an_ES, Name: Aragonese (Spain)
-format locale: ID: an_ES, Name: Aragonese (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  an_ES.utf8
-default locale: ID: an_ES, Name: Aragonese (Spain)
-display locale: ID: an_ES, Name: Aragonese (Spain)
-format locale: ID: an_ES, Name: Aragonese (Spain)
-default charset: UTF-8
-
-OS Locale:  ar_AE
-default locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-display locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-format locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-default charset: ISO-8859-6
-
-OS Locale:  ar_AE.iso88596
-default locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-display locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-format locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-default charset: ISO-8859-6
-
-OS Locale:  ar_AE.utf8
-default locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-display locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-format locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-default charset: UTF-8
-
-OS Locale:  ar_BH
-default locale: ID: ar_BH, Name: Arabic (Bahrain)
-display locale: ID: ar_BH, Name: Arabic (Bahrain)
-format locale: ID: ar_BH, Name: Arabic (Bahrain)
-default charset: ISO-8859-6
-
-OS Locale:  ar_BH.iso88596
-default locale: ID: ar_BH, Name: Arabic (Bahrain)
-display locale: ID: ar_BH, Name: Arabic (Bahrain)
-format locale: ID: ar_BH, Name: Arabic (Bahrain)
-default charset: ISO-8859-6
-
-OS Locale:  ar_BH.utf8
-default locale: ID: ar_BH, Name: Arabic (Bahrain)
-display locale: ID: ar_BH, Name: Arabic (Bahrain)
-format locale: ID: ar_BH, Name: Arabic (Bahrain)
-default charset: UTF-8
-
-OS Locale:  ar_DZ
-default locale: ID: ar_DZ, Name: Arabic (Algeria)
-display locale: ID: ar_DZ, Name: Arabic (Algeria)
-format locale: ID: ar_DZ, Name: Arabic (Algeria)
-default charset: ISO-8859-6
-
-OS Locale:  ar_DZ.iso88596
-default locale: ID: ar_DZ, Name: Arabic (Algeria)
-display locale: ID: ar_DZ, Name: Arabic (Algeria)
-format locale: ID: ar_DZ, Name: Arabic (Algeria)
-default charset: ISO-8859-6
-
-OS Locale:  ar_DZ.utf8
-default locale: ID: ar_DZ, Name: Arabic (Algeria)
-display locale: ID: ar_DZ, Name: Arabic (Algeria)
-format locale: ID: ar_DZ, Name: Arabic (Algeria)
-default charset: UTF-8
-
-OS Locale:  ar_EG
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: ISO-8859-6
-
-OS Locale:  ar_EG.iso88596
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: ISO-8859-6
-
-OS Locale:  ar_EG.utf8
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: UTF-8
-
-OS Locale:  ar_IN
-default locale: ID: ar_IN, Name: Arabic (India)
-display locale: ID: ar_IN, Name: Arabic (India)
-format locale: ID: ar_IN, Name: Arabic (India)
-default charset: UTF-8
-
-OS Locale:  ar_IN.utf8
-default locale: ID: ar_IN, Name: Arabic (India)
-display locale: ID: ar_IN, Name: Arabic (India)
-format locale: ID: ar_IN, Name: Arabic (India)
-default charset: UTF-8
-
-OS Locale:  ar_IQ
-default locale: ID: ar_IQ, Name: Arabic (Iraq)
-display locale: ID: ar_IQ, Name: Arabic (Iraq)
-format locale: ID: ar_IQ, Name: Arabic (Iraq)
-default charset: ISO-8859-6
-
-OS Locale:  ar_IQ.iso88596
-default locale: ID: ar_IQ, Name: Arabic (Iraq)
-display locale: ID: ar_IQ, Name: Arabic (Iraq)
-format locale: ID: ar_IQ, Name: Arabic (Iraq)
-default charset: ISO-8859-6
-
-OS Locale:  ar_IQ.utf8
-default locale: ID: ar_IQ, Name: Arabic (Iraq)
-display locale: ID: ar_IQ, Name: Arabic (Iraq)
-format locale: ID: ar_IQ, Name: Arabic (Iraq)
-default charset: UTF-8
-
-OS Locale:  ar_JO
-default locale: ID: ar_JO, Name: Arabic (Jordan)
-display locale: ID: ar_JO, Name: Arabic (Jordan)
-format locale: ID: ar_JO, Name: Arabic (Jordan)
-default charset: ISO-8859-6
-
-OS Locale:  ar_JO.iso88596
-default locale: ID: ar_JO, Name: Arabic (Jordan)
-display locale: ID: ar_JO, Name: Arabic (Jordan)
-format locale: ID: ar_JO, Name: Arabic (Jordan)
-default charset: ISO-8859-6
-
-OS Locale:  ar_JO.utf8
-default locale: ID: ar_JO, Name: Arabic (Jordan)
-display locale: ID: ar_JO, Name: Arabic (Jordan)
-format locale: ID: ar_JO, Name: Arabic (Jordan)
-default charset: UTF-8
-
-OS Locale:  ar_KW
-default locale: ID: ar_KW, Name: Arabic (Kuwait)
-display locale: ID: ar_KW, Name: Arabic (Kuwait)
-format locale: ID: ar_KW, Name: Arabic (Kuwait)
-default charset: ISO-8859-6
-
-OS Locale:  ar_KW.iso88596
-default locale: ID: ar_KW, Name: Arabic (Kuwait)
-display locale: ID: ar_KW, Name: Arabic (Kuwait)
-format locale: ID: ar_KW, Name: Arabic (Kuwait)
-default charset: ISO-8859-6
-
-OS Locale:  ar_KW.utf8
-default locale: ID: ar_KW, Name: Arabic (Kuwait)
-display locale: ID: ar_KW, Name: Arabic (Kuwait)
-format locale: ID: ar_KW, Name: Arabic (Kuwait)
-default charset: UTF-8
-
-OS Locale:  ar_LB
-default locale: ID: ar_LB, Name: Arabic (Lebanon)
-display locale: ID: ar_LB, Name: Arabic (Lebanon)
-format locale: ID: ar_LB, Name: Arabic (Lebanon)
-default charset: ISO-8859-6
-
-OS Locale:  ar_LB.iso88596
-default locale: ID: ar_LB, Name: Arabic (Lebanon)
-display locale: ID: ar_LB, Name: Arabic (Lebanon)
-format locale: ID: ar_LB, Name: Arabic (Lebanon)
-default charset: ISO-8859-6
-
-OS Locale:  ar_LB.utf8
-default locale: ID: ar_LB, Name: Arabic (Lebanon)
-display locale: ID: ar_LB, Name: Arabic (Lebanon)
-format locale: ID: ar_LB, Name: Arabic (Lebanon)
-default charset: UTF-8
-
-OS Locale:  ar_LY
-default locale: ID: ar_LY, Name: Arabic (Libya)
-display locale: ID: ar_LY, Name: Arabic (Libya)
-format locale: ID: ar_LY, Name: Arabic (Libya)
-default charset: ISO-8859-6
-
-OS Locale:  ar_LY.iso88596
-default locale: ID: ar_LY, Name: Arabic (Libya)
-display locale: ID: ar_LY, Name: Arabic (Libya)
-format locale: ID: ar_LY, Name: Arabic (Libya)
-default charset: ISO-8859-6
-
-OS Locale:  ar_LY.utf8
-default locale: ID: ar_LY, Name: Arabic (Libya)
-display locale: ID: ar_LY, Name: Arabic (Libya)
-format locale: ID: ar_LY, Name: Arabic (Libya)
-default charset: UTF-8
-
-OS Locale:  ar_MA
-default locale: ID: ar_MA, Name: Arabic (Morocco)
-display locale: ID: ar_MA, Name: Arabic (Morocco)
-format locale: ID: ar_MA, Name: Arabic (Morocco)
-default charset: ISO-8859-6
-
-OS Locale:  ar_MA.iso88596
-default locale: ID: ar_MA, Name: Arabic (Morocco)
-display locale: ID: ar_MA, Name: Arabic (Morocco)
-format locale: ID: ar_MA, Name: Arabic (Morocco)
-default charset: ISO-8859-6
-
-OS Locale:  ar_MA.utf8
-default locale: ID: ar_MA, Name: Arabic (Morocco)
-display locale: ID: ar_MA, Name: Arabic (Morocco)
-format locale: ID: ar_MA, Name: Arabic (Morocco)
-default charset: UTF-8
-
-OS Locale:  ar_OM
-default locale: ID: ar_OM, Name: Arabic (Oman)
-display locale: ID: ar_OM, Name: Arabic (Oman)
-format locale: ID: ar_OM, Name: Arabic (Oman)
-default charset: ISO-8859-6
-
-OS Locale:  ar_OM.iso88596
-default locale: ID: ar_OM, Name: Arabic (Oman)
-display locale: ID: ar_OM, Name: Arabic (Oman)
-format locale: ID: ar_OM, Name: Arabic (Oman)
-default charset: ISO-8859-6
-
-OS Locale:  ar_OM.utf8
-default locale: ID: ar_OM, Name: Arabic (Oman)
-display locale: ID: ar_OM, Name: Arabic (Oman)
-format locale: ID: ar_OM, Name: Arabic (Oman)
-default charset: UTF-8
-
-OS Locale:  ar_QA
-default locale: ID: ar_QA, Name: Arabic (Qatar)
-display locale: ID: ar_QA, Name: Arabic (Qatar)
-format locale: ID: ar_QA, Name: Arabic (Qatar)
-default charset: ISO-8859-6
-
-OS Locale:  ar_QA.iso88596
-default locale: ID: ar_QA, Name: Arabic (Qatar)
-display locale: ID: ar_QA, Name: Arabic (Qatar)
-format locale: ID: ar_QA, Name: Arabic (Qatar)
-default charset: ISO-8859-6
-
-OS Locale:  ar_QA.utf8
-default locale: ID: ar_QA, Name: Arabic (Qatar)
-display locale: ID: ar_QA, Name: Arabic (Qatar)
-format locale: ID: ar_QA, Name: Arabic (Qatar)
-default charset: UTF-8
-
-OS Locale:  ar_SA
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SA.iso88596
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SA.utf8
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: UTF-8
-
-OS Locale:  ar_SD
-default locale: ID: ar_SD, Name: Arabic (Sudan)
-display locale: ID: ar_SD, Name: Arabic (Sudan)
-format locale: ID: ar_SD, Name: Arabic (Sudan)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SD.iso88596
-default locale: ID: ar_SD, Name: Arabic (Sudan)
-display locale: ID: ar_SD, Name: Arabic (Sudan)
-format locale: ID: ar_SD, Name: Arabic (Sudan)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SD.utf8
-default locale: ID: ar_SD, Name: Arabic (Sudan)
-display locale: ID: ar_SD, Name: Arabic (Sudan)
-format locale: ID: ar_SD, Name: Arabic (Sudan)
-default charset: UTF-8
-
-OS Locale:  ar_SY
-default locale: ID: ar_SY, Name: Arabic (Syria)
-display locale: ID: ar_SY, Name: Arabic (Syria)
-format locale: ID: ar_SY, Name: Arabic (Syria)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SY.iso88596
-default locale: ID: ar_SY, Name: Arabic (Syria)
-display locale: ID: ar_SY, Name: Arabic (Syria)
-format locale: ID: ar_SY, Name: Arabic (Syria)
-default charset: ISO-8859-6
-
-OS Locale:  ar_SY.utf8
-default locale: ID: ar_SY, Name: Arabic (Syria)
-display locale: ID: ar_SY, Name: Arabic (Syria)
-format locale: ID: ar_SY, Name: Arabic (Syria)
-default charset: UTF-8
-
-OS Locale:  ar_TN
-default locale: ID: ar_TN, Name: Arabic (Tunisia)
-display locale: ID: ar_TN, Name: Arabic (Tunisia)
-format locale: ID: ar_TN, Name: Arabic (Tunisia)
-default charset: ISO-8859-6
-
-OS Locale:  ar_TN.iso88596
-default locale: ID: ar_TN, Name: Arabic (Tunisia)
-display locale: ID: ar_TN, Name: Arabic (Tunisia)
-format locale: ID: ar_TN, Name: Arabic (Tunisia)
-default charset: ISO-8859-6
-
-OS Locale:  ar_TN.utf8
-default locale: ID: ar_TN, Name: Arabic (Tunisia)
-display locale: ID: ar_TN, Name: Arabic (Tunisia)
-format locale: ID: ar_TN, Name: Arabic (Tunisia)
-default charset: UTF-8
-
-OS Locale:  ar_YE
-default locale: ID: ar_YE, Name: Arabic (Yemen)
-display locale: ID: ar_YE, Name: Arabic (Yemen)
-format locale: ID: ar_YE, Name: Arabic (Yemen)
-default charset: ISO-8859-6
-
-OS Locale:  ar_YE.iso88596
-default locale: ID: ar_YE, Name: Arabic (Yemen)
-display locale: ID: ar_YE, Name: Arabic (Yemen)
-format locale: ID: ar_YE, Name: Arabic (Yemen)
-default charset: ISO-8859-6
-
-OS Locale:  ar_YE.utf8
-default locale: ID: ar_YE, Name: Arabic (Yemen)
-display locale: ID: ar_YE, Name: Arabic (Yemen)
-format locale: ID: ar_YE, Name: Arabic (Yemen)
-default charset: UTF-8
-
-OS Locale:  as_IN.utf8
-default locale: ID: as_IN, Name: Assamese (India)
-display locale: ID: as_IN, Name: Assamese (India)
-format locale: ID: as_IN, Name: Assamese (India)
-default charset: UTF-8
-
-OS Locale:  az_AZ.utf8
-default locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan)
-display locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan)
-format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan)
-default charset: UTF-8
-
-OS Locale:  be_BY
-default locale: ID: be_BY, Name: Belarusian (Belarus)
-display locale: ID: be_BY, Name: Belarusian (Belarus)
-format locale: ID: be_BY, Name: Belarusian (Belarus)
-default charset: windows-1251
-
-OS Locale:  be_BY.cp1251
-default locale: ID: be_BY, Name: Belarusian (Belarus)
-display locale: ID: be_BY, Name: Belarusian (Belarus)
-format locale: ID: be_BY, Name: Belarusian (Belarus)
-default charset: windows-1251
-
-OS Locale:  be_BY.utf8
-default locale: ID: be_BY, Name: Belarusian (Belarus)
-display locale: ID: be_BY, Name: Belarusian (Belarus)
-format locale: ID: be_BY, Name: Belarusian (Belarus)
-default charset: UTF-8
-
-OS Locale:  be_BY.utf8@latin
-default locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-display locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-format locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-default charset: UTF-8
-
-OS Locale:  be_BY@latin
-default locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-display locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-format locale: ID: be_BY_#Latn, Name: Belarusian (Latin,Belarus)
-default charset: UTF-8
-
-OS Locale:  bg_BG
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: windows-1251
-
-OS Locale:  bg_BG.cp1251
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: windows-1251
-
-OS Locale:  bg_BG.utf8
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: UTF-8
-
-OS Locale:  bn_BD
-default locale: ID: bn_BD, Name: Bengali (Bangladesh)
-display locale: ID: bn_BD, Name: Bengali (Bangladesh)
-format locale: ID: bn_BD, Name: Bengali (Bangladesh)
-default charset: UTF-8
-
-OS Locale:  bn_BD.utf8
-default locale: ID: bn_BD, Name: Bengali (Bangladesh)
-display locale: ID: bn_BD, Name: Bengali (Bangladesh)
-format locale: ID: bn_BD, Name: Bengali (Bangladesh)
-default charset: UTF-8
-
-OS Locale:  bn_IN
-default locale: ID: bn_IN, Name: Bengali (India)
-display locale: ID: bn_IN, Name: Bengali (India)
-format locale: ID: bn_IN, Name: Bengali (India)
-default charset: UTF-8
-
-OS Locale:  bn_IN.utf8
-default locale: ID: bn_IN, Name: Bengali (India)
-display locale: ID: bn_IN, Name: Bengali (India)
-format locale: ID: bn_IN, Name: Bengali (India)
-default charset: UTF-8
-
-OS Locale:  bokmål
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  bokmal
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  br_FR
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: ISO-8859-1
-
-OS Locale:  br_FR.iso88591
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: ISO-8859-1
-
-OS Locale:  br_FR.iso885915@euro
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: ISO-8859-15
-
-OS Locale:  br_FR.utf8
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: UTF-8
-
-OS Locale:  br_FR@euro
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: br_FR, Name: Breton (France)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: ISO-8859-15
-
-OS Locale:  bs_BA
-default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-default charset: ISO-8859-2
-
-OS Locale:  bs_BA.iso88592
-default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-default charset: ISO-8859-2
-
-OS Locale:  bs_BA.utf8
-default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina)
-default charset: UTF-8
-
-OS Locale:  byn_ER
-default locale: ID: byn_ER, Name: Blin (Eritrea)
-display locale: ID: byn_ER, Name: Blin (Eritrea)
-format locale: ID: byn_ER, Name: Blin (Eritrea)
-default charset: UTF-8
-
-OS Locale:  byn_ER.utf8
-default locale: ID: byn_ER, Name: Blin (Eritrea)
-display locale: ID: byn_ER, Name: Blin (Eritrea)
-format locale: ID: byn_ER, Name: Blin (Eritrea)
-default charset: UTF-8
-
-OS Locale:  ca_AD
-default locale: ID: ca_AD, Name: Catalan (Andorra)
-display locale: ID: ca_AD, Name: Catalan (Andorra)
-format locale: ID: ca_AD, Name: Catalan (Andorra)
-default charset: ISO-8859-15
-
-OS Locale:  ca_AD.iso885915
-default locale: ID: ca_AD, Name: Catalan (Andorra)
-display locale: ID: ca_AD, Name: Catalan (Andorra)
-format locale: ID: ca_AD, Name: Catalan (Andorra)
-default charset: ISO-8859-15
-
-OS Locale:  ca_AD.utf8
-default locale: ID: ca_AD, Name: Catalan (Andorra)
-display locale: ID: ca_AD, Name: Catalan (Andorra)
-format locale: ID: ca_AD, Name: Catalan (Andorra)
-default charset: UTF-8
-
-OS Locale:  ca_ES
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES.iso88591
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES.iso885915@euro
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  ca_ES.utf8
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: UTF-8
-
-OS Locale:  ca_ES@euro
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  ca_FR
-default locale: ID: ca_FR, Name: Catalan (France)
-display locale: ID: ca_FR, Name: Catalan (France)
-format locale: ID: ca_FR, Name: Catalan (France)
-default charset: ISO-8859-15
-
-OS Locale:  ca_FR.iso885915
-default locale: ID: ca_FR, Name: Catalan (France)
-display locale: ID: ca_FR, Name: Catalan (France)
-format locale: ID: ca_FR, Name: Catalan (France)
-default charset: ISO-8859-15
-
-OS Locale:  ca_FR.utf8
-default locale: ID: ca_FR, Name: Catalan (France)
-display locale: ID: ca_FR, Name: Catalan (France)
-format locale: ID: ca_FR, Name: Catalan (France)
-default charset: UTF-8
-
-OS Locale:  ca_IT
-default locale: ID: ca_IT, Name: Catalan (Italy)
-display locale: ID: ca_IT, Name: Catalan (Italy)
-format locale: ID: ca_IT, Name: Catalan (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  ca_IT.iso885915
-default locale: ID: ca_IT, Name: Catalan (Italy)
-display locale: ID: ca_IT, Name: Catalan (Italy)
-format locale: ID: ca_IT, Name: Catalan (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  ca_IT.utf8
-default locale: ID: ca_IT, Name: Catalan (Italy)
-display locale: ID: ca_IT, Name: Catalan (Italy)
-format locale: ID: ca_IT, Name: Catalan (Italy)
-default charset: UTF-8
-
-OS Locale:  catalan
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  croatian
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ.iso88592
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ.utf8
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: UTF-8
-
-OS Locale:  csb_PL
-default locale: ID: csb_PL, Name: Kashubian (Poland)
-display locale: ID: csb_PL, Name: Kashubian (Poland)
-format locale: ID: csb_PL, Name: Kashubian (Poland)
-default charset: UTF-8
-
-OS Locale:  csb_PL.utf8
-default locale: ID: csb_PL, Name: Kashubian (Poland)
-display locale: ID: csb_PL, Name: Kashubian (Poland)
-format locale: ID: csb_PL, Name: Kashubian (Poland)
-default charset: UTF-8
-
-OS Locale:  cy_GB
-default locale: ID: cy_GB, Name: Welsh (United Kingdom)
-display locale: ID: cy_GB, Name: Welsh (United Kingdom)
-format locale: ID: cy_GB, Name: Welsh (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  cy_GB.iso885914
-default locale: ID: cy_GB, Name: Welsh (United Kingdom)
-display locale: ID: cy_GB, Name: Welsh (United Kingdom)
-format locale: ID: cy_GB, Name: Welsh (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  cy_GB.utf8
-default locale: ID: cy_GB, Name: Welsh (United Kingdom)
-display locale: ID: cy_GB, Name: Welsh (United Kingdom)
-format locale: ID: cy_GB, Name: Welsh (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  czech
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  da_DK
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da_DK.iso88591
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da_DK.iso885915
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-15
-
-OS Locale:  da_DK.utf8
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: UTF-8
-
-OS Locale:  danish
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  dansk
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT.iso88591
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT.iso885915@euro
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-15
-
-OS Locale:  de_AT.utf8
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: UTF-8
-
-OS Locale:  de_AT@euro
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-15
-
-OS Locale:  de_BE
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  de_BE.iso88591
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  de_BE.iso885915@euro
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  de_BE.utf8
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: UTF-8
-
-OS Locale:  de_BE@euro
-default locale: ID: de_BE, Name: German (Belgium)
-display locale: ID: de_BE, Name: German (Belgium)
-format locale: ID: de_BE, Name: German (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  de_CH
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  de_CH.iso88591
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  de_CH.utf8
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: UTF-8
-
-OS Locale:  de_DE
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE.iso88591
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE.iso885915@euro
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de_DE.utf8
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: UTF-8
-
-OS Locale:  de_DE@euro
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de_LU
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: ISO-8859-1
-
-OS Locale:  de_LU.iso88591
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: ISO-8859-1
-
-OS Locale:  de_LU.iso885915@euro
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: ISO-8859-15
-
-OS Locale:  de_LU.utf8
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: UTF-8
-
-OS Locale:  de_LU@euro
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: de_LU, Name: German (Luxembourg)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: ISO-8859-15
-
-OS Locale:  deutsch
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  dutch
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  dz_BT
-default locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-display locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-format locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-default charset: UTF-8
-
-OS Locale:  dz_BT.utf8
-default locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-display locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-format locale: ID: dz_BT, Name: Dzongkha (Bhutan)
-default charset: UTF-8
-
-OS Locale:  eesti
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-1
-
-OS Locale:  el_CY
-default locale: ID: el_CY, Name: Greek (Cyprus)
-display locale: ID: el_CY, Name: Greek (Cyprus)
-format locale: ID: el_CY, Name: Greek (Cyprus)
-default charset: ISO-8859-7
-
-OS Locale:  el_CY.iso88597
-default locale: ID: el_CY, Name: Greek (Cyprus)
-display locale: ID: el_CY, Name: Greek (Cyprus)
-format locale: ID: el_CY, Name: Greek (Cyprus)
-default charset: ISO-8859-7
-
-OS Locale:  el_CY.utf8
-default locale: ID: el_CY, Name: Greek (Cyprus)
-display locale: ID: el_CY, Name: Greek (Cyprus)
-format locale: ID: el_CY, Name: Greek (Cyprus)
-default charset: UTF-8
-
-OS Locale:  el_GR
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR.iso88597
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR.utf8
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: UTF-8
-
-OS Locale:  en_AU
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: ISO-8859-1
-
-OS Locale:  en_AU.iso88591
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: ISO-8859-1
-
-OS Locale:  en_AU.utf8
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: UTF-8
-
-OS Locale:  en_BW
-default locale: ID: en_BW, Name: English (Botswana)
-display locale: ID: en_BW, Name: English (Botswana)
-format locale: ID: en_BW, Name: English (Botswana)
-default charset: ISO-8859-1
-
-OS Locale:  en_BW.iso88591
-default locale: ID: en_BW, Name: English (Botswana)
-display locale: ID: en_BW, Name: English (Botswana)
-format locale: ID: en_BW, Name: English (Botswana)
-default charset: ISO-8859-1
-
-OS Locale:  en_BW.utf8
-default locale: ID: en_BW, Name: English (Botswana)
-display locale: ID: en_BW, Name: English (Botswana)
-format locale: ID: en_BW, Name: English (Botswana)
-default charset: UTF-8
-
-OS Locale:  en_CA
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA.iso88591
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA.utf8
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: UTF-8
-
-OS Locale:  en_DK
-default locale: ID: en_DK, Name: English (Denmark)
-display locale: ID: en_DK, Name: English (Denmark)
-format locale: ID: en_DK, Name: English (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  en_DK.iso88591
-default locale: ID: en_DK, Name: English (Denmark)
-display locale: ID: en_DK, Name: English (Denmark)
-format locale: ID: en_DK, Name: English (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  en_DK.utf8
-default locale: ID: en_DK, Name: English (Denmark)
-display locale: ID: en_DK, Name: English (Denmark)
-format locale: ID: en_DK, Name: English (Denmark)
-default charset: UTF-8
-
-OS Locale:  en_GB
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  en_GB.iso88591
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  en_GB.iso885915
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  en_GB.utf8
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  en_HK
-default locale: ID: en_HK, Name: English (Hong Kong)
-display locale: ID: en_HK, Name: English (Hong Kong)
-format locale: ID: en_HK, Name: English (Hong Kong)
-default charset: ISO-8859-1
-
-OS Locale:  en_HK.iso88591
-default locale: ID: en_HK, Name: English (Hong Kong)
-display locale: ID: en_HK, Name: English (Hong Kong)
-format locale: ID: en_HK, Name: English (Hong Kong)
-default charset: ISO-8859-1
-
-OS Locale:  en_HK.utf8
-default locale: ID: en_HK, Name: English (Hong Kong)
-display locale: ID: en_HK, Name: English (Hong Kong)
-format locale: ID: en_HK, Name: English (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  en_IE
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  en_IE.iso88591
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  en_IE.iso885915@euro
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  en_IE.utf8
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: UTF-8
-
-OS Locale:  en_IE@euro
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  en_IN
-default locale: ID: en_IN, Name: English (India)
-display locale: ID: en_IN, Name: English (India)
-format locale: ID: en_IN, Name: English (India)
-default charset: UTF-8
-
-OS Locale:  en_IN.utf8
-default locale: ID: en_IN, Name: English (India)
-display locale: ID: en_IN, Name: English (India)
-format locale: ID: en_IN, Name: English (India)
-default charset: UTF-8
-
-OS Locale:  en_NZ
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: ISO-8859-1
-
-OS Locale:  en_NZ.iso88591
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: ISO-8859-1
-
-OS Locale:  en_NZ.utf8
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: UTF-8
-
-OS Locale:  en_PH
-default locale: ID: en_PH, Name: English (Philippines)
-display locale: ID: en_PH, Name: English (Philippines)
-format locale: ID: en_PH, Name: English (Philippines)
-default charset: ISO-8859-1
-
-OS Locale:  en_PH.iso88591
-default locale: ID: en_PH, Name: English (Philippines)
-display locale: ID: en_PH, Name: English (Philippines)
-format locale: ID: en_PH, Name: English (Philippines)
-default charset: ISO-8859-1
-
-OS Locale:  en_PH.utf8
-default locale: ID: en_PH, Name: English (Philippines)
-display locale: ID: en_PH, Name: English (Philippines)
-format locale: ID: en_PH, Name: English (Philippines)
-default charset: UTF-8
-
-OS Locale:  en_SG
-default locale: ID: en_SG, Name: English (Singapore)
-display locale: ID: en_SG, Name: English (Singapore)
-format locale: ID: en_SG, Name: English (Singapore)
-default charset: ISO-8859-1
-
-OS Locale:  en_SG.iso88591
-default locale: ID: en_SG, Name: English (Singapore)
-display locale: ID: en_SG, Name: English (Singapore)
-format locale: ID: en_SG, Name: English (Singapore)
-default charset: ISO-8859-1
-
-OS Locale:  en_SG.utf8
-default locale: ID: en_SG, Name: English (Singapore)
-display locale: ID: en_SG, Name: English (Singapore)
-format locale: ID: en_SG, Name: English (Singapore)
-default charset: UTF-8
-
-OS Locale:  en_US
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-1
-
-OS Locale:  en_US.iso88591
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-1
-
-OS Locale:  en_US.iso885915
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-15
-
-OS Locale:  en_US.utf8
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: UTF-8
-
-OS Locale:  en_ZA
-default locale: ID: en_ZA, Name: English (South Africa)
-display locale: ID: en_ZA, Name: English (South Africa)
-format locale: ID: en_ZA, Name: English (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  en_ZA.iso88591
-default locale: ID: en_ZA, Name: English (South Africa)
-display locale: ID: en_ZA, Name: English (South Africa)
-format locale: ID: en_ZA, Name: English (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  en_ZA.utf8
-default locale: ID: en_ZA, Name: English (South Africa)
-display locale: ID: en_ZA, Name: English (South Africa)
-format locale: ID: en_ZA, Name: English (South Africa)
-default charset: UTF-8
-
-OS Locale:  en_ZW
-default locale: ID: en_ZW, Name: English (Zimbabwe)
-display locale: ID: en_ZW, Name: English (Zimbabwe)
-format locale: ID: en_ZW, Name: English (Zimbabwe)
-default charset: ISO-8859-1
-
-OS Locale:  en_ZW.iso88591
-default locale: ID: en_ZW, Name: English (Zimbabwe)
-display locale: ID: en_ZW, Name: English (Zimbabwe)
-format locale: ID: en_ZW, Name: English (Zimbabwe)
-default charset: ISO-8859-1
-
-OS Locale:  en_ZW.utf8
-default locale: ID: en_ZW, Name: English (Zimbabwe)
-display locale: ID: en_ZW, Name: English (Zimbabwe)
-format locale: ID: en_ZW, Name: English (Zimbabwe)
-default charset: UTF-8
-
-OS Locale:  es_AR
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: ISO-8859-1
-
-OS Locale:  es_AR.iso88591
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: ISO-8859-1
-
-OS Locale:  es_AR.utf8
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: UTF-8
-
-OS Locale:  es_BO
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: ISO-8859-1
-
-OS Locale:  es_BO.iso88591
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: ISO-8859-1
-
-OS Locale:  es_BO.utf8
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: UTF-8
-
-OS Locale:  es_CL
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: ISO-8859-1
-
-OS Locale:  es_CL.iso88591
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: ISO-8859-1
-
-OS Locale:  es_CL.utf8
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: UTF-8
-
-OS Locale:  es_CO
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CO.iso88591
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CO.utf8
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: UTF-8
-
-OS Locale:  es_CR
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: ISO-8859-1
-
-OS Locale:  es_CR.iso88591
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: ISO-8859-1
-
-OS Locale:  es_CR.utf8
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: UTF-8
-
-OS Locale:  es_DO
-default locale: ID: es_DO, Name: Spanish (Dominican Republic)
-display locale: ID: es_DO, Name: Spanish (Dominican Republic)
-format locale: ID: es_DO, Name: Spanish (Dominican Republic)
-default charset: ISO-8859-1
-
-OS Locale:  es_DO.iso88591
-default locale: ID: es_DO, Name: Spanish (Dominican Republic)
-display locale: ID: es_DO, Name: Spanish (Dominican Republic)
-format locale: ID: es_DO, Name: Spanish (Dominican Republic)
-default charset: ISO-8859-1
-
-OS Locale:  es_DO.utf8
-default locale: ID: es_DO, Name: Spanish (Dominican Republic)
-display locale: ID: es_DO, Name: Spanish (Dominican Republic)
-format locale: ID: es_DO, Name: Spanish (Dominican Republic)
-default charset: UTF-8
-
-OS Locale:  es_EC
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: ISO-8859-1
-
-OS Locale:  es_EC.iso88591
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: ISO-8859-1
-
-OS Locale:  es_EC.utf8
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: UTF-8
-
-OS Locale:  es_ES
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES.iso88591
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES.iso885915@euro
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es_ES.utf8
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: UTF-8
-
-OS Locale:  es_ES@euro
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es_GT
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: ISO-8859-1
-
-OS Locale:  es_GT.iso88591
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: ISO-8859-1
-
-OS Locale:  es_GT.utf8
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: UTF-8
-
-OS Locale:  es_HN
-default locale: ID: es_HN, Name: Spanish (Honduras)
-display locale: ID: es_HN, Name: Spanish (Honduras)
-format locale: ID: es_HN, Name: Spanish (Honduras)
-default charset: ISO-8859-1
-
-OS Locale:  es_HN.iso88591
-default locale: ID: es_HN, Name: Spanish (Honduras)
-display locale: ID: es_HN, Name: Spanish (Honduras)
-format locale: ID: es_HN, Name: Spanish (Honduras)
-default charset: ISO-8859-1
-
-OS Locale:  es_HN.utf8
-default locale: ID: es_HN, Name: Spanish (Honduras)
-display locale: ID: es_HN, Name: Spanish (Honduras)
-format locale: ID: es_HN, Name: Spanish (Honduras)
-default charset: UTF-8
-
-OS Locale:  es_MX
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX.iso88591
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX.utf8
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: UTF-8
-
-OS Locale:  es_NI
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: ISO-8859-1
-
-OS Locale:  es_NI.iso88591
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: ISO-8859-1
-
-OS Locale:  es_NI.utf8
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: UTF-8
-
-OS Locale:  es_PA
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: ISO-8859-1
-
-OS Locale:  es_PA.iso88591
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: ISO-8859-1
-
-OS Locale:  es_PA.utf8
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: UTF-8
-
-OS Locale:  es_PE
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: ISO-8859-1
-
-OS Locale:  es_PE.iso88591
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: ISO-8859-1
-
-OS Locale:  es_PE.utf8
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: UTF-8
-
-OS Locale:  es_PR
-default locale: ID: es_PR, Name: Spanish (Puerto Rico)
-display locale: ID: es_PR, Name: Spanish (Puerto Rico)
-format locale: ID: es_PR, Name: Spanish (Puerto Rico)
-default charset: ISO-8859-1
-
-OS Locale:  es_PR.iso88591
-default locale: ID: es_PR, Name: Spanish (Puerto Rico)
-display locale: ID: es_PR, Name: Spanish (Puerto Rico)
-format locale: ID: es_PR, Name: Spanish (Puerto Rico)
-default charset: ISO-8859-1
-
-OS Locale:  es_PR.utf8
-default locale: ID: es_PR, Name: Spanish (Puerto Rico)
-display locale: ID: es_PR, Name: Spanish (Puerto Rico)
-format locale: ID: es_PR, Name: Spanish (Puerto Rico)
-default charset: UTF-8
-
-OS Locale:  es_PY
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_PY.iso88591
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_PY.utf8
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: UTF-8
-
-OS Locale:  es_SV
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: ISO-8859-1
-
-OS Locale:  es_SV.iso88591
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: ISO-8859-1
-
-OS Locale:  es_SV.utf8
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: UTF-8
-
-OS Locale:  es_US
-default locale: ID: es_US, Name: Spanish (United States)
-display locale: ID: es_US, Name: Spanish (United States)
-format locale: ID: es_US, Name: Spanish (United States)
-default charset: ISO-8859-1
-
-OS Locale:  es_US.iso88591
-default locale: ID: es_US, Name: Spanish (United States)
-display locale: ID: es_US, Name: Spanish (United States)
-format locale: ID: es_US, Name: Spanish (United States)
-default charset: ISO-8859-1
-
-OS Locale:  es_US.utf8
-default locale: ID: es_US, Name: Spanish (United States)
-display locale: ID: es_US, Name: Spanish (United States)
-format locale: ID: es_US, Name: Spanish (United States)
-default charset: UTF-8
-
-OS Locale:  es_UY
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_UY.iso88591
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_UY.utf8
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: UTF-8
-
-OS Locale:  es_VE
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: ISO-8859-1
-
-OS Locale:  es_VE.iso88591
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: ISO-8859-1
-
-OS Locale:  es_VE.utf8
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: UTF-8
-
-OS Locale:  estonian
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-1
-
-OS Locale:  et_EE
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-1
-
-OS Locale:  et_EE.iso88591
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-1
-
-OS Locale:  et_EE.iso885915
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-15
-
-OS Locale:  et_EE.utf8
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: UTF-8
-
-OS Locale:  eu_ES
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  eu_ES.iso88591
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  eu_ES.iso885915@euro
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  eu_ES.utf8
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: UTF-8
-
-OS Locale:  eu_ES@euro
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: eu_ES, Name: Basque (Spain)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  fa_IR
-default locale: ID: fa_IR, Name: Persian (Iran)
-display locale: ID: fa_IR, Name: Persian (Iran)
-format locale: ID: fa_IR, Name: Persian (Iran)
-default charset: UTF-8
-
-OS Locale:  fa_IR.utf8
-default locale: ID: fa_IR, Name: Persian (Iran)
-display locale: ID: fa_IR, Name: Persian (Iran)
-format locale: ID: fa_IR, Name: Persian (Iran)
-default charset: UTF-8
-
-OS Locale:  fi_FI
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi_FI.iso88591
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi_FI.iso885915@euro
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  fi_FI.utf8
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: UTF-8
-
-OS Locale:  fi_FI@euro
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  finnish
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fo_FO
-default locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-display locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-format locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-default charset: ISO-8859-1
-
-OS Locale:  fo_FO.iso88591
-default locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-display locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-format locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-default charset: ISO-8859-1
-
-OS Locale:  fo_FO.utf8
-default locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-display locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-format locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-default charset: UTF-8
-
-OS Locale:  fr_BE
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  fr_BE.iso88591
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  fr_BE.iso885915@euro
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  fr_BE.utf8
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: UTF-8
-
-OS Locale:  fr_BE@euro
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  fr_CA
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CA.iso88591
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CA.utf8
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: UTF-8
-
-OS Locale:  fr_CH
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CH.iso88591
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CH.utf8
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: UTF-8
-
-OS Locale:  fr_FR
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR.iso88591
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR.iso885915@euro
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr_FR.utf8
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: UTF-8
-
-OS Locale:  fr_FR@euro
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr_LU
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: ISO-8859-1
-
-OS Locale:  fr_LU.iso88591
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: ISO-8859-1
-
-OS Locale:  fr_LU.iso885915@euro
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: ISO-8859-15
-
-OS Locale:  fr_LU.utf8
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: UTF-8
-
-OS Locale:  fr_LU@euro
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: fr_LU, Name: French (Luxembourg)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: ISO-8859-15
-
-OS Locale:  français
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  french
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fy_NL
-default locale: ID: fy_NL, Name: Frisian (Netherlands)
-display locale: ID: fy_NL, Name: Frisian (Netherlands)
-format locale: ID: fy_NL, Name: Frisian (Netherlands)
-default charset: UTF-8
-
-OS Locale:  fy_NL.utf8
-default locale: ID: fy_NL, Name: Frisian (Netherlands)
-display locale: ID: fy_NL, Name: Frisian (Netherlands)
-format locale: ID: fy_NL, Name: Frisian (Netherlands)
-default charset: UTF-8
-
-OS Locale:  ga_IE
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  ga_IE.iso88591
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  ga_IE.iso885915@euro
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  ga_IE.utf8
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: UTF-8
-
-OS Locale:  ga_IE@euro
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: ga_IE, Name: Irish (Ireland)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  galego
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  galician
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  gd_GB
-default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  gd_GB.iso885915
-default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  gd_GB.utf8
-default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  german
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  gez_ER
-default locale: ID: gez_ER, Name: Geez (Eritrea)
-display locale: ID: gez_ER, Name: Geez (Eritrea)
-format locale: ID: gez_ER, Name: Geez (Eritrea)
-default charset: UTF-8
-
-OS Locale:  gez_ER.utf8
-default locale: ID: gez_ER, Name: Geez (Eritrea)
-display locale: ID: gez_ER, Name: Geez (Eritrea)
-format locale: ID: gez_ER, Name: Geez (Eritrea)
-default charset: UTF-8
-
-OS Locale:  gez_ER.utf8@abegede
-default locale: ID: gez_ER, Name: Geez (Eritrea)
-display locale: ID: gez_ER, Name: Geez (Eritrea)
-format locale: ID: gez_ER, Name: Geez (Eritrea)
-default charset: UTF-8
-
-OS Locale:  gez_ER@abegede
-default locale: ID: gez_ER, Name: Geez (Eritrea)
-display locale: ID: gez_ER, Name: Geez (Eritrea)
-format locale: ID: gez_ER, Name: Geez (Eritrea)
-default charset: UTF-8
-
-OS Locale:  gez_ET
-default locale: ID: gez_ET, Name: Geez (Ethiopia)
-display locale: ID: gez_ET, Name: Geez (Ethiopia)
-format locale: ID: gez_ET, Name: Geez (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  gez_ET.utf8
-default locale: ID: gez_ET, Name: Geez (Ethiopia)
-display locale: ID: gez_ET, Name: Geez (Ethiopia)
-format locale: ID: gez_ET, Name: Geez (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  gez_ET.utf8@abegede
-default locale: ID: gez_ET, Name: Geez (Ethiopia)
-display locale: ID: gez_ET, Name: Geez (Ethiopia)
-format locale: ID: gez_ET, Name: Geez (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  gez_ET@abegede
-default locale: ID: gez_ET, Name: Geez (Ethiopia)
-display locale: ID: gez_ET, Name: Geez (Ethiopia)
-format locale: ID: gez_ET, Name: Geez (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  gl_ES
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  gl_ES.iso88591
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  gl_ES.iso885915@euro
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  gl_ES.utf8
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: UTF-8
-
-OS Locale:  gl_ES@euro
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: gl_ES, Name: Gallegan (Spain)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  greek
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  gu_IN
-default locale: ID: gu_IN, Name: Gujarati (India)
-display locale: ID: gu_IN, Name: Gujarati (India)
-format locale: ID: gu_IN, Name: Gujarati (India)
-default charset: UTF-8
-
-OS Locale:  gu_IN.utf8
-default locale: ID: gu_IN, Name: Gujarati (India)
-display locale: ID: gu_IN, Name: Gujarati (India)
-format locale: ID: gu_IN, Name: Gujarati (India)
-default charset: UTF-8
-
-OS Locale:  gv_GB
-default locale: ID: gv_GB, Name: Manx (United Kingdom)
-display locale: ID: gv_GB, Name: Manx (United Kingdom)
-format locale: ID: gv_GB, Name: Manx (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  gv_GB.iso88591
-default locale: ID: gv_GB, Name: Manx (United Kingdom)
-display locale: ID: gv_GB, Name: Manx (United Kingdom)
-format locale: ID: gv_GB, Name: Manx (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  gv_GB.utf8
-default locale: ID: gv_GB, Name: Manx (United Kingdom)
-display locale: ID: gv_GB, Name: Manx (United Kingdom)
-format locale: ID: gv_GB, Name: Manx (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  he_IL
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  he_IL.iso88598
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  he_IL.utf8
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: UTF-8
-
-OS Locale:  hebrew
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  hi_IN
-default locale: ID: hi_IN, Name: Hindi (India)
-display locale: ID: hi_IN, Name: Hindi (India)
-format locale: ID: hi_IN, Name: Hindi (India)
-default charset: UTF-8
-
-OS Locale:  hi_IN.utf8
-default locale: ID: hi_IN, Name: Hindi (India)
-display locale: ID: hi_IN, Name: Hindi (India)
-format locale: ID: hi_IN, Name: Hindi (India)
-default charset: UTF-8
-
-OS Locale:  hr_HR
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hr_HR.iso88592
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hr_HR.utf8
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: UTF-8
-
-OS Locale:  hrvatski
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hsb_DE
-default locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-display locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: ISO-8859-2
-
-OS Locale:  hsb_DE.iso88592
-default locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-display locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: ISO-8859-2
-
-OS Locale:  hsb_DE.utf8
-default locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-display locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: UTF-8
-
-OS Locale:  hu_HU
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU.iso88592
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU.utf8
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: UTF-8
-
-OS Locale:  hungarian
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hy_AM
-default locale: ID: hy_AM, Name: Armenian (Armenia)
-display locale: ID: hy_AM, Name: Armenian (Armenia)
-format locale: ID: hy_AM, Name: Armenian (Armenia)
-default charset: UTF-8
-
-OS Locale:  hy_AM.armscii8
-default locale: ID: hy_AM, Name: Armenian (Armenia)
-display locale: ID: hy_AM, Name: Armenian (Armenia)
-format locale: ID: hy_AM, Name: Armenian (Armenia)
-default charset: UTF-8
-
-OS Locale:  hy_AM.utf8
-default locale: ID: hy_AM, Name: Armenian (Armenia)
-display locale: ID: hy_AM, Name: Armenian (Armenia)
-format locale: ID: hy_AM, Name: Armenian (Armenia)
-default charset: UTF-8
-
-OS Locale:  icelandic
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  id_ID
-default locale: ID: in_ID, Name: Indonesian (Indonesia)
-display locale: ID: in_ID, Name: Indonesian (Indonesia)
-format locale: ID: in_ID, Name: Indonesian (Indonesia)
-default charset: ISO-8859-1
-
-OS Locale:  id_ID.iso88591
-default locale: ID: in_ID, Name: Indonesian (Indonesia)
-display locale: ID: in_ID, Name: Indonesian (Indonesia)
-format locale: ID: in_ID, Name: Indonesian (Indonesia)
-default charset: ISO-8859-1
-
-OS Locale:  id_ID.utf8
-default locale: ID: in_ID, Name: Indonesian (Indonesia)
-display locale: ID: in_ID, Name: Indonesian (Indonesia)
-format locale: ID: in_ID, Name: Indonesian (Indonesia)
-default charset: UTF-8
-
-OS Locale:  is_IS
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  is_IS.iso88591
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  is_IS.utf8
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: UTF-8
-
-OS Locale:  it_CH
-default locale: ID: it_CH, Name: Italian (Switzerland)
-display locale: ID: it_CH, Name: Italian (Switzerland)
-format locale: ID: it_CH, Name: Italian (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  it_CH.iso88591
-default locale: ID: it_CH, Name: Italian (Switzerland)
-display locale: ID: it_CH, Name: Italian (Switzerland)
-format locale: ID: it_CH, Name: Italian (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  it_CH.utf8
-default locale: ID: it_CH, Name: Italian (Switzerland)
-display locale: ID: it_CH, Name: Italian (Switzerland)
-format locale: ID: it_CH, Name: Italian (Switzerland)
-default charset: UTF-8
-
-OS Locale:  it_IT
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it_IT.iso88591
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it_IT.iso885915@euro
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  it_IT.utf8
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: UTF-8
-
-OS Locale:  it_IT@euro
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  italian
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  iw_IL
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  iw_IL.iso88598
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  iw_IL.utf8
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: UTF-8
-
-OS Locale:  ja_JP
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  ja_JP.eucjp
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  ja_JP.ujis
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  ja_JP.utf8
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: UTF-8
-
-OS Locale:  japanese
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  japanese.euc
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-euc-jp-linux
-
-OS Locale:  ka_GE
-default locale: ID: ka_GE, Name: Georgian (Georgia)
-display locale: ID: ka_GE, Name: Georgian (Georgia)
-format locale: ID: ka_GE, Name: Georgian (Georgia)
-default charset: UTF-8
-
-OS Locale:  ka_GE.georgianps
-default locale: ID: ka_GE, Name: Georgian (Georgia)
-display locale: ID: ka_GE, Name: Georgian (Georgia)
-format locale: ID: ka_GE, Name: Georgian (Georgia)
-default charset: UTF-8
-
-OS Locale:  ka_GE.utf8
-default locale: ID: ka_GE, Name: Georgian (Georgia)
-display locale: ID: ka_GE, Name: Georgian (Georgia)
-format locale: ID: ka_GE, Name: Georgian (Georgia)
-default charset: UTF-8
-
-OS Locale:  kk_KZ
-default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-default charset: UTF-8
-
-OS Locale:  kk_KZ.pt154
-default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-default charset: UTF-8
-
-OS Locale:  kk_KZ.utf8
-default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-default charset: UTF-8
-
-OS Locale:  kl_GL
-default locale: ID: kl_GL, Name: Greenlandic (Greenland)
-display locale: ID: kl_GL, Name: Greenlandic (Greenland)
-format locale: ID: kl_GL, Name: Greenlandic (Greenland)
-default charset: ISO-8859-1
-
-OS Locale:  kl_GL.iso88591
-default locale: ID: kl_GL, Name: Greenlandic (Greenland)
-display locale: ID: kl_GL, Name: Greenlandic (Greenland)
-format locale: ID: kl_GL, Name: Greenlandic (Greenland)
-default charset: ISO-8859-1
-
-OS Locale:  kl_GL.utf8
-default locale: ID: kl_GL, Name: Greenlandic (Greenland)
-display locale: ID: kl_GL, Name: Greenlandic (Greenland)
-format locale: ID: kl_GL, Name: Greenlandic (Greenland)
-default charset: UTF-8
-
-OS Locale:  km_KH
-default locale: ID: km_KH, Name: Khmer (Cambodia)
-display locale: ID: km_KH, Name: Khmer (Cambodia)
-format locale: ID: km_KH, Name: Khmer (Cambodia)
-default charset: UTF-8
-
-OS Locale:  km_KH.utf8
-default locale: ID: km_KH, Name: Khmer (Cambodia)
-display locale: ID: km_KH, Name: Khmer (Cambodia)
-format locale: ID: km_KH, Name: Khmer (Cambodia)
-default charset: UTF-8
-
-OS Locale:  kn_IN
-default locale: ID: kn_IN, Name: Kannada (India)
-display locale: ID: kn_IN, Name: Kannada (India)
-format locale: ID: kn_IN, Name: Kannada (India)
-default charset: UTF-8
-
-OS Locale:  kn_IN.utf8
-default locale: ID: kn_IN, Name: Kannada (India)
-display locale: ID: kn_IN, Name: Kannada (India)
-format locale: ID: kn_IN, Name: Kannada (India)
-default charset: UTF-8
-
-OS Locale:  ko_KR
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko_KR.euckr
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko_KR.utf8
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: UTF-8
-
-OS Locale:  korean
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  korean.euc
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ku_TR
-default locale: ID: ku_TR, Name: Kurdish (Turkey)
-display locale: ID: ku_TR, Name: Kurdish (Turkey)
-format locale: ID: ku_TR, Name: Kurdish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  ku_TR.iso88599
-default locale: ID: ku_TR, Name: Kurdish (Turkey)
-display locale: ID: ku_TR, Name: Kurdish (Turkey)
-format locale: ID: ku_TR, Name: Kurdish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  ku_TR.utf8
-default locale: ID: ku_TR, Name: Kurdish (Turkey)
-display locale: ID: ku_TR, Name: Kurdish (Turkey)
-format locale: ID: ku_TR, Name: Kurdish (Turkey)
-default charset: UTF-8
-
-OS Locale:  kw_GB
-default locale: ID: kw_GB, Name: Cornish (United Kingdom)
-display locale: ID: kw_GB, Name: Cornish (United Kingdom)
-format locale: ID: kw_GB, Name: Cornish (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  kw_GB.iso88591
-default locale: ID: kw_GB, Name: Cornish (United Kingdom)
-display locale: ID: kw_GB, Name: Cornish (United Kingdom)
-format locale: ID: kw_GB, Name: Cornish (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  kw_GB.utf8
-default locale: ID: kw_GB, Name: Cornish (United Kingdom)
-display locale: ID: kw_GB, Name: Cornish (United Kingdom)
-format locale: ID: kw_GB, Name: Cornish (United Kingdom)
-default charset: UTF-8
-
-OS Locale:  ky_KG
-default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-display locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-default charset: UTF-8
-
-OS Locale:  ky_KG.utf8
-default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-display locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-default charset: UTF-8
-
-OS Locale:  lg_UG
-default locale: ID: lg_UG, Name: Ganda (Uganda)
-display locale: ID: lg_UG, Name: Ganda (Uganda)
-format locale: ID: lg_UG, Name: Ganda (Uganda)
-default charset: UTF-8
-
-OS Locale:  lg_UG.iso885910
-default locale: ID: lg_UG, Name: Ganda (Uganda)
-display locale: ID: lg_UG, Name: Ganda (Uganda)
-format locale: ID: lg_UG, Name: Ganda (Uganda)
-default charset: UTF-8
-
-OS Locale:  lg_UG.utf8
-default locale: ID: lg_UG, Name: Ganda (Uganda)
-display locale: ID: lg_UG, Name: Ganda (Uganda)
-format locale: ID: lg_UG, Name: Ganda (Uganda)
-default charset: UTF-8
-
-OS Locale:  lithuanian
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lo_LA
-default locale: ID: lo_LA, Name: Lao (Laos)
-display locale: ID: lo_LA, Name: Lao (Laos)
-format locale: ID: lo_LA, Name: Lao (Laos)
-default charset: UTF-8
-
-OS Locale:  lo_LA.utf8
-default locale: ID: lo_LA, Name: Lao (Laos)
-display locale: ID: lo_LA, Name: Lao (Laos)
-format locale: ID: lo_LA, Name: Lao (Laos)
-default charset: UTF-8
-
-OS Locale:  lt_LT
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lt_LT.iso885913
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lt_LT.utf8
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: UTF-8
-
-OS Locale:  lv_LV
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  lv_LV.iso885913
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  lv_LV.utf8
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: UTF-8
-
-OS Locale:  mai_IN
-default locale: ID: mai_IN, Name: Maithili (India)
-display locale: ID: mai_IN, Name: Maithili (India)
-format locale: ID: mai_IN, Name: Maithili (India)
-default charset: UTF-8
-
-OS Locale:  mai_IN.utf8
-default locale: ID: mai_IN, Name: Maithili (India)
-display locale: ID: mai_IN, Name: Maithili (India)
-format locale: ID: mai_IN, Name: Maithili (India)
-default charset: UTF-8
-
-OS Locale:  mg_MG
-default locale: ID: mg_MG, Name: Malagasy (Madagascar)
-display locale: ID: mg_MG, Name: Malagasy (Madagascar)
-format locale: ID: mg_MG, Name: Malagasy (Madagascar)
-default charset: ISO-8859-15
-
-OS Locale:  mg_MG.iso885915
-default locale: ID: mg_MG, Name: Malagasy (Madagascar)
-display locale: ID: mg_MG, Name: Malagasy (Madagascar)
-format locale: ID: mg_MG, Name: Malagasy (Madagascar)
-default charset: ISO-8859-15
-
-OS Locale:  mg_MG.utf8
-default locale: ID: mg_MG, Name: Malagasy (Madagascar)
-display locale: ID: mg_MG, Name: Malagasy (Madagascar)
-format locale: ID: mg_MG, Name: Malagasy (Madagascar)
-default charset: UTF-8
-
-OS Locale:  mi_NZ
-default locale: ID: mi_NZ, Name: Maori (New Zealand)
-display locale: ID: mi_NZ, Name: Maori (New Zealand)
-format locale: ID: mi_NZ, Name: Maori (New Zealand)
-default charset: ISO-8859-13
-
-OS Locale:  mi_NZ.iso885913
-default locale: ID: mi_NZ, Name: Maori (New Zealand)
-display locale: ID: mi_NZ, Name: Maori (New Zealand)
-format locale: ID: mi_NZ, Name: Maori (New Zealand)
-default charset: ISO-8859-13
-
-OS Locale:  mi_NZ.utf8
-default locale: ID: mi_NZ, Name: Maori (New Zealand)
-display locale: ID: mi_NZ, Name: Maori (New Zealand)
-format locale: ID: mi_NZ, Name: Maori (New Zealand)
-default charset: UTF-8
-
-OS Locale:  mk_MK
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: ISO-8859-5
-
-OS Locale:  mk_MK.iso88595
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: ISO-8859-5
-
-OS Locale:  mk_MK.utf8
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: UTF-8
-
-OS Locale:  ml_IN
-default locale: ID: ml_IN, Name: Malayalam (India)
-display locale: ID: ml_IN, Name: Malayalam (India)
-format locale: ID: ml_IN, Name: Malayalam (India)
-default charset: UTF-8
-
-OS Locale:  ml_IN.utf8
-default locale: ID: ml_IN, Name: Malayalam (India)
-display locale: ID: ml_IN, Name: Malayalam (India)
-format locale: ID: ml_IN, Name: Malayalam (India)
-default charset: UTF-8
-
-OS Locale:  mn_MN
-default locale: ID: mn_MN, Name: Mongolian (Mongolia)
-display locale: ID: mn_MN, Name: Mongolian (Mongolia)
-format locale: ID: mn_MN, Name: Mongolian (Mongolia)
-default charset: UTF-8
-
-OS Locale:  mn_MN.utf8
-default locale: ID: mn_MN, Name: Mongolian (Mongolia)
-display locale: ID: mn_MN, Name: Mongolian (Mongolia)
-format locale: ID: mn_MN, Name: Mongolian (Mongolia)
-default charset: UTF-8
-
-OS Locale:  mr_IN
-default locale: ID: mr_IN, Name: Marathi (India)
-display locale: ID: mr_IN, Name: Marathi (India)
-format locale: ID: mr_IN, Name: Marathi (India)
-default charset: UTF-8
-
-OS Locale:  mr_IN.utf8
-default locale: ID: mr_IN, Name: Marathi (India)
-display locale: ID: mr_IN, Name: Marathi (India)
-format locale: ID: mr_IN, Name: Marathi (India)
-default charset: UTF-8
-
-OS Locale:  ms_MY
-default locale: ID: ms_MY, Name: Malay (Malaysia)
-display locale: ID: ms_MY, Name: Malay (Malaysia)
-format locale: ID: ms_MY, Name: Malay (Malaysia)
-default charset: ISO-8859-1
-
-OS Locale:  ms_MY.iso88591
-default locale: ID: ms_MY, Name: Malay (Malaysia)
-display locale: ID: ms_MY, Name: Malay (Malaysia)
-format locale: ID: ms_MY, Name: Malay (Malaysia)
-default charset: ISO-8859-1
-
-OS Locale:  ms_MY.utf8
-default locale: ID: ms_MY, Name: Malay (Malaysia)
-display locale: ID: ms_MY, Name: Malay (Malaysia)
-format locale: ID: ms_MY, Name: Malay (Malaysia)
-default charset: UTF-8
-
-OS Locale:  mt_MT
-default locale: ID: mt_MT, Name: Maltese (Malta)
-display locale: ID: mt_MT, Name: Maltese (Malta)
-format locale: ID: mt_MT, Name: Maltese (Malta)
-default charset: ISO-8859-3
-
-OS Locale:  mt_MT.iso88593
-default locale: ID: mt_MT, Name: Maltese (Malta)
-display locale: ID: mt_MT, Name: Maltese (Malta)
-format locale: ID: mt_MT, Name: Maltese (Malta)
-default charset: ISO-8859-3
-
-OS Locale:  mt_MT.utf8
-default locale: ID: mt_MT, Name: Maltese (Malta)
-display locale: ID: mt_MT, Name: Maltese (Malta)
-format locale: ID: mt_MT, Name: Maltese (Malta)
-default charset: UTF-8
-
-OS Locale:  nb_NO
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nb_NO.iso88591
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nb_NO.utf8
-default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway)
-default charset: UTF-8
-
-OS Locale:  ne_NP
-default locale: ID: ne_NP, Name: Nepali (Nepal)
-display locale: ID: ne_NP, Name: Nepali (Nepal)
-format locale: ID: ne_NP, Name: Nepali (Nepal)
-default charset: UTF-8
-
-OS Locale:  ne_NP.utf8
-default locale: ID: ne_NP, Name: Nepali (Nepal)
-display locale: ID: ne_NP, Name: Nepali (Nepal)
-format locale: ID: ne_NP, Name: Nepali (Nepal)
-default charset: UTF-8
-
-OS Locale:  nl_BE
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  nl_BE.iso88591
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  nl_BE.iso885915@euro
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  nl_BE.utf8
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: UTF-8
-
-OS Locale:  nl_BE@euro
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  nl_NL
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl_NL.iso88591
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl_NL.iso885915@euro
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  nl_NL.utf8
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: UTF-8
-
-OS Locale:  nl_NL@euro
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  nn_NO
-default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nn_NO.iso88591
-default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nn_NO.utf8
-default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-default charset: UTF-8
-
-OS Locale:  no_NO
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO.iso88591
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO.utf8
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: UTF-8
-
-OS Locale:  norwegian
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  nr_ZA
-default locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-display locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-format locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-default charset: UTF-8
-
-OS Locale:  nr_ZA.utf8
-default locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-display locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-format locale: ID: nr_ZA, Name: South Ndebele (South Africa)
-default charset: UTF-8
-
-OS Locale:  nso_ZA
-default locale: ID: nso_ZA, Name: Pedi (South Africa)
-display locale: ID: nso_ZA, Name: Pedi (South Africa)
-format locale: ID: nso_ZA, Name: Pedi (South Africa)
-default charset: UTF-8
-
-OS Locale:  nso_ZA.utf8
-default locale: ID: nso_ZA, Name: Pedi (South Africa)
-display locale: ID: nso_ZA, Name: Pedi (South Africa)
-format locale: ID: nso_ZA, Name: Pedi (South Africa)
-default charset: UTF-8
-
-OS Locale:  nynorsk
-default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  oc_FR
-default locale: ID: oc_FR, Name: Occitan (France)
-display locale: ID: oc_FR, Name: Occitan (France)
-format locale: ID: oc_FR, Name: Occitan (France)
-default charset: ISO-8859-1
-
-OS Locale:  oc_FR.iso88591
-default locale: ID: oc_FR, Name: Occitan (France)
-display locale: ID: oc_FR, Name: Occitan (France)
-format locale: ID: oc_FR, Name: Occitan (France)
-default charset: ISO-8859-1
-
-OS Locale:  oc_FR.utf8
-default locale: ID: oc_FR, Name: Occitan (France)
-display locale: ID: oc_FR, Name: Occitan (France)
-format locale: ID: oc_FR, Name: Occitan (France)
-default charset: UTF-8
-
-OS Locale:  om_ET
-default locale: ID: om_ET, Name: Oromo (Ethiopia)
-display locale: ID: om_ET, Name: Oromo (Ethiopia)
-format locale: ID: om_ET, Name: Oromo (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  om_ET.utf8
-default locale: ID: om_ET, Name: Oromo (Ethiopia)
-display locale: ID: om_ET, Name: Oromo (Ethiopia)
-format locale: ID: om_ET, Name: Oromo (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  om_KE
-default locale: ID: om_KE, Name: Oromo (Kenya)
-display locale: ID: om_KE, Name: Oromo (Kenya)
-format locale: ID: om_KE, Name: Oromo (Kenya)
-default charset: ISO-8859-1
-
-OS Locale:  om_KE.iso88591
-default locale: ID: om_KE, Name: Oromo (Kenya)
-display locale: ID: om_KE, Name: Oromo (Kenya)
-format locale: ID: om_KE, Name: Oromo (Kenya)
-default charset: ISO-8859-1
-
-OS Locale:  om_KE.utf8
-default locale: ID: om_KE, Name: Oromo (Kenya)
-display locale: ID: om_KE, Name: Oromo (Kenya)
-format locale: ID: om_KE, Name: Oromo (Kenya)
-default charset: UTF-8
-
-OS Locale:  or_IN
-default locale: ID: or_IN, Name: Oriya (India)
-display locale: ID: or_IN, Name: Oriya (India)
-format locale: ID: or_IN, Name: Oriya (India)
-default charset: UTF-8
-
-OS Locale:  or_IN.utf8
-default locale: ID: or_IN, Name: Oriya (India)
-display locale: ID: or_IN, Name: Oriya (India)
-format locale: ID: or_IN, Name: Oriya (India)
-default charset: UTF-8
-
-OS Locale:  pa_IN
-default locale: ID: pa_IN, Name: Panjabi (India)
-display locale: ID: pa_IN, Name: Panjabi (India)
-format locale: ID: pa_IN, Name: Panjabi (India)
-default charset: UTF-8
-
-OS Locale:  pa_IN.utf8
-default locale: ID: pa_IN, Name: Panjabi (India)
-display locale: ID: pa_IN, Name: Panjabi (India)
-format locale: ID: pa_IN, Name: Panjabi (India)
-default charset: UTF-8
-
-OS Locale:  pa_PK
-default locale: ID: pa_PK, Name: Panjabi (Pakistan)
-display locale: ID: pa_PK, Name: Panjabi (Pakistan)
-format locale: ID: pa_PK, Name: Panjabi (Pakistan)
-default charset: UTF-8
-
-OS Locale:  pa_PK.utf8
-default locale: ID: pa_PK, Name: Panjabi (Pakistan)
-display locale: ID: pa_PK, Name: Panjabi (Pakistan)
-format locale: ID: pa_PK, Name: Panjabi (Pakistan)
-default charset: UTF-8
-
-OS Locale:  pl_PL
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl_PL.iso88592
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl_PL.utf8
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: UTF-8
-
-OS Locale:  polish
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  portuguese
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR.iso88591
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR.utf8
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: UTF-8
-
-OS Locale:  pt_PT
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_PT.iso88591
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_PT.iso885915@euro
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  pt_PT.utf8
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: UTF-8
-
-OS Locale:  pt_PT@euro
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  ro_RO
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ro_RO.iso88592
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ro_RO.utf8
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: UTF-8
-
-OS Locale:  romanian
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ru_RU
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru_RU.iso88595
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru_RU.koi8r
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: KOI8-R
-
-OS Locale:  ru_RU.utf8
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: UTF-8
-
-OS Locale:  ru_UA
-default locale: ID: ru_UA, Name: Russian (Ukraine)
-display locale: ID: ru_UA, Name: Russian (Ukraine)
-format locale: ID: ru_UA, Name: Russian (Ukraine)
-default charset: KOI8-U
-
-OS Locale:  ru_UA.koi8u
-default locale: ID: ru_UA, Name: Russian (Ukraine)
-display locale: ID: ru_UA, Name: Russian (Ukraine)
-format locale: ID: ru_UA, Name: Russian (Ukraine)
-default charset: KOI8-U
-
-OS Locale:  ru_UA.utf8
-default locale: ID: ru_UA, Name: Russian (Ukraine)
-display locale: ID: ru_UA, Name: Russian (Ukraine)
-format locale: ID: ru_UA, Name: Russian (Ukraine)
-default charset: UTF-8
-
-OS Locale:  russian
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  rw_RW
-default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-display locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-default charset: UTF-8
-
-OS Locale:  rw_RW.utf8
-default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-display locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-default charset: UTF-8
-
-OS Locale:  se_NO
-default locale: ID: se_NO, Name: Northern Sami (Norway)
-display locale: ID: se_NO, Name: Northern Sami (Norway)
-format locale: ID: se_NO, Name: Northern Sami (Norway)
-default charset: UTF-8
-
-OS Locale:  se_NO.utf8
-default locale: ID: se_NO, Name: Northern Sami (Norway)
-display locale: ID: se_NO, Name: Northern Sami (Norway)
-format locale: ID: se_NO, Name: Northern Sami (Norway)
-default charset: UTF-8
-
-OS Locale:  si_LK
-default locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-display locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-format locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-default charset: UTF-8
-
-OS Locale:  si_LK.utf8
-default locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-display locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-format locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-default charset: UTF-8
-
-OS Locale:  sid_ET
-default locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-display locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-format locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  sid_ET.utf8
-default locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-display locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-format locale: ID: sid_ET, Name: Sidamo (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  sk_SK
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  sk_SK.iso88592
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  sk_SK.utf8
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: UTF-8
-
-OS Locale:  sl_SI
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  sl_SI.iso88592
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  sl_SI.utf8
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: UTF-8
-
-OS Locale:  slovak
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  slovene
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  slovenian
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  so_DJ
-default locale: ID: so_DJ, Name: Somali (Djibouti)
-display locale: ID: so_DJ, Name: Somali (Djibouti)
-format locale: ID: so_DJ, Name: Somali (Djibouti)
-default charset: ISO-8859-1
-
-OS Locale:  so_DJ.iso88591
-default locale: ID: so_DJ, Name: Somali (Djibouti)
-display locale: ID: so_DJ, Name: Somali (Djibouti)
-format locale: ID: so_DJ, Name: Somali (Djibouti)
-default charset: ISO-8859-1
-
-OS Locale:  so_DJ.utf8
-default locale: ID: so_DJ, Name: Somali (Djibouti)
-display locale: ID: so_DJ, Name: Somali (Djibouti)
-format locale: ID: so_DJ, Name: Somali (Djibouti)
-default charset: UTF-8
-
-OS Locale:  so_ET
-default locale: ID: so_ET, Name: Somali (Ethiopia)
-display locale: ID: so_ET, Name: Somali (Ethiopia)
-format locale: ID: so_ET, Name: Somali (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  so_ET.utf8
-default locale: ID: so_ET, Name: Somali (Ethiopia)
-display locale: ID: so_ET, Name: Somali (Ethiopia)
-format locale: ID: so_ET, Name: Somali (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  so_KE
-default locale: ID: so_KE, Name: Somali (Kenya)
-display locale: ID: so_KE, Name: Somali (Kenya)
-format locale: ID: so_KE, Name: Somali (Kenya)
-default charset: ISO-8859-1
-
-OS Locale:  so_KE.iso88591
-default locale: ID: so_KE, Name: Somali (Kenya)
-display locale: ID: so_KE, Name: Somali (Kenya)
-format locale: ID: so_KE, Name: Somali (Kenya)
-default charset: ISO-8859-1
-
-OS Locale:  so_KE.utf8
-default locale: ID: so_KE, Name: Somali (Kenya)
-display locale: ID: so_KE, Name: Somali (Kenya)
-format locale: ID: so_KE, Name: Somali (Kenya)
-default charset: UTF-8
-
-OS Locale:  so_SO
-default locale: ID: so_SO, Name: Somali (Somalia)
-display locale: ID: so_SO, Name: Somali (Somalia)
-format locale: ID: so_SO, Name: Somali (Somalia)
-default charset: ISO-8859-1
-
-OS Locale:  so_SO.iso88591
-default locale: ID: so_SO, Name: Somali (Somalia)
-display locale: ID: so_SO, Name: Somali (Somalia)
-format locale: ID: so_SO, Name: Somali (Somalia)
-default charset: ISO-8859-1
-
-OS Locale:  so_SO.utf8
-default locale: ID: so_SO, Name: Somali (Somalia)
-display locale: ID: so_SO, Name: Somali (Somalia)
-format locale: ID: so_SO, Name: Somali (Somalia)
-default charset: UTF-8
-
-OS Locale:  spanish
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  sq_AL
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: ISO-8859-1
-
-OS Locale:  sq_AL.iso88591
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: ISO-8859-1
-
-OS Locale:  sq_AL.utf8
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: UTF-8
-
-OS Locale:  sr_CS
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sr_CS.iso88595
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sr_CS.utf8
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: UTF-8
-
-OS Locale:  sr_ME
-default locale: ID: sr_ME, Name: Serbian (Montenegro)
-display locale: ID: sr_ME, Name: Serbian (Montenegro)
-format locale: ID: sr_ME, Name: Serbian (Montenegro)
-default charset: UTF-8
-
-OS Locale:  sr_ME.utf8
-default locale: ID: sr_ME, Name: Serbian (Montenegro)
-display locale: ID: sr_ME, Name: Serbian (Montenegro)
-format locale: ID: sr_ME, Name: Serbian (Montenegro)
-default charset: UTF-8
-
-OS Locale:  sr_RS
-default locale: ID: sr_RS, Name: Serbian (Serbia)
-display locale: ID: sr_RS, Name: Serbian (Serbia)
-format locale: ID: sr_RS, Name: Serbian (Serbia)
-default charset: UTF-8
-
-OS Locale:  sr_RS.utf8
-default locale: ID: sr_RS, Name: Serbian (Serbia)
-display locale: ID: sr_RS, Name: Serbian (Serbia)
-format locale: ID: sr_RS, Name: Serbian (Serbia)
-default charset: UTF-8
-
-OS Locale:  sr_RS.utf8@latin
-default locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-display locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-format locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-default charset: UTF-8
-
-OS Locale:  sr_RS@latin
-default locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-display locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-format locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-default charset: UTF-8
-
-OS Locale:  ss_ZA
-default locale: ID: ss_ZA, Name: Swati (South Africa)
-display locale: ID: ss_ZA, Name: Swati (South Africa)
-format locale: ID: ss_ZA, Name: Swati (South Africa)
-default charset: UTF-8
-
-OS Locale:  ss_ZA.utf8
-default locale: ID: ss_ZA, Name: Swati (South Africa)
-display locale: ID: ss_ZA, Name: Swati (South Africa)
-format locale: ID: ss_ZA, Name: Swati (South Africa)
-default charset: UTF-8
-
-OS Locale:  st_ZA
-default locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-display locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-format locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  st_ZA.iso88591
-default locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-display locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-format locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  st_ZA.utf8
-default locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-display locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-format locale: ID: st_ZA, Name: Southern Sotho (South Africa)
-default charset: UTF-8
-
-OS Locale:  sv_FI
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  sv_FI.iso88591
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  sv_FI.iso885915@euro
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  sv_FI.utf8
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: UTF-8
-
-OS Locale:  sv_FI@euro
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: sv_FI, Name: Swedish (Finland)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  sv_SE
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv_SE.iso88591
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv_SE.iso885915
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-15
-
-OS Locale:  sv_SE.utf8
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: UTF-8
-
-OS Locale:  swedish
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  ta_IN
-default locale: ID: ta_IN, Name: Tamil (India)
-display locale: ID: ta_IN, Name: Tamil (India)
-format locale: ID: ta_IN, Name: Tamil (India)
-default charset: UTF-8
-
-OS Locale:  ta_IN.utf8
-default locale: ID: ta_IN, Name: Tamil (India)
-display locale: ID: ta_IN, Name: Tamil (India)
-format locale: ID: ta_IN, Name: Tamil (India)
-default charset: UTF-8
-
-OS Locale:  te_IN
-default locale: ID: te_IN, Name: Telugu (India)
-display locale: ID: te_IN, Name: Telugu (India)
-format locale: ID: te_IN, Name: Telugu (India)
-default charset: UTF-8
-
-OS Locale:  te_IN.utf8
-default locale: ID: te_IN, Name: Telugu (India)
-display locale: ID: te_IN, Name: Telugu (India)
-format locale: ID: te_IN, Name: Telugu (India)
-default charset: UTF-8
-
-OS Locale:  tg_TJ
-default locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-display locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-format locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-default charset: UTF-8
-
-OS Locale:  tg_TJ.koi8t
-default locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-display locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-format locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-default charset: UTF-8
-
-OS Locale:  tg_TJ.utf8
-default locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-display locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-format locale: ID: tg_TJ, Name: Tajik (Tajikistan)
-default charset: UTF-8
-
-OS Locale:  th_TH
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.tis620
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.utf8
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: UTF-8
-
-OS Locale:  thai
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  ti_ER
-default locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-display locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-format locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-default charset: UTF-8
-
-OS Locale:  ti_ER.utf8
-default locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-display locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-format locale: ID: ti_ER, Name: Tigrinya (Eritrea)
-default charset: UTF-8
-
-OS Locale:  ti_ET
-default locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-display locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-format locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  ti_ET.utf8
-default locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-display locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-format locale: ID: ti_ET, Name: Tigrinya (Ethiopia)
-default charset: UTF-8
-
-OS Locale:  tig_ER
-default locale: ID: tig_ER, Name: Tigre (Eritrea)
-display locale: ID: tig_ER, Name: Tigre (Eritrea)
-format locale: ID: tig_ER, Name: Tigre (Eritrea)
-default charset: UTF-8
-
-OS Locale:  tig_ER.utf8
-default locale: ID: tig_ER, Name: Tigre (Eritrea)
-display locale: ID: tig_ER, Name: Tigre (Eritrea)
-format locale: ID: tig_ER, Name: Tigre (Eritrea)
-default charset: UTF-8
-
-OS Locale:  tl_PH
-default locale: ID: tl_PH, Name: Tagalog (Philippines)
-display locale: ID: tl_PH, Name: Tagalog (Philippines)
-format locale: ID: tl_PH, Name: Tagalog (Philippines)
-default charset: ISO-8859-1
-
-OS Locale:  tl_PH.iso88591
-default locale: ID: tl_PH, Name: Tagalog (Philippines)
-display locale: ID: tl_PH, Name: Tagalog (Philippines)
-format locale: ID: tl_PH, Name: Tagalog (Philippines)
-default charset: ISO-8859-1
-
-OS Locale:  tl_PH.utf8
-default locale: ID: tl_PH, Name: Tagalog (Philippines)
-display locale: ID: tl_PH, Name: Tagalog (Philippines)
-format locale: ID: tl_PH, Name: Tagalog (Philippines)
-default charset: UTF-8
-
-OS Locale:  tn_ZA
-default locale: ID: tn_ZA, Name: Tswana (South Africa)
-display locale: ID: tn_ZA, Name: Tswana (South Africa)
-format locale: ID: tn_ZA, Name: Tswana (South Africa)
-default charset: UTF-8
-
-OS Locale:  tn_ZA.utf8
-default locale: ID: tn_ZA, Name: Tswana (South Africa)
-display locale: ID: tn_ZA, Name: Tswana (South Africa)
-format locale: ID: tn_ZA, Name: Tswana (South Africa)
-default charset: UTF-8
-
-OS Locale:  tr_CY
-default locale: ID: tr_CY, Name: Turkish (Cyprus)
-display locale: ID: tr_CY, Name: Turkish (Cyprus)
-format locale: ID: tr_CY, Name: Turkish (Cyprus)
-default charset: ISO-8859-9
-
-OS Locale:  tr_CY.iso88599
-default locale: ID: tr_CY, Name: Turkish (Cyprus)
-display locale: ID: tr_CY, Name: Turkish (Cyprus)
-format locale: ID: tr_CY, Name: Turkish (Cyprus)
-default charset: ISO-8859-9
-
-OS Locale:  tr_CY.utf8
-default locale: ID: tr_CY, Name: Turkish (Cyprus)
-display locale: ID: tr_CY, Name: Turkish (Cyprus)
-format locale: ID: tr_CY, Name: Turkish (Cyprus)
-default charset: UTF-8
-
-OS Locale:  tr_TR
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR.iso88599
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR.utf8
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: UTF-8
-
-OS Locale:  ts_ZA
-default locale: ID: ts_ZA, Name: Tsonga (South Africa)
-display locale: ID: ts_ZA, Name: Tsonga (South Africa)
-format locale: ID: ts_ZA, Name: Tsonga (South Africa)
-default charset: UTF-8
-
-OS Locale:  ts_ZA.utf8
-default locale: ID: ts_ZA, Name: Tsonga (South Africa)
-display locale: ID: ts_ZA, Name: Tsonga (South Africa)
-format locale: ID: ts_ZA, Name: Tsonga (South Africa)
-default charset: UTF-8
-
-OS Locale:  tt_RU.utf8
-default locale: ID: tt_RU, Name: Tatar (Russia)
-display locale: ID: tt_RU, Name: Tatar (Russia)
-format locale: ID: tt_RU, Name: Tatar (Russia)
-default charset: UTF-8
-
-OS Locale:  turkish
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  uk_UA
-default locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-display locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-format locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-default charset: KOI8-U
-
-OS Locale:  uk_UA.koi8u
-default locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-display locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-format locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-default charset: KOI8-U
-
-OS Locale:  uk_UA.utf8
-default locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-display locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-format locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-default charset: UTF-8
-
-OS Locale:  ur_PK
-default locale: ID: ur_PK, Name: Urdu (Pakistan)
-display locale: ID: ur_PK, Name: Urdu (Pakistan)
-format locale: ID: ur_PK, Name: Urdu (Pakistan)
-default charset: UTF-8
-
-OS Locale:  ur_PK.utf8
-default locale: ID: ur_PK, Name: Urdu (Pakistan)
-display locale: ID: ur_PK, Name: Urdu (Pakistan)
-format locale: ID: ur_PK, Name: Urdu (Pakistan)
-default charset: UTF-8
-
-OS Locale:  uz_UZ
-default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-default charset: ISO-8859-1
-
-OS Locale:  uz_UZ.iso88591
-default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan)
-default charset: ISO-8859-1
-
-OS Locale:  uz_UZ.utf8@cyrillic
-default locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-display locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-format locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-default charset: UTF-8
-
-OS Locale:  uz_UZ@cyrillic
-default locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-display locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-format locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-default charset: UTF-8
-
-OS Locale:  ve_ZA
-default locale: ID: ve_ZA, Name: Venda (South Africa)
-display locale: ID: ve_ZA, Name: Venda (South Africa)
-format locale: ID: ve_ZA, Name: Venda (South Africa)
-default charset: UTF-8
-
-OS Locale:  ve_ZA.utf8
-default locale: ID: ve_ZA, Name: Venda (South Africa)
-display locale: ID: ve_ZA, Name: Venda (South Africa)
-format locale: ID: ve_ZA, Name: Venda (South Africa)
-default charset: UTF-8
-
-OS Locale:  vi_VN
-default locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-display locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-format locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-default charset: UTF-8
-
-OS Locale:  vi_VN.tcvn
-default locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-display locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-format locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-default charset: UTF-8
-
-OS Locale:  vi_VN.utf8
-default locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-display locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-format locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-default charset: UTF-8
-
-OS Locale:  wa_BE
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  wa_BE.iso88591
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  wa_BE.iso885915@euro
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  wa_BE.utf8
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: UTF-8
-
-OS Locale:  wa_BE@euro
-default locale: ID: wa_BE, Name: Walloon (Belgium)
-display locale: ID: wa_BE, Name: Walloon (Belgium)
-format locale: ID: wa_BE, Name: Walloon (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  xh_ZA
-default locale: ID: xh_ZA, Name: Xhosa (South Africa)
-display locale: ID: xh_ZA, Name: Xhosa (South Africa)
-format locale: ID: xh_ZA, Name: Xhosa (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  xh_ZA.iso88591
-default locale: ID: xh_ZA, Name: Xhosa (South Africa)
-display locale: ID: xh_ZA, Name: Xhosa (South Africa)
-format locale: ID: xh_ZA, Name: Xhosa (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  xh_ZA.utf8
-default locale: ID: xh_ZA, Name: Xhosa (South Africa)
-display locale: ID: xh_ZA, Name: Xhosa (South Africa)
-format locale: ID: xh_ZA, Name: Xhosa (South Africa)
-default charset: UTF-8
-
-OS Locale:  yi_US
-default locale: ID: ji_US, Name: Yiddish (United States)
-display locale: ID: ji_US, Name: Yiddish (United States)
-format locale: ID: ji_US, Name: Yiddish (United States)
-default charset: windows-1255
-
-OS Locale:  yi_US.cp1255
-default locale: ID: ji_US, Name: Yiddish (United States)
-display locale: ID: ji_US, Name: Yiddish (United States)
-format locale: ID: ji_US, Name: Yiddish (United States)
-default charset: windows-1255
-
-OS Locale:  yi_US.utf8
-default locale: ID: ji_US, Name: Yiddish (United States)
-display locale: ID: ji_US, Name: Yiddish (United States)
-format locale: ID: ji_US, Name: Yiddish (United States)
-default charset: UTF-8
-
-OS Locale:  zh_CN
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.gb18030
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.gb2312
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.gbk
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.utf8
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_HK
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: Big5-HKSCS
-
-OS Locale:  zh_HK.big5hkscs
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: Big5-HKSCS
-
-OS Locale:  zh_HK.utf8
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  zh_SG
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: zh_SG, Name: Chinese (Singapore)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: GB2312
-
-OS Locale:  zh_SG.gb2312
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: zh_SG, Name: Chinese (Singapore)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: GB2312
-
-OS Locale:  zh_SG.gbk
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: zh_SG, Name: Chinese (Singapore)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: GBK
-
-OS Locale:  zh_SG.utf8
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: zh_SG, Name: Chinese (Singapore)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: UTF-8
-
-OS Locale:  zh_TW
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: Big5
-
-OS Locale:  zh_TW.big5
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: Big5
-
-OS Locale:  zh_TW.euctw
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.utf8
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zu_ZA
-default locale: ID: zu_ZA, Name: Zulu (South Africa)
-display locale: ID: zu_ZA, Name: Zulu (South Africa)
-format locale: ID: zu_ZA, Name: Zulu (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  zu_ZA.iso88591
-default locale: ID: zu_ZA, Name: Zulu (South Africa)
-display locale: ID: zu_ZA, Name: Zulu (South Africa)
-format locale: ID: zu_ZA, Name: Zulu (South Africa)
-default charset: ISO-8859-1
-
-OS Locale:  zu_ZA.utf8
-default locale: ID: zu_ZA, Name: Zulu (South Africa)
-display locale: ID: zu_ZA, Name: Zulu (South Africa)
-format locale: ID: zu_ZA, Name: Zulu (South Africa)
-default charset: UTF-8
-
-Testing some typical combinations
-
-
-OS Locale (LC_CTYPE: ja_JP.UTF-8, LC_MESSAGES: zh_CN.UTF-8)
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: UTF-8
-
-OS Locale (LC_CTYPE: zh_CN.UTF-8, LC_MESSAGES: en_US.UTF-8)
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale (LC_CTYPE: C, LC_MESSAGES: zh_CN.UTF-8)
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: en_US, Name: English (United States)
-default charset: US-ASCII
--- a/test/java/util/Locale/data/deflocale.sol10	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1725 +0,0 @@
-                         Solaris 10 3/05 s10_74L2a SPARC
-
-                      (copyright from `uname -a` goes here)
-
-SunOS deltas4 5.10 Generic_142900-03 sun4u sparc SUNW,Sun-Blade-2500
-Testing all available locales
-
-OS Locale:  C
-default locale: ID: en, Name: English
-display locale: ID: en, Name: English
-format locale: ID: en, Name: English
-default charset: US-ASCII
-
-OS Locale:  POSIX
-default locale: ID: en, Name: English
-display locale: ID: en, Name: English
-format locale: ID: en, Name: English
-default charset: US-ASCII
-
-OS Locale:  ar
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: ISO-8859-6
-
-OS Locale:  ar_EG.UTF-8
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: UTF-8
-
-OS Locale:  ar_SA.UTF-8
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: UTF-8
-
-OS Locale:  bg_BG
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: ISO-8859-5
-
-OS Locale:  bg_BG.ISO8859-5
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: ISO-8859-5
-
-OS Locale:  ca
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES.ISO8859-1
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES.ISO8859-15
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  ca_ES.ISO8859-15@euro
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  cs_CZ
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ.ISO8859-2
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ.UTF-8
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: UTF-8
-
-OS Locale:  cs_CZ.UTF-8@euro
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: UTF-8
-
-OS Locale:  cz
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  da
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da.ISO8859-15
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-15
-
-OS Locale:  da_DK
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da_DK.ISO8859-1
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da_DK.ISO8859-15
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-15
-
-OS Locale:  da_DK.ISO8859-15@euro
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-15
-
-OS Locale:  de
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de.ISO8859-15
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de.UTF-8
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: UTF-8
-
-OS Locale:  de_AT
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT.ISO8859-1
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT.ISO8859-15
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-15
-
-OS Locale:  de_AT.ISO8859-15@euro
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-15
-
-OS Locale:  de_CH
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  de_CH.ISO8859-1
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE.ISO8859-1
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE.ISO8859-15
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de_DE.ISO8859-15@euro
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de_DE.UTF-8
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: UTF-8
-
-OS Locale:  de_DE.UTF-8@euro
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: UTF-8
-
-OS Locale:  el
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el.sun_eu_greek
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR.ISO8859-7
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR.ISO8859-7@euro
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  en_AU
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: ISO-8859-1
-
-OS Locale:  en_AU.ISO8859-1
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA.ISO8859-1
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA.UTF-8
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: UTF-8
-
-OS Locale:  en_GB
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  en_GB.ISO8859-1
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  en_GB.ISO8859-15
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  en_GB.ISO8859-15@euro
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  en_IE
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  en_IE.ISO8859-1
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  en_IE.ISO8859-15
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  en_IE.ISO8859-15@euro
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  en_NZ
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: ISO-8859-1
-
-OS Locale:  en_NZ.ISO8859-1
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: ISO-8859-1
-
-OS Locale:  en_US
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-1
-
-OS Locale:  en_US.ISO8859-1
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-1
-
-OS Locale:  en_US.ISO8859-15
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-15
-
-OS Locale:  en_US.ISO8859-15@euro
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-15
-
-OS Locale:  en_US.UTF-8
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: UTF-8
-
-OS Locale:  es
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es.ISO8859-15
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es.UTF-8
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: UTF-8
-
-OS Locale:  es_AR
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: ISO-8859-1
-
-OS Locale:  es_AR.ISO8859-1
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: ISO-8859-1
-
-OS Locale:  es_BO
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: ISO-8859-1
-
-OS Locale:  es_BO.ISO8859-1
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CL
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: ISO-8859-1
-
-OS Locale:  es_CL.ISO8859-1
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: ISO-8859-1
-
-OS Locale:  es_CO
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CO.ISO8859-1
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CR
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: ISO-8859-1
-
-OS Locale:  es_CR.ISO8859-1
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: ISO-8859-1
-
-OS Locale:  es_EC
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: ISO-8859-1
-
-OS Locale:  es_EC.ISO8859-1
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES.ISO8859-1
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES.ISO8859-15
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es_ES.ISO8859-15@euro
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es_ES.UTF-8
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: UTF-8
-
-OS Locale:  es_ES.UTF-8@euro
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: UTF-8
-
-OS Locale:  es_GT
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: ISO-8859-1
-
-OS Locale:  es_GT.ISO8859-1
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX.ISO8859-1
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX.UTF-8
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: UTF-8
-
-OS Locale:  es_NI
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: ISO-8859-1
-
-OS Locale:  es_NI.ISO8859-1
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: ISO-8859-1
-
-OS Locale:  es_PA
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: ISO-8859-1
-
-OS Locale:  es_PA.ISO8859-1
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: ISO-8859-1
-
-OS Locale:  es_PE
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: ISO-8859-1
-
-OS Locale:  es_PE.ISO8859-1
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: ISO-8859-1
-
-OS Locale:  es_PY
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_PY.ISO8859-1
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_SV
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: ISO-8859-1
-
-OS Locale:  es_SV.ISO8859-1
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: ISO-8859-1
-
-OS Locale:  es_UY
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_UY.ISO8859-1
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_VE
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: ISO-8859-1
-
-OS Locale:  es_VE.ISO8859-1
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: ISO-8859-1
-
-OS Locale:  et
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-15
-
-OS Locale:  et_EE
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-15
-
-OS Locale:  et_EE.ISO8859-15
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-15
-
-OS Locale:  fi
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi.ISO8859-15
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  fi_FI
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi_FI.ISO8859-1
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi_FI.ISO8859-15
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  fi_FI.ISO8859-15@euro
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  fi_FI.UTF-8
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: UTF-8
-
-OS Locale:  fr
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr.ISO8859-15
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr.UTF-8
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: UTF-8
-
-OS Locale:  fr_BE
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  fr_BE.ISO8859-1
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  fr_BE.ISO8859-15
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  fr_BE.ISO8859-15@euro
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  fr_BE.UTF-8
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: UTF-8
-
-OS Locale:  fr_BE.UTF-8@euro
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: UTF-8
-
-OS Locale:  fr_CA
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CA.ISO8859-1
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CA.UTF-8
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: UTF-8
-
-OS Locale:  fr_CH
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CH.ISO8859-1
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR.ISO8859-1
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR.ISO8859-15
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr_FR.ISO8859-15@euro
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr_FR.UTF-8
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: UTF-8
-
-OS Locale:  fr_FR.UTF-8@euro
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: UTF-8
-
-OS Locale:  he
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  he_IL
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  he_IL.UTF-8
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: UTF-8
-
-OS Locale:  hi_IN.UTF-8
-default locale: ID: hi_IN, Name: Hindi (India)
-display locale: ID: hi_IN, Name: Hindi (India)
-format locale: ID: hi_IN, Name: Hindi (India)
-default charset: UTF-8
-
-OS Locale:  hr_HR
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hr_HR.ISO8859-2
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hu
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU.ISO8859-2
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU.UTF-8
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: UTF-8
-
-OS Locale:  is_IS
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  is_IS.ISO8859-1
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  iso_8859_1
-default locale: ID: en, Name: English
-display locale: ID: en, Name: English
-format locale: ID: en, Name: English
-default charset: US-ASCII
-
-OS Locale:  it
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it.ISO8859-15
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  it.UTF-8
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: UTF-8
-
-OS Locale:  it_IT
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it_IT.ISO8859-1
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it_IT.ISO8859-15
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  it_IT.ISO8859-15@euro
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  it_IT.UTF-8
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: UTF-8
-
-OS Locale:  it_IT.UTF-8@euro
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: UTF-8
-
-OS Locale:  ja
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-eucJP-Open
-
-OS Locale:  ja_JP.PCK
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-PCK
-
-OS Locale:  ja_JP.UTF-8
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: UTF-8
-
-OS Locale:  ja_JP.eucJP
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-eucJP-Open
-
-OS Locale:  ko
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko.UTF-8
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: UTF-8
-
-OS Locale:  ko_KR.EUC
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko_KR.EUC@dict
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko_KR.UTF-8
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: UTF-8
-
-OS Locale:  ko_KR.UTF-8@dict
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: UTF-8
-
-OS Locale:  lt
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lt_LT
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lt_LT.ISO8859-13
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lv
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  lv_LV
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  lv_LV.ISO8859-13
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  mk_MK
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: ISO-8859-5
-
-OS Locale:  mk_MK.ISO8859-5
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: ISO-8859-5
-
-OS Locale:  nl
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl.ISO8859-15
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  nl_BE
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  nl_BE.ISO8859-1
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  nl_BE.ISO8859-15
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  nl_BE.ISO8859-15@euro
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  nl_NL
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl_NL.ISO8859-1
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl_NL.ISO8859-15
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  nl_NL.ISO8859-15@euro
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  no
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO.ISO8859-1@bokmal
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO.ISO8859-1@nynorsk
-default locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-display locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-default charset: ISO-8859-1
-
-OS Locale:  no_NY
-default locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-display locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-default charset: ISO-8859-1
-
-OS Locale:  nr
-default locale: ID: nr, Name: South Ndebele
-display locale: ID: nr, Name: South Ndebele
-format locale: ID: nr, Name: South Ndebele
-default charset: ISO-8859-2
-
-OS Locale:  pl
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl.UTF-8
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: UTF-8
-
-OS Locale:  pl_PL
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl_PL.ISO8859-2
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl_PL.UTF-8
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: UTF-8
-
-OS Locale:  pt
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt.ISO8859-15
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  pt_BR
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR.ISO8859-1
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR.UTF-8
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: UTF-8
-
-OS Locale:  pt_PT
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_PT.ISO8859-1
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_PT.ISO8859-15
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  pt_PT.ISO8859-15@euro
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  ro_RO
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ro_RO.ISO8859-2
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ru
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru.UTF-8
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: UTF-8
-
-OS Locale:  ru.koi8-r
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: KOI8-R
-
-OS Locale:  ru_RU
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru_RU.ANSI1251
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: windows-1251
-
-OS Locale:  ru_RU.ISO8859-5
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru_RU.KOI8-R
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: KOI8-R
-
-OS Locale:  ru_RU.UTF-8
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: UTF-8
-
-OS Locale:  sh_BA
-default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-display locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-default charset: ISO-8859-2
-
-OS Locale:  sh_BA.ISO8859-2@bosnia
-default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-display locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-default charset: ISO-8859-2
-
-OS Locale:  sk_SK
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  sk_SK.ISO8859-2
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  sl_SI
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  sl_SI.ISO8859-2
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  sq_AL
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: ISO-8859-2
-
-OS Locale:  sq_AL.ISO8859-2
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: ISO-8859-2
-
-OS Locale:  sr_SP
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sr_YU
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sr_YU.ISO8859-5
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sv
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv.ISO8859-15
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-15
-
-OS Locale:  sv.UTF-8
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: UTF-8
-
-OS Locale:  sv_SE
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv_SE.ISO8859-1
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv_SE.ISO8859-15
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-15
-
-OS Locale:  sv_SE.ISO8859-15@euro
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-15
-
-OS Locale:  sv_SE.UTF-8
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: UTF-8
-
-OS Locale:  sv_SE.UTF-8@euro
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: UTF-8
-
-OS Locale:  th
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.ISO8859-11
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.TIS620
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.UTF-8
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: UTF-8
-
-OS Locale:  tr
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR.ISO8859-9
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR.UTF-8
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: UTF-8
-
-OS Locale:  zh
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh.GBK
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh.UTF-8
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_CN.EUC
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.EUC@pinyin
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.EUC@radical
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.EUC@stroke
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.GB18030
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.GB18030@pinyin
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.GB18030@radical
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.GB18030@stroke
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.GBK
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.GBK@pinyin
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.GBK@radical
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.GBK@stroke
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.UTF-8
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_CN.UTF-8@pinyin
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_CN.UTF-8@radical
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_CN.UTF-8@stroke
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_HK.BIG5HK
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-Big5-HKSCS-2001
-
-OS Locale:  zh_HK.BIG5HK@radical
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-Big5-HKSCS-2001
-
-OS Locale:  zh_HK.BIG5HK@stroke
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-Big5-HKSCS-2001
-
-OS Locale:  zh_HK.UTF-8
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  zh_HK.UTF-8@radical
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  zh_HK.UTF-8@stroke
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  zh_TW
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.BIG5
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.BIG5@pinyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.BIG5@radical
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.BIG5@stroke
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.BIG5@zhuyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.EUC
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.EUC@pinyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.EUC@radical
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.EUC@stroke
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.EUC@zhuyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.UTF-8
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zh_TW.UTF-8@pinyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zh_TW.UTF-8@radical
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zh_TW.UTF-8@stroke
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zh_TW.UTF-8@zhuyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-Testing some typical combinations
-
-
-OS Locale (LC_CTYPE: ja_JP.UTF-8, LC_MESSAGES: zh_CN.UTF-8)
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: UTF-8
-
-OS Locale (LC_CTYPE: zh_CN.UTF-8, LC_MESSAGES: en_US.UTF-8)
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale (LC_CTYPE: C, LC_MESSAGES: zh_CN.UTF-8)
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: en_CN, Name: English (China)
-default charset: US-ASCII
--- a/test/java/util/Locale/data/deflocale.sol10.fmtasdefault	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1725 +0,0 @@
-                         Solaris 10 3/05 s10_74L2a SPARC
-
-                      (copyright from `uname -a` goes here)
-
-SunOS deltas4 5.10 Generic_142900-03 sun4u sparc SUNW,Sun-Blade-2500
-Testing all available locales
-
-OS Locale:  C
-default locale: ID: en, Name: English
-display locale: ID: en, Name: English
-format locale: ID: en, Name: English
-default charset: US-ASCII
-
-OS Locale:  POSIX
-default locale: ID: en, Name: English
-display locale: ID: en, Name: English
-format locale: ID: en, Name: English
-default charset: US-ASCII
-
-OS Locale:  ar
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: ISO-8859-6
-
-OS Locale:  ar_EG.UTF-8
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: ar_EG, Name: Arabic (Egypt)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: UTF-8
-
-OS Locale:  ar_SA.UTF-8
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: UTF-8
-
-OS Locale:  bg_BG
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: ISO-8859-5
-
-OS Locale:  bg_BG.ISO8859-5
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: ISO-8859-5
-
-OS Locale:  ca
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES.ISO8859-1
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  ca_ES.ISO8859-15
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  ca_ES.ISO8859-15@euro
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: ca_ES, Name: Catalan (Spain)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  cs_CZ
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ.ISO8859-2
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  cs_CZ.UTF-8
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: UTF-8
-
-OS Locale:  cs_CZ.UTF-8@euro
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: UTF-8
-
-OS Locale:  cz
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: cs_CZ, Name: Czech (Czech Republic)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: ISO-8859-2
-
-OS Locale:  da
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da.ISO8859-15
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-15
-
-OS Locale:  da_DK
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da_DK.ISO8859-1
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-1
-
-OS Locale:  da_DK.ISO8859-15
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-15
-
-OS Locale:  da_DK.ISO8859-15@euro
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: da_DK, Name: Danish (Denmark)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: ISO-8859-15
-
-OS Locale:  de
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de.ISO8859-15
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de.UTF-8
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: UTF-8
-
-OS Locale:  de_AT
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT.ISO8859-1
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-1
-
-OS Locale:  de_AT.ISO8859-15
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-15
-
-OS Locale:  de_AT.ISO8859-15@euro
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: de_AT, Name: German (Austria)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: ISO-8859-15
-
-OS Locale:  de_CH
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  de_CH.ISO8859-1
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: de_CH, Name: German (Switzerland)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE.ISO8859-1
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-1
-
-OS Locale:  de_DE.ISO8859-15
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de_DE.ISO8859-15@euro
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: ISO-8859-15
-
-OS Locale:  de_DE.UTF-8
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: UTF-8
-
-OS Locale:  de_DE.UTF-8@euro
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: de_DE, Name: German (Germany)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: UTF-8
-
-OS Locale:  el
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el.sun_eu_greek
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR.ISO8859-7
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  el_GR.ISO8859-7@euro
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: el_GR, Name: Greek (Greece)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: ISO-8859-7
-
-OS Locale:  en_AU
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: ISO-8859-1
-
-OS Locale:  en_AU.ISO8859-1
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_AU, Name: English (Australia)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA.ISO8859-1
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  en_CA.UTF-8
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_CA, Name: English (Canada)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: UTF-8
-
-OS Locale:  en_GB
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  en_GB.ISO8859-1
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-1
-
-OS Locale:  en_GB.ISO8859-15
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  en_GB.ISO8859-15@euro
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_GB, Name: English (United Kingdom)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: ISO-8859-15
-
-OS Locale:  en_IE
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  en_IE.ISO8859-1
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-1
-
-OS Locale:  en_IE.ISO8859-15
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  en_IE.ISO8859-15@euro
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_IE, Name: English (Ireland)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: ISO-8859-15
-
-OS Locale:  en_NZ
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: ISO-8859-1
-
-OS Locale:  en_NZ.ISO8859-1
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_NZ, Name: English (New Zealand)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: ISO-8859-1
-
-OS Locale:  en_US
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-1
-
-OS Locale:  en_US.ISO8859-1
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-1
-
-OS Locale:  en_US.ISO8859-15
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-15
-
-OS Locale:  en_US.ISO8859-15@euro
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: ISO-8859-15
-
-OS Locale:  en_US.UTF-8
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: UTF-8
-
-OS Locale:  es
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es.ISO8859-15
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es.UTF-8
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: UTF-8
-
-OS Locale:  es_AR
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: ISO-8859-1
-
-OS Locale:  es_AR.ISO8859-1
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: es_AR, Name: Spanish (Argentina)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: ISO-8859-1
-
-OS Locale:  es_BO
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: ISO-8859-1
-
-OS Locale:  es_BO.ISO8859-1
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: es_BO, Name: Spanish (Bolivia)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CL
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: ISO-8859-1
-
-OS Locale:  es_CL.ISO8859-1
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: es_CL, Name: Spanish (Chile)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: ISO-8859-1
-
-OS Locale:  es_CO
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CO.ISO8859-1
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: es_CO, Name: Spanish (Colombia)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: ISO-8859-1
-
-OS Locale:  es_CR
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: ISO-8859-1
-
-OS Locale:  es_CR.ISO8859-1
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: es_CR, Name: Spanish (Costa Rica)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: ISO-8859-1
-
-OS Locale:  es_EC
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: ISO-8859-1
-
-OS Locale:  es_EC.ISO8859-1
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: es_EC, Name: Spanish (Ecuador)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES.ISO8859-1
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-1
-
-OS Locale:  es_ES.ISO8859-15
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es_ES.ISO8859-15@euro
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: ISO-8859-15
-
-OS Locale:  es_ES.UTF-8
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: UTF-8
-
-OS Locale:  es_ES.UTF-8@euro
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: es_ES, Name: Spanish (Spain)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: UTF-8
-
-OS Locale:  es_GT
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: ISO-8859-1
-
-OS Locale:  es_GT.ISO8859-1
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: es_GT, Name: Spanish (Guatemala)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX.ISO8859-1
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: ISO-8859-1
-
-OS Locale:  es_MX.UTF-8
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: es_MX, Name: Spanish (Mexico)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: UTF-8
-
-OS Locale:  es_NI
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: ISO-8859-1
-
-OS Locale:  es_NI.ISO8859-1
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: es_NI, Name: Spanish (Nicaragua)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: ISO-8859-1
-
-OS Locale:  es_PA
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: ISO-8859-1
-
-OS Locale:  es_PA.ISO8859-1
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: es_PA, Name: Spanish (Panama)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: ISO-8859-1
-
-OS Locale:  es_PE
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: ISO-8859-1
-
-OS Locale:  es_PE.ISO8859-1
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: es_PE, Name: Spanish (Peru)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: ISO-8859-1
-
-OS Locale:  es_PY
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_PY.ISO8859-1
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: es_PY, Name: Spanish (Paraguay)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_SV
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: ISO-8859-1
-
-OS Locale:  es_SV.ISO8859-1
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: es_SV, Name: Spanish (El Salvador)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: ISO-8859-1
-
-OS Locale:  es_UY
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_UY.ISO8859-1
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: es_UY, Name: Spanish (Uruguay)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: ISO-8859-1
-
-OS Locale:  es_VE
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: ISO-8859-1
-
-OS Locale:  es_VE.ISO8859-1
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: es_VE, Name: Spanish (Venezuela)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: ISO-8859-1
-
-OS Locale:  et
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-15
-
-OS Locale:  et_EE
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-15
-
-OS Locale:  et_EE.ISO8859-15
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: et_EE, Name: Estonian (Estonia)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: ISO-8859-15
-
-OS Locale:  fi
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi.ISO8859-15
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  fi_FI
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi_FI.ISO8859-1
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-1
-
-OS Locale:  fi_FI.ISO8859-15
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  fi_FI.ISO8859-15@euro
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: ISO-8859-15
-
-OS Locale:  fi_FI.UTF-8
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: fi_FI, Name: Finnish (Finland)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: UTF-8
-
-OS Locale:  fr
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr.ISO8859-15
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr.UTF-8
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: UTF-8
-
-OS Locale:  fr_BE
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  fr_BE.ISO8859-1
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  fr_BE.ISO8859-15
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  fr_BE.ISO8859-15@euro
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  fr_BE.UTF-8
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: UTF-8
-
-OS Locale:  fr_BE.UTF-8@euro
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: fr_BE, Name: French (Belgium)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: UTF-8
-
-OS Locale:  fr_CA
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CA.ISO8859-1
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CA.UTF-8
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: fr_CA, Name: French (Canada)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: UTF-8
-
-OS Locale:  fr_CH
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  fr_CH.ISO8859-1
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: fr_CH, Name: French (Switzerland)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR.ISO8859-1
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-1
-
-OS Locale:  fr_FR.ISO8859-15
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr_FR.ISO8859-15@euro
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: ISO-8859-15
-
-OS Locale:  fr_FR.UTF-8
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: UTF-8
-
-OS Locale:  fr_FR.UTF-8@euro
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: fr_FR, Name: French (France)
-format locale: ID: fr_FR, Name: French (France)
-default charset: UTF-8
-
-OS Locale:  he
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  he_IL
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: ISO-8859-8
-
-OS Locale:  he_IL.UTF-8
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: iw_IL, Name: Hebrew (Israel)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: UTF-8
-
-OS Locale:  hi_IN.UTF-8
-default locale: ID: hi_IN, Name: Hindi (India)
-display locale: ID: hi_IN, Name: Hindi (India)
-format locale: ID: hi_IN, Name: Hindi (India)
-default charset: UTF-8
-
-OS Locale:  hr_HR
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hr_HR.ISO8859-2
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: hr_HR, Name: Croatian (Croatia)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: ISO-8859-2
-
-OS Locale:  hu
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU.ISO8859-2
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: ISO-8859-2
-
-OS Locale:  hu_HU.UTF-8
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: hu_HU, Name: Hungarian (Hungary)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: UTF-8
-
-OS Locale:  is_IS
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  is_IS.ISO8859-1
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: is_IS, Name: Icelandic (Iceland)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: ISO-8859-1
-
-OS Locale:  iso_8859_1
-default locale: ID: en, Name: English
-display locale: ID: en, Name: English
-format locale: ID: en, Name: English
-default charset: US-ASCII
-
-OS Locale:  it
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it.ISO8859-15
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  it.UTF-8
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: UTF-8
-
-OS Locale:  it_IT
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it_IT.ISO8859-1
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-1
-
-OS Locale:  it_IT.ISO8859-15
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  it_IT.ISO8859-15@euro
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: ISO-8859-15
-
-OS Locale:  it_IT.UTF-8
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: UTF-8
-
-OS Locale:  it_IT.UTF-8@euro
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: it_IT, Name: Italian (Italy)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: UTF-8
-
-OS Locale:  ja
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-eucJP-Open
-
-OS Locale:  ja_JP.PCK
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-PCK
-
-OS Locale:  ja_JP.UTF-8
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: UTF-8
-
-OS Locale:  ja_JP.eucJP
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: x-eucJP-Open
-
-OS Locale:  ko
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko.UTF-8
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: UTF-8
-
-OS Locale:  ko_KR.EUC
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko_KR.EUC@dict
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: EUC-KR
-
-OS Locale:  ko_KR.UTF-8
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: UTF-8
-
-OS Locale:  ko_KR.UTF-8@dict
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: ko_KR, Name: Korean (South Korea)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: UTF-8
-
-OS Locale:  lt
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lt_LT
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lt_LT.ISO8859-13
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: ISO-8859-13
-
-OS Locale:  lv
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  lv_LV
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  lv_LV.ISO8859-13
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: lv_LV, Name: Latvian (Latvia)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: ISO-8859-13
-
-OS Locale:  mk_MK
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: ISO-8859-5
-
-OS Locale:  mk_MK.ISO8859-5
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: mk_MK, Name: Macedonian (Macedonia)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: ISO-8859-5
-
-OS Locale:  nl
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl.ISO8859-15
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  nl_BE
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  nl_BE.ISO8859-1
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-1
-
-OS Locale:  nl_BE.ISO8859-15
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  nl_BE.ISO8859-15@euro
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: nl_BE, Name: Dutch (Belgium)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: ISO-8859-15
-
-OS Locale:  nl_NL
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl_NL.ISO8859-1
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-1
-
-OS Locale:  nl_NL.ISO8859-15
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  nl_NL.ISO8859-15@euro
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: nl_NL, Name: Dutch (Netherlands)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: ISO-8859-15
-
-OS Locale:  no
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO.ISO8859-1@bokmal
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: no_NO, Name: Norwegian (Norway)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: ISO-8859-1
-
-OS Locale:  no_NO.ISO8859-1@nynorsk
-default locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-display locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-default charset: ISO-8859-1
-
-OS Locale:  no_NY
-default locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-display locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-default charset: ISO-8859-1
-
-OS Locale:  nr
-default locale: ID: nr, Name: South Ndebele
-display locale: ID: nr, Name: South Ndebele
-format locale: ID: nr, Name: South Ndebele
-default charset: ISO-8859-2
-
-OS Locale:  pl
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl.UTF-8
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: UTF-8
-
-OS Locale:  pl_PL
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl_PL.ISO8859-2
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: ISO-8859-2
-
-OS Locale:  pl_PL.UTF-8
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: pl_PL, Name: Polish (Poland)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: UTF-8
-
-OS Locale:  pt
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt.ISO8859-15
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  pt_BR
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR.ISO8859-1
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: ISO-8859-1
-
-OS Locale:  pt_BR.UTF-8
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: pt_BR, Name: Portuguese (Brazil)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: UTF-8
-
-OS Locale:  pt_PT
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_PT.ISO8859-1
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-1
-
-OS Locale:  pt_PT.ISO8859-15
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  pt_PT.ISO8859-15@euro
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: pt_PT, Name: Portuguese (Portugal)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: ISO-8859-15
-
-OS Locale:  ro_RO
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ro_RO.ISO8859-2
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: ro_RO, Name: Romanian (Romania)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: ISO-8859-2
-
-OS Locale:  ru
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru.UTF-8
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: UTF-8
-
-OS Locale:  ru.koi8-r
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: KOI8-R
-
-OS Locale:  ru_RU
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru_RU.ANSI1251
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: windows-1251
-
-OS Locale:  ru_RU.ISO8859-5
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: ISO-8859-5
-
-OS Locale:  ru_RU.KOI8-R
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: KOI8-R
-
-OS Locale:  ru_RU.UTF-8
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: ru_RU, Name: Russian (Russia)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: UTF-8
-
-OS Locale:  sh_BA
-default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-display locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-default charset: ISO-8859-2
-
-OS Locale:  sh_BA.ISO8859-2@bosnia
-default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-display locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina)
-default charset: ISO-8859-2
-
-OS Locale:  sk_SK
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  sk_SK.ISO8859-2
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: sk_SK, Name: Slovak (Slovakia)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: ISO-8859-2
-
-OS Locale:  sl_SI
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  sl_SI.ISO8859-2
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: sl_SI, Name: Slovenian (Slovenia)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: ISO-8859-2
-
-OS Locale:  sq_AL
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: ISO-8859-2
-
-OS Locale:  sq_AL.ISO8859-2
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: sq_AL, Name: Albanian (Albania)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: ISO-8859-2
-
-OS Locale:  sr_SP
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sr_YU
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sr_YU.ISO8859-5
-default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro)
-default charset: ISO-8859-5
-
-OS Locale:  sv
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv.ISO8859-15
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-15
-
-OS Locale:  sv.UTF-8
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: UTF-8
-
-OS Locale:  sv_SE
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv_SE.ISO8859-1
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-1
-
-OS Locale:  sv_SE.ISO8859-15
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-15
-
-OS Locale:  sv_SE.ISO8859-15@euro
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: ISO-8859-15
-
-OS Locale:  sv_SE.UTF-8
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: UTF-8
-
-OS Locale:  sv_SE.UTF-8@euro
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: sv_SE, Name: Swedish (Sweden)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: UTF-8
-
-OS Locale:  th
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.ISO8859-11
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.TIS620
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: TIS-620
-
-OS Locale:  th_TH.UTF-8
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: th_TH, Name: Thai (Thailand)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: UTF-8
-
-OS Locale:  tr
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR.ISO8859-9
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: ISO-8859-9
-
-OS Locale:  tr_TR.UTF-8
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: tr_TR, Name: Turkish (Turkey)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: UTF-8
-
-OS Locale:  zh
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh.GBK
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh.UTF-8
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_CN.EUC
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.EUC@pinyin
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.EUC@radical
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.EUC@stroke
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB2312
-
-OS Locale:  zh_CN.GB18030
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.GB18030@pinyin
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.GB18030@radical
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.GB18030@stroke
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GB18030
-
-OS Locale:  zh_CN.GBK
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.GBK@pinyin
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.GBK@radical
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.GBK@stroke
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale:  zh_CN.UTF-8
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_CN.UTF-8@pinyin
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_CN.UTF-8@radical
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_CN.UTF-8@stroke
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale:  zh_HK.BIG5HK
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-Big5-HKSCS-2001
-
-OS Locale:  zh_HK.BIG5HK@radical
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-Big5-HKSCS-2001
-
-OS Locale:  zh_HK.BIG5HK@stroke
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-Big5-HKSCS-2001
-
-OS Locale:  zh_HK.UTF-8
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  zh_HK.UTF-8@radical
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  zh_HK.UTF-8@stroke
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: zh_HK, Name: Chinese (Hong Kong)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: UTF-8
-
-OS Locale:  zh_TW
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.BIG5
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.BIG5@pinyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.BIG5@radical
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.BIG5@stroke
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.BIG5@zhuyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-Big5-Solaris
-
-OS Locale:  zh_TW.EUC
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.EUC@pinyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.EUC@radical
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.EUC@stroke
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.EUC@zhuyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-EUC-TW
-
-OS Locale:  zh_TW.UTF-8
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zh_TW.UTF-8@pinyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zh_TW.UTF-8@radical
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zh_TW.UTF-8@stroke
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-OS Locale:  zh_TW.UTF-8@zhuyin
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: zh_TW, Name: Chinese (Taiwan)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: UTF-8
-
-Testing some typical combinations
-
-
-OS Locale (LC_CTYPE: ja_JP.UTF-8, LC_MESSAGES: zh_CN.UTF-8)
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: UTF-8
-
-OS Locale (LC_CTYPE: zh_CN.UTF-8, LC_MESSAGES: en_US.UTF-8)
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: UTF-8
-
-OS Locale (LC_CTYPE: C, LC_MESSAGES: zh_CN.UTF-8)
-default locale: ID: en, Name: English
-display locale: ID: zh_CN, Name: Chinese (China)
-format locale: ID: en, Name: English
-default charset: US-ASCII
--- a/test/java/util/Locale/data/deflocale.win7	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1494 +0,0 @@
-# OSVersionInfo
-# MajorVersion: 6
-# MinorVersion: 1
-# BuildNumber: 7600
-# CSDVersion: 
-
-
-OS Locale (lcid: 7f, name: ): Invariant Language (Invariant Country) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: windows-1252
-
-OS Locale (lcid: 401, name: ar-SA): Arabic (Saudi Arabia) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: windows-1252
-
-OS Locale (lcid: 402, name: bg-BG): Bulgarian (Bulgaria) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: windows-1252
-
-OS Locale (lcid: 403, name: ca-ES): Catalan (Spain) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: windows-1252
-
-OS Locale (lcid: 404, name: zh-TW): Chinese (Traditional) (Taiwan) - 950
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: windows-1252
-
-OS Locale (lcid: 405, name: cs-CZ): Czech (Czech Republic) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: windows-1252
-
-OS Locale (lcid: 406, name: da-DK): Danish (Denmark) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: windows-1252
-
-OS Locale (lcid: 407, name: de-DE): German (Germany) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 408, name: el-GR): Greek (Greece) - 1253
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: windows-1252
-
-OS Locale (lcid: 409, name: en-US): English (United States) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: windows-1252
-
-OS Locale (lcid: 40b, name: fi-FI): Finnish (Finland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 40c, name: fr-FR): French (France) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_FR, Name: French (France)
-default charset: windows-1252
-
-OS Locale (lcid: 40d, name: he-IL): Hebrew (Israel) - 1255
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: windows-1252
-
-OS Locale (lcid: 40e, name: hu-HU): Hungarian (Hungary) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: windows-1252
-
-OS Locale (lcid: 40f, name: is-IS): Icelandic (Iceland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: windows-1252
-
-OS Locale (lcid: 410, name: it-IT): Italian (Italy) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: windows-1252
-
-OS Locale (lcid: 411, name: ja-JP): Japanese (Japan) - 932
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: windows-1252
-
-OS Locale (lcid: 412, name: ko-KR): Korean (Korea) - 949
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: windows-1252
-
-OS Locale (lcid: 413, name: nl-NL): Dutch (Netherlands) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: windows-1252
-
-OS Locale (lcid: 414, name: nb-NO): Norwegian (Bokm…l) (Norway) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: windows-1252
-
-OS Locale (lcid: 415, name: pl-PL): Polish (Poland) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: windows-1252
-
-OS Locale (lcid: 416, name: pt-BR): Portuguese (Brazil) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: windows-1252
-
-OS Locale (lcid: 417, name: rm-CH): Romansh (Switzerland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: rm_CH, Name: Raeto-Romance (Switzerland)
-default charset: windows-1252
-
-OS Locale (lcid: 418, name: ro-RO): Romanian (Romania) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: windows-1252
-
-OS Locale (lcid: 419, name: ru-RU): Russian (Russia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: windows-1252
-
-OS Locale (lcid: 41a, name: hr-HR): Croatian (Croatia) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: windows-1252
-
-OS Locale (lcid: 41b, name: sk-SK): Slovak (Slovakia) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: windows-1252
-
-OS Locale (lcid: 41c, name: sq-AL): Albanian (Albania) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: windows-1252
-
-OS Locale (lcid: 41d, name: sv-SE): Swedish (Sweden) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 41e, name: th-TH): Thai (Thailand) - 874
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: windows-1252
-
-OS Locale (lcid: 41f, name: tr-TR): Turkish (Turkey) - 1254
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: windows-1252
-
-OS Locale (lcid: 420, name: ur-PK): Urdu (Islamic Republic of Pakistan) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ur_PK, Name: Urdu (Pakistan)
-default charset: windows-1252
-
-OS Locale (lcid: 421, name: id-ID): Indonesian (Indonesia) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: in_ID, Name: Indonesian (Indonesia)
-default charset: windows-1252
-
-OS Locale (lcid: 422, name: uk-UA): Ukrainian (Ukraine) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-default charset: windows-1252
-
-OS Locale (lcid: 423, name: be-BY): Belarusian (Belarus) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: be_BY, Name: Belarusian (Belarus)
-default charset: windows-1252
-
-OS Locale (lcid: 424, name: sl-SI): Slovenian (Slovenia) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: windows-1252
-
-OS Locale (lcid: 425, name: et-EE): Estonian (Estonia) - 1257
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: windows-1252
-
-OS Locale (lcid: 426, name: lv-LV): Latvian (Latvia) - 1257
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: windows-1252
-
-OS Locale (lcid: 427, name: lt-LT): Lithuanian (Lithuania) - 1257
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: windows-1252
-
-OS Locale (lcid: 428, name: tg-Cyrl-TJ): Tajik (Cyrillic) (Tajikistan) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tg_TJ_#Cyrl, Name: Tajik (Cyrillic,Tajikistan)
-default charset: windows-1252
-
-OS Locale (lcid: 428, name: tg-Cyrl): Tajik (Cyrillic) (Tajikistan) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tg_TJ_#Cyrl, Name: Tajik (Cyrillic,Tajikistan)
-default charset: windows-1252
-
-OS Locale (lcid: 429, name: fa-IR): Persian (Iran) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fa_IR, Name: Persian (Iran)
-default charset: windows-1252
-
-OS Locale (lcid: 42a, name: vi-VN): Vietnamese (Vietnam) - 1258
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-default charset: windows-1252
-
-OS Locale (lcid: 42b, name: hy-AM): Armenian (Armenia) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hy_AM, Name: Armenian (Armenia)
-default charset: windows-1252
-
-OS Locale (lcid: 42c, name: az-Latn-AZ): Azeri (Latin) (Azerbaijan) - 1254
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: az_AZ_#Latn, Name: Azerbaijani (Latin,Azerbaijan)
-default charset: windows-1252
-
-OS Locale (lcid: 42c, name: az-Latn): Azeri (Latin) (Azerbaijan) - 1254
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: az_AZ_#Latn, Name: Azerbaijani (Latin,Azerbaijan)
-default charset: windows-1252
-
-OS Locale (lcid: 42d, name: eu-ES): Basque (Spain) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: windows-1252
-
-OS Locale (lcid: 42e, name: hsb-DE): Upper Sorbian (Germany) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 42e, name: hsb): Upper Sorbian (Germany) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 42f, name: mk-MK): Macedonian (FYROM) (Macedonia (FYROM)) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: windows-1252
-
-OS Locale (lcid: 432, name: tn-ZA): Setswana (South Africa) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tn_ZA, Name: Tswana (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 434, name: xh-ZA): isiXhosa (South Africa) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: xh_ZA, Name: Xhosa (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 435, name: zu-ZA): isiZulu (South Africa) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zu_ZA, Name: Zulu (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 436, name: af-ZA): Afrikaans (South Africa) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: af_ZA, Name: Afrikaans (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 437, name: ka-GE): Georgian (Georgia) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ka_GE, Name: Georgian (Georgia)
-default charset: windows-1252
-
-OS Locale (lcid: 438, name: fo-FO): Faroese (Faroe Islands) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-default charset: windows-1252
-
-OS Locale (lcid: 439, name: hi-IN): Hindi (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hi_IN, Name: Hindi (India)
-default charset: windows-1252
-
-OS Locale (lcid: 43a, name: mt-MT): Maltese (Malta) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mt_MT, Name: Maltese (Malta)
-default charset: windows-1252
-
-OS Locale (lcid: 43b, name: se-NO): Sami (Northern) (Norway) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: se_NO, Name: Northern Sami (Norway)
-default charset: windows-1252
-
-OS Locale (lcid: 43e, name: ms-MY): Malay (Malaysia) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ms_MY, Name: Malay (Malaysia)
-default charset: windows-1252
-
-OS Locale (lcid: 43f, name: kk-KZ): Kazakh (Kazakhstan) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-default charset: windows-1252
-
-OS Locale (lcid: 440, name: ky-KG): Kyrgyz (Kyrgyzstan) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-default charset: windows-1252
-
-OS Locale (lcid: 441, name: sw-KE): Kiswahili (Kenya) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sw_KE, Name: Swahili (Kenya)
-default charset: windows-1252
-
-OS Locale (lcid: 442, name: tk-TM): Turkmen (Turkmenistan) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tk_TM, Name: Turkmen (Turkmenistan)
-default charset: windows-1252
-
-OS Locale (lcid: 443, name: uz-Latn): Uzbek (Latin) (Uzbekistan) - 1254
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uz_UZ_#Latn, Name: Uzbek (Latin,Uzbekistan)
-default charset: windows-1252
-
-OS Locale (lcid: 443, name: uz-Latn-UZ): Uzbek (Latin) (Uzbekistan) - 1254
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uz_UZ_#Latn, Name: Uzbek (Latin,Uzbekistan)
-default charset: windows-1252
-
-OS Locale (lcid: 444, name: tt-RU): Tatar (Russia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tt_RU, Name: Tatar (Russia)
-default charset: windows-1252
-
-OS Locale (lcid: 445, name: bn-IN): Bengali (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bn_IN, Name: Bengali (India)
-default charset: windows-1252
-
-OS Locale (lcid: 446, name: pa-IN): Punjabi (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: pa_IN, Name: Panjabi (India)
-default charset: windows-1252
-
-OS Locale (lcid: 447, name: gu-IN): Gujarati (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gu_IN, Name: Gujarati (India)
-default charset: windows-1252
-
-OS Locale (lcid: 448, name: or-IN): Oriya (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: or_IN, Name: Oriya (India)
-default charset: windows-1252
-
-OS Locale (lcid: 449, name: ta-IN): Tamil (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ta_IN, Name: Tamil (India)
-default charset: windows-1252
-
-OS Locale (lcid: 44a, name: te-IN): Telugu (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: te_IN, Name: Telugu (India)
-default charset: windows-1252
-
-OS Locale (lcid: 44b, name: kn-IN): Kannada (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kn_IN, Name: Kannada (India)
-default charset: windows-1252
-
-OS Locale (lcid: 44c, name: ml-IN): Malayalam (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ml_IN, Name: Malayalam (India)
-default charset: windows-1252
-
-OS Locale (lcid: 44d, name: as-IN): Assamese (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: as_IN, Name: Assamese (India)
-default charset: windows-1252
-
-OS Locale (lcid: 44e, name: mr-IN): Marathi (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mr_IN, Name: Marathi (India)
-default charset: windows-1252
-
-OS Locale (lcid: 44f, name: sa-IN): Sanskrit (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sa_IN, Name: Sanskrit (India)
-default charset: windows-1252
-
-OS Locale (lcid: 450, name: mn-MN): Mongolian (Cyrillic) (Mongolia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mn_MN, Name: Mongolian (Mongolia)
-default charset: windows-1252
-
-OS Locale (lcid: 450, name: mn-Cyrl): Mongolian (Cyrillic) (Mongolia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mn_MN, Name: Mongolian (Mongolia)
-default charset: windows-1252
-
-OS Locale (lcid: 451, name: bo-CN): Tibetan (People's Republic of China) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bo_CN, Name: Tibetan (China)
-default charset: windows-1252
-
-OS Locale (lcid: 452, name: cy-GB): Welsh (United Kingdom) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: cy_GB, Name: Welsh (United Kingdom)
-default charset: windows-1252
-
-OS Locale (lcid: 453, name: km-KH): Khmer (Cambodia) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: km_KH, Name: Khmer (Cambodia)
-default charset: windows-1252
-
-OS Locale (lcid: 454, name: lo-LA): Lao (Lao P.D.R.) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: lo_LA, Name: Lao (Laos)
-default charset: windows-1252
-
-OS Locale (lcid: 456, name: gl-ES): Galician (Spain) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: windows-1252
-
-OS Locale (lcid: 457, name: kok-IN): Konkani (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kok_IN, Name: Konkani (India)
-default charset: windows-1252
-
-OS Locale (lcid: 457, name: kok): Konkani (India) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kok_IN, Name: Konkani (India)
-default charset: windows-1252
-
-OS Locale (lcid: 45a, name: syr): Syriac (Syria) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: syr_SY, Name: Syriac (Syria)
-default charset: windows-1252
-
-OS Locale (lcid: 45a, name: syr-SY): Syriac (Syria) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: syr_SY, Name: Syriac (Syria)
-default charset: windows-1252
-
-OS Locale (lcid: 45b, name: si-LK): Sinhala (Sri Lanka) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-default charset: windows-1252
-
-OS Locale (lcid: 45d, name: iu-Cans-CA): Inuktitut (Syllabics) (Canada) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iu_CA_#Cans, Name: Inuktitut (Unified Canadian Aboriginal Syllabics,Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 45d, name: iu-Cans): Inuktitut (Syllabics) (Canada) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iu_CA_#Cans, Name: Inuktitut (Unified Canadian Aboriginal Syllabics,Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 45e, name: am-ET): Amharic (Ethiopia) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: am_ET, Name: Amharic (Ethiopia)
-default charset: windows-1252
-
-OS Locale (lcid: 461, name: ne-NP): Nepali (Nepal) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ne_NP, Name: Nepali (Nepal)
-default charset: windows-1252
-
-OS Locale (lcid: 462, name: fy-NL): Frisian (Netherlands) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fy_NL, Name: Frisian (Netherlands)
-default charset: windows-1252
-
-OS Locale (lcid: 463, name: ps-AF): Pashto (Afghanistan) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ps_AF, Name: Pushto (Afghanistan)
-default charset: windows-1252
-
-OS Locale (lcid: 464, name: fil-PH): Filipino (Philippines) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fil_PH, Name: Filipino (Philippines)
-default charset: windows-1252
-
-OS Locale (lcid: 464, name: fil): Filipino (Philippines) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fil_PH, Name: Filipino (Philippines)
-default charset: windows-1252
-
-OS Locale (lcid: 465, name: dv-MV): Divehi (Maldives) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: dv_MV, Name: Divehi (Maldives)
-default charset: windows-1252
-
-OS Locale (lcid: 468, name: ha-Latn-NG): Hausa (Latin) (Nigeria) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ha_NG_#Latn, Name: Hausa (Latin,Nigeria)
-default charset: windows-1252
-
-OS Locale (lcid: 468, name: ha-Latn): Hausa (Latin) (Nigeria) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ha_NG_#Latn, Name: Hausa (Latin,Nigeria)
-default charset: windows-1252
-
-OS Locale (lcid: 46a, name: yo-NG): Yoruba (Nigeria) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: yo_NG, Name: Yoruba (Nigeria)
-default charset: windows-1252
-
-OS Locale (lcid: 46b, name: quz): Quechua (Bolivia) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: quz_BO, Name: quz (Bolivia)
-default charset: windows-1252
-
-OS Locale (lcid: 46b, name: quz-BO): Quechua (Bolivia) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: quz_BO, Name: quz (Bolivia)
-default charset: windows-1252
-
-OS Locale (lcid: 46c, name: nso): Sesotho sa Leboa (South Africa) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: nso_ZA, Name: Pedi (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 46c, name: nso-ZA): Sesotho sa Leboa (South Africa) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: nso_ZA, Name: Pedi (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 46d, name: ba-RU): Bashkir (Russia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ba_RU, Name: Bashkir (Russia)
-default charset: windows-1252
-
-OS Locale (lcid: 46e, name: lb-LU): Luxembourgish (Luxembourg) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: lb_LU, Name: Luxembourgish (Luxembourg)
-default charset: windows-1252
-
-OS Locale (lcid: 46f, name: kl-GL): Greenlandic (Greenland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kl_GL, Name: Greenlandic (Greenland)
-default charset: windows-1252
-
-OS Locale (lcid: 470, name: ig-NG): Igbo (Nigeria) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ig_NG, Name: Igbo (Nigeria)
-default charset: windows-1252
-
-OS Locale (lcid: 478, name: ii-CN): Yi (People's Republic of China) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ii_CN, Name: Sichuan Yi (China)
-default charset: windows-1252
-
-OS Locale (lcid: 47a, name: arn): Mapudungun (Chile) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: arn_CL, Name: Mapudungun (Chile)
-default charset: windows-1252
-
-OS Locale (lcid: 47a, name: arn-CL): Mapudungun (Chile) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: arn_CL, Name: Mapudungun (Chile)
-default charset: windows-1252
-
-OS Locale (lcid: 47c, name: moh): Mohawk (Canada) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: moh_CA, Name: Mohawk (Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 47c, name: moh-CA): Mohawk (Canada) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: moh_CA, Name: Mohawk (Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 47e, name: br-FR): Breton (France) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: windows-1252
-
-OS Locale (lcid: 480, name: ug-CN): Uyghur (People's Republic of China) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ug_CN, Name: Uighur (China)
-default charset: windows-1252
-
-OS Locale (lcid: 481, name: mi-NZ): Maori (New Zealand) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mi_NZ, Name: Maori (New Zealand)
-default charset: windows-1252
-
-OS Locale (lcid: 482, name: oc-FR): Occitan (France) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: oc_FR, Name: Occitan (France)
-default charset: windows-1252
-
-OS Locale (lcid: 483, name: co-FR): Corsican (France) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: co_FR, Name: Corsican (France)
-default charset: windows-1252
-
-OS Locale (lcid: 484, name: gsw): Alsatian (France) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gsw_FR, Name: Swiss German (France)
-default charset: windows-1252
-
-OS Locale (lcid: 484, name: gsw-FR): Alsatian (France) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gsw_FR, Name: Swiss German (France)
-default charset: windows-1252
-
-OS Locale (lcid: 485, name: sah): Yakut (Russia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sah_RU, Name: Yakut (Russia)
-default charset: windows-1252
-
-OS Locale (lcid: 485, name: sah-RU): Yakut (Russia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sah_RU, Name: Yakut (Russia)
-default charset: windows-1252
-
-OS Locale (lcid: 486, name: qut): K'iche (Guatemala) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: qut_GT, Name: qut (Guatemala)
-default charset: windows-1252
-
-OS Locale (lcid: 486, name: qut-GT): K'iche (Guatemala) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: qut_GT, Name: qut (Guatemala)
-default charset: windows-1252
-
-OS Locale (lcid: 487, name: rw-RW): Kinyarwanda (Rwanda) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-default charset: windows-1252
-
-OS Locale (lcid: 488, name: wo-SN): Wolof (Senegal) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: wo_SN, Name: Wolof (Senegal)
-default charset: windows-1252
-
-OS Locale (lcid: 48c, name: prs): Dari (Afghanistan) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: prs_AF, Name: prs (Afghanistan)
-default charset: windows-1252
-
-OS Locale (lcid: 48c, name: prs-AF): Dari (Afghanistan) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: prs_AF, Name: prs (Afghanistan)
-default charset: windows-1252
-
-OS Locale (lcid: 491, name: gd-GB): Scottish Gaelic (United Kingdom) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-default charset: windows-1252
-
-OS Locale (lcid: 801, name: ar-IQ): Arabic (Iraq) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_IQ, Name: Arabic (Iraq)
-default charset: windows-1252
-
-OS Locale (lcid: 804, name: zh-Hans): Chinese (Simplified) (People's Republic of China) - 936
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: windows-1252
-
-OS Locale (lcid: 804, name: zh-CN): Chinese (Simplified) (People's Republic of China) - 936
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: windows-1252
-
-OS Locale (lcid: 807, name: de-CH): German (Switzerland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: windows-1252
-
-OS Locale (lcid: 809, name: en-GB): English (United Kingdom) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: windows-1252
-
-OS Locale (lcid: 80a, name: es-MX): Spanish (Mexico) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: windows-1252
-
-OS Locale (lcid: 80c, name: fr-BE): French (Belgium) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: windows-1252
-
-OS Locale (lcid: 810, name: it-CH): Italian (Switzerland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: it_CH, Name: Italian (Switzerland)
-default charset: windows-1252
-
-OS Locale (lcid: 813, name: nl-BE): Dutch (Belgium) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: windows-1252
-
-OS Locale (lcid: 814, name: nn-NO): Norwegian (Nynorsk) (Norway) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-default charset: windows-1252
-
-OS Locale (lcid: 816, name: pt-PT): Portuguese (Portugal) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: windows-1252
-
-OS Locale (lcid: 81a, name: sr-Latn-CS): Serbian (Latin) (Serbia and Montenegro (Former)) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_CS_#Latn, Name: Serbian (Latin,Serbia and Montenegro)
-default charset: windows-1252
-
-OS Locale (lcid: 81d, name: sv-FI): Swedish (Finland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 82c, name: az-Cyrl-AZ): Azeri (Cyrillic) (Azerbaijan) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: az_AZ_#Cyrl, Name: Azerbaijani (Cyrillic,Azerbaijan)
-default charset: windows-1252
-
-OS Locale (lcid: 82c, name: az-Cyrl): Azeri (Cyrillic) (Azerbaijan) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: az_AZ_#Cyrl, Name: Azerbaijani (Cyrillic,Azerbaijan)
-default charset: windows-1252
-
-OS Locale (lcid: 82e, name: dsb): Lower Sorbian (Germany) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: dsb_DE, Name: Lower Sorbian (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 82e, name: dsb-DE): Lower Sorbian (Germany) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: dsb_DE, Name: Lower Sorbian (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 83b, name: se-SE): Sami (Northern) (Sweden) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: se_SE, Name: Northern Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 83c, name: ga-IE): Irish (Ireland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: windows-1252
-
-OS Locale (lcid: 83e, name: ms-BN): Malay (Brunei Darussalam) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ms_BN, Name: Malay (Brunei)
-default charset: windows-1252
-
-OS Locale (lcid: 843, name: uz-Cyrl-UZ): Uzbek (Cyrillic) (Uzbekistan) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-default charset: windows-1252
-
-OS Locale (lcid: 843, name: uz-Cyrl): Uzbek (Cyrillic) (Uzbekistan) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-default charset: windows-1252
-
-OS Locale (lcid: 845, name: bn-BD): Bengali (Bangladesh) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bn_BD, Name: Bengali (Bangladesh)
-default charset: windows-1252
-
-OS Locale (lcid: 850, name: mn-Mong-CN): Mongolian (Traditional Mongolian) (People's Republic of China) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mn_CN_#Mong, Name: Mongolian (Mongolian,China)
-default charset: windows-1252
-
-OS Locale (lcid: 850, name: mn-Mong): Mongolian (Traditional Mongolian) (People's Republic of China) - 0
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mn_CN_#Mong, Name: Mongolian (Mongolian,China)
-default charset: windows-1252
-
-OS Locale (lcid: 85d, name: iu-Latn): Inuktitut (Latin) (Canada) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iu_CA_#Latn, Name: Inuktitut (Latin,Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 85d, name: iu-Latn-CA): Inuktitut (Latin) (Canada) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iu_CA_#Latn, Name: Inuktitut (Latin,Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 85f, name: tzm): Tamazight (Latin) (Algeria) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-default charset: windows-1252
-
-OS Locale (lcid: 85f, name: tzm-Latn-DZ): Tamazight (Latin) (Algeria) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-default charset: windows-1252
-
-OS Locale (lcid: 85f, name: tzm-Latn): Tamazight (Latin) (Algeria) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-default charset: windows-1252
-
-OS Locale (lcid: 86b, name: quz-EC): Quechua (Ecuador) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: quz_EC, Name: quz (Ecuador)
-default charset: windows-1252
-
-OS Locale (lcid: c01, name: ar-EG): Arabic (Egypt) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: windows-1252
-
-OS Locale (lcid: c04, name: zh-HK): Chinese (Traditional) (Hong Kong S.A.R.) - 950
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-MS950-HKSCS
-
-OS Locale (lcid: c04, name: zh-Hant): Chinese (Traditional) (Hong Kong S.A.R.) - 950
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: windows-1252
-
-OS Locale (lcid: c07, name: de-AT): German (Austria) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: windows-1252
-
-OS Locale (lcid: c09, name: en-AU): English (Australia) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: windows-1252
-
-OS Locale (lcid: c0a, name: es-ES): Spanish (Spain) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: windows-1252
-
-OS Locale (lcid: c0c, name: fr-CA): French (Canada) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: windows-1252
-
-OS Locale (lcid: c1a, name: sr-Cyrl-CS): Serbian (Cyrillic) (Serbia and Montenegro (Former)) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_CS_#Cyrl, Name: Serbian (Cyrillic,Serbia and Montenegro)
-default charset: windows-1252
-
-OS Locale (lcid: c3b, name: se-FI): Sami (Northern) (Finland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: se_FI, Name: Northern Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: c6b, name: quz-PE): Quechua (Peru) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: quz_PE, Name: quz (Peru)
-default charset: windows-1252
-
-OS Locale (lcid: 1001, name: ar-LY): Arabic (Libya) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_LY, Name: Arabic (Libya)
-default charset: windows-1252
-
-OS Locale (lcid: 1004, name: zh-SG): Chinese (Simplified) (Singapore) - 936
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: windows-1252
-
-OS Locale (lcid: 1007, name: de-LU): German (Luxembourg) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: windows-1252
-
-OS Locale (lcid: 1009, name: en-CA): English (Canada) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 100a, name: es-GT): Spanish (Guatemala) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: windows-1252
-
-OS Locale (lcid: 100c, name: fr-CH): French (Switzerland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: windows-1252
-
-OS Locale (lcid: 101a, name: hr-BA): Croatian (Latin) (Bosnia and Herzegovina) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hr_BA, Name: Croatian (Bosnia and Herzegovina)
-default charset: windows-1252
-
-OS Locale (lcid: 103b, name: smj-NO): Sami (Lule) (Norway) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smj_NO, Name: Lule Sami (Norway)
-default charset: windows-1252
-
-OS Locale (lcid: 1401, name: ar-DZ): Arabic (Algeria) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_DZ, Name: Arabic (Algeria)
-default charset: windows-1252
-
-OS Locale (lcid: 1404, name: zh-MO): Chinese (Traditional) (Macao S.A.R.) - 950
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_MO, Name: Chinese (Macao)
-default charset: windows-1252
-
-OS Locale (lcid: 1407, name: de-LI): German (Liechtenstein) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_LI, Name: German (Liechtenstein)
-default charset: windows-1252
-
-OS Locale (lcid: 1409, name: en-NZ): English (New Zealand) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: windows-1252
-
-OS Locale (lcid: 140a, name: es-CR): Spanish (Costa Rica) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: windows-1252
-
-OS Locale (lcid: 140c, name: fr-LU): French (Luxembourg) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: windows-1252
-
-OS Locale (lcid: 141a, name: bs-Latn): Bosnian (Latin) (Bosnia and Herzegovina) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bs_BA_#Latn, Name: Bosnian (Latin,Bosnia and Herzegovina)
-default charset: windows-1252
-
-OS Locale (lcid: 141a, name: bs-Latn-BA): Bosnian (Latin) (Bosnia and Herzegovina) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bs_BA_#Latn, Name: Bosnian (Latin,Bosnia and Herzegovina)
-default charset: windows-1252
-
-OS Locale (lcid: 143b, name: smj-SE): Sami (Lule) (Sweden) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smj_SE, Name: Lule Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 143b, name: smj): Sami (Lule) (Sweden) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smj_SE, Name: Lule Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 1801, name: ar-MA): Arabic (Morocco) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_MA, Name: Arabic (Morocco)
-default charset: windows-1252
-
-OS Locale (lcid: 1809, name: en-IE): English (Ireland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: windows-1252
-
-OS Locale (lcid: 180a, name: es-PA): Spanish (Panama) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: windows-1252
-
-OS Locale (lcid: 180c, name: fr-MC): French (Principality of Monaco) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_MC, Name: French (Monaco)
-default charset: windows-1252
-
-OS Locale (lcid: 181a, name: sr-Latn-BA): Serbian (Latin) (Bosnia and Herzegovina) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_BA_#Latn, Name: Serbian (Latin,Bosnia and Herzegovina)
-default charset: windows-1252
-
-OS Locale (lcid: 183b, name: sma-NO): Sami (Southern) (Norway) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sma_NO, Name: Southern Sami (Norway)
-default charset: windows-1252
-
-OS Locale (lcid: 1c01, name: ar-TN): Arabic (Tunisia) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_TN, Name: Arabic (Tunisia)
-default charset: windows-1252
-
-OS Locale (lcid: 1c09, name: en-ZA): English (South Africa) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_ZA, Name: English (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 1c0a, name: es-DO): Spanish (Dominican Republic) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_DO, Name: Spanish (Dominican Republic)
-default charset: windows-1252
-
-OS Locale (lcid: 1c1a, name: sr-Cyrl-BA): Serbian (Cyrillic) (Bosnia and Herzegovina) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_BA_#Cyrl, Name: Serbian (Cyrillic,Bosnia and Herzegovina)
-default charset: windows-1252
-
-OS Locale (lcid: 1c3b, name: sma): Sami (Southern) (Sweden) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sma_SE, Name: Southern Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 1c3b, name: sma-SE): Sami (Southern) (Sweden) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sma_SE, Name: Southern Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 2001, name: ar-OM): Arabic (Oman) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_OM, Name: Arabic (Oman)
-default charset: windows-1252
-
-OS Locale (lcid: 2009, name: en-JM): English (Jamaica) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_JM, Name: English (Jamaica)
-default charset: windows-1252
-
-OS Locale (lcid: 200a, name: es-VE): Spanish (Bolivarian Republic of Venezuela) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: windows-1252
-
-OS Locale (lcid: 201a, name: bs-Cyrl-BA): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bs_BA_#Cyrl, Name: Bosnian (Cyrillic,Bosnia and Herzegovina)
-default charset: windows-1252
-
-OS Locale (lcid: 201a, name: bs-Cyrl): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bs_BA_#Cyrl, Name: Bosnian (Cyrillic,Bosnia and Herzegovina)
-default charset: windows-1252
-
-OS Locale (lcid: 203b, name: sms-FI): Sami (Skolt) (Finland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sms_FI, Name: Skolt Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 203b, name: sms): Sami (Skolt) (Finland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sms_FI, Name: Skolt Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 2401, name: ar-YE): Arabic (Yemen) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_YE, Name: Arabic (Yemen)
-default charset: windows-1252
-
-OS Locale (lcid: 2409, name: en-029): English (Caribbean) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_029, Name: English (Caribbean)
-default charset: windows-1252
-
-OS Locale (lcid: 240a, name: es-CO): Spanish (Colombia) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: windows-1252
-
-OS Locale (lcid: 241a, name: sr-Latn-RS): Serbian (Latin) (Serbia) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-default charset: windows-1252
-
-OS Locale (lcid: 241a, name: sr-Latn): Serbian (Latin) (Serbia) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-default charset: windows-1252
-
-OS Locale (lcid: 243b, name: smn): Sami (Inari) (Finland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smn_FI, Name: Inari Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 243b, name: smn-FI): Sami (Inari) (Finland) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smn_FI, Name: Inari Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 2801, name: ar-SY): Arabic (Syria) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_SY, Name: Arabic (Syria)
-default charset: windows-1252
-
-OS Locale (lcid: 2809, name: en-BZ): English (Belize) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_BZ, Name: English (Belize)
-default charset: windows-1252
-
-OS Locale (lcid: 280a, name: es-PE): Spanish (Peru) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: windows-1252
-
-OS Locale (lcid: 281a, name: sr-Cyrl-RS): Serbian (Cyrillic) (Serbia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_RS_#Cyrl, Name: Serbian (Cyrillic,Serbia)
-default charset: windows-1252
-
-OS Locale (lcid: 281a, name: sr-Cyrl): Serbian (Cyrillic) (Serbia) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_RS_#Cyrl, Name: Serbian (Cyrillic,Serbia)
-default charset: windows-1252
-
-OS Locale (lcid: 2c01, name: ar-JO): Arabic (Jordan) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_JO, Name: Arabic (Jordan)
-default charset: windows-1252
-
-OS Locale (lcid: 2c09, name: en-TT): English (Trinidad and Tobago) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_TT, Name: English (Trinidad and Tobago)
-default charset: windows-1252
-
-OS Locale (lcid: 2c0a, name: es-AR): Spanish (Argentina) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: windows-1252
-
-OS Locale (lcid: 2c1a, name: sr-Latn-ME): Serbian (Latin) (Montenegro) - 1250
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_ME_#Latn, Name: Serbian (Latin,Montenegro)
-default charset: windows-1252
-
-OS Locale (lcid: 3001, name: ar-LB): Arabic (Lebanon) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_LB, Name: Arabic (Lebanon)
-default charset: windows-1252
-
-OS Locale (lcid: 3009, name: en-ZW): English (Zimbabwe) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_ZW, Name: English (Zimbabwe)
-default charset: windows-1252
-
-OS Locale (lcid: 300a, name: es-EC): Spanish (Ecuador) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: windows-1252
-
-OS Locale (lcid: 301a, name: sr-Cyrl-ME): Serbian (Cyrillic) (Montenegro) - 1251
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_ME_#Cyrl, Name: Serbian (Cyrillic,Montenegro)
-default charset: windows-1252
-
-OS Locale (lcid: 3401, name: ar-KW): Arabic (Kuwait) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_KW, Name: Arabic (Kuwait)
-default charset: windows-1252
-
-OS Locale (lcid: 3409, name: en-PH): English (Republic of the Philippines) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_PH, Name: English (Philippines)
-default charset: windows-1252
-
-OS Locale (lcid: 340a, name: es-CL): Spanish (Chile) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: windows-1252
-
-OS Locale (lcid: 3801, name: ar-AE): Arabic (U.A.E.) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-default charset: windows-1252
-
-OS Locale (lcid: 380a, name: es-UY): Spanish (Uruguay) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: windows-1252
-
-OS Locale (lcid: 3c01, name: ar-BH): Arabic (Bahrain) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_BH, Name: Arabic (Bahrain)
-default charset: windows-1252
-
-OS Locale (lcid: 3c0a, name: es-PY): Spanish (Paraguay) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: windows-1252
-
-OS Locale (lcid: 4001, name: ar-QA): Arabic (Qatar) - 1256
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_QA, Name: Arabic (Qatar)
-default charset: windows-1252
-
-OS Locale (lcid: 4009, name: en-IN): English (India) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_IN, Name: English (India)
-default charset: windows-1252
-
-OS Locale (lcid: 400a, name: es-BO): Spanish (Bolivia) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: windows-1252
-
-OS Locale (lcid: 4409, name: en-MY): English (Malaysia) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_MY, Name: English (Malaysia)
-default charset: windows-1252
-
-OS Locale (lcid: 440a, name: es-SV): Spanish (El Salvador) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: windows-1252
-
-OS Locale (lcid: 4809, name: en-SG): English (Singapore) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_SG, Name: English (Singapore)
-default charset: windows-1252
-
-OS Locale (lcid: 480a, name: es-HN): Spanish (Honduras) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_HN, Name: Spanish (Honduras)
-default charset: windows-1252
-
-OS Locale (lcid: 4c0a, name: es-NI): Spanish (Nicaragua) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: windows-1252
-
-OS Locale (lcid: 500a, name: es-PR): Spanish (Puerto Rico) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_PR, Name: Spanish (Puerto Rico)
-default charset: windows-1252
-
-OS Locale (lcid: 540a, name: es-US): Spanish (United States) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_US, Name: Spanish (United States)
-default charset: windows-1252
-
-OS UI Language (name: en-US)
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: windows-1252
-
-OS UI Language (name: ja-JP)
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: en_US, Name: English (United States)
-default charset: windows-1252
--- a/test/java/util/Locale/data/deflocale.win7.fmtasdefault	Thu Aug 03 07:28:01 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1494 +0,0 @@
-# OSVersionInfo
-# MajorVersion: 6
-# MinorVersion: 1
-# BuildNumber: 7600
-# CSDVersion: 
-
-
-OS Locale (lcid: 7f, name: ): Invariant Language (Invariant Country) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: windows-1252
-
-OS Locale (lcid: 401, name: ar-SA): Arabic (Saudi Arabia) - 1256
-default locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_SA, Name: Arabic (Saudi Arabia)
-default charset: windows-1256
-
-OS Locale (lcid: 402, name: bg-BG): Bulgarian (Bulgaria) - 1251
-default locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bg_BG, Name: Bulgarian (Bulgaria)
-default charset: windows-1251
-
-OS Locale (lcid: 403, name: ca-ES): Catalan (Spain) - 1252
-default locale: ID: ca_ES, Name: Catalan (Spain)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ca_ES, Name: Catalan (Spain)
-default charset: windows-1252
-
-OS Locale (lcid: 404, name: zh-TW): Chinese (Traditional) (Taiwan) - 950
-default locale: ID: zh_TW, Name: Chinese (Taiwan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_TW, Name: Chinese (Taiwan)
-default charset: x-windows-950
-
-OS Locale (lcid: 405, name: cs-CZ): Czech (Czech Republic) - 1250
-default locale: ID: cs_CZ, Name: Czech (Czech Republic)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: cs_CZ, Name: Czech (Czech Republic)
-default charset: windows-1250
-
-OS Locale (lcid: 406, name: da-DK): Danish (Denmark) - 1252
-default locale: ID: da_DK, Name: Danish (Denmark)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: da_DK, Name: Danish (Denmark)
-default charset: windows-1252
-
-OS Locale (lcid: 407, name: de-DE): German (Germany) - 1252
-default locale: ID: de_DE, Name: German (Germany)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_DE, Name: German (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 408, name: el-GR): Greek (Greece) - 1253
-default locale: ID: el_GR, Name: Greek (Greece)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: el_GR, Name: Greek (Greece)
-default charset: windows-1253
-
-OS Locale (lcid: 409, name: en-US): English (United States) - 1252
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: windows-1252
-
-OS Locale (lcid: 40b, name: fi-FI): Finnish (Finland) - 1252
-default locale: ID: fi_FI, Name: Finnish (Finland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fi_FI, Name: Finnish (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 40c, name: fr-FR): French (France) - 1252
-default locale: ID: fr_FR, Name: French (France)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_FR, Name: French (France)
-default charset: windows-1252
-
-OS Locale (lcid: 40d, name: he-IL): Hebrew (Israel) - 1255
-default locale: ID: iw_IL, Name: Hebrew (Israel)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iw_IL, Name: Hebrew (Israel)
-default charset: windows-1255
-
-OS Locale (lcid: 40e, name: hu-HU): Hungarian (Hungary) - 1250
-default locale: ID: hu_HU, Name: Hungarian (Hungary)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hu_HU, Name: Hungarian (Hungary)
-default charset: windows-1250
-
-OS Locale (lcid: 40f, name: is-IS): Icelandic (Iceland) - 1252
-default locale: ID: is_IS, Name: Icelandic (Iceland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: is_IS, Name: Icelandic (Iceland)
-default charset: windows-1252
-
-OS Locale (lcid: 410, name: it-IT): Italian (Italy) - 1252
-default locale: ID: it_IT, Name: Italian (Italy)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: it_IT, Name: Italian (Italy)
-default charset: windows-1252
-
-OS Locale (lcid: 411, name: ja-JP): Japanese (Japan) - 932
-default locale: ID: ja_JP, Name: Japanese (Japan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ja_JP, Name: Japanese (Japan)
-default charset: windows-31j
-
-OS Locale (lcid: 412, name: ko-KR): Korean (Korea) - 949
-default locale: ID: ko_KR, Name: Korean (South Korea)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ko_KR, Name: Korean (South Korea)
-default charset: x-windows-949
-
-OS Locale (lcid: 413, name: nl-NL): Dutch (Netherlands) - 1252
-default locale: ID: nl_NL, Name: Dutch (Netherlands)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: nl_NL, Name: Dutch (Netherlands)
-default charset: windows-1252
-
-OS Locale (lcid: 414, name: nb-NO): Norwegian (Bokm…l) (Norway) - 1252
-default locale: ID: no_NO, Name: Norwegian (Norway)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: no_NO, Name: Norwegian (Norway)
-default charset: windows-1252
-
-OS Locale (lcid: 415, name: pl-PL): Polish (Poland) - 1250
-default locale: ID: pl_PL, Name: Polish (Poland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: pl_PL, Name: Polish (Poland)
-default charset: windows-1250
-
-OS Locale (lcid: 416, name: pt-BR): Portuguese (Brazil) - 1252
-default locale: ID: pt_BR, Name: Portuguese (Brazil)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: pt_BR, Name: Portuguese (Brazil)
-default charset: windows-1252
-
-OS Locale (lcid: 417, name: rm-CH): Romansh (Switzerland) - 1252
-default locale: ID: rm_CH, Name: Raeto-Romance (Switzerland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: rm_CH, Name: Raeto-Romance (Switzerland)
-default charset: windows-1252
-
-OS Locale (lcid: 418, name: ro-RO): Romanian (Romania) - 1250
-default locale: ID: ro_RO, Name: Romanian (Romania)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ro_RO, Name: Romanian (Romania)
-default charset: windows-1250
-
-OS Locale (lcid: 419, name: ru-RU): Russian (Russia) - 1251
-default locale: ID: ru_RU, Name: Russian (Russia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ru_RU, Name: Russian (Russia)
-default charset: windows-1251
-
-OS Locale (lcid: 41a, name: hr-HR): Croatian (Croatia) - 1250
-default locale: ID: hr_HR, Name: Croatian (Croatia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hr_HR, Name: Croatian (Croatia)
-default charset: windows-1250
-
-OS Locale (lcid: 41b, name: sk-SK): Slovak (Slovakia) - 1250
-default locale: ID: sk_SK, Name: Slovak (Slovakia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sk_SK, Name: Slovak (Slovakia)
-default charset: windows-1250
-
-OS Locale (lcid: 41c, name: sq-AL): Albanian (Albania) - 1250
-default locale: ID: sq_AL, Name: Albanian (Albania)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sq_AL, Name: Albanian (Albania)
-default charset: windows-1250
-
-OS Locale (lcid: 41d, name: sv-SE): Swedish (Sweden) - 1252
-default locale: ID: sv_SE, Name: Swedish (Sweden)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sv_SE, Name: Swedish (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 41e, name: th-TH): Thai (Thailand) - 874
-default locale: ID: th_TH, Name: Thai (Thailand)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: th_TH, Name: Thai (Thailand)
-default charset: x-windows-874
-
-OS Locale (lcid: 41f, name: tr-TR): Turkish (Turkey) - 1254
-default locale: ID: tr_TR, Name: Turkish (Turkey)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tr_TR, Name: Turkish (Turkey)
-default charset: windows-1254
-
-OS Locale (lcid: 420, name: ur-PK): Urdu (Islamic Republic of Pakistan) - 1256
-default locale: ID: ur_PK, Name: Urdu (Pakistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ur_PK, Name: Urdu (Pakistan)
-default charset: windows-1256
-
-OS Locale (lcid: 421, name: id-ID): Indonesian (Indonesia) - 1252
-default locale: ID: in_ID, Name: Indonesian (Indonesia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: in_ID, Name: Indonesian (Indonesia)
-default charset: windows-1252
-
-OS Locale (lcid: 422, name: uk-UA): Ukrainian (Ukraine) - 1251
-default locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uk_UA, Name: Ukrainian (Ukraine)
-default charset: windows-1251
-
-OS Locale (lcid: 423, name: be-BY): Belarusian (Belarus) - 1251
-default locale: ID: be_BY, Name: Belarusian (Belarus)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: be_BY, Name: Belarusian (Belarus)
-default charset: windows-1251
-
-OS Locale (lcid: 424, name: sl-SI): Slovenian (Slovenia) - 1250
-default locale: ID: sl_SI, Name: Slovenian (Slovenia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sl_SI, Name: Slovenian (Slovenia)
-default charset: windows-1250
-
-OS Locale (lcid: 425, name: et-EE): Estonian (Estonia) - 1257
-default locale: ID: et_EE, Name: Estonian (Estonia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: et_EE, Name: Estonian (Estonia)
-default charset: windows-1257
-
-OS Locale (lcid: 426, name: lv-LV): Latvian (Latvia) - 1257
-default locale: ID: lv_LV, Name: Latvian (Latvia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: lv_LV, Name: Latvian (Latvia)
-default charset: windows-1257
-
-OS Locale (lcid: 427, name: lt-LT): Lithuanian (Lithuania) - 1257
-default locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: lt_LT, Name: Lithuanian (Lithuania)
-default charset: windows-1257
-
-OS Locale (lcid: 428, name: tg-Cyrl-TJ): Tajik (Cyrillic) (Tajikistan) - 1251
-default locale: ID: tg_TJ_#Cyrl, Name: Tajik (Cyrillic,Tajikistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tg_TJ_#Cyrl, Name: Tajik (Cyrillic,Tajikistan)
-default charset: windows-1251
-
-OS Locale (lcid: 428, name: tg-Cyrl): Tajik (Cyrillic) (Tajikistan) - 1251
-default locale: ID: tg_TJ_#Cyrl, Name: Tajik (Cyrillic,Tajikistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tg_TJ_#Cyrl, Name: Tajik (Cyrillic,Tajikistan)
-default charset: windows-1251
-
-OS Locale (lcid: 429, name: fa-IR): Persian (Iran) - 1256
-default locale: ID: fa_IR, Name: Persian (Iran)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fa_IR, Name: Persian (Iran)
-default charset: windows-1256
-
-OS Locale (lcid: 42a, name: vi-VN): Vietnamese (Vietnam) - 1258
-default locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: vi_VN, Name: Vietnamese (Vietnam)
-default charset: windows-1258
-
-OS Locale (lcid: 42b, name: hy-AM): Armenian (Armenia) - 0
-default locale: ID: hy_AM, Name: Armenian (Armenia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hy_AM, Name: Armenian (Armenia)
-default charset: UTF-8
-
-OS Locale (lcid: 42c, name: az-Latn-AZ): Azeri (Latin) (Azerbaijan) - 1254
-default locale: ID: az_AZ_#Latn, Name: Azerbaijani (Latin,Azerbaijan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: az_AZ_#Latn, Name: Azerbaijani (Latin,Azerbaijan)
-default charset: windows-1254
-
-OS Locale (lcid: 42c, name: az-Latn): Azeri (Latin) (Azerbaijan) - 1254
-default locale: ID: az_AZ_#Latn, Name: Azerbaijani (Latin,Azerbaijan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: az_AZ_#Latn, Name: Azerbaijani (Latin,Azerbaijan)
-default charset: windows-1254
-
-OS Locale (lcid: 42d, name: eu-ES): Basque (Spain) - 1252
-default locale: ID: eu_ES, Name: Basque (Spain)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: eu_ES, Name: Basque (Spain)
-default charset: windows-1252
-
-OS Locale (lcid: 42e, name: hsb-DE): Upper Sorbian (Germany) - 1252
-default locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 42e, name: hsb): Upper Sorbian (Germany) - 1252
-default locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hsb_DE, Name: Upper Sorbian (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 42f, name: mk-MK): Macedonian (FYROM) (Macedonia (FYROM)) - 1251
-default locale: ID: mk_MK, Name: Macedonian (Macedonia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mk_MK, Name: Macedonian (Macedonia)
-default charset: windows-1251
-
-OS Locale (lcid: 432, name: tn-ZA): Setswana (South Africa) - 1252
-default locale: ID: tn_ZA, Name: Tswana (South Africa)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tn_ZA, Name: Tswana (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 434, name: xh-ZA): isiXhosa (South Africa) - 1252
-default locale: ID: xh_ZA, Name: Xhosa (South Africa)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: xh_ZA, Name: Xhosa (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 435, name: zu-ZA): isiZulu (South Africa) - 1252
-default locale: ID: zu_ZA, Name: Zulu (South Africa)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zu_ZA, Name: Zulu (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 436, name: af-ZA): Afrikaans (South Africa) - 1252
-default locale: ID: af_ZA, Name: Afrikaans (South Africa)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: af_ZA, Name: Afrikaans (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 437, name: ka-GE): Georgian (Georgia) - 0
-default locale: ID: ka_GE, Name: Georgian (Georgia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ka_GE, Name: Georgian (Georgia)
-default charset: UTF-8
-
-OS Locale (lcid: 438, name: fo-FO): Faroese (Faroe Islands) - 1252
-default locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fo_FO, Name: Faroese (Faroe Islands)
-default charset: windows-1252
-
-OS Locale (lcid: 439, name: hi-IN): Hindi (India) - 0
-default locale: ID: hi_IN, Name: Hindi (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hi_IN, Name: Hindi (India)
-default charset: UTF-8
-
-OS Locale (lcid: 43a, name: mt-MT): Maltese (Malta) - 0
-default locale: ID: mt_MT, Name: Maltese (Malta)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mt_MT, Name: Maltese (Malta)
-default charset: UTF-8
-
-OS Locale (lcid: 43b, name: se-NO): Sami (Northern) (Norway) - 1252
-default locale: ID: se_NO, Name: Northern Sami (Norway)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: se_NO, Name: Northern Sami (Norway)
-default charset: windows-1252
-
-OS Locale (lcid: 43e, name: ms-MY): Malay (Malaysia) - 1252
-default locale: ID: ms_MY, Name: Malay (Malaysia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ms_MY, Name: Malay (Malaysia)
-default charset: windows-1252
-
-OS Locale (lcid: 43f, name: kk-KZ): Kazakh (Kazakhstan) - 0
-default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan)
-default charset: UTF-8
-
-OS Locale (lcid: 440, name: ky-KG): Kyrgyz (Kyrgyzstan) - 1251
-default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan)
-default charset: windows-1251
-
-OS Locale (lcid: 441, name: sw-KE): Kiswahili (Kenya) - 1252
-default locale: ID: sw_KE, Name: Swahili (Kenya)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sw_KE, Name: Swahili (Kenya)
-default charset: windows-1252
-
-OS Locale (lcid: 442, name: tk-TM): Turkmen (Turkmenistan) - 1250
-default locale: ID: tk_TM, Name: Turkmen (Turkmenistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tk_TM, Name: Turkmen (Turkmenistan)
-default charset: windows-1250
-
-OS Locale (lcid: 443, name: uz-Latn): Uzbek (Latin) (Uzbekistan) - 1254
-default locale: ID: uz_UZ_#Latn, Name: Uzbek (Latin,Uzbekistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uz_UZ_#Latn, Name: Uzbek (Latin,Uzbekistan)
-default charset: windows-1254
-
-OS Locale (lcid: 443, name: uz-Latn-UZ): Uzbek (Latin) (Uzbekistan) - 1254
-default locale: ID: uz_UZ_#Latn, Name: Uzbek (Latin,Uzbekistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uz_UZ_#Latn, Name: Uzbek (Latin,Uzbekistan)
-default charset: windows-1254
-
-OS Locale (lcid: 444, name: tt-RU): Tatar (Russia) - 1251
-default locale: ID: tt_RU, Name: Tatar (Russia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tt_RU, Name: Tatar (Russia)
-default charset: windows-1251
-
-OS Locale (lcid: 445, name: bn-IN): Bengali (India) - 0
-default locale: ID: bn_IN, Name: Bengali (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bn_IN, Name: Bengali (India)
-default charset: UTF-8
-
-OS Locale (lcid: 446, name: pa-IN): Punjabi (India) - 0
-default locale: ID: pa_IN, Name: Panjabi (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: pa_IN, Name: Panjabi (India)
-default charset: UTF-8
-
-OS Locale (lcid: 447, name: gu-IN): Gujarati (India) - 0
-default locale: ID: gu_IN, Name: Gujarati (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gu_IN, Name: Gujarati (India)
-default charset: UTF-8
-
-OS Locale (lcid: 448, name: or-IN): Oriya (India) - 0
-default locale: ID: or_IN, Name: Oriya (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: or_IN, Name: Oriya (India)
-default charset: UTF-8
-
-OS Locale (lcid: 449, name: ta-IN): Tamil (India) - 0
-default locale: ID: ta_IN, Name: Tamil (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ta_IN, Name: Tamil (India)
-default charset: UTF-8
-
-OS Locale (lcid: 44a, name: te-IN): Telugu (India) - 0
-default locale: ID: te_IN, Name: Telugu (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: te_IN, Name: Telugu (India)
-default charset: UTF-8
-
-OS Locale (lcid: 44b, name: kn-IN): Kannada (India) - 0
-default locale: ID: kn_IN, Name: Kannada (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kn_IN, Name: Kannada (India)
-default charset: UTF-8
-
-OS Locale (lcid: 44c, name: ml-IN): Malayalam (India) - 0
-default locale: ID: ml_IN, Name: Malayalam (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ml_IN, Name: Malayalam (India)
-default charset: UTF-8
-
-OS Locale (lcid: 44d, name: as-IN): Assamese (India) - 0
-default locale: ID: as_IN, Name: Assamese (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: as_IN, Name: Assamese (India)
-default charset: UTF-8
-
-OS Locale (lcid: 44e, name: mr-IN): Marathi (India) - 0
-default locale: ID: mr_IN, Name: Marathi (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mr_IN, Name: Marathi (India)
-default charset: UTF-8
-
-OS Locale (lcid: 44f, name: sa-IN): Sanskrit (India) - 0
-default locale: ID: sa_IN, Name: Sanskrit (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sa_IN, Name: Sanskrit (India)
-default charset: UTF-8
-
-OS Locale (lcid: 450, name: mn-MN): Mongolian (Cyrillic) (Mongolia) - 1251
-default locale: ID: mn_MN, Name: Mongolian (Mongolia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mn_MN, Name: Mongolian (Mongolia)
-default charset: windows-1251
-
-OS Locale (lcid: 450, name: mn-Cyrl): Mongolian (Cyrillic) (Mongolia) - 1251
-default locale: ID: mn_MN, Name: Mongolian (Mongolia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mn_MN, Name: Mongolian (Mongolia)
-default charset: windows-1251
-
-OS Locale (lcid: 451, name: bo-CN): Tibetan (People's Republic of China) - 0
-default locale: ID: bo_CN, Name: Tibetan (China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bo_CN, Name: Tibetan (China)
-default charset: UTF-8
-
-OS Locale (lcid: 452, name: cy-GB): Welsh (United Kingdom) - 1252
-default locale: ID: cy_GB, Name: Welsh (United Kingdom)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: cy_GB, Name: Welsh (United Kingdom)
-default charset: windows-1252
-
-OS Locale (lcid: 453, name: km-KH): Khmer (Cambodia) - 0
-default locale: ID: km_KH, Name: Khmer (Cambodia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: km_KH, Name: Khmer (Cambodia)
-default charset: UTF-8
-
-OS Locale (lcid: 454, name: lo-LA): Lao (Lao P.D.R.) - 0
-default locale: ID: lo_LA, Name: Lao (Laos)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: lo_LA, Name: Lao (Laos)
-default charset: UTF-8
-
-OS Locale (lcid: 456, name: gl-ES): Galician (Spain) - 1252
-default locale: ID: gl_ES, Name: Gallegan (Spain)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gl_ES, Name: Gallegan (Spain)
-default charset: windows-1252
-
-OS Locale (lcid: 457, name: kok-IN): Konkani (India) - 0
-default locale: ID: kok_IN, Name: Konkani (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kok_IN, Name: Konkani (India)
-default charset: UTF-8
-
-OS Locale (lcid: 457, name: kok): Konkani (India) - 0
-default locale: ID: kok_IN, Name: Konkani (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kok_IN, Name: Konkani (India)
-default charset: UTF-8
-
-OS Locale (lcid: 45a, name: syr): Syriac (Syria) - 0
-default locale: ID: syr_SY, Name: Syriac (Syria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: syr_SY, Name: Syriac (Syria)
-default charset: UTF-8
-
-OS Locale (lcid: 45a, name: syr-SY): Syriac (Syria) - 0
-default locale: ID: syr_SY, Name: Syriac (Syria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: syr_SY, Name: Syriac (Syria)
-default charset: UTF-8
-
-OS Locale (lcid: 45b, name: si-LK): Sinhala (Sri Lanka) - 0
-default locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: si_LK, Name: Sinhalese (Sri Lanka)
-default charset: UTF-8
-
-OS Locale (lcid: 45d, name: iu-Cans-CA): Inuktitut (Syllabics) (Canada) - 0
-default locale: ID: iu_CA_#Cans, Name: Inuktitut (Unified Canadian Aboriginal Syllabics,Canada)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iu_CA_#Cans, Name: Inuktitut (Unified Canadian Aboriginal Syllabics,Canada)
-default charset: UTF-8
-
-OS Locale (lcid: 45d, name: iu-Cans): Inuktitut (Syllabics) (Canada) - 0
-default locale: ID: iu_CA_#Cans, Name: Inuktitut (Unified Canadian Aboriginal Syllabics,Canada)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iu_CA_#Cans, Name: Inuktitut (Unified Canadian Aboriginal Syllabics,Canada)
-default charset: UTF-8
-
-OS Locale (lcid: 45e, name: am-ET): Amharic (Ethiopia) - 0
-default locale: ID: am_ET, Name: Amharic (Ethiopia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: am_ET, Name: Amharic (Ethiopia)
-default charset: UTF-8
-
-OS Locale (lcid: 461, name: ne-NP): Nepali (Nepal) - 0
-default locale: ID: ne_NP, Name: Nepali (Nepal)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ne_NP, Name: Nepali (Nepal)
-default charset: UTF-8
-
-OS Locale (lcid: 462, name: fy-NL): Frisian (Netherlands) - 1252
-default locale: ID: fy_NL, Name: Frisian (Netherlands)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fy_NL, Name: Frisian (Netherlands)
-default charset: windows-1252
-
-OS Locale (lcid: 463, name: ps-AF): Pashto (Afghanistan) - 0
-default locale: ID: ps_AF, Name: Pushto (Afghanistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ps_AF, Name: Pushto (Afghanistan)
-default charset: UTF-8
-
-OS Locale (lcid: 464, name: fil-PH): Filipino (Philippines) - 1252
-default locale: ID: fil_PH, Name: Filipino (Philippines)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fil_PH, Name: Filipino (Philippines)
-default charset: windows-1252
-
-OS Locale (lcid: 464, name: fil): Filipino (Philippines) - 1252
-default locale: ID: fil_PH, Name: Filipino (Philippines)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fil_PH, Name: Filipino (Philippines)
-default charset: windows-1252
-
-OS Locale (lcid: 465, name: dv-MV): Divehi (Maldives) - 0
-default locale: ID: dv_MV, Name: Divehi (Maldives)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: dv_MV, Name: Divehi (Maldives)
-default charset: UTF-8
-
-OS Locale (lcid: 468, name: ha-Latn-NG): Hausa (Latin) (Nigeria) - 1252
-default locale: ID: ha_NG_#Latn, Name: Hausa (Latin,Nigeria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ha_NG_#Latn, Name: Hausa (Latin,Nigeria)
-default charset: windows-1252
-
-OS Locale (lcid: 468, name: ha-Latn): Hausa (Latin) (Nigeria) - 1252
-default locale: ID: ha_NG_#Latn, Name: Hausa (Latin,Nigeria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ha_NG_#Latn, Name: Hausa (Latin,Nigeria)
-default charset: windows-1252
-
-OS Locale (lcid: 46a, name: yo-NG): Yoruba (Nigeria) - 1252
-default locale: ID: yo_NG, Name: Yoruba (Nigeria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: yo_NG, Name: Yoruba (Nigeria)
-default charset: windows-1252
-
-OS Locale (lcid: 46b, name: quz): Quechua (Bolivia) - 1252
-default locale: ID: quz_BO, Name: quz (Bolivia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: quz_BO, Name: quz (Bolivia)
-default charset: windows-1252
-
-OS Locale (lcid: 46b, name: quz-BO): Quechua (Bolivia) - 1252
-default locale: ID: quz_BO, Name: quz (Bolivia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: quz_BO, Name: quz (Bolivia)
-default charset: windows-1252
-
-OS Locale (lcid: 46c, name: nso): Sesotho sa Leboa (South Africa) - 1252
-default locale: ID: nso_ZA, Name: Pedi (South Africa)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: nso_ZA, Name: Pedi (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 46c, name: nso-ZA): Sesotho sa Leboa (South Africa) - 1252
-default locale: ID: nso_ZA, Name: Pedi (South Africa)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: nso_ZA, Name: Pedi (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 46d, name: ba-RU): Bashkir (Russia) - 1251
-default locale: ID: ba_RU, Name: Bashkir (Russia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ba_RU, Name: Bashkir (Russia)
-default charset: windows-1251
-
-OS Locale (lcid: 46e, name: lb-LU): Luxembourgish (Luxembourg) - 1252
-default locale: ID: lb_LU, Name: Luxembourgish (Luxembourg)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: lb_LU, Name: Luxembourgish (Luxembourg)
-default charset: windows-1252
-
-OS Locale (lcid: 46f, name: kl-GL): Greenlandic (Greenland) - 1252
-default locale: ID: kl_GL, Name: Greenlandic (Greenland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: kl_GL, Name: Greenlandic (Greenland)
-default charset: windows-1252
-
-OS Locale (lcid: 470, name: ig-NG): Igbo (Nigeria) - 1252
-default locale: ID: ig_NG, Name: Igbo (Nigeria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ig_NG, Name: Igbo (Nigeria)
-default charset: windows-1252
-
-OS Locale (lcid: 478, name: ii-CN): Yi (People's Republic of China) - 0
-default locale: ID: ii_CN, Name: Sichuan Yi (China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ii_CN, Name: Sichuan Yi (China)
-default charset: UTF-8
-
-OS Locale (lcid: 47a, name: arn): Mapudungun (Chile) - 1252
-default locale: ID: arn_CL, Name: Mapudungun (Chile)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: arn_CL, Name: Mapudungun (Chile)
-default charset: windows-1252
-
-OS Locale (lcid: 47a, name: arn-CL): Mapudungun (Chile) - 1252
-default locale: ID: arn_CL, Name: Mapudungun (Chile)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: arn_CL, Name: Mapudungun (Chile)
-default charset: windows-1252
-
-OS Locale (lcid: 47c, name: moh): Mohawk (Canada) - 1252
-default locale: ID: moh_CA, Name: Mohawk (Canada)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: moh_CA, Name: Mohawk (Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 47c, name: moh-CA): Mohawk (Canada) - 1252
-default locale: ID: moh_CA, Name: Mohawk (Canada)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: moh_CA, Name: Mohawk (Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 47e, name: br-FR): Breton (France) - 1252
-default locale: ID: br_FR, Name: Breton (France)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: br_FR, Name: Breton (France)
-default charset: windows-1252
-
-OS Locale (lcid: 480, name: ug-CN): Uyghur (People's Republic of China) - 1256
-default locale: ID: ug_CN, Name: Uighur (China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ug_CN, Name: Uighur (China)
-default charset: windows-1256
-
-OS Locale (lcid: 481, name: mi-NZ): Maori (New Zealand) - 0
-default locale: ID: mi_NZ, Name: Maori (New Zealand)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mi_NZ, Name: Maori (New Zealand)
-default charset: UTF-8
-
-OS Locale (lcid: 482, name: oc-FR): Occitan (France) - 1252
-default locale: ID: oc_FR, Name: Occitan (France)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: oc_FR, Name: Occitan (France)
-default charset: windows-1252
-
-OS Locale (lcid: 483, name: co-FR): Corsican (France) - 1252
-default locale: ID: co_FR, Name: Corsican (France)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: co_FR, Name: Corsican (France)
-default charset: windows-1252
-
-OS Locale (lcid: 484, name: gsw): Alsatian (France) - 1252
-default locale: ID: gsw_FR, Name: Swiss German (France)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gsw_FR, Name: Swiss German (France)
-default charset: windows-1252
-
-OS Locale (lcid: 484, name: gsw-FR): Alsatian (France) - 1252
-default locale: ID: gsw_FR, Name: Swiss German (France)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gsw_FR, Name: Swiss German (France)
-default charset: windows-1252
-
-OS Locale (lcid: 485, name: sah): Yakut (Russia) - 1251
-default locale: ID: sah_RU, Name: Yakut (Russia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sah_RU, Name: Yakut (Russia)
-default charset: windows-1251
-
-OS Locale (lcid: 485, name: sah-RU): Yakut (Russia) - 1251
-default locale: ID: sah_RU, Name: Yakut (Russia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sah_RU, Name: Yakut (Russia)
-default charset: windows-1251
-
-OS Locale (lcid: 486, name: qut): K'iche (Guatemala) - 1252
-default locale: ID: qut_GT, Name: qut (Guatemala)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: qut_GT, Name: qut (Guatemala)
-default charset: windows-1252
-
-OS Locale (lcid: 486, name: qut-GT): K'iche (Guatemala) - 1252
-default locale: ID: qut_GT, Name: qut (Guatemala)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: qut_GT, Name: qut (Guatemala)
-default charset: windows-1252
-
-OS Locale (lcid: 487, name: rw-RW): Kinyarwanda (Rwanda) - 1252
-default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda)
-default charset: windows-1252
-
-OS Locale (lcid: 488, name: wo-SN): Wolof (Senegal) - 1252
-default locale: ID: wo_SN, Name: Wolof (Senegal)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: wo_SN, Name: Wolof (Senegal)
-default charset: windows-1252
-
-OS Locale (lcid: 48c, name: prs): Dari (Afghanistan) - 1256
-default locale: ID: prs_AF, Name: prs (Afghanistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: prs_AF, Name: prs (Afghanistan)
-default charset: windows-1256
-
-OS Locale (lcid: 48c, name: prs-AF): Dari (Afghanistan) - 1256
-default locale: ID: prs_AF, Name: prs (Afghanistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: prs_AF, Name: prs (Afghanistan)
-default charset: windows-1256
-
-OS Locale (lcid: 491, name: gd-GB): Scottish Gaelic (United Kingdom) - 1252
-default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom)
-default charset: windows-1252
-
-OS Locale (lcid: 801, name: ar-IQ): Arabic (Iraq) - 1256
-default locale: ID: ar_IQ, Name: Arabic (Iraq)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_IQ, Name: Arabic (Iraq)
-default charset: windows-1256
-
-OS Locale (lcid: 804, name: zh-Hans): Chinese (Simplified) (People's Republic of China) - 936
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale (lcid: 804, name: zh-CN): Chinese (Simplified) (People's Republic of China) - 936
-default locale: ID: zh_CN, Name: Chinese (China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_CN, Name: Chinese (China)
-default charset: GBK
-
-OS Locale (lcid: 807, name: de-CH): German (Switzerland) - 1252
-default locale: ID: de_CH, Name: German (Switzerland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_CH, Name: German (Switzerland)
-default charset: windows-1252
-
-OS Locale (lcid: 809, name: en-GB): English (United Kingdom) - 1252
-default locale: ID: en_GB, Name: English (United Kingdom)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_GB, Name: English (United Kingdom)
-default charset: windows-1252
-
-OS Locale (lcid: 80a, name: es-MX): Spanish (Mexico) - 1252
-default locale: ID: es_MX, Name: Spanish (Mexico)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_MX, Name: Spanish (Mexico)
-default charset: windows-1252
-
-OS Locale (lcid: 80c, name: fr-BE): French (Belgium) - 1252
-default locale: ID: fr_BE, Name: French (Belgium)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_BE, Name: French (Belgium)
-default charset: windows-1252
-
-OS Locale (lcid: 810, name: it-CH): Italian (Switzerland) - 1252
-default locale: ID: it_CH, Name: Italian (Switzerland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: it_CH, Name: Italian (Switzerland)
-default charset: windows-1252
-
-OS Locale (lcid: 813, name: nl-BE): Dutch (Belgium) - 1252
-default locale: ID: nl_BE, Name: Dutch (Belgium)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: nl_BE, Name: Dutch (Belgium)
-default charset: windows-1252
-
-OS Locale (lcid: 814, name: nn-NO): Norwegian (Nynorsk) (Norway) - 1252
-default locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk)
-default charset: windows-1252
-
-OS Locale (lcid: 816, name: pt-PT): Portuguese (Portugal) - 1252
-default locale: ID: pt_PT, Name: Portuguese (Portugal)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: pt_PT, Name: Portuguese (Portugal)
-default charset: windows-1252
-
-OS Locale (lcid: 81a, name: sr-Latn-CS): Serbian (Latin) (Serbia and Montenegro (Former)) - 1250
-default locale: ID: sr_CS_#Latn, Name: Serbian (Latin,Serbia and Montenegro)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_CS_#Latn, Name: Serbian (Latin,Serbia and Montenegro)
-default charset: windows-1250
-
-OS Locale (lcid: 81d, name: sv-FI): Swedish (Finland) - 1252
-default locale: ID: sv_FI, Name: Swedish (Finland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sv_FI, Name: Swedish (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 82c, name: az-Cyrl-AZ): Azeri (Cyrillic) (Azerbaijan) - 1251
-default locale: ID: az_AZ_#Cyrl, Name: Azerbaijani (Cyrillic,Azerbaijan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: az_AZ_#Cyrl, Name: Azerbaijani (Cyrillic,Azerbaijan)
-default charset: windows-1251
-
-OS Locale (lcid: 82c, name: az-Cyrl): Azeri (Cyrillic) (Azerbaijan) - 1251
-default locale: ID: az_AZ_#Cyrl, Name: Azerbaijani (Cyrillic,Azerbaijan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: az_AZ_#Cyrl, Name: Azerbaijani (Cyrillic,Azerbaijan)
-default charset: windows-1251
-
-OS Locale (lcid: 82e, name: dsb): Lower Sorbian (Germany) - 1252
-default locale: ID: dsb_DE, Name: Lower Sorbian (Germany)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: dsb_DE, Name: Lower Sorbian (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 82e, name: dsb-DE): Lower Sorbian (Germany) - 1252
-default locale: ID: dsb_DE, Name: Lower Sorbian (Germany)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: dsb_DE, Name: Lower Sorbian (Germany)
-default charset: windows-1252
-
-OS Locale (lcid: 83b, name: se-SE): Sami (Northern) (Sweden) - 1252
-default locale: ID: se_SE, Name: Northern Sami (Sweden)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: se_SE, Name: Northern Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 83c, name: ga-IE): Irish (Ireland) - 1252
-default locale: ID: ga_IE, Name: Irish (Ireland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ga_IE, Name: Irish (Ireland)
-default charset: windows-1252
-
-OS Locale (lcid: 83e, name: ms-BN): Malay (Brunei Darussalam) - 1252
-default locale: ID: ms_BN, Name: Malay (Brunei)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ms_BN, Name: Malay (Brunei)
-default charset: windows-1252
-
-OS Locale (lcid: 843, name: uz-Cyrl-UZ): Uzbek (Cyrillic) (Uzbekistan) - 1251
-default locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-default charset: windows-1251
-
-OS Locale (lcid: 843, name: uz-Cyrl): Uzbek (Cyrillic) (Uzbekistan) - 1251
-default locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: uz_UZ_#Cyrl, Name: Uzbek (Cyrillic,Uzbekistan)
-default charset: windows-1251
-
-OS Locale (lcid: 845, name: bn-BD): Bengali (Bangladesh) - 0
-default locale: ID: bn_BD, Name: Bengali (Bangladesh)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bn_BD, Name: Bengali (Bangladesh)
-default charset: UTF-8
-
-OS Locale (lcid: 850, name: mn-Mong-CN): Mongolian (Traditional Mongolian) (People's Republic of China) - 0
-default locale: ID: mn_CN_#Mong, Name: Mongolian (Mongolian,China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mn_CN_#Mong, Name: Mongolian (Mongolian,China)
-default charset: UTF-8
-
-OS Locale (lcid: 850, name: mn-Mong): Mongolian (Traditional Mongolian) (People's Republic of China) - 0
-default locale: ID: mn_CN_#Mong, Name: Mongolian (Mongolian,China)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: mn_CN_#Mong, Name: Mongolian (Mongolian,China)
-default charset: UTF-8
-
-OS Locale (lcid: 85d, name: iu-Latn): Inuktitut (Latin) (Canada) - 1252
-default locale: ID: iu_CA_#Latn, Name: Inuktitut (Latin,Canada)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iu_CA_#Latn, Name: Inuktitut (Latin,Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 85d, name: iu-Latn-CA): Inuktitut (Latin) (Canada) - 1252
-default locale: ID: iu_CA_#Latn, Name: Inuktitut (Latin,Canada)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: iu_CA_#Latn, Name: Inuktitut (Latin,Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 85f, name: tzm): Tamazight (Latin) (Algeria) - 1252
-default locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-default charset: windows-1252
-
-OS Locale (lcid: 85f, name: tzm-Latn-DZ): Tamazight (Latin) (Algeria) - 1252
-default locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-default charset: windows-1252
-
-OS Locale (lcid: 85f, name: tzm-Latn): Tamazight (Latin) (Algeria) - 1252
-default locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: tzm_DZ_#Latn, Name: tzm (Latin,Algeria)
-default charset: windows-1252
-
-OS Locale (lcid: 86b, name: quz-EC): Quechua (Ecuador) - 1252
-default locale: ID: quz_EC, Name: quz (Ecuador)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: quz_EC, Name: quz (Ecuador)
-default charset: windows-1252
-
-OS Locale (lcid: c01, name: ar-EG): Arabic (Egypt) - 1256
-default locale: ID: ar_EG, Name: Arabic (Egypt)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_EG, Name: Arabic (Egypt)
-default charset: windows-1256
-
-OS Locale (lcid: c04, name: zh-HK): Chinese (Traditional) (Hong Kong S.A.R.) - 950
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-MS950-HKSCS
-
-OS Locale (lcid: c04, name: zh-Hant): Chinese (Traditional) (Hong Kong S.A.R.) - 950
-default locale: ID: zh_HK, Name: Chinese (Hong Kong)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_HK, Name: Chinese (Hong Kong)
-default charset: x-windows-950
-
-OS Locale (lcid: c07, name: de-AT): German (Austria) - 1252
-default locale: ID: de_AT, Name: German (Austria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_AT, Name: German (Austria)
-default charset: windows-1252
-
-OS Locale (lcid: c09, name: en-AU): English (Australia) - 1252
-default locale: ID: en_AU, Name: English (Australia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_AU, Name: English (Australia)
-default charset: windows-1252
-
-OS Locale (lcid: c0a, name: es-ES): Spanish (Spain) - 1252
-default locale: ID: es_ES, Name: Spanish (Spain)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_ES, Name: Spanish (Spain)
-default charset: windows-1252
-
-OS Locale (lcid: c0c, name: fr-CA): French (Canada) - 1252
-default locale: ID: fr_CA, Name: French (Canada)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_CA, Name: French (Canada)
-default charset: windows-1252
-
-OS Locale (lcid: c1a, name: sr-Cyrl-CS): Serbian (Cyrillic) (Serbia and Montenegro (Former)) - 1251
-default locale: ID: sr_CS_#Cyrl, Name: Serbian (Cyrillic,Serbia and Montenegro)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_CS_#Cyrl, Name: Serbian (Cyrillic,Serbia and Montenegro)
-default charset: windows-1251
-
-OS Locale (lcid: c3b, name: se-FI): Sami (Northern) (Finland) - 1252
-default locale: ID: se_FI, Name: Northern Sami (Finland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: se_FI, Name: Northern Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: c6b, name: quz-PE): Quechua (Peru) - 1252
-default locale: ID: quz_PE, Name: quz (Peru)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: quz_PE, Name: quz (Peru)
-default charset: windows-1252
-
-OS Locale (lcid: 1001, name: ar-LY): Arabic (Libya) - 1256
-default locale: ID: ar_LY, Name: Arabic (Libya)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_LY, Name: Arabic (Libya)
-default charset: windows-1256
-
-OS Locale (lcid: 1004, name: zh-SG): Chinese (Simplified) (Singapore) - 936
-default locale: ID: zh_SG, Name: Chinese (Singapore)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_SG, Name: Chinese (Singapore)
-default charset: GBK
-
-OS Locale (lcid: 1007, name: de-LU): German (Luxembourg) - 1252
-default locale: ID: de_LU, Name: German (Luxembourg)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_LU, Name: German (Luxembourg)
-default charset: windows-1252
-
-OS Locale (lcid: 1009, name: en-CA): English (Canada) - 1252
-default locale: ID: en_CA, Name: English (Canada)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_CA, Name: English (Canada)
-default charset: windows-1252
-
-OS Locale (lcid: 100a, name: es-GT): Spanish (Guatemala) - 1252
-default locale: ID: es_GT, Name: Spanish (Guatemala)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_GT, Name: Spanish (Guatemala)
-default charset: windows-1252
-
-OS Locale (lcid: 100c, name: fr-CH): French (Switzerland) - 1252
-default locale: ID: fr_CH, Name: French (Switzerland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_CH, Name: French (Switzerland)
-default charset: windows-1252
-
-OS Locale (lcid: 101a, name: hr-BA): Croatian (Latin) (Bosnia and Herzegovina) - 1250
-default locale: ID: hr_BA, Name: Croatian (Bosnia and Herzegovina)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: hr_BA, Name: Croatian (Bosnia and Herzegovina)
-default charset: windows-1250
-
-OS Locale (lcid: 103b, name: smj-NO): Sami (Lule) (Norway) - 1252
-default locale: ID: smj_NO, Name: Lule Sami (Norway)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smj_NO, Name: Lule Sami (Norway)
-default charset: windows-1252
-
-OS Locale (lcid: 1401, name: ar-DZ): Arabic (Algeria) - 1256
-default locale: ID: ar_DZ, Name: Arabic (Algeria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_DZ, Name: Arabic (Algeria)
-default charset: windows-1256
-
-OS Locale (lcid: 1404, name: zh-MO): Chinese (Traditional) (Macao S.A.R.) - 950
-default locale: ID: zh_MO, Name: Chinese (Macao)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: zh_MO, Name: Chinese (Macao)
-default charset: x-windows-950
-
-OS Locale (lcid: 1407, name: de-LI): German (Liechtenstein) - 1252
-default locale: ID: de_LI, Name: German (Liechtenstein)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: de_LI, Name: German (Liechtenstein)
-default charset: windows-1252
-
-OS Locale (lcid: 1409, name: en-NZ): English (New Zealand) - 1252
-default locale: ID: en_NZ, Name: English (New Zealand)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_NZ, Name: English (New Zealand)
-default charset: windows-1252
-
-OS Locale (lcid: 140a, name: es-CR): Spanish (Costa Rica) - 1252
-default locale: ID: es_CR, Name: Spanish (Costa Rica)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_CR, Name: Spanish (Costa Rica)
-default charset: windows-1252
-
-OS Locale (lcid: 140c, name: fr-LU): French (Luxembourg) - 1252
-default locale: ID: fr_LU, Name: French (Luxembourg)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_LU, Name: French (Luxembourg)
-default charset: windows-1252
-
-OS Locale (lcid: 141a, name: bs-Latn): Bosnian (Latin) (Bosnia and Herzegovina) - 1250
-default locale: ID: bs_BA_#Latn, Name: Bosnian (Latin,Bosnia and Herzegovina)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bs_BA_#Latn, Name: Bosnian (Latin,Bosnia and Herzegovina)
-default charset: windows-1250
-
-OS Locale (lcid: 141a, name: bs-Latn-BA): Bosnian (Latin) (Bosnia and Herzegovina) - 1250
-default locale: ID: bs_BA_#Latn, Name: Bosnian (Latin,Bosnia and Herzegovina)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bs_BA_#Latn, Name: Bosnian (Latin,Bosnia and Herzegovina)
-default charset: windows-1250
-
-OS Locale (lcid: 143b, name: smj-SE): Sami (Lule) (Sweden) - 1252
-default locale: ID: smj_SE, Name: Lule Sami (Sweden)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smj_SE, Name: Lule Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 143b, name: smj): Sami (Lule) (Sweden) - 1252
-default locale: ID: smj_SE, Name: Lule Sami (Sweden)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smj_SE, Name: Lule Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 1801, name: ar-MA): Arabic (Morocco) - 1256
-default locale: ID: ar_MA, Name: Arabic (Morocco)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_MA, Name: Arabic (Morocco)
-default charset: windows-1256
-
-OS Locale (lcid: 1809, name: en-IE): English (Ireland) - 1252
-default locale: ID: en_IE, Name: English (Ireland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_IE, Name: English (Ireland)
-default charset: windows-1252
-
-OS Locale (lcid: 180a, name: es-PA): Spanish (Panama) - 1252
-default locale: ID: es_PA, Name: Spanish (Panama)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_PA, Name: Spanish (Panama)
-default charset: windows-1252
-
-OS Locale (lcid: 180c, name: fr-MC): French (Principality of Monaco) - 1252
-default locale: ID: fr_MC, Name: French (Monaco)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: fr_MC, Name: French (Monaco)
-default charset: windows-1252
-
-OS Locale (lcid: 181a, name: sr-Latn-BA): Serbian (Latin) (Bosnia and Herzegovina) - 1250
-default locale: ID: sr_BA_#Latn, Name: Serbian (Latin,Bosnia and Herzegovina)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_BA_#Latn, Name: Serbian (Latin,Bosnia and Herzegovina)
-default charset: windows-1250
-
-OS Locale (lcid: 183b, name: sma-NO): Sami (Southern) (Norway) - 1252
-default locale: ID: sma_NO, Name: Southern Sami (Norway)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sma_NO, Name: Southern Sami (Norway)
-default charset: windows-1252
-
-OS Locale (lcid: 1c01, name: ar-TN): Arabic (Tunisia) - 1256
-default locale: ID: ar_TN, Name: Arabic (Tunisia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_TN, Name: Arabic (Tunisia)
-default charset: windows-1256
-
-OS Locale (lcid: 1c09, name: en-ZA): English (South Africa) - 1252
-default locale: ID: en_ZA, Name: English (South Africa)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_ZA, Name: English (South Africa)
-default charset: windows-1252
-
-OS Locale (lcid: 1c0a, name: es-DO): Spanish (Dominican Republic) - 1252
-default locale: ID: es_DO, Name: Spanish (Dominican Republic)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_DO, Name: Spanish (Dominican Republic)
-default charset: windows-1252
-
-OS Locale (lcid: 1c1a, name: sr-Cyrl-BA): Serbian (Cyrillic) (Bosnia and Herzegovina) - 1251
-default locale: ID: sr_BA_#Cyrl, Name: Serbian (Cyrillic,Bosnia and Herzegovina)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_BA_#Cyrl, Name: Serbian (Cyrillic,Bosnia and Herzegovina)
-default charset: windows-1251
-
-OS Locale (lcid: 1c3b, name: sma): Sami (Southern) (Sweden) - 1252
-default locale: ID: sma_SE, Name: Southern Sami (Sweden)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sma_SE, Name: Southern Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 1c3b, name: sma-SE): Sami (Southern) (Sweden) - 1252
-default locale: ID: sma_SE, Name: Southern Sami (Sweden)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sma_SE, Name: Southern Sami (Sweden)
-default charset: windows-1252
-
-OS Locale (lcid: 2001, name: ar-OM): Arabic (Oman) - 1256
-default locale: ID: ar_OM, Name: Arabic (Oman)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_OM, Name: Arabic (Oman)
-default charset: windows-1256
-
-OS Locale (lcid: 2009, name: en-JM): English (Jamaica) - 1252
-default locale: ID: en_JM, Name: English (Jamaica)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_JM, Name: English (Jamaica)
-default charset: windows-1252
-
-OS Locale (lcid: 200a, name: es-VE): Spanish (Bolivarian Republic of Venezuela) - 1252
-default locale: ID: es_VE, Name: Spanish (Venezuela)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_VE, Name: Spanish (Venezuela)
-default charset: windows-1252
-
-OS Locale (lcid: 201a, name: bs-Cyrl-BA): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251
-default locale: ID: bs_BA_#Cyrl, Name: Bosnian (Cyrillic,Bosnia and Herzegovina)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bs_BA_#Cyrl, Name: Bosnian (Cyrillic,Bosnia and Herzegovina)
-default charset: windows-1251
-
-OS Locale (lcid: 201a, name: bs-Cyrl): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251
-default locale: ID: bs_BA_#Cyrl, Name: Bosnian (Cyrillic,Bosnia and Herzegovina)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: bs_BA_#Cyrl, Name: Bosnian (Cyrillic,Bosnia and Herzegovina)
-default charset: windows-1251
-
-OS Locale (lcid: 203b, name: sms-FI): Sami (Skolt) (Finland) - 1252
-default locale: ID: sms_FI, Name: Skolt Sami (Finland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sms_FI, Name: Skolt Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 203b, name: sms): Sami (Skolt) (Finland) - 1252
-default locale: ID: sms_FI, Name: Skolt Sami (Finland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sms_FI, Name: Skolt Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 2401, name: ar-YE): Arabic (Yemen) - 1256
-default locale: ID: ar_YE, Name: Arabic (Yemen)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_YE, Name: Arabic (Yemen)
-default charset: windows-1256
-
-OS Locale (lcid: 2409, name: en-029): English (Caribbean) - 1252
-default locale: ID: en_029, Name: English (Caribbean)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_029, Name: English (Caribbean)
-default charset: windows-1252
-
-OS Locale (lcid: 240a, name: es-CO): Spanish (Colombia) - 1252
-default locale: ID: es_CO, Name: Spanish (Colombia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_CO, Name: Spanish (Colombia)
-default charset: windows-1252
-
-OS Locale (lcid: 241a, name: sr-Latn-RS): Serbian (Latin) (Serbia) - 1250
-default locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-default charset: windows-1250
-
-OS Locale (lcid: 241a, name: sr-Latn): Serbian (Latin) (Serbia) - 1250
-default locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_RS_#Latn, Name: Serbian (Latin,Serbia)
-default charset: windows-1250
-
-OS Locale (lcid: 243b, name: smn): Sami (Inari) (Finland) - 1252
-default locale: ID: smn_FI, Name: Inari Sami (Finland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smn_FI, Name: Inari Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 243b, name: smn-FI): Sami (Inari) (Finland) - 1252
-default locale: ID: smn_FI, Name: Inari Sami (Finland)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: smn_FI, Name: Inari Sami (Finland)
-default charset: windows-1252
-
-OS Locale (lcid: 2801, name: ar-SY): Arabic (Syria) - 1256
-default locale: ID: ar_SY, Name: Arabic (Syria)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_SY, Name: Arabic (Syria)
-default charset: windows-1256
-
-OS Locale (lcid: 2809, name: en-BZ): English (Belize) - 1252
-default locale: ID: en_BZ, Name: English (Belize)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_BZ, Name: English (Belize)
-default charset: windows-1252
-
-OS Locale (lcid: 280a, name: es-PE): Spanish (Peru) - 1252
-default locale: ID: es_PE, Name: Spanish (Peru)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_PE, Name: Spanish (Peru)
-default charset: windows-1252
-
-OS Locale (lcid: 281a, name: sr-Cyrl-RS): Serbian (Cyrillic) (Serbia) - 1251
-default locale: ID: sr_RS_#Cyrl, Name: Serbian (Cyrillic,Serbia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_RS_#Cyrl, Name: Serbian (Cyrillic,Serbia)
-default charset: windows-1251
-
-OS Locale (lcid: 281a, name: sr-Cyrl): Serbian (Cyrillic) (Serbia) - 1251
-default locale: ID: sr_RS_#Cyrl, Name: Serbian (Cyrillic,Serbia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_RS_#Cyrl, Name: Serbian (Cyrillic,Serbia)
-default charset: windows-1251
-
-OS Locale (lcid: 2c01, name: ar-JO): Arabic (Jordan) - 1256
-default locale: ID: ar_JO, Name: Arabic (Jordan)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_JO, Name: Arabic (Jordan)
-default charset: windows-1256
-
-OS Locale (lcid: 2c09, name: en-TT): English (Trinidad and Tobago) - 1252
-default locale: ID: en_TT, Name: English (Trinidad and Tobago)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_TT, Name: English (Trinidad and Tobago)
-default charset: windows-1252
-
-OS Locale (lcid: 2c0a, name: es-AR): Spanish (Argentina) - 1252
-default locale: ID: es_AR, Name: Spanish (Argentina)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_AR, Name: Spanish (Argentina)
-default charset: windows-1252
-
-OS Locale (lcid: 2c1a, name: sr-Latn-ME): Serbian (Latin) (Montenegro) - 1250
-default locale: ID: sr_ME_#Latn, Name: Serbian (Latin,Montenegro)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_ME_#Latn, Name: Serbian (Latin,Montenegro)
-default charset: windows-1250
-
-OS Locale (lcid: 3001, name: ar-LB): Arabic (Lebanon) - 1256
-default locale: ID: ar_LB, Name: Arabic (Lebanon)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_LB, Name: Arabic (Lebanon)
-default charset: windows-1256
-
-OS Locale (lcid: 3009, name: en-ZW): English (Zimbabwe) - 1252
-default locale: ID: en_ZW, Name: English (Zimbabwe)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_ZW, Name: English (Zimbabwe)
-default charset: windows-1252
-
-OS Locale (lcid: 300a, name: es-EC): Spanish (Ecuador) - 1252
-default locale: ID: es_EC, Name: Spanish (Ecuador)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_EC, Name: Spanish (Ecuador)
-default charset: windows-1252
-
-OS Locale (lcid: 301a, name: sr-Cyrl-ME): Serbian (Cyrillic) (Montenegro) - 1251
-default locale: ID: sr_ME_#Cyrl, Name: Serbian (Cyrillic,Montenegro)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: sr_ME_#Cyrl, Name: Serbian (Cyrillic,Montenegro)
-default charset: windows-1251
-
-OS Locale (lcid: 3401, name: ar-KW): Arabic (Kuwait) - 1256
-default locale: ID: ar_KW, Name: Arabic (Kuwait)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_KW, Name: Arabic (Kuwait)
-default charset: windows-1256
-
-OS Locale (lcid: 3409, name: en-PH): English (Republic of the Philippines) - 1252
-default locale: ID: en_PH, Name: English (Philippines)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_PH, Name: English (Philippines)
-default charset: windows-1252
-
-OS Locale (lcid: 340a, name: es-CL): Spanish (Chile) - 1252
-default locale: ID: es_CL, Name: Spanish (Chile)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_CL, Name: Spanish (Chile)
-default charset: windows-1252
-
-OS Locale (lcid: 3801, name: ar-AE): Arabic (U.A.E.) - 1256
-default locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_AE, Name: Arabic (United Arab Emirates)
-default charset: windows-1256
-
-OS Locale (lcid: 380a, name: es-UY): Spanish (Uruguay) - 1252
-default locale: ID: es_UY, Name: Spanish (Uruguay)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_UY, Name: Spanish (Uruguay)
-default charset: windows-1252
-
-OS Locale (lcid: 3c01, name: ar-BH): Arabic (Bahrain) - 1256
-default locale: ID: ar_BH, Name: Arabic (Bahrain)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_BH, Name: Arabic (Bahrain)
-default charset: windows-1256
-
-OS Locale (lcid: 3c0a, name: es-PY): Spanish (Paraguay) - 1252
-default locale: ID: es_PY, Name: Spanish (Paraguay)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_PY, Name: Spanish (Paraguay)
-default charset: windows-1252
-
-OS Locale (lcid: 4001, name: ar-QA): Arabic (Qatar) - 1256
-default locale: ID: ar_QA, Name: Arabic (Qatar)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: ar_QA, Name: Arabic (Qatar)
-default charset: windows-1256
-
-OS Locale (lcid: 4009, name: en-IN): English (India) - 1252
-default locale: ID: en_IN, Name: English (India)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_IN, Name: English (India)
-default charset: windows-1252
-
-OS Locale (lcid: 400a, name: es-BO): Spanish (Bolivia) - 1252
-default locale: ID: es_BO, Name: Spanish (Bolivia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_BO, Name: Spanish (Bolivia)
-default charset: windows-1252
-
-OS Locale (lcid: 4409, name: en-MY): English (Malaysia) - 1252
-default locale: ID: en_MY, Name: English (Malaysia)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_MY, Name: English (Malaysia)
-default charset: windows-1252
-
-OS Locale (lcid: 440a, name: es-SV): Spanish (El Salvador) - 1252
-default locale: ID: es_SV, Name: Spanish (El Salvador)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_SV, Name: Spanish (El Salvador)
-default charset: windows-1252
-
-OS Locale (lcid: 4809, name: en-SG): English (Singapore) - 1252
-default locale: ID: en_SG, Name: English (Singapore)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_SG, Name: English (Singapore)
-default charset: windows-1252
-
-OS Locale (lcid: 480a, name: es-HN): Spanish (Honduras) - 1252
-default locale: ID: es_HN, Name: Spanish (Honduras)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_HN, Name: Spanish (Honduras)
-default charset: windows-1252
-
-OS Locale (lcid: 4c0a, name: es-NI): Spanish (Nicaragua) - 1252
-default locale: ID: es_NI, Name: Spanish (Nicaragua)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_NI, Name: Spanish (Nicaragua)
-default charset: windows-1252
-
-OS Locale (lcid: 500a, name: es-PR): Spanish (Puerto Rico) - 1252
-default locale: ID: es_PR, Name: Spanish (Puerto Rico)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_PR, Name: Spanish (Puerto Rico)
-default charset: windows-1252
-
-OS Locale (lcid: 540a, name: es-US): Spanish (United States) - 1252
-default locale: ID: es_US, Name: Spanish (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: es_US, Name: Spanish (United States)
-default charset: windows-1252
-
-OS UI Language (name: en-US)
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: en_US, Name: English (United States)
-format locale: ID: en_US, Name: English (United States)
-default charset: windows-1252
-
-OS UI Language (name: ja-JP)
-default locale: ID: en_US, Name: English (United States)
-display locale: ID: ja_JP, Name: Japanese (Japan)
-format locale: ID: en_US, Name: English (United States)
-default charset: windows-1252
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/util/zip/ZipFile/MultiThreadedReadTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ *
+ * 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 8038491
+ * @summary Crash in ZipFile.read() when ZipFileInputStream is shared between threads
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.FileUtils
+ * @run main MultiThreadedReadTest
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.nio.file.Paths;
+import java.util.Random;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+import jdk.testlibrary.FileUtils;
+
+public class MultiThreadedReadTest extends Thread {
+
+    private static final int NUM_THREADS = 10;
+    private static final String ZIPFILE_NAME = "large.zip";
+    private static final String ZIPENTRY_NAME = "random.txt";
+    private static InputStream is = null;
+
+    public static void main(String args[]) throws Exception {
+        createZipFile();
+        try (ZipFile zf = new ZipFile(new File(ZIPFILE_NAME))) {
+            is = zf.getInputStream(zf.getEntry(ZIPENTRY_NAME));
+            Thread[] threadArray = new Thread[NUM_THREADS];
+            for (int i = 0; i < threadArray.length; i++) {
+                threadArray[i] = new MultiThreadedReadTest();
+            }
+            for (int i = 0; i < threadArray.length; i++) {
+                threadArray[i].start();
+            }
+            for (int i = 0; i < threadArray.length; i++) {
+                threadArray[i].join();
+            }
+        } finally {
+            FileUtils.deleteFileIfExistsWithRetry(Paths.get(ZIPFILE_NAME));
+        }
+    }
+
+    private static void createZipFile() throws Exception {
+        try (ZipOutputStream zos =
+            new ZipOutputStream(new FileOutputStream(ZIPFILE_NAME))) {
+
+            zos.putNextEntry(new ZipEntry(ZIPENTRY_NAME));
+            StringBuilder sb = new StringBuilder();
+            Random rnd = new Random();
+            for(int i = 0; i < 1000; i++) {
+                // append some random string for ZipEntry
+                sb.append(Long.toString(rnd.nextLong()));
+            }
+            byte[] b = sb.toString().getBytes();
+            zos.write(b, 0, b.length);
+        }
+    }
+
+    @Override
+    public void run() {
+        try {
+            while (is.read() != -1) { }
+        } catch (Exception e) {
+            // Swallow any Exceptions (which are expected) - we're only interested in the crash
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/util/zip/ZipFile/ZipEntryFreeTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,130 @@
+/*
+ * 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.
+ */
+
+/* @test
+ * @bug 6907252
+ * @summary ZipFileInputStream Not Thread-Safe
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @run main ZipEntryFreeTest
+ */
+
+import java.io.*;
+import java.nio.file.Paths;
+import java.util.Random;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.zip.*;
+import jdk.testlibrary.FileUtils;
+
+public class ZipEntryFreeTest extends Thread {
+
+    private static final int NUM_THREADS = 5;
+    private static final int TEST_ITERATIONS = 5;
+    private static final String ZIPFILE_NAME = "large.zip";
+    private static final String ZIPENTRY_NAME = "random.txt";
+    private static InputStream is = null;
+    final Timer timer = new Timer();
+
+    public static void main(String args[]) throws Exception {
+        createZipFile();
+        try {
+            for (int i = 0; i < TEST_ITERATIONS; i++) {
+               runTest();
+            }
+        } finally {
+            FileUtils.deleteFileIfExistsWithRetry(Paths.get(ZIPFILE_NAME));
+        }
+    }
+
+    private static void runTest() throws Exception {
+        try (ZipFile zf = new ZipFile(new File(ZIPFILE_NAME))) {
+            is = zf.getInputStream(zf.getEntry(ZIPENTRY_NAME + "_0"));
+            Thread[] threadArray = new Thread[NUM_THREADS];
+            for (int i = 0; i < threadArray.length; i++) {
+                threadArray[i] = new ZipEntryFreeTest();
+            }
+            for (int i = 0; i < threadArray.length; i++) {
+                threadArray[i].start();
+            }
+            for (int i = 0; i < threadArray.length; i++) {
+                threadArray[i].join();
+            }
+        }
+    }
+
+    private static void createZipFile() throws Exception {
+        Random rnd = new Random(1000L);
+        byte[] contents = new byte[2_000_000];
+        ZipEntry ze = null;
+
+        try (ZipOutputStream zos =
+            new ZipOutputStream(new FileOutputStream(ZIPFILE_NAME))) {
+            // uncompressed mode seemed to tickle the crash
+            zos.setMethod(ZipOutputStream.STORED);
+            for (int ze_count = 0; ze_count < 10; ze_count++) {
+                rnd.nextBytes(contents);
+                ze = createZipEntry(contents, ze_count);
+                zos.putNextEntry(ze);
+                zos.write(contents, 0, contents.length);
+            }
+            zos.flush();
+        }
+    }
+
+    private static ZipEntry createZipEntry(byte[] b, int i) {
+        ZipEntry ze = new ZipEntry(ZIPENTRY_NAME + "_" + i);
+        ze.setCompressedSize(b.length);
+        ze.setSize(b.length);
+        CRC32 crc = new CRC32();
+        crc.update(b);
+        ze.setCrc(crc.getValue());
+        return ze;
+    }
+
+    @Override
+    public void run() {
+        try {
+            int iteration = 0;
+            TimerTask tt = (new TimerTask() {
+                @Override
+                public void run() {
+                    try {
+                        is.close();
+                    } catch (Exception ex) {
+                         ex.printStackTrace(System.out);
+                    }
+                }
+            });
+            timer.schedule(tt, 50);
+            while (is.read() != -1 && iteration++ < 1_000) { }
+        } catch (ZipException ze) {
+            // ZipException now expected instead of ZIP_Read crash
+            System.out.println(ze);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            timer.cancel();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,379 @@
+/*
+ * 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.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.NoSuchAlgorithmException;
+import java.security.Security;
+import java.util.concurrent.TimeUnit;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLHandshakeException;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+
+/**
+ * @test
+ * @bug 8076221
+ * @summary Check if weak cipher suites are disabled
+ * @run main/othervm DisabledAlgorithms default
+ * @run main/othervm -Djdk.tls.namedGroups="secp256r1,secp192r1"
+ *     DisabledAlgorithms empty
+ */
+public class DisabledAlgorithms {
+
+    private static final String pathToStores =
+            "../../../../sun/security/ssl/etc";
+    private static final String keyStoreFile = "keystore";
+    private static final String trustStoreFile = "truststore";
+    private static final String passwd = "passphrase";
+
+    private static final String keyFilename =
+            System.getProperty("test.src", "./") + "/" + pathToStores +
+                "/" + keyStoreFile;
+
+    private static final String trustFilename =
+            System.getProperty("test.src", "./") + "/" + pathToStores +
+                "/" + trustStoreFile;
+
+    // supported RC4 cipher suites
+    // it does not contain KRB5 cipher suites because they need a KDC
+    private static final String[] rc4_ciphersuites = new String[] {
+        "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
+        "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
+        "SSL_RSA_WITH_RC4_128_SHA",
+        "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
+        "TLS_ECDH_RSA_WITH_RC4_128_SHA",
+        "SSL_RSA_WITH_RC4_128_MD5",
+        "TLS_ECDH_anon_WITH_RC4_128_SHA",
+        "SSL_DH_anon_WITH_RC4_128_MD5"
+    };
+
+    public static void main(String[] args) throws Exception {
+        if (args.length < 1) {
+            throw new RuntimeException("No parameters specified");
+        }
+
+        System.setProperty("javax.net.ssl.keyStore", keyFilename);
+        System.setProperty("javax.net.ssl.keyStorePassword", passwd);
+        System.setProperty("javax.net.ssl.trustStore", trustFilename);
+        System.setProperty("javax.net.ssl.trustStorePassword", passwd);
+
+        switch (args[0]) {
+            case "default":
+                // use default jdk.tls.disabledAlgorithms
+                System.out.println("jdk.tls.disabledAlgorithms = "
+                        + Security.getProperty("jdk.tls.disabledAlgorithms"));
+
+                // check if RC4 cipher suites can't be used by default
+                checkFailure(rc4_ciphersuites);
+                break;
+            case "empty":
+                // reset jdk.tls.disabledAlgorithms
+                Security.setProperty("jdk.tls.disabledAlgorithms", "");
+                System.out.println("jdk.tls.disabledAlgorithms = "
+                        + Security.getProperty("jdk.tls.disabledAlgorithms"));
+
+                // some of the certs in our test are weak; disable
+                Security.setProperty("jdk.certpath.disabledAlgorithms", "");
+                System.out.println("jdk.certpath.disabledAlgorithms = "
+                        + Security.getProperty("jdk.cerpath.disabledAlgorithms"));
+
+                // check if RC4 cipher suites can be used
+                // if jdk.tls.disabledAlgorithms is empty
+                checkSuccess(rc4_ciphersuites);
+                break;
+            default:
+                throw new RuntimeException("Wrong parameter: " + args[0]);
+        }
+
+        System.out.println("Test passed");
+    }
+
+    /*
+     * Checks if that specified cipher suites cannot be used.
+     */
+    private static void checkFailure(String[] ciphersuites) throws Exception {
+        try (SSLServer server = SSLServer.init(ciphersuites)) {
+            startNewThread(server);
+            while (!server.isRunning()) {
+                sleep();
+            }
+
+            int port = server.getPort();
+            for (String ciphersuite : ciphersuites) {
+                try (SSLClient client = SSLClient.init(port, ciphersuite)) {
+                    client.connect();
+                    throw new RuntimeException("Expected SSLHandshakeException "
+                            + "not thrown");
+                } catch (SSLHandshakeException e) {
+                    System.out.println("Expected exception on client side: "
+                            + e);
+                }
+            }
+
+            while (server.isRunning()) {
+                sleep();
+            }
+
+            if (!server.sslError()) {
+                throw new RuntimeException("Expected SSL exception "
+                        + "not thrown on server side");
+            }
+        }
+
+    }
+
+    /*
+     * Checks if specified cipher suites can be used.
+     */
+    private static void checkSuccess(String[] ciphersuites) throws Exception {
+        try (SSLServer server = SSLServer.init(ciphersuites)) {
+            startNewThread(server);
+            while (!server.isRunning()) {
+                sleep();
+            }
+
+            int port = server.getPort();
+            for (String ciphersuite : ciphersuites) {
+                try (SSLClient client = SSLClient.init(port, ciphersuite)) {
+                    client.connect();
+                    String negotiated = client.getNegotiatedCipherSuite();
+                    System.out.println("Negotiated cipher suite: "
+                            + negotiated);
+                    if (!negotiated.equals(ciphersuite)) {
+                        throw new RuntimeException("Unexpected cipher suite: "
+                                + negotiated);
+                    }
+                }
+            }
+
+            server.stop();
+            while (server.isRunning()) {
+                sleep();
+            }
+
+            if (server.error()) {
+                throw new RuntimeException("Unexpected error on server side");
+            }
+        }
+
+    }
+
+    private static Thread startNewThread(SSLServer server) {
+        Thread serverThread = new Thread(server, "SSL server thread");
+        serverThread.setDaemon(true);
+        serverThread.start();
+        return serverThread;
+    }
+
+    private static void sleep() {
+        try {
+            TimeUnit.MILLISECONDS.sleep(50);
+        } catch (InterruptedException e) {
+            // do nothing
+        }
+    }
+
+    static class SSLServer implements Runnable, AutoCloseable {
+
+        private final SSLServerSocket ssocket;
+        private volatile boolean stopped = false;
+        private volatile boolean running = false;
+        private volatile boolean sslError = false;
+        private volatile boolean otherError = false;
+
+        private SSLServer(SSLServerSocket ssocket) {
+            this.ssocket = ssocket;
+        }
+
+        @Override
+        public void run() {
+            System.out.println("Server: started");
+            running = true;
+            while (!stopped) {
+                try (SSLSocket socket = (SSLSocket) ssocket.accept()) {
+                    System.out.println("Server: accepted client connection");
+                    InputStream in = socket.getInputStream();
+                    OutputStream out = socket.getOutputStream();
+                    int b = in.read();
+                    if (b < 0) {
+                        throw new IOException("Unexpected EOF");
+                    }
+                    System.out.println("Server: send data: " + b);
+                    out.write(b);
+                    out.flush();
+                    socket.getSession().invalidate();
+                } catch (SSLHandshakeException e) {
+                    System.out.println("Server: run: " + e);
+                    e.printStackTrace();
+                    sslError = true;
+                    stopped = true;
+                } catch (IOException e) {
+                    if (!stopped) {
+                        System.out.println("Server: run: unexpected exception: "
+                                + e);
+                        e.printStackTrace();
+                        otherError = true;
+                        stopped = true;
+                    } else {
+                        System.out.println("Server: run: " + e);
+                        System.out.println("The exception above occurred "
+                                    + "because socket was closed, "
+                                    + "please ignore it");
+                    }
+                }
+            }
+
+            System.out.println("Server: finished");
+            running = false;
+        }
+
+        int getPort() {
+            return ssocket.getLocalPort();
+        }
+
+        String[] getEnabledCiperSuites() {
+            return ssocket.getEnabledCipherSuites();
+        }
+
+        boolean isRunning() {
+            return running;
+        }
+
+        boolean sslError() {
+            return sslError;
+        }
+
+        boolean error() {
+            return sslError || otherError;
+        }
+
+        void stop() {
+            stopped = true;
+            if (!ssocket.isClosed()) {
+                try {
+                    System.out.println("Server: close socket");
+                    ssocket.close();
+                } catch (IOException e) {
+                    System.out.println("Server: close: " + e);
+                }
+            }
+        }
+
+        @Override
+        public void close() {
+            stop();
+        }
+
+        static SSLServer init(String[] ciphersuites)
+                throws IOException {
+            SSLServerSocketFactory ssf = (SSLServerSocketFactory)
+                    SSLServerSocketFactory.getDefault();
+            SSLServerSocket ssocket = (SSLServerSocket)
+                    ssf.createServerSocket(0);
+
+            if (ciphersuites != null) {
+                System.out.println("Server: enable cipher suites: "
+                        + java.util.Arrays.toString(ciphersuites));
+                ssocket.setEnabledCipherSuites(ciphersuites);
+            }
+
+            return new SSLServer(ssocket);
+        }
+    }
+
+    static class SSLClient implements AutoCloseable {
+
+        private final SSLSocket socket;
+
+        private SSLClient(SSLSocket socket) {
+            this.socket = socket;
+        }
+
+        void connect() throws IOException {
+            System.out.println("Client: connect to server");
+            try (
+                    BufferedInputStream bis = new BufferedInputStream(
+                            socket.getInputStream());
+                    BufferedOutputStream bos = new BufferedOutputStream(
+                            socket.getOutputStream())) {
+                bos.write('x');
+                bos.flush();
+
+                int read = bis.read();
+                if (read < 0) {
+                    throw new IOException("Client: couldn't read a response");
+                }
+                socket.getSession().invalidate();
+            }
+        }
+
+        String[] getEnabledCiperSuites() {
+            return socket.getEnabledCipherSuites();
+        }
+
+        String getNegotiatedCipherSuite() {
+            return socket.getSession().getCipherSuite();
+        }
+
+        @Override
+        public void close() throws Exception {
+            if (!socket.isClosed()) {
+                try {
+                    socket.close();
+                } catch (IOException e) {
+                    System.out.println("Client: close: " + e);
+                }
+            }
+        }
+
+        static SSLClient init(int port)
+                throws NoSuchAlgorithmException, IOException {
+            return init(port, null);
+        }
+
+        static SSLClient init(int port, String ciphersuite)
+                throws NoSuchAlgorithmException, IOException {
+            SSLContext context = SSLContext.getDefault();
+            SSLSocketFactory ssf = (SSLSocketFactory)
+                    context.getSocketFactory();
+            SSLSocket socket = (SSLSocket) ssf.createSocket("localhost", port);
+
+            if (ciphersuite != null) {
+                System.out.println("Client: enable cipher suite: "
+                        + ciphersuite);
+                socket.setEnabledCipherSuites(new String[] { ciphersuite });
+            }
+
+            return new SSLClient(socket);
+        }
+
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JComboBox/8033069/bug8033069NoScrollBar.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,182 @@
+/*
+ * 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.awt.AWTException;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+import javax.swing.UnsupportedLookAndFeelException;
+
+/* @test
+ * @bug 8033069
+ * @summary Checks that JComboBox popup does not close when mouse wheel is
+ *          rotated over combo box and over its popup. The case where popup
+ *          has no scroll bar.
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main bug8033069NoScrollBar
+ * @author Alexey Ivanov
+ */
+public class bug8033069NoScrollBar implements Runnable {
+
+    private static final String[] NO_SCROLL_ITEMS = new String[] {
+        "A", "B", "C", "D", "E", "F"
+    };
+
+    private final Robot robot;
+
+    private final String[] items;
+
+    private JFrame frame;
+    private JComboBox cb1;
+    private JComboBox cb2;
+
+    public static void main(String[] args) throws Exception {
+        iterateLookAndFeels(new bug8033069NoScrollBar(NO_SCROLL_ITEMS));
+    }
+
+    protected static void iterateLookAndFeels(final bug8033069NoScrollBar test) throws Exception {
+        LookAndFeelInfo[] lafInfo = UIManager.getInstalledLookAndFeels();
+        for (LookAndFeelInfo info : lafInfo) {
+            try {
+                UIManager.setLookAndFeel(info.getClassName());
+                System.out.println("Look and Feel: " + info.getClassName());
+                test.runTest();
+            } catch (UnsupportedLookAndFeelException e) {
+                System.out.println("Skipping unsupported LaF: " + info);
+            }
+        }
+    }
+
+    public bug8033069NoScrollBar(String[] items) throws AWTException {
+        this.items = items;
+
+        robot = new Robot();
+        robot.setAutoDelay(200);
+    }
+
+    private void setupUI() {
+        frame = new JFrame();
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        cb1 = new JComboBox<>(items);
+        cb2 = new JComboBox<>(items);
+        JPanel panel = new JPanel(new GridLayout(1, 2));
+        panel.add(cb1);
+        panel.add(cb2);
+
+        frame.add(panel);
+
+        frame.pack();
+        frame.setVisible(true);
+    }
+
+    public void runTest() throws Exception {
+        try {
+            SwingUtilities.invokeAndWait(this);
+
+            robot.waitForIdle();
+            assertFalse("cb1 popup is visible",
+                        Util.invokeOnEDT(cb1::isPopupVisible));
+
+            // Move mouse pointer to the center of the fist combo box
+            Point p = cb1.getLocationOnScreen();
+            Dimension d = cb1.getSize();
+            robot.mouseMove(p.x + d.width / 2, p.y + d.height / 2);
+            // Click it to open popup
+            robot.mousePress(InputEvent.BUTTON1_MASK);
+            robot.mouseRelease(InputEvent.BUTTON1_MASK);
+
+            robot.waitForIdle();
+            assertTrue("cb1 popup is not visible",
+                       Util.invokeOnEDT(cb1::isPopupVisible));
+
+            robot.mouseWheel(1);
+            robot.waitForIdle();
+            assertTrue("cb1 popup is not visible after mouse wheel up on combo box",
+                       Util.invokeOnEDT(cb1::isPopupVisible));
+
+            robot.mouseWheel(-1);
+            robot.waitForIdle();
+            assertTrue("cb1 popup is not visible after mouse wheel down on combo box",
+                       Util.invokeOnEDT(cb1::isPopupVisible));
+
+            // Move mouse down on the popup
+            robot.mouseMove(p.x + d.width / 2, p.y + d.height * 3);
+
+            robot.mouseWheel(1);
+            robot.waitForIdle();
+            assertTrue("cb1 popup is not visible after mouse wheel up on popup",
+                       Util.invokeOnEDT(cb1::isPopupVisible));
+
+            robot.mouseWheel(-1);
+            robot.waitForIdle();
+            assertTrue("cb1 popup is not visible after mouse wheel down on popup",
+                       Util.invokeOnEDT(cb1::isPopupVisible));
+
+
+            // Move mouse pointer to the center of the second combo box
+            p = cb2.getLocationOnScreen();
+            d = cb2.getSize();
+            robot.mouseMove(p.x + d.width / 2, p.y + d.height / 2);
+
+            robot.mouseWheel(1);
+            robot.waitForIdle();
+            assertFalse("cb1 popup is visible after mouse wheel up on cb2",
+                        Util.invokeOnEDT(cb1::isPopupVisible));
+        } finally {
+            if (frame != null) {
+                frame.dispose();
+            }
+        }
+
+        System.out.println("Test passed");
+    }
+
+    @Override
+    public void run() {
+        setupUI();
+    }
+
+    private static void assertTrue(String message, boolean value) {
+        assertEquals(message, true, value);
+    }
+
+    private static void assertFalse(String message, boolean value) {
+        assertEquals(message, false, value);
+    }
+
+    private static void assertEquals(String message, boolean expected, boolean actual) {
+        if (expected != actual) {
+            throw new RuntimeException(message);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JComboBox/8033069/bug8033069ScrollBar.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,52 @@
+/*
+ * 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.awt.AWTException;
+
+/* @test
+ * @bug 8033069
+ * @summary Checks that JComboBox popup does not close when mouse wheel is
+ *          rotated over combo box and over its popup. The case where
+ *          popup has scroll bar.
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main bug8033069ScrollBar
+ * @author Alexey Ivanov
+ */
+public class bug8033069ScrollBar extends bug8033069NoScrollBar {
+
+    private static final String[] SCROLL_ITEMS = new String[] {
+            "A", "B", "C", "D", "E", "F",
+            "G", "H", "I", "J", "K", "L",
+            "M", "N", "O", "P", "Q", "R"
+    };
+
+    public static void main(String[] args) throws Exception {
+        iterateLookAndFeels(new bug8033069ScrollBar(SCROLL_ITEMS));
+    }
+
+    public bug8033069ScrollBar(String[] items) throws AWTException {
+        super(items);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JMenu/8071705/bug8071705.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,207 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8071705
+ * @summary  Java application menu misbehaves when running multiple screen stacked vertically
+ * @build bug8071705
+ * @run main/othervm bug8071705
+ */
+
+import java.awt.Dimension;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.event.KeyEvent;
+import java.util.concurrent.CountDownLatch;
+
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+
+public class bug8071705 {
+
+    public static void main(String[] args) throws Exception {
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        final boolean [] result = new boolean[1];
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                JFrame frame = createGUI();
+                GraphicsDevice[] devices = checkScreens();
+
+                // check if we have more than one and if they are stacked
+                // vertically
+                GraphicsDevice device = checkConfigs(devices);
+                if (device == null) {
+                    // just pass the test
+                    frame.dispose();
+                    result[0] = true;
+                    latch.countDown();
+                } else {
+                    FrameListener listener =
+                            new FrameListener(device, latch, result);
+                    frame.addComponentListener(listener);
+                    frame.setVisible(true);
+                }
+            }
+        });
+
+        latch.await();
+
+        if (result[0] == false) {
+            throw new RuntimeException("popup menu rendered in wrong position");
+        }
+
+        System.out.println("OK");
+    }
+
+    private static GraphicsDevice[] checkScreens() {
+        GraphicsEnvironment ge =
+            GraphicsEnvironment.getLocalGraphicsEnvironment();
+        return ge.getScreenDevices();
+    }
+
+    private static JFrame createGUI() {
+        JMenuBar menuBar = new JMenuBar();
+        JMenu menu = new JMenu("Some menu");
+        menuBar.add(menu);
+
+        for (int i = 0; i < 10; i++) {
+            menu.add(new JMenuItem("Some menu #" + i));
+        }
+
+        JFrame frame = new JFrame();
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.setMinimumSize(new Dimension(200, 200));
+        frame.setJMenuBar(menuBar);
+        return frame;
+    }
+
+    private static GraphicsDevice checkConfigs(GraphicsDevice[] devices) {
+
+        GraphicsDevice correctDevice = null;
+        if (devices.length < 2) {
+            return correctDevice;
+        }
+
+        Toolkit toolkit = Toolkit.getDefaultToolkit();
+        Rectangle screenBounds = new Rectangle(toolkit.getScreenSize());
+        int halfScreen = screenBounds.height/2;
+
+        for(int i = 0; i < devices.length; i++) {
+            if(devices[i].getType() == GraphicsDevice.TYPE_RASTER_SCREEN) {
+                GraphicsConfiguration conf =
+                        devices[i].getDefaultConfiguration();
+                Rectangle bounds = conf.getBounds();
+                if (bounds.y >= halfScreen) {
+                    // found
+                    correctDevice = devices[i];
+                    break;
+                }
+            }
+        }
+        return correctDevice;
+    }
+
+    private static class FrameListener extends ComponentAdapter {
+
+        private GraphicsDevice device;
+        private CountDownLatch latch;
+        private boolean [] result;
+        public FrameListener(GraphicsDevice device,
+                             CountDownLatch latch,
+                             boolean [] result)
+        {
+            this.device = device;
+            this.latch = latch;
+            this.result = result;
+        }
+
+        @Override
+        public void componentShown(ComponentEvent e) {
+            JFrame frame = (JFrame) e.getComponent();
+
+            runActualTest(device, latch, frame, result);
+
+            frame.setVisible(false);
+            frame.dispose();
+            latch.countDown();
+        }
+    }
+
+    private static Rectangle setLocation(JFrame frame, GraphicsDevice device) {
+        GraphicsConfiguration conf = device.getDefaultConfiguration();
+        Rectangle bounds = conf.getBounds();
+
+        // put just below half screen
+        int x = bounds.x + bounds.width/2;
+        int y = bounds.y + bounds.height/2;
+        frame.setLocation(x, y);
+
+        return bounds;
+    }
+
+    private static void runActualTest(GraphicsDevice device,
+                                      CountDownLatch latch,
+                                      JFrame frame,
+                                      boolean [] result)
+    {
+        Rectangle screenBounds = setLocation(frame, device);
+        JMenu menu = frame.getJMenuBar().getMenu(0);
+        menu.doClick();
+
+        Point location = menu.getLocationOnScreen();
+        JPopupMenu pm = menu.getPopupMenu();
+        Dimension pmSize = pm.getSize();
+
+        int yOffset = UIManager.getInt("Menu.submenuPopupOffsetY");
+        int height = location.y + yOffset + pmSize.height + menu.getHeight();
+        int available = screenBounds.y + screenBounds.height - height;
+        if (available > 0) {
+            Point origin = pm.getLocationOnScreen();
+            if (origin.y < location.y) {
+                // growing upward, wrong!
+                result[0] = false;
+            } else {
+                // growing downward, ok!
+                result[0] = true;
+            }
+        } else {
+            // there is no space, growing upward would be ok, so we pass
+            result[0] = true;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JRadioButton/8075609/bug8075609.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,115 @@
+/*
+ * 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.
+ */
+
+ /*
+ * @test
+ * @library ../../regtesthelpers
+ * @build Util
+ * @bug 8075609
+ * @summary  IllegalArgumentException when transferring focus from JRadioButton using tab
+ * @author Vivi An
+ * @run main bug8075609
+ */
+
+import javax.swing.*;
+import javax.swing.event.*;
+import java.awt.event.*;
+import java.awt.*;
+import sun.awt.SunToolkit;
+
+public class bug8075609 {
+    private static Robot robot;
+    private static SunToolkit toolkit;
+    private static JTextField textField;
+
+    public static void main(String args[]) throws Throwable {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+
+        robot = new Robot();
+        Thread.sleep(100);
+
+        robot.setAutoDelay(100);
+        toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+
+        // Radio button group tab key test
+        runTest1();
+    }
+
+    private static void createAndShowGUI() {
+        JFrame mainFrame = new JFrame("Bug 8075609 - 1 test");
+
+        JPanel rootPanel = new JPanel();
+        rootPanel.setLayout(new BorderLayout());
+
+        JPanel formPanel = new JPanel();
+        formPanel.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
+        formPanel.setFocusCycleRoot(true);
+
+        JRadioButton option1 = new JRadioButton("Option 1", true);
+        JRadioButton option2 = new JRadioButton("Option 2");
+
+        ButtonGroup radioButtonGroup = new ButtonGroup();
+        radioButtonGroup.add(option1);
+        radioButtonGroup.add(option2);
+
+        formPanel.add(option1);
+        formPanel.add(option2);
+        textField = new JTextField("Another focusable component");
+        formPanel.add(textField);
+
+        rootPanel.add(formPanel, BorderLayout.CENTER);
+
+        JButton okButton = new JButton("OK");
+        rootPanel.add(okButton, BorderLayout.SOUTH);
+
+        mainFrame.add(rootPanel);
+        mainFrame.pack();
+        mainFrame.setVisible(true);
+        mainFrame.toFront();
+    }
+
+    // Radio button Group as a single component when traversing through tab key
+    private static void runTest1() throws Exception{
+        hitKey(robot, KeyEvent.VK_TAB);
+
+        robot.setAutoDelay(1000 );
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (textField.hasFocus()) {
+                    System.out.println("Radio Button Group Go To Next Component through Tab Key failed");
+                    throw new RuntimeException("Focus is not on textField as Expected");
+                }
+            }
+        });
+    }
+
+    private static void hitKey(Robot robot, int keycode) {
+        robot.keyPress(keycode);
+        robot.keyRelease(keycode);
+        toolkit.realSync();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/xml/jaxp/testng/parse/jdk7156085/UTF8ReaderBug.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2014 Google, 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.
+ *
+ * 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 parse.jdk7156085;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.InputSource;
+import org.xml.sax.helpers.DefaultHandler;
+import org.testng.annotations.Test;
+
+/**
+ * JDK-7156085: ArrayIndexOutOfBoundsException throws in UTF8Reader of SAXParser
+ * https://bugs.openjdk.java.net/browse/JDK-7156085
+ *
+ * XERCESJ-1257: buffer overflow in UTF8Reader for characters out of BMP
+ * https://issues.apache.org/jira/browse/XERCESJ-1257
+ */
+public class UTF8ReaderBug {
+    @Test
+    public void shouldAcceptSupplementaryCharacters() throws Throwable {
+        StringBuilder b = new StringBuilder("<xml>");
+        for(int i = 5; i < 8223; i++) {
+            b.append(' ');
+        }
+        // Add surrogate characters which overflow the buffer. This shows the need to place an
+        // overflow check at --
+        // com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:544)
+        b.append("\uD835\uDC37");
+        b.append("</xml>");
+        sendToParser(b.toString());
+    }
+
+    private static void sendToParser(String b) throws Throwable {
+        byte[] input = b.getBytes("UTF-8");
+        ByteArrayInputStream in = new ByteArrayInputStream(input);
+
+        SAXParserFactory  spf = SAXParserFactory.newInstance();
+        SAXParser p = spf.newSAXParser();
+        p.parse(new InputSource(in), new DefaultHandler());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/internal/misc/Unsafe/CopySwap.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,723 @@
+/*
+ * 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.Field;
+import sun.misc.Unsafe;
+
+/*
+ * @test
+ * @summary Test Unsafe.copySwapMemory
+ * @modules java.base/jdk.internal.misc
+ */
+public class CopySwap {
+    private static final boolean DEBUG = Boolean.getBoolean("CopySwap.DEBUG");
+
+    public static final long KB = 1024;
+    public static final long MB = KB * 1024;
+    public static final long GB = MB * 1024;
+
+    private static final Unsafe UNSAFE;
+    private static final int SMALL_COPY_SIZE = 32;
+    private static final int BASE_ALIGNMENT = 16;
+
+    static {
+        try {
+            Field f = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
+            f.setAccessible(true);
+            UNSAFE = (sun.misc.Unsafe) f.get(null);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to get Unsafe instance.", e);
+        }
+    }
+
+    private static long alignDown(long value, long alignment) {
+        return value & ~(alignment - 1);
+    }
+
+    private static long alignUp(long value, long alignment) {
+        return (value + alignment - 1) & ~(alignment - 1);
+    }
+
+    private static boolean isAligned(long value, long alignment) {
+        return value == alignDown(value, alignment);
+    }
+
+    private static long toUnsignedLong(byte x) {
+        return ((long) x) & 0xffL;
+    }
+
+    private static long toUnsignedLong(short x) {
+        return ((long) x) & 0xffffL;
+    }
+
+    private static long toUnsignedLong(int x) {
+        return ((long) x) & 0xffffffffL;
+    }
+
+    private CopySwap() {
+    }
+
+    /**
+     * Generate verification data for a given offset
+     *
+     * The verification data is used to verify that the correct bytes
+     * have indeed been copied and byte swapped.
+     *
+     * The data is generated based on the offset (in bytes) into the
+     * source buffer. For a native buffer the offset is relative to
+     * the base pointer. For a heap array it is relative to the
+     * address of the first array element.
+     *
+     * This method will return the result of doing an elementSize byte
+     * read starting at offset (in bytes).
+     *
+     * @param offset offset into buffer
+     * @param elemSize size (in bytes) of the element
+     *
+     * @return the verification data, only the least significant
+     * elemSize*8 bits are set, zero extended
+     */
+    private long getVerificationDataForOffset(long offset, long elemSize) {
+        byte[] bytes = new byte[(int)elemSize];
+
+        for (long i = 0; i < elemSize; i++) {
+            bytes[(int)i] = (byte)(offset + i);
+        }
+
+        long o = UNSAFE.arrayBaseOffset(byte[].class);
+
+        switch ((int)elemSize) {
+        case 1: return toUnsignedLong(UNSAFE.getByte(bytes, o));
+        case 2: return toUnsignedLong(UNSAFE.getShortUnaligned(bytes, o));
+        case 4: return toUnsignedLong(UNSAFE.getIntUnaligned(bytes, o));
+        case 8: return UNSAFE.getLongUnaligned(bytes, o);
+        default: throw new IllegalArgumentException("Invalid element size: " + elemSize);
+        }
+    }
+
+    /**
+     * Verify byte swapped data
+     *
+     * @param ptr the data to verify
+     * @param srcOffset the srcOffset (in bytes) from which the copy started,
+     *        used as key to regenerate the verification data
+     * @param dstOffset the offset (in bytes) in the array at which to start
+     *        the verification, relative to the first element in the array
+     * @param size size (in bytes) of data to to verify
+     * @param elemSize size (in bytes) of the individual array elements
+     *
+     * @throws RuntimeException if an error is found
+     */
+    private void verifySwappedData(GenericPointer ptr, long srcOffset, long dstOffset, long size, long elemSize) {
+        for (long offset = 0; offset < size; offset += elemSize) {
+            long expectedUnswapped = getVerificationDataForOffset(srcOffset + offset, elemSize);
+            long expected = byteSwap(expectedUnswapped, elemSize);
+
+            long actual = getArrayElem(ptr, dstOffset + offset, elemSize);
+
+            if (expected != actual) {
+                throw new RuntimeException("srcOffset: 0x" + Long.toHexString(srcOffset) +
+                                           " dstOffset: 0x" + Long.toHexString(dstOffset) +
+                                           " size: 0x" + Long.toHexString(size) +
+                                           " offset: 0x" + Long.toHexString(offset) +
+                                           " expectedUnswapped: 0x" + Long.toHexString(expectedUnswapped) +
+                                           " expected: 0x" + Long.toHexString(expected) +
+                                           " != actual: 0x" + Long.toHexString(actual));
+            }
+        }
+    }
+
+    /**
+     * Initialize an array with verification friendly data
+     *
+     * @param ptr pointer to the data to initialize
+     * @param size size (in bytes) of the data
+     * @param elemSize size (in bytes) of the individual elements
+     */
+    private void initVerificationData(GenericPointer ptr, long size, long elemSize) {
+        for (long offset = 0; offset < size; offset++) {
+            byte data = (byte)getVerificationDataForOffset(offset, 1);
+
+            if (ptr.isOnHeap()) {
+                UNSAFE.putByte(ptr.getObject(), ptr.getOffset() + offset, data);
+            } else {
+                UNSAFE.putByte(ptr.getOffset() + offset, data);
+            }
+        }
+    }
+
+    /**
+     * Allocate a primitive array
+     *
+     * @param size size (in bytes) of all the array elements (elemSize * length)
+     * @param elemSize the size of the array elements
+     *
+     * @return a newly allocated primitive array
+     */
+    Object allocArray(long size, long elemSize) {
+        int length = (int)(size / elemSize);
+
+        switch ((int)elemSize) {
+        case 2: return new short[length];
+        case 4: return new int[length];
+        case 8: return new long[length];
+        default:
+            throw new IllegalArgumentException("Invalid element size: " + elemSize);
+        }
+    }
+
+    /**
+     * Get the value of a primitive array entry
+     *
+     * @param ptr pointer to the data
+     * @param offset offset (in bytes) of the array element, relative to the first element in the array
+     *
+     * @return the array element, as an unsigned long
+     */
+    private long getArrayElem(GenericPointer ptr, long offset, long elemSize) {
+        if (ptr.isOnHeap()) {
+            Object o = ptr.getObject();
+            int index = (int)(offset / elemSize);
+
+            if (o instanceof short[]) {
+                short[] arr = (short[])o;
+                return toUnsignedLong(arr[index]);
+            } else if (o instanceof int[]) {
+                int[] arr = (int[])o;
+                return toUnsignedLong(arr[index]);
+            } else if (o instanceof long[]) {
+                long[] arr = (long[])o;
+                return arr[index];
+            } else {
+                throw new IllegalArgumentException("Invalid object type: " + o.getClass().getName());
+            }
+        } else {
+            long addr = ptr.getOffset() + offset;
+
+            switch ((int)elemSize) {
+            case 1: return toUnsignedLong(UNSAFE.getByte(addr));
+            case 2: return toUnsignedLong(UNSAFE.getShortUnaligned(null, addr));
+            case 4: return toUnsignedLong(UNSAFE.getIntUnaligned(null, addr));
+            case 8: return UNSAFE.getLongUnaligned(null, addr);
+            default: throw new IllegalArgumentException("Invalid element size: " + elemSize);
+            }
+        }
+    }
+
+    private void putValue(long addr, long elemSize, long value) {
+        switch ((int)elemSize) {
+        case 1: UNSAFE.putByte(addr, (byte)value); break;
+        case 2: UNSAFE.putShortUnaligned(null, addr, (short)value); break;
+        case 4: UNSAFE.putIntUnaligned(null, addr, (int)value); break;
+        case 8: UNSAFE.putLongUnaligned(null, addr, value); break;
+        default: throw new IllegalArgumentException("Invalid element size: " + elemSize);
+        }
+    }
+
+    /**
+     * Get the size of the elements for an array
+     *
+     * @param o a primitive heap array
+     *
+     * @return the size (in bytes) of the individual array elements
+     */
+    private long getArrayElemSize(Object o) {
+        if (o instanceof short[]) {
+            return 2;
+        } else if (o instanceof int[]) {
+            return 4;
+        } else if (o instanceof long[]) {
+            return 8;
+        } else {
+            throw new IllegalArgumentException("Invalid object type: " + o.getClass().getName());
+        }
+    }
+
+    /**
+     * Byte swap a value
+     *
+     * @param value the value to swap, only the bytes*8 least significant bits are used
+     * @param size size (in bytes) of the value
+     *
+     * @return the byte swapped value in the bytes*8 least significant bits
+     */
+    private long byteSwap(long value, long size) {
+        switch ((int)size) {
+        case 2: return toUnsignedLong(Short.reverseBytes((short)value));
+        case 4: return toUnsignedLong(Integer.reverseBytes((int)value));
+        case 8: return Long.reverseBytes(value);
+        default: throw new IllegalArgumentException("Invalid element size: " + size);
+        }
+    }
+
+    /**
+     * Verify data in a heap array which has *not* been byte swapped
+     *
+     * @param ptr the data to verify
+     * @param startOffset the offset (in bytes) at which to start the verification
+     * @param size size (in bytes) of the data to verify
+     *
+     * @throws RuntimeException if an error is found
+     */
+    private void verifyUnswappedData(GenericPointer ptr, long startOffset, long size) {
+        for (long elemOffset = startOffset; elemOffset < startOffset + size; elemOffset++) {
+            byte expected = (byte)getVerificationDataForOffset(elemOffset, 1);
+
+            byte actual;
+            if (ptr.isOnHeap()) {
+                actual = UNSAFE.getByte(ptr.getObject(), ptr.getOffset() + elemOffset);
+            } else {
+                actual = UNSAFE.getByte(ptr.getOffset() + elemOffset);
+            }
+
+            if (expected != actual) {
+                throw new RuntimeException("startOffset: 0x" + Long.toHexString(startOffset) +
+                                           " size: 0x" + Long.toHexString(size) +
+                                           " elemOffset: 0x" + Long.toHexString(elemOffset) +
+                                           " expected: 0x" + Long.toHexString(expected) +
+                                           " != actual: 0x" + Long.toHexString(actual));
+            }
+        }
+    }
+
+
+    /**
+     * Copy and byte swap data from the source to the destination
+     *
+     * This method will pre-populate the whole source and destination
+     * buffers with verification friendly data. It will then use
+     * copySwapMemory to fill part of the destination buffer with
+     * swapped data from the source. Some space (padding) will be
+     * left before and after the data in the destination buffer, which
+     * should not be touched/overwritten by the copy call.
+     *
+     * Note: Both source and destination buffers will be overwritten!
+     *
+     * @param src source buffer to copy from
+     * @param srcOffset the offset (in bytes) in the source buffer, relative to
+     *        the first array element, at which to start reading data
+     * @param dst destination buffer to copy to
+     * @param dstOffset the offset (in bytes) in the destination
+     *        buffer, relative to the first array element, at which to
+     *        start writing data
+     * @param bufSize the size (in bytes) of the src and dst arrays
+     * @param copyBytes the size (in bytes) of the copy to perform,
+     *        must be a multiple of elemSize
+     * @param elemSize the size (in bytes) of the elements to byte swap
+     *
+     * @throws RuntimeException if an error is found
+     */
+    private void testCopySwap(GenericPointer src, long srcOffset,
+                              GenericPointer dst, long dstOffset,
+                              long bufSize, long copyBytes, long elemSize) {
+        if (!isAligned(copyBytes, elemSize)) {
+            throw new IllegalArgumentException(
+                "copyBytes (" + copyBytes + ") must be a multiple of elemSize (" + elemSize + ")");
+        }
+        if (src.isOnHeap() && !isAligned(srcOffset, elemSize)) {
+            throw new IllegalArgumentException(
+                "srcOffset (" + srcOffset + ") must be a multiple of elemSize (" + elemSize + ")");
+        }
+        if (dst.isOnHeap() && !isAligned(dstOffset, elemSize)) {
+            throw new IllegalArgumentException(
+                "dstOffset (" + dstOffset + ") must be a multiple of elemSize (" + elemSize + ")");
+        }
+        if (srcOffset + copyBytes > bufSize) {
+            throw new IllegalArgumentException(
+                "srcOffset (" + srcOffset + ") + copyBytes (" + copyBytes + ") > bufSize (" + bufSize + ")");
+        }
+        if (dstOffset + copyBytes > bufSize) {
+            throw new IllegalArgumentException(
+                "dstOffset (" + dstOffset + ") + copyBytes (" + copyBytes + ") > bufSize (" + bufSize + ")");
+        }
+
+        // Initialize the whole source buffer with a verification friendly pattern (no 0x00 bytes)
+        initVerificationData(src, bufSize, elemSize);
+        if (!src.equals(dst)) {
+            initVerificationData(dst, bufSize, elemSize);
+        }
+
+        if (DEBUG) {
+            System.out.println("===before===");
+            for (int offset = 0; offset < bufSize; offset += elemSize) {
+                long srcValue = getArrayElem(src, offset, elemSize);
+                long dstValue = getArrayElem(dst, offset, elemSize);
+
+                System.out.println("offs=0x" + Long.toHexString(toUnsignedLong(offset)) +
+                                 " src=0x" + Long.toHexString(srcValue) +
+                                 " dst=0x" + Long.toHexString(dstValue));
+            }
+        }
+
+        // Copy & swap data into the middle of the destination buffer
+        UNSAFE.copySwapMemory(src.getObject(),
+                              src.getOffset() + srcOffset,
+                              dst.getObject(),
+                              dst.getOffset() + dstOffset,
+                              copyBytes,
+                              elemSize);
+
+        if (DEBUG) {
+            System.out.println("===after===");
+            for (int offset = 0; offset < bufSize; offset += elemSize) {
+                long srcValue = getArrayElem(src, offset, elemSize);
+                long dstValue = getArrayElem(dst, offset, elemSize);
+
+                System.out.println("offs=0x" + Long.toHexString(toUnsignedLong(offset)) +
+                                 " src=0x" + Long.toHexString(srcValue) +
+                                 " dst=0x" + Long.toHexString(dstValue));
+            }
+        }
+
+        // Verify the the front padding is unchanged
+        verifyUnswappedData(dst, 0, dstOffset);
+
+        // Verify swapped data
+        verifySwappedData(dst, srcOffset, dstOffset, copyBytes, elemSize);
+
+        // Verify that the back back padding is unchanged
+        long frontAndDataBytes = dstOffset + copyBytes;
+        long trailingBytes = bufSize - frontAndDataBytes;
+        verifyUnswappedData(dst, frontAndDataBytes, trailingBytes);
+    }
+
+    /**
+     * Test various configurations copy-swapping from one buffer to the other
+     *
+     * @param src the source buffer to copy from
+     * @param dst the destination buffer to copy to
+     * @param size size (in bytes) of the buffers
+     * @param elemSize size (in bytes) of the individual elements
+     *
+     * @throws RuntimeException if an error is found
+     */
+    public void testBufferPair(GenericPointer src, GenericPointer dst, long size, long elemSize) {
+        // offset in source from which to start reading data
+        for (long srcOffset = 0; srcOffset < size; srcOffset += (src.isOnHeap() ? elemSize : 1)) {
+
+            // offset in destination at which to start writing data
+            for (int dstOffset = 0; dstOffset < size; dstOffset += (dst.isOnHeap() ? elemSize : 1)) {
+
+                // number of bytes to copy
+                long maxCopyBytes = Math.min(size - srcOffset, size - dstOffset);
+                for (long copyBytes = 0; copyBytes < maxCopyBytes; copyBytes += elemSize) {
+                    try {
+                        testCopySwap(src, srcOffset, dst, dstOffset, size, copyBytes, elemSize);
+                    } catch (RuntimeException e) {
+                        // Wrap the exception in another exception to catch the relevant configuration data
+                        throw new RuntimeException("testBufferPair: " +
+                                                   "src=" + src +
+                                                   " dst=" + dst +
+                                                   " elemSize=0x" + Long.toHexString(elemSize) +
+                                                   " copyBytes=0x" + Long.toHexString(copyBytes) +
+                                                   " srcOffset=0x" + Long.toHexString(srcOffset) +
+                                                   " dstOffset=0x" + Long.toHexString(dstOffset),
+                                                   e);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Test copying between various permutations of buffers
+     *
+     * @param buffers buffers to permute (src x dst)
+     * @param size size (in bytes) of buffers
+     * @param elemSize size (in bytes) of individual elements
+     *
+     * @throws RuntimeException if an error is found
+     */
+    public void testPermuteBuffers(GenericPointer[] buffers, long size, long elemSize) {
+        for (int srcIndex = 0; srcIndex < buffers.length; srcIndex++) {
+            for (int dstIndex = 0; dstIndex < buffers.length; dstIndex++) {
+                testBufferPair(buffers[srcIndex], buffers[dstIndex], size, elemSize);
+            }
+        }
+    }
+
+    /**
+     * Test copying of a specific element size
+     *
+     * @param size size (in bytes) of buffers to allocate
+     * @param elemSize size (in bytes) of individual elements
+     *
+     * @throws RuntimeException if an error is found
+     */
+    private void testElemSize(long size, long elemSize) {
+        long buf1Raw = 0;
+        long buf2Raw = 0;
+
+        try {
+            buf1Raw = UNSAFE.allocateMemory(size + BASE_ALIGNMENT);
+            long buf1 = alignUp(buf1Raw, BASE_ALIGNMENT);
+
+            buf2Raw = UNSAFE.allocateMemory(size + BASE_ALIGNMENT);
+            long buf2 = alignUp(buf2Raw, BASE_ALIGNMENT);
+
+            GenericPointer[] buffers = {
+                new GenericPointer(buf1),
+                new GenericPointer(buf2),
+                new GenericPointer(allocArray(size, elemSize)),
+                new GenericPointer(allocArray(size, elemSize))
+            };
+
+            testPermuteBuffers(buffers, size, elemSize);
+        } finally {
+            if (buf1Raw != 0) {
+                UNSAFE.freeMemory(buf1Raw);
+            }
+            if (buf2Raw != 0) {
+                UNSAFE.freeMemory(buf2Raw);
+            }
+        }
+    }
+
+    /**
+     * Verify that small copy swaps work
+     */
+    private void testSmallCopy() {
+        int smallBufSize = SMALL_COPY_SIZE;
+
+        // Test various element types and heap/native combinations
+        for (long elemSize = 2; elemSize <= 8; elemSize <<= 1) {
+            testElemSize(smallBufSize, elemSize);
+        }
+    }
+
+
+    /**
+     * Verify that large copy swaps work
+     */
+    private void testLargeCopy() {
+        long size = 2 * GB + 8;
+        long bufRaw = 0;
+
+        // Check that a large native copy succeeds
+        try {
+            try {
+                bufRaw = UNSAFE.allocateMemory(size + BASE_ALIGNMENT);
+            } catch (OutOfMemoryError e) {
+                // Accept failure, skip test
+                return;
+            }
+
+            long buf = alignUp(bufRaw, BASE_ALIGNMENT);
+
+            UNSAFE.copySwapMemory(null, buf, null, buf, size, 8);
+        } catch (Exception e) {
+            throw new RuntimeException("copySwapMemory of large buffer failed");
+        } finally {
+            if (bufRaw != 0) {
+                UNSAFE.freeMemory(bufRaw);
+            }
+        }
+    }
+
+    /**
+     * Run positive tests
+     *
+     * @throws RuntimeException if an error is found
+     */
+    private void testPositive() {
+        testSmallCopy();
+        testLargeCopy();
+    }
+
+    /**
+     * Run negative tests, testing corner cases and the various exceptions
+     *
+     * @throws RuntimeException if an error is found
+     */
+    private void testNegative() {
+        long bufRaw = 0;
+
+        try {
+            bufRaw = UNSAFE.allocateMemory(1024);
+            long buf = alignUp(bufRaw, BASE_ALIGNMENT);
+            short[] arr = new short[16];
+
+            // Check various illegal element sizes
+            for (int elemSize = 2; elemSize <= 8; elemSize <<= 1) {
+                long[] illegalSizes = { -1, 1, elemSize - 1, elemSize + 1, elemSize * 2 - 1 };
+                for (long size : illegalSizes) {
+                    try {
+                        // Check that illegal elemSize throws an IAE
+                        UNSAFE.copySwapMemory(null, buf, null, buf, size, elemSize);
+                        throw new RuntimeException("copySwapMemory failed to throw IAE for size=" + size + " elemSize=" + elemSize);
+                    } catch (IllegalArgumentException e) {
+                        // good
+                    }
+                }
+            }
+
+            try {
+                // Check that negative srcOffset throws an IAE
+                UNSAFE.copySwapMemory(arr, -1, arr, UNSAFE.arrayBaseOffset(arr.getClass()), 16, 2);
+                throw new RuntimeException("copySwapMemory failed to throw IAE for srcOffset=-1");
+            } catch (IllegalArgumentException e) {
+                // good
+            }
+
+            try {
+                // Check that negative dstOffset throws an IAE
+                UNSAFE.copySwapMemory(arr, UNSAFE.arrayBaseOffset(arr.getClass()), arr, -1, 16, 2);
+                throw new RuntimeException("copySwapMemory failed to throw IAE for destOffset=-1");
+            } catch (IllegalArgumentException e) {
+                // good
+            }
+
+            long illegalElemSizes[] = { 0, 1, 3, 5, 6, 7, 9, 10, -1 };
+            for (long elemSize : illegalElemSizes) {
+                try {
+                    // Check that elemSize 1 throws an IAE
+                    UNSAFE.copySwapMemory(null, buf, null, buf, 16, elemSize);
+                    throw new RuntimeException("copySwapMemory failed to throw NPE");
+                } catch (IllegalArgumentException e) {
+                    // good
+                }
+            }
+
+            try {
+                // Check that a NULL source throws NPE
+                UNSAFE.copySwapMemory(null, 0, null, buf, 16, 2);
+                throw new RuntimeException("copySwapMemory failed to throw NPE");
+            } catch (NullPointerException e) {
+                // good
+            }
+
+            try {
+                // Check that a NULL destination throws NPE
+                UNSAFE.copySwapMemory(null, buf, null, 0, 16, 2);
+                throw new RuntimeException("copySwapMemory failed to throw NPE");
+            } catch (NullPointerException e) {
+                // good
+            }
+
+            try {
+                // Check that a reference array destination throws IAE
+                UNSAFE.copySwapMemory(null, buf, new Object[16], UNSAFE.arrayBaseOffset(Object[].class), 16, 8);
+                throw new RuntimeException("copySwapMemory failed to throw NPE");
+            } catch (IllegalArgumentException e) {
+                // good
+            }
+
+            // Check that invalid source & dest pointers throw IAEs (only relevant on 32-bit platforms)
+            if (UNSAFE.addressSize() == 4) {
+                long invalidPtr = (long)1 << 35; // Pick a random bit in upper 32 bits
+
+                try {
+                    // Check that an invalid (not 32-bit clean) source pointer throws IAE
+                    UNSAFE.copySwapMemory(null, invalidPtr, null, buf, 16, 2);
+                    throw new RuntimeException("copySwapMemory failed to throw IAE for srcOffset 0x" +
+                                               Long.toHexString(invalidPtr));
+                } catch (IllegalArgumentException e) {
+                    // good
+                }
+
+                try {
+                    // Check that an invalid (not 32-bit clean) source pointer throws IAE
+                    UNSAFE.copySwapMemory(null, buf, null, invalidPtr, 16, 2);
+                    throw new RuntimeException("copySwapMemory failed to throw IAE for destOffset 0x" +
+                                               Long.toHexString(invalidPtr));
+                } catch (IllegalArgumentException e) {
+                    // good
+                }
+            }
+        } finally {
+            if (bufRaw != 0) {
+                UNSAFE.freeMemory(bufRaw);
+            }
+        }
+    }
+
+    /**
+     * Run all tests
+     *
+     * @throws RuntimeException if an error is found
+     */
+    private void test() {
+        testPositive();
+        testNegative();
+    }
+
+    public static void main(String[] args) {
+        CopySwap cs = new CopySwap();
+        cs.test();
+    }
+
+    /**
+     * Helper class to represent a "pointer" - either a heap array or
+     * a pointer to a native buffer.
+     *
+     * In the case of a native pointer, the Object is null and the offset is
+     * the absolute address of the native buffer.
+     *
+     * In the case of a heap object, the Object is a primitive array, and
+     * the offset will be set to the base offset to the first element, meaning
+     * the object and the offset together form a double-register pointer.
+     */
+    static class GenericPointer {
+        private final Object o;
+        private final long offset;
+
+        private GenericPointer(Object o, long offset) {
+            this.o = o;
+            this.offset = offset;
+        }
+
+        public String toString() {
+            return "GenericPointer(o={" + o + "}, offset=0x" + Long.toHexString(offset) + ")";
+        }
+
+        public boolean equals(Object other) {
+            if (!(other instanceof GenericPointer)) {
+                return false;
+            }
+
+            GenericPointer otherp = (GenericPointer)other;
+
+            return o == otherp.o && offset == otherp.offset;
+        }
+
+        GenericPointer(Object o) {
+            this(o, UNSAFE.arrayBaseOffset(o.getClass()));
+        }
+
+        GenericPointer(long offset) {
+            this(null, offset);
+        }
+
+        public boolean isOnHeap() {
+            return o != null;
+        }
+
+        public Object getObject() {
+            return o;
+        }
+
+        public long getOffset() {
+            return offset;
+        }
+    }
+}
--- a/test/lib/testlibrary/jdk/testlibrary/Utils.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/lib/testlibrary/jdk/testlibrary/Utils.java	Tue Aug 22 02:03:52 2017 +0100
@@ -37,6 +37,7 @@
 import java.util.Collections;
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Common library for various test helper functions.
@@ -59,6 +60,22 @@
     public static final String JAVA_OPTIONS = System.getProperty("test.java.opts", "").trim();
 
 
+    /**
+    * Returns the value of 'test.timeout.factor' system property
+    * converted to {@code double}.
+    */
+    public static final double TIMEOUT_FACTOR;
+    static {
+        String toFactor = System.getProperty("test.timeout.factor", "1.0");
+        TIMEOUT_FACTOR = Double.parseDouble(toFactor);
+    }
+
+    /**
+    * Returns the value of JTREG default test timeout in milliseconds
+    * converted to {@code long}.
+    */
+    public static final long DEFAULT_TEST_TIMEOUT = TimeUnit.SECONDS.toMillis(120);
+
     private Utils() {
         // Private constructor to prevent class instantiation
     }
@@ -232,6 +249,16 @@
         }
     }
 
+    /**
+     * Adjusts the provided timeout value for the TIMEOUT_FACTOR
+     * @param tOut the timeout value to be adjusted
+     * @return The timeout value adjusted for the value of "test.timeout.factor"
+     *         system property
+     */
+    public static long adjustTimeout(long tOut) {
+        return Math.round(tOut * Utils.TIMEOUT_FACTOR);
+    }
+
     private static final int BUFFER_SIZE = 1024;
 
     /**
--- a/test/sun/awt/image/bug8038000.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/awt/image/bug8038000.java	Tue Aug 22 02:03:52 2017 +0100
@@ -23,11 +23,13 @@
 
 /**
  * @test
- * @bug     8038000
+ * @bug     8038000 8047066
  *
  * @summary Verifies that we could create different type of Rasters with height 1
  * and strideline which exceeds raster width.
  * Also checks that a set of RasterOp work correctly with such kind of Rasters.
+ * For 8047066 verifies that ColorConvertOp could process
+ * Raster (ByteBuffer + SinglePixelPackedSampleModel)
  *
  * @run     main bug8038000
  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/java2d/cmm/ColorConvertOp/AlphaTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ *
+ * 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     8005930
+ * @summary Thest verifies that color conversion does not distort
+ *          alpha channel in the destination image.
+ *
+ * @run     main AlphaTest
+ */
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+
+public class AlphaTest {
+    public static void main(String[] args) {
+        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
+
+        ColorConvertOp op = new ColorConvertOp(cs, null);
+        // create source image filled with an opaque color
+        BufferedImage src = createSrc();
+        int srcAlpha = getAlpha(src);
+
+        System.out.printf("Src alpha: 0x%02x\n", srcAlpha);
+
+        // create clear (transparent black) destination image
+        BufferedImage dst = createDst();
+        int dstAlpha = getAlpha(dst);
+        System.out.printf("Dst alpha: 0x%02x\n", dstAlpha);
+
+
+        dst = op.filter(src, dst);
+        dstAlpha = getAlpha(dst);
+        // we expect that destination image is opaque
+        // i.e. alpha is transferred from source to
+        // the destination
+        System.out.printf("Result alpha: 0x%02x\n", dstAlpha);
+
+        if (srcAlpha != dstAlpha) {
+            throw new RuntimeException("Test failed!");
+        }
+        System.out.println("Test passed");
+    }
+
+    private static BufferedImage createSrc() {
+        BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+
+        Graphics2D g = img.createGraphics();
+        g.setColor(Color.red);
+        g.fillRect(0, 0, w, h);
+        g.dispose();
+
+        return img;
+    }
+
+    private static BufferedImage createDst() {
+        BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+
+        Graphics2D g = img.createGraphics();
+        g.setComposite(AlphaComposite.Clear);
+        g.fillRect(0, 0, w, h);
+        g.dispose();
+
+        return img;
+    }
+
+    private static int getAlpha(BufferedImage img) {
+        int argb = img.getRGB(w / 2, h / 2);
+        return 0xff & (argb >> 24);
+    }
+
+    private static final int w = 100;
+    private static final int h = 100;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/java2d/cmm/ColorConvertOp/GrayTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2012, 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     7124245
+ * @summary Test verifies that color conversion does not distort
+ *          colors in destination image of standard type.
+ *
+ * @run main GrayTest
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+
+public class GrayTest {
+    public static void main(String[] args) {
+        GrayTest t = new GrayTest();
+
+        t.doTest(BufferedImage.TYPE_INT_RGB);
+        t.doTest(BufferedImage.TYPE_INT_BGR);
+        t.doTest(BufferedImage.TYPE_INT_ARGB);
+        t.doTest(BufferedImage.TYPE_3BYTE_BGR);
+        t.doTest(BufferedImage.TYPE_4BYTE_ABGR);
+        System.out.println("Test passed.");
+    }
+
+    private static final int w = 3;
+    private static final int h = 3;
+
+    private BufferedImage src;
+    private BufferedImage dst;
+
+    private ColorConvertOp op;
+
+    public GrayTest() {
+        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
+        op = new ColorConvertOp(cs, null);
+    }
+
+    private void render(Graphics2D g) {
+        g.setColor(Color.red);
+        g.fillRect(0, 0, w, h);
+    }
+
+    private BufferedImage initImage(int type) {
+        BufferedImage img = new BufferedImage(w, h, type);
+        Graphics2D g = img.createGraphics();
+
+        render(g);
+
+        g.dispose();
+
+        return img;
+    }
+
+    public void doTest(int type) {
+        System.out.println("Test for type: " + type);
+        src = initImage(type);
+
+        dst = initImage(type);
+
+        dst = op.filter(src, dst);
+
+        int pixel = dst.getRGB(1, 1);
+        int r = 0xff & (pixel >> 16);
+        int g = 0xff & (pixel >>  8);
+        int b = 0xff & (pixel      );
+
+        System.out.printf("dst: r:%02x, g: %02x, %02x\n",
+                r, g, b);
+
+        if (r != g || r != b) {
+            String msg = String.format("Invalid pixel: %08x", pixel);
+            throw new RuntimeException(msg);
+        }
+        System.out.println("Done.");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/java2d/cmm/ProfileOp/DisposalCrashTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ *
+ * 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     8024511
+ * @summary Verifies that instances of color profiles are destroyed correctly.
+ *          A crash during profile destruction indicates failure.
+ *
+ * @run     main DisposalCrashTest
+ */
+
+import static java.awt.color.ColorSpace.*;
+import java.awt.color.ICC_Profile;
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.Vector;
+
+public class DisposalCrashTest {
+
+    static final ReferenceQueue<ICC_Profile> queue = new ReferenceQueue<>();
+    static final Vector<Reference<? extends ICC_Profile>> v = new Vector<>();
+
+    public static void main(String[] args) {
+        int[] ids = new int[]{
+            CS_sRGB, CS_CIEXYZ, CS_GRAY, CS_LINEAR_RGB, CS_PYCC
+        };
+
+        for (int id : ids) {
+            ICC_Profile p = getCopyOf(id);
+        }
+
+        while (!v.isEmpty()) {
+            System.gc();
+            System.out.println(".");
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {};
+
+            final Reference<? extends ICC_Profile> ref = queue.poll();
+            System.out.println("Got reference: " + ref);
+
+            v.remove(ref);
+        }
+
+        System.out.println("Test PASSED.");
+    }
+
+    private static ICC_Profile getCopyOf(int id) {
+        ICC_Profile std = ICC_Profile.getInstance(id);
+
+        byte[] data = std.getData();
+
+        ICC_Profile p = ICC_Profile.getInstance(data);
+
+        WeakReference<ICC_Profile> ref = new WeakReference<>(p, queue);
+
+        v.add(ref);
+
+        return p;
+    }
+}
--- a/test/sun/java2d/cmm/ProfileOp/ReadWriteProfileTest.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/java2d/cmm/ProfileOp/ReadWriteProfileTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -23,7 +23,7 @@
 
 /**
  * @test
- * @bug 6476665 6523403 6733501 7042594
+ * @bug 6476665 6523403 6733501 7042594 7043064
  * @summary Verifies reading and writing profiles and tags of the standard color
  * spaces
  * @run main ReadWriteProfileTest
@@ -82,6 +82,7 @@
 
     public void run() {
         for (int i = 0; i < cspaces.length; i++) {
+            System.out.println("Profile: " + csNames[i]);
             ICC_Profile pf = ICC_Profile.getInstance(cspaces[i]);
             byte [] data = pf.getData();
             pf = ICC_Profile.getInstance(data);
@@ -92,6 +93,10 @@
             }
 
             for (int tagSig : tags[i].keySet()) {
+                String signature = SigToString(tagSig);
+                System.out.printf("Tag: %s\n", signature);
+                System.out.flush();
+
                 byte [] tagData = pf.getData(tagSig);
                 byte [] empty = new byte[tagData.length];
                 boolean emptyDataRejected = false;
@@ -104,15 +109,23 @@
                     throw new
                         RuntimeException("Test failed: empty tag data was not rejected.");
                 }
-                pf.setData(tagSig, tagData);
-
+                try {
+                    pf.setData(tagSig, tagData);
+                } catch (IllegalArgumentException e) {
+                    // let's ignore this exception for Kodak proprietary tags
+                    if (isKodakExtention(signature)) {
+                        System.out.println("Ignore Kodak tag: " + signature);
+                    } else {
+                        throw new RuntimeException("Test failed!", e);
+                    }
+                }
                 byte [] tagData1 = pf.getData(tagSig);
 
                 if (!Arrays.equals(tagData1, tags[i].get(tagSig)))
                 {
                     System.err.println("Incorrect result of getData(int) with" +
                                        " tag " +
-                                       Integer.toHexString(tagSig) +
+                                       SigToString(tagSig) +
                                        " of " + csNames[i] + " profile");
 
                     throw new RuntimeException("Incorrect result of " +
@@ -122,6 +135,19 @@
         }
     }
 
+    private static boolean isKodakExtention(String signature) {
+        return signature.matches("K\\d\\d\\d");
+    }
+
+    private static String SigToString(int tagSig ) {
+              return String.format("%c%c%c%c",
+                        (char)(0xff & (tagSig >> 24)),
+                        (char)(0xff & (tagSig >> 16)),
+                        (char)(0xff & (tagSig >>  8)),
+                        (char)(0xff & (tagSig)));
+
+    }
+
     public static void main(String [] args) {
         ReadWriteProfileTest test = new ReadWriteProfileTest();
         test.run();
Binary file test/sun/management/jmxremote/bootstrap/linux-i586/launcher has changed
Binary file test/sun/management/jmxremote/bootstrap/solaris-i586/launcher has changed
Binary file test/sun/management/jmxremote/bootstrap/solaris-sparc/launcher has changed
Binary file test/sun/management/windows/revokeall.exe has changed
--- a/test/sun/net/InetAddress/nameservice/dns/cname.sh	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/net/InetAddress/nameservice/dns/cname.sh	Tue Aug 22 02:03:52 2017 +0100
@@ -33,7 +33,7 @@
 
 # The host that we try to resolve
 
-HOST=www-proxy.us.oracle.com
+HOST=developer.classpath.org
 
 # fail gracefully if DNS is not configured or there
 # isn't a CNAME record.
Binary file test/sun/net/idn/nfscis.spp has changed
Binary file test/sun/net/idn/nfscsi.spp has changed
Binary file test/sun/net/idn/nfscss.spp has changed
Binary file test/sun/net/idn/nfsmxp.spp has changed
Binary file test/sun/net/idn/nfsmxs.spp has changed
--- a/test/sun/net/www/protocol/file/DirPermissionDenied.sh	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/net/www/protocol/file/DirPermissionDenied.sh	Tue Aug 22 02:03:52 2017 +0100
@@ -37,5 +37,6 @@
 
 $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES DirPermissionDenied ${TESTDIR}
 result=$?
+chmod u+r ${TESTDIR}
 rm -rf ${TESTDIR}
 exit $result
--- a/test/sun/security/krb5/ConfPlusProp.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/krb5/ConfPlusProp.java	Tue Aug 22 02:03:52 2017 +0100
@@ -34,6 +34,12 @@
 public class ConfPlusProp {
     Config config;
     public static void main(String[] args) throws Exception {
+        if (System.getenv("USERDNSDOMAIN") != null ||
+                System.getenv("LOGONSERVER") != null) {
+            System.out.println(
+                    "Looks like a Windows machine in a domain. Skip test.");
+            return;
+        }
         new ConfPlusProp().run();
     }
 
@@ -89,23 +95,8 @@
         check("R2", "old");
         check("R3", null);
 
-        int version = System.getProperty("java.version").charAt(2) - '0';
-        System.out.println("JDK version is " + version);
-
-        // Zero-config is supported since 1.7
-        if (version >= 7) {
-            // Point to a non-existing file
-            System.setProperty("java.security.krb5.conf", "i-am-not-a file");
-            refresh();
-
-            // Default realm might come from DNS
-            //checkDefaultRealm(null);
-            check("R1", null);
-            check("R2", null);
-            check("R3", null);
-            if (config.getDefault("forwardable", "libdefaults") != null) {
-                throw new Exception("Extra config error");
-            }
+        if (config.getDefault("forwardable", "libdefaults") != null) {
+            throw new Exception("Extra config error");
         }
 
         // Add prop
@@ -135,14 +126,6 @@
         check("R2", "k2");
         check("R3", "k2");
 
-        // Point to a non-existing file
-        System.setProperty("java.security.krb5.conf", "i-am-not-a file");
-        refresh();
-
-        checkDefaultRealm("R2");
-        check("R1", "k2");
-        check("R2", "k2");
-        check("R3", "k2");
         if (config.getDefault("forwardable", "libdefaults") != null) {
             throw new Exception("Extra config error");
         }
--- a/test/sun/security/krb5/DnsFallback.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/krb5/DnsFallback.java	Tue Aug 22 02:03:52 2017 +0100
@@ -22,8 +22,7 @@
  */
 /*
  * @test
- * @bug 6673164
- * @bug 6552334
+ * @bug 6673164 6552334 8077102
  * @run main/othervm DnsFallback
  * @summary fix dns_fallback parse error, and use dns by default
  */
@@ -35,34 +34,47 @@
     public static void main(String[] args) throws Exception {
 
         // for 6673164
-        check("true", "true", true);
-        check("false", "true", false);
-        check("true", "false", true);
-        check("false", "false", false);
-        check("true", null, true);
-        check("false", null, false);
-        check(null, "true", true);
-        check(null, "false", false);
+        check("true", "true", true, true);
+        check("false", "true", false, false);
+        check("true", "false", true, true);
+        check("false", "false", false, false);
+        check("true", null, true, true);
+        check("false", null, false, false);
+        check(null, "true", true, true);
+        check(null, "false", false, false);
 
-        // for 6552334
-        check(null, null, true);
+        // for 6552334, no longer true
+        //check(null, null, true, true);
+
+        // 8077102
+        check(null, null, false, true);
     }
 
-    static void check(String realm, String fallback, boolean output) throws Exception {
+    /**
+     * Sets and checks.
+     *
+     * @param u dns_lookup_XXX value set, none if null
+     * @param f dns_fallback value set, none if null
+     * @param r expected useDNS_Realm
+     * @param k expected useDNS_KDC
+     */
+    static void check(String u, String f, boolean r, boolean k)
+             throws Exception {
         FileOutputStream fo = new FileOutputStream("dnsfallback.conf");
         StringBuffer sb = new StringBuffer();
         sb.append("[libdefaults]\n");
-        if (realm != null) {
-            sb.append("dns_lookup_realm=" + realm + "\n");
+	if (u != null) {
+	    sb.append("dns_lookup_realm=" + u);
+	    sb.append("dns_lookup_kdc=" + u);
         }
-        if (fallback != null) {
-            sb.append("dns_fallback=" + fallback + "\n");
+	if (f != null) {
+	    sb.append("dns_fallback=" + f);
         }
         fo.write(sb.toString().getBytes());
         fo.close();
         System.setProperty("java.security.krb5.conf", "dnsfallback.conf");
         Config.refresh();
-        System.out.println("Testing " + realm + ", " + fallback + ", " + output);
+        System.out.println("Testing " + u + ", " + f + ", " + r + ", " + k);
         if (Config.getInstance().useDNS_Realm() != output) {
             throw new Exception("Fail");
         }
--- a/test/sun/security/krb5/auto/SSL.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/krb5/auto/SSL.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -40,6 +40,7 @@
 import java.net.InetAddress;
 import javax.net.ssl.*;
 import java.security.Principal;
+import java.security.Security;
 import java.util.Date;
 import sun.security.jgss.GSSUtil;
 import sun.security.krb5.PrincipalName;
@@ -54,6 +55,9 @@
     private static volatile int port;
 
     public static void main(String[] args) throws Exception {
+        // reset the security property to make sure that the algorithms
+        // and keys used in this test are not disabled.
+        Security.setProperty("jdk.tls.disabledAlgorithms", "");
 
         krb5Cipher = args[0];
 
--- a/test/sun/security/krb5/config/DNS.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/krb5/config/DNS.java	Tue Aug 22 02:03:52 2017 +0100
@@ -23,12 +23,22 @@
 
 // See dns.sh.
 import sun.security.krb5.Config;
+import sun.security.krb5.KrbException;
 
 public class DNS {
     public static void main(String[] args) throws Exception {
         System.setProperty("java.security.krb5.conf",
-                System.getProperty("test.src", ".") +"/nothing.conf");
+                System.getProperty("test.src", ".") +"/no-such-file.conf");
         Config config = Config.getInstance();
+        try {
+            String r = config.getDefaultRealm();
+            throw new Exception("What? There is a default realm " + r + "?");
+        } catch (KrbException ke) {
+            ke.printStackTrace();
+            if (ke.getCause() != null) {
+                throw new Exception("There should be no cause. Won't try DNS");
+            }
+        }
         String kdcs = config.getKDCList("X");
         if (!kdcs.equals("a.com.:88 b.com.:99") &&
                 !kdcs.equals("a.com. b.com.:99")) {
--- a/test/sun/security/krb5/confplusprop.conf	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/krb5/confplusprop.conf	Tue Aug 22 02:03:52 2017 +0100
@@ -1,7 +1,7 @@
 [libdefaults]
 default_realm = R1
 forwardable = well
-dns_lookup_realm = false
+dns_lookup_kdc = false
 
 [realms]
 R1 = {
--- a/test/sun/security/krb5/confplusprop2.conf	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/krb5/confplusprop2.conf	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 [libdefaults]
-dns_lookup_realm = false
+dns_lookup_kdc = false
 
 [realms]
 R1 = {
--- a/test/sun/security/krb5/runNameEquals.sh	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/krb5/runNameEquals.sh	Tue Aug 22 02:03:52 2017 +0100
@@ -22,7 +22,7 @@
 #
 
 # @test
-# @bug 6317711 6944847
+# @bug 6317711 6944847 8024046
 # @summary Ensure the GSSName has the correct impl which respects
 # the contract for equals and hashCode across different configurations.
 
@@ -52,6 +52,15 @@
     PATHSEP=":"
     FILESEP="/"
     NATIVE=true
+    # Not all *nix has native GSS libs installed
+    krb5-config --libs 2> /dev/null
+    if [ $? != 0 ]; then
+        # Fedora has a different path
+        /usr/kerberos/bin/krb5-config --libs 2> /dev/null
+        if [ $? != 0 ]; then
+            NATIVE=false
+        fi
+    fi
     ;;
   Darwin )
     PATHSEP=":"
@@ -92,6 +101,15 @@
     if [ $? != 0 ] ; then
         echo "Native provider fails"
         EXIT_STATUS=1
+        if [ "$OS" = "Linux" -a `arch` = "x86_64" ]; then
+            ${TESTJAVA}${FILESEP}bin${FILESEP}java -XshowSettings:properties -version 2> allprop
+            cat allprop | grep sun.arch.data.model | grep 32
+            if [ "$?" = "0" ]; then
+                echo "Running 32-bit JDK on 64-bit Linux. Maybe only 64-bit library is installed."
+                echo "Please manually check if this is the case. Treated as PASSED now."
+                EXIT_STATUS=0
+            fi
+        fi
     fi
 fi
 
--- a/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -23,16 +23,10 @@
 
 import java.io.*;
 import java.util.*;
-import java.lang.reflect.*;
-
 import java.security.*;
-import java.security.cert.*;
-import java.security.spec.*;
-import java.security.interfaces.*;
-import java.math.BigInteger;
-
 import javax.crypto.*;
 import javax.crypto.spec.*;
+import javax.xml.bind.DatatypeConverter;
 
 public class SecretKeysBasic extends PKCS11Test {
 
@@ -94,6 +88,17 @@
             SecretKey expected,
             boolean saveBeforeCheck)
             throws Exception {
+
+        // A bug in NSS 3.12 (Mozilla bug 471665) causes AES key lengths
+        // to be read incorrectly.  Checking for improper 16 byte length
+        // in key string.
+        if (isNSS(provider) && expected.getAlgorithm().equals("AES") &&
+                (getNSSVersion() >= 3.12 && getNSSVersion() <= 3.122)) {
+            System.out.println("NSS 3.12 bug returns incorrect AES key "+
+                    "length breaking key storage. Aborting...");
+            return true;
+        }
+
         if (saveBeforeCheck) {
             ks.setKeyEntry(alias, expected, null, null);
         }
@@ -127,13 +132,20 @@
         System.out.println("\tALGO=" + key.getAlgorithm());
         if (key.getFormat() != null) {
             System.out.println("\t[" + key.getFormat() + "] VALUE=" +
-                    new BigInteger(key.getEncoded()));
+                    DatatypeConverter.printHexBinary(key.getEncoded()));
         } else {
             System.out.println("\tVALUE=n/a");
         }
     }
 
     private static void doTest() throws Exception {
+        // Make sure both NSS libraries are the same version.
+        if (isNSS(provider) &&
+                (getLibsoftokn3Version() != getLibnss3Version())) {
+            System.out.println("libsoftokn3 and libnss3 versions do not match.  Aborting test...");
+            return;
+        }
+
         if (ks == null) {
             ks = KeyStore.getInstance(KS_TYPE, provider);
             ks.load(null, tokenPwd);
--- a/test/sun/security/pkcs11/PKCS11Test.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/PKCS11Test.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -54,6 +54,21 @@
 
     static String NSPR_PREFIX = "";
 
+    // NSS version info
+    public static enum ECCState { None, Basic, Extended };
+    static double nss_version = -1;
+    static ECCState nss_ecc_status = ECCState.Extended;
+
+    // The NSS library we need to search for in getNSSLibDir()
+    // Default is "libsoftokn3.so", listed as "softokn3"
+    // The other is "libnss3.so", listed as "nss3".
+    static String nss_library = "softokn3";
+
+    // NSS versions of each library.  It is simplier to keep nss_version
+    // for quick checking for generic testing than many if-else statements.
+    static double softoken3_version = -1;
+    static double nss3_version = -1;
+
     static Provider getSunPKCS11(String config) throws Exception {
         Class clazz = Class.forName("sun.security.pkcs11.SunPKCS11");
         Constructor cons = clazz.getConstructor(new Class[] {String.class});
@@ -79,24 +94,28 @@
             testNSS(test);
             testDeimos(test);
         } finally {
+            // NOTE: Do not place a 'return' in any finally block
+            // as it will suppress exceptions and hide test failures.
             Provider[] newProviders = Security.getProviders();
+            boolean found = true;
             // Do not restore providers if nothing changed. This is especailly
             // useful for ./Provider/Login.sh, where a SecurityManager exists.
             if (oldProviders.length == newProviders.length) {
-                boolean found = false;
+                found = false;
                 for (int i = 0; i<oldProviders.length; i++) {
                     if (oldProviders[i] != newProviders[i]) {
                         found = true;
                         break;
                     }
                 }
-                if (!found) return;
             }
-            for (Provider p: newProviders) {
-                Security.removeProvider(p.getName());
-            }
-            for (Provider p: oldProviders) {
-                Security.addProvider(p);
+            if (found) {
+                for (Provider p: newProviders) {
+                    Security.removeProvider(p.getName());
+                }
+                for (Provider p: oldProviders) {
+                    Security.addProvider(p);
+                }
             }
         }
     }
@@ -159,6 +178,10 @@
     }
 
     public static String getNSSLibDir() throws Exception {
+        return getNSSLibDir(nss_library);
+    }
+
+    static String getNSSLibDir(String library) throws Exception {
         Properties props = System.getProperties();
         String osName = props.getProperty("os.name");
         if (osName.startsWith("Win")) {
@@ -167,17 +190,24 @@
         }
         String osid = osName + "-"
                 + props.getProperty("os.arch") + "-" + props.getProperty("sun.arch.data.model");
-        String nssLibDir = osMap.get(osid);
-        if (nssLibDir == null) {
+        String[] nssLibDirs = osMap.get(osid);
+        if (nssLibDirs == null) {
             System.out.println("Unsupported OS, skipping: " + osid);
             return null;
-//          throw new Exception("Unsupported OS " + osName);
         }
-        if (nssLibDir.length() == 0) {
+        if (nssLibDirs.length == 0) {
             System.out.println("NSS not supported on this platform, skipping test");
             return null;
         }
-        System.setProperty("pkcs11test.nss.libdir", nssLibDir);
+        String nssLibDir = null;
+        for (String dir : nssLibDirs) {
+            if (new File(dir).exists() &&
+                new File(dir + System.mapLibraryName(library)).exists()) {
+                nssLibDir = dir;
+                System.setProperty("pkcs11test.nss.libdir", nssLibDir);
+                break;
+            }
+        }
         return nssLibDir;
     }
 
@@ -201,6 +231,142 @@
         return true;
     }
 
+    // Check the provider being used is NSS
+    public static boolean isNSS(Provider p) {
+        return p.getName().toUpperCase().equals("SUNPKCS11-NSS");
+    }
+
+    static double getNSSVersion() {
+        if (nss_version == -1)
+            getNSSInfo();
+        return nss_version;
+    }
+
+    static ECCState getNSSECC() {
+        if (nss_version == -1)
+            getNSSInfo();
+        return nss_ecc_status;
+    }
+
+    public static double getLibsoftokn3Version() {
+        if (softoken3_version == -1)
+            return getNSSInfo("softokn3");
+        return softoken3_version;
+    }
+
+    public static double getLibnss3Version() {
+        if (nss3_version == -1)
+            return getNSSInfo("nss3");
+        return nss3_version;
+    }
+
+    /* Read the library to find out the verison */
+    static void getNSSInfo() {
+        getNSSInfo(nss_library);
+    }
+
+    static double getNSSInfo(String library) {
+        String nssHeader = "$Header: NSS";
+        boolean found = false;
+        String s = null;
+        int i = 0;
+        String libfile = "";
+
+        if (library.compareTo("softokn3") == 0 && softoken3_version > -1)
+            return softoken3_version;
+        if (library.compareTo("nss3") == 0 && nss3_version > -1)
+            return nss3_version;
+
+        try {
+            libfile = getNSSLibDir() + System.mapLibraryName(library);
+            FileInputStream is = new FileInputStream(libfile);
+            byte[] data = new byte[1000];
+            int read = 0;
+
+            while (is.available() > 0) {
+                if (read == 0) {
+                    read = is.read(data, 0, 1000);
+                } else {
+                    // Prepend last 100 bytes in case the header was split
+                    // between the reads.
+                    System.arraycopy(data, 900, data, 0, 100);
+                    read = 100 + is.read(data, 100, 900);
+                }
+
+                s = new String(data, 0, read);
+                if ((i = s.indexOf(nssHeader)) > 0) {
+                    found = true;
+                    // If the nssHeader is before 920 we can break, otherwise
+                    // we may not have the whole header so do another read.  If
+                    // no bytes are in the stream, that is ok, found is true.
+                    if (i < 920) {
+                        break;
+                    }
+                }
+            }
+
+            is.close();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (!found) {
+            System.out.println("lib" + library +
+                    " version not found, set to 0.0: " + libfile);
+            nss_version = 0.0;
+            return nss_version;
+        }
+
+        // the index after whitespace after nssHeader
+        int afterheader = s.indexOf("NSS", i) + 4;
+        String version = s.substring(afterheader, s.indexOf(' ', afterheader));
+
+        // If a "dot dot" release, strip the extra dots for double parsing
+        String[] dot = version.split("\\.");
+        if (dot.length > 2) {
+            version = dot[0]+"."+dot[1];
+            for (int j = 2; dot.length > j; j++) {
+                version += dot[j];
+            }
+        }
+
+        // Convert to double for easier version value checking
+        try {
+            nss_version = Double.parseDouble(version);
+        } catch (NumberFormatException e) {
+            System.out.println("Failed to parse lib" + library +
+                    " version. Set to 0.0");
+            e.printStackTrace();
+        }
+
+        System.out.print("lib" + library + " version = "+version+".  ");
+
+        // Check for ECC
+        if (s.indexOf("Basic") > 0) {
+            nss_ecc_status = ECCState.Basic;
+            System.out.println("ECC Basic.");
+        } else if (s.indexOf("Extended") > 0) {
+            nss_ecc_status = ECCState.Extended;
+            System.out.println("ECC Extended.");
+        } else {
+            System.out.println("ECC None.");
+        }
+
+        if (library.compareTo("softokn3") == 0) {
+            softoken3_version = nss_version;
+        } else if (library.compareTo("nss3") == 0) {
+            nss3_version = nss_version;
+        }
+
+        return nss_version;
+    }
+
+    // Used to set the nss_library file to search for libsoftokn3.so
+    public static void useNSS() {
+        nss_library = "nss3";
+    }
+
     public static void testNSS(PKCS11Test test) throws Exception {
         String libdir = getNSSLibDir();
         if (libdir == null) {
@@ -212,7 +378,7 @@
             return;
         }
 
-        String libfile = libdir + System.mapLibraryName("softokn3");
+        String libfile = libdir + System.mapLibraryName(nss_library);
 
         String customDBdir = System.getProperty("CUSTOM_DB_DIR");
         String dbdir = (customDBdir != null) ?
@@ -234,17 +400,24 @@
     }
 
 
-    private static final Map<String,String> osMap;
+    private static final Map<String,String[]> osMap;
 
     // Location of the NSS libraries on each supported platform
     static {
-        osMap = new HashMap<String,String>();
-        osMap.put("SunOS-sparc-32", "/usr/lib/mps/");
-        osMap.put("SunOS-sparcv9-64", "/usr/lib/mps/64/");
-        osMap.put("SunOS-x86-32", "/usr/lib/mps/");
-        osMap.put("SunOS-amd64-64", "/usr/lib/mps/64/");
-        osMap.put("Linux-i386-32", "/usr/lib/");
-        osMap.put("Linux-amd64-64", "/usr/lib64/");
+        osMap = new HashMap<String,String[]>();
+        osMap.put("SunOS-sparc-32", new String[]{"/usr/lib/mps/"});
+        osMap.put("SunOS-sparcv9-64", new String[]{"/usr/lib/mps/64/"});
+        osMap.put("SunOS-x86-32", new String[]{"/usr/lib/mps/"});
+        osMap.put("SunOS-amd64-64", new String[]{"/usr/lib/mps/64/"});
+        osMap.put("Linux-i386-32", new String[]{
+            "/usr/lib/i386-linux-gnu/", "/usr/lib/"});
+        osMap.put("Linux-amd64-64", new String[]{
+            "/usr/lib/x86_64-linux-gnu/", "/usr/lib/x86_64-linux-gnu/nss/",
+            "/usr/lib64/"});
+        osMap.put("Windows-x86-32", new String[]{
+            PKCS11_BASE + "/nss/lib/windows-i586/".replace('/', SEP)});
+        osMap.put("Windows-amd64-64", new String[]{
+            PKCS11_BASE + "/nss/lib/windows-amd64/".replace('/', SEP)});
     }
 
     private final static char[] hexDigits = "0123456789abcdef".toCharArray();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/security/pkcs11/README	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,22 @@
+This README is to keep a list facts and known workaround for the pkcs11 java tests
+perform as a result of bugs or features in NSS or other pkcs11 libraries.
+
+- NSS ECC None/Basic/Extended
+The tests detect the NSS library support for Elliptic Curves as to not
+report incorrect failures.  PKCS11 reports back CKR_DOMAIN_PARAMS_INVALID
+when the curve is not supported.
+
+- Default libsoftokn3.so
+By default PKCS11Test.java will look for libsoftokn3.so.  There are a number of
+tests, particularly in Secmod, that need libnss3.so.  The method useNSS() in
+PKCS11test.java is to change the search and version checking to libnss3.
+
+ECC Basic supports is secp256r1, secp384r1, and secp521r1.
+
+- A bug in NSS 3.12 (Mozilla bug 471665) causes AES key lengths to be
+read incorrectly. KeyStore/SecretKeysBasic.java tiggers this bug and
+knows to avoid it.
+
+- A number of EC tests fail because of a DER bug in NSS 3.11.  The best guess
+is Mozilla bug 480280.  Those tests that abort execution with a PASS result
+are:  TestECDH2, TestECDSA, TestECDSA2 and TestECGenSpec.
--- a/test/sun/security/pkcs11/SecmodTest.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/SecmodTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -36,6 +36,7 @@
     static String keyAlias = "mykey";
 
     static boolean initSecmod() throws Exception {
+        useNSS();
         LIBPATH = getNSSLibDir();
         if (LIBPATH == null) {
             return false;
--- a/test/sun/security/pkcs11/ec/ReadCertificates.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/ec/ReadCertificates.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -113,6 +113,20 @@
                 System.out.println("Warning: " + e.getMessage() +
                 ". Trying another provider...");
                 cert.verify(key);
+            } catch (InvalidKeyException e) {
+                // The root cause of the exception might be NSS not having
+                // "ECC Extended" support curves.  If so, we can ignore it.
+                Throwable t = e;
+                while (t.getCause() != null) {
+                    t = t.getCause();
+                }
+                if (t instanceof sun.security.pkcs11.wrapper.PKCS11Exception &&
+                        t.getMessage().equals("CKR_DOMAIN_PARAMS_INVALID") &&
+                        isNSS(p) && getNSSECC() == ECCState.Basic) {
+                    System.out.println("Failed as expected. NSS Basic ECC.");
+                    continue;
+                }
+                throw e;
             }
         }
 
--- a/test/sun/security/pkcs11/ec/TestCurves.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/ec/TestCurves.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -53,6 +53,12 @@
             return;
         }
 
+        if (isNSS(p) && getNSSVersion() >= 3.11 && getNSSVersion() < 3.12) {
+            System.out.println("NSS 3.11 has a DER issue that recent " +
+                    "version do not.");
+            return;
+        }
+
         Random random = new Random();
         byte[] data = new byte[2048];
         random.nextBytes(data);
@@ -64,8 +70,29 @@
             KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", p);
             kpg.initialize(params);
             KeyPair kp1, kp2;
-            kp1 = kpg.generateKeyPair();
-            kp2 = kpg.generateKeyPair();
+
+            try {
+                kp1 = kpg.generateKeyPair();
+                kp2 = kpg.generateKeyPair();
+            } catch (Exception e) {
+                // The root cause of the exception might be NSS not having
+                // "ECC Extended" support curves.  If so, we can ignore it.
+                if (e instanceof java.security.ProviderException) {
+                    Throwable t = e.getCause();
+                    if (t instanceof
+                            sun.security.pkcs11.wrapper.PKCS11Exception &&
+                            t.getMessage().equals("CKR_DOMAIN_PARAMS_INVALID") &&
+                            isNSS(p) && (getNSSECC() == ECCState.Basic) &&
+                            (!params.toString().startsWith("secp256r1") &&
+                            !params.toString().startsWith("secp384r1") &&
+                            !params.toString().startsWith("secp521r1"))) {
+                        System.out.println("NSS Basic ECC.  Failure expected");
+                        continue;
+                    }
+                }
+
+                throw e;
+            }
 
             testSigning(p, "SHA1withECDSA", data, kp1, kp2);
             testSigning(p, "SHA224withECDSA", data, kp1, kp2);
--- a/test/sun/security/pkcs11/ec/TestECDH.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/ec/TestECDH.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -61,6 +61,12 @@
             return;
         }
 
+        if (isNSS(p) && getNSSECC() == ECCState.Basic) {
+            System.out.println("NSS only supports Basic ECC.  Skipping..");
+            return;
+        }
+
+
         /*
          * PKCS11Test.main will remove this provider if needed
          */
--- a/test/sun/security/pkcs11/ec/TestECDH2.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/ec/TestECDH2.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -106,6 +106,13 @@
             return;
         }
 
+        if (isNSS(provider) && getNSSVersion() >= 3.11 &&
+                getNSSVersion() < 3.12) {
+            System.out.println("NSS 3.11 has a DER issue that recent " +
+                    "version do not.");
+            return;
+        }
+
         kf = KeyFactory.getInstance("EC", provider);
         kpg = KeyPairGenerator.getInstance("EC", provider);
 
--- a/test/sun/security/pkcs11/ec/TestECDSA.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/ec/TestECDSA.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -30,9 +30,7 @@
  * @library ../../../../java/security/testlibrary
  */
 
-import java.io.*;
 import java.util.*;
-import java.math.BigInteger;
 
 import java.security.*;
 import java.security.spec.*;
@@ -116,6 +114,13 @@
             System.out.println("ECDSA not supported, skipping");
             return;
         }
+	
+        if (isNSS(provider) && getNSSVersion() >= 3.11 &&
+                getNSSVersion() < 3.12) {
+            System.out.println("NSS 3.11 has a DER issue that recent " +
+                    "version do not.");
+            return;
+        }
 
         /*
          * PKCS11Test.main will remove this provider if needed
@@ -136,10 +141,14 @@
             return;
         }
 
-        test(provider, pub192, priv192, sig192);
-        test(provider, pub163, priv163, sig163);
+        if (getNSSECC() != ECCState.Basic) {
+            test(provider, pub192, priv192, sig192);
+            test(provider, pub163, priv163, sig163);
+            test(provider, pub571, priv571, sig571);
+        } else {
+            System.out.println("ECC Basic only, skipping 192, 163 and 571.");
+        }
         test(provider, pub521, priv521, sig521);
-        test(provider, pub571, priv571, sig571);
 
         long stop = System.currentTimeMillis();
         System.out.println("All tests passed (" + (stop - start) + " ms).");
--- a/test/sun/security/pkcs11/ec/TestECDSA2.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/ec/TestECDSA2.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -103,6 +103,13 @@
             return;
         }
 
+        if (isNSS(provider) && getNSSVersion() >= 3.11 &&
+                getNSSVersion() < 3.12) {
+            System.out.println("NSS 3.11 has a DER issue that recent " +
+                    "version do not.");
+            return;
+        }
+
         kf = KeyFactory.getInstance("EC", provider);
 
         long start = System.currentTimeMillis();
--- a/test/sun/security/pkcs11/ec/TestECGenSpec.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/ec/TestECGenSpec.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -47,9 +47,20 @@
             return;
         }
 
-        String[] names = { "NIST P-192", "sect163k1", "1.3.132.0.26", "X9.62 c2tnb239v1"};
-        int[] lengths = {192, 163, 233, 239};
-        for (int i = 0; i < names.length; i++) {
+        if (isNSS(p) && getNSSVersion() >= 3.11 && getNSSVersion() < 3.12) {
+            System.out.println("NSS 3.11 has a DER issue that recent " +
+                    "version do not.");
+            return;
+        }
+
+        String[] names = { "secp256r1", "NIST P-192", "sect163k1", "1.3.132.0.26",
+            "X9.62 c2tnb239v1"};
+        int curves = 1;
+        if (getNSSECC() == ECCState.Extended) {
+            curves = names.length;
+        }
+        int[] lengths = {256, 192, 163, 233, 239};
+        for (int i = 0; i < curves; i++) {
             String name = names[i];
             int len = lengths[i];
             System.out.println("Testing " + name + "...");
--- a/test/sun/security/pkcs11/ec/TestKeyFactory.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/pkcs11/ec/TestKeyFactory.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -119,11 +119,17 @@
             System.out.println("Provider does not support EC, skipping");
             return;
         }
-        int[] keyLengths = {192, 163, 521, 409};
+        int[] keyLengths = {192, 163, 409, 521};
+        int len = 0;
+        if (getNSSECC() == ECCState.Basic) {
+            System.out.println("NSS Basic ECC only. Skipping 192, 163, & 409");
+            len = 3;
+        }
         KeyFactory kf = KeyFactory.getInstance("EC", p);
-        for (int len : keyLengths) {
+        for (; keyLengths.length > len ; len++) {
+            System.out.println("Length "+keyLengths[len]);
             KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", p);
-            kpg.initialize(len);
+            kpg.initialize(keyLengths[len]);
             KeyPair kp = kpg.generateKeyPair();
             test(kf, kp.getPrivate());
             test(kf, kp.getPublic());
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libfreebl3.chk has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libfreebl3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libnspr4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libnss3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libnssckbi.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libplc4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libplds4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libsoftokn3.chk has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-amd64/libsoftokn3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-i586/libnspr4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-i586/libnss3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-i586/libnssckbi.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-i586/libplc4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-i586/libplds4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/linux-i586/libsoftokn3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-amd64/libnspr4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-amd64/libnss3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-amd64/libnssckbi.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-amd64/libplc4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-amd64/libplds4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-amd64/libsoftokn3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-i586/libfreebl3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-i586/libnspr4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-i586/libnss3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-i586/libnssckbi.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-i586/libplc4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-i586/libplds4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-i586/libsoftokn3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libfreebl_hybrid_3.chk has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libfreebl_hybrid_3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libnspr4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libnss3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libnssckbi.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libplc4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libplds4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libsoftokn3.chk has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparc/libsoftokn3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparcv9/libnspr4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparcv9/libnss3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparcv9/libnssckbi.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparcv9/libplc4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparcv9/libplds4.so has changed
Binary file test/sun/security/pkcs11/nss/lib/solaris-sparcv9/libsoftokn3.so has changed
Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.dll has changed
Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.dll has changed
Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.dll has changed
Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nss3.dll has changed
Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nssckbi.dll has changed
Binary file test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.dll has changed
--- a/test/sun/security/provider/DSA/TestDSA2.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/provider/DSA/TestDSA2.java	Tue Aug 22 02:03:52 2017 +0100
@@ -50,7 +50,7 @@
     public static void main(String[] args) throws Exception {
         boolean[] expectedToPass = { true, true, true };
         test(1024, expectedToPass);
-        boolean[] expectedToPass2 = { false, true, true };
+        boolean[] expectedToPass2 = { true, true, true };
         test(2048, expectedToPass2);
     }
 
--- a/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -36,7 +36,7 @@
  */
 
 import java.io.*;
-import java.net.*;
+import java.security.Security;
 import javax.net.ssl.*;
 
 public class CipherSuiteOrder {
@@ -198,6 +198,10 @@
     volatile Exception clientException = null;
 
     public static void main(String[] args) throws Exception {
+        // reset the security property to make sure that the algorithms
+        // and keys used in this test are not disabled.
+        Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
         String keyFilename =
             System.getProperty("test.src", "./") + "/" + pathToStores +
                 "/" + keyStoreFile;
--- a/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/DHKeyExchange/DHEKeySizing.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/DHKeyExchange/DHEKeySizing.java	Tue Aug 22 02:03:52 2017 +0100
@@ -103,10 +103,10 @@
 import java.security.Security;
 import java.security.KeyStore;
 import java.security.KeyFactory;
+import java.security.Security;
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
 import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.*;
 import java.security.interfaces.*;
 import sun.misc.BASE64Decoder;
 
--- a/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/CheckStatus.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/CheckStatus.java	Tue Aug 22 02:03:52 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -622,6 +622,9 @@
     }
 
     public static void main(String args[]) throws Exception {
+        // reset the security property to make sure that the algorithms
+        // and keys used in this test are not disabled.
+        Security.setProperty("jdk.tls.disabledAlgorithms", "");
 
         CheckStatus cs;
 
--- a/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ConnectionTest.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ConnectionTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -33,6 +33,8 @@
  * The code could certainly be tightened up a lot.
  *
  * @author Brad Wetmore
+ *
+ * @run main/othervm ConnectionTest
  */
 
 import javax.net.ssl.*;
@@ -672,6 +674,10 @@
     }
 
     public static void main(String args[]) throws Exception {
+        // reset the security property to make sure that the algorithms
+        // and keys used in this test are not disabled.
+        Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
         ConnectionTest ct = new ConnectionTest();
         ct.test();
     }
--- a/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargeBufs.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargeBufs.java	Tue Aug 22 02:03:52 2017 +0100
@@ -180,6 +180,9 @@
     }
 
     public static void main(String args[]) throws Exception {
+        // reset the security property to make sure that the algorithms
+        // and keys used in this test are not disabled.
+        Security.setProperty("jdk.tls.disabledAlgorithms", "");
 
         LargeBufs test;
 
--- a/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java	Thu Aug 03 07:28:01 2017 +0100
+++ b/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java	Tue Aug 22 02:03:52 2017 +0100
@@ -37,7 +37,7 @@
  */
 
 import java.io.*;
-import java.net.*;
+import java.security.Security;
 import javax.net.ssl.*;
 
 public class GenericStreamCipher {
@@ -165,6 +165,10 @@
     volatile Exception clientException = null;
 
     public static void main(String[] args) throws Exception {
+        // reset the security property to make sure that the algorithms
+        // and keys used in this test are not disabled.
+        Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
         String keyFilename =
             System.getProperty("test.src", ".") + "/" + pathToStores +
                 "/" + keyStoreFile;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tools/launcher/RunpathTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2012, 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 7190813
+ * @summary Check for extended  RPATHs on *nixes
+ * @compile -XDignore.symbol.file RunpathTest.java
+ * @run main RunpathTest
+ * @author ksrini
+ */
+
+import java.io.File;
+
+public class RunpathTest extends TestHelper {
+
+    final String elfreaderCmd;
+    RunpathTest() {
+        elfreaderCmd = findElfReader();
+    }
+
+    final String findElfReader() {
+        String[] paths = {"/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/ccs/bin"};
+        final String cmd = isSolaris ? "elfdump" : "readelf";
+        for (String x : paths) {
+            File p = new File(x);
+            File e = new File(p, cmd);
+            if (e.canExecute()) {
+                return e.getAbsolutePath();
+            }
+        }
+        System.err.println("Warning: no suitable elf reader!");
+        return null;
+    }
+
+    void elfCheck(String javacmd, String expectedRpath) {
+        final TestResult tr = doExec(elfreaderCmd, "-d", javacmd);
+        if (!tr.matches(expectedRpath)) {
+            System.out.println(tr);
+            throw new RuntimeException("FAILED: RPATH strings " +
+                    expectedRpath + " not found in " + javaCmd);
+        }
+        System.out.println(javacmd + " contains expected RPATHS");
+    }
+
+    void testRpath() {
+        if (isDualMode && is64Bit) {
+            String expectedRpath = ".*RPATH.*\\$ORIGIN/../../lib/" + getJreArch()
+                    + ":\\$ORIGIN/../../jre/lib/" + getJreArch() + ".*";
+            elfCheck(java64Cmd, expectedRpath);
+        } else {
+            String expectedRpath = ".*RPATH.*\\$ORIGIN/../lib/" + getJreArch()
+                    + ":\\$ORIGIN/../jre/lib/" + getJreArch() + ".*";
+            elfCheck(javaCmd, expectedRpath);
+        }
+    }
+
+    public static void main(String... args) throws Exception {
+        if (isSolaris || isLinux) {
+            RunpathTest rp = new RunpathTest();
+            rp.testRpath();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tools/pack200/MemoryAllocatorTest.java	Tue Aug 22 02:03:52 2017 +0100
@@ -0,0 +1,369 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6755943
+ * @summary Checks any memory overruns in archive length.
+ * @run main/timeout=1200 MemoryAllocatorTest
+ */
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class MemoryAllocatorTest {
+
+    /*
+     * The smallest possible pack file with 1 empty resource
+     */
+    static int[] magic = {
+        0xCA, 0xFE, 0xD0, 0x0D
+    };
+    static int[] version_info = {
+        0x07, // minor
+        0x96  // major
+    };
+    static int[] option = {
+        0x10
+    };
+    static int[] size_hi = {
+        0x00
+    };
+    static int[] size_lo_ulong = {
+        0xFF, 0xFC, 0xFC, 0xFC, 0xFC // ULONG_MAX 0xFFFFFFFF
+    };
+    static int[] size_lo_correct = {
+        0x17
+    };
+    static int[] data = {
+        0x00, 0xEC, 0xDA, 0xDE, 0xF8, 0x45, 0x01, 0x02,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x01, 0x31, 0x01, 0x00
+    };
+    // End of pack file data
+
+    static final String JAVA_HOME = System.getProperty("java.home");
+
+    static final boolean debug = Boolean.getBoolean("MemoryAllocatorTest.Debug");
+    static final boolean WINDOWS = System.getProperty("os.name").startsWith("Windows");
+    static final boolean LINUX = System.getProperty("os.name").startsWith("Linux");
+    static final boolean SIXTYFOUR_BIT = System.getProperty("sun.arch.data.model", "32").equals("64");
+    static final private int EXPECTED_EXIT_CODE = (WINDOWS) ? -1 : 255;
+
+    static int testExitValue = 0;
+    
+    static byte[] bytes(int[] a) {
+        byte[] b = new byte[a.length];
+        for (int i = 0; i < b.length; i++) {
+            b[i] = (byte) a[i];
+        }
+        return b;
+    }
+    
+    static void createPackFile(boolean good, File packFile) throws IOException {
+        FileOutputStream fos = new FileOutputStream(packFile);
+        fos.write(bytes(magic));
+        fos.write(bytes(version_info));
+        fos.write(bytes(option));
+        fos.write(bytes(size_hi));
+        if (good) {
+            fos.write(bytes(size_lo_correct));
+        } else {
+            fos.write(bytes(size_lo_ulong));
+        }
+        fos.write(bytes(data));
+    }
+
+    /*
+     * This method modifies the LSB of the size_lo for various wicked
+     * values between MAXINT-0x3F and MAXINT.
+     */
+    static int modifyPackFile(File packFile) throws IOException {
+        RandomAccessFile raf = new RandomAccessFile(packFile, "rws");
+        long len = packFile.length();
+        FileChannel fc = raf.getChannel();
+        MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_WRITE, 0, len);
+        int pos = magic.length + version_info.length + option.length +
+                size_hi.length;
+        byte value = bb.get(pos);
+        value--;
+        bb.position(pos);
+        bb.put(value);
+        bb.force();
+        fc.truncate(len);
+        fc.close();
+        return value & 0xFF;
+    }
+
+    static String getUnpack200Cmd() throws Exception {
+        File binDir = new File(JAVA_HOME, "bin");
+        File unpack200File = WINDOWS
+                ? new File(binDir, "unpack200.exe")
+                : new File(binDir, "unpack200");
+
+        String cmd = unpack200File.getAbsolutePath();
+        if (!unpack200File.canExecute()) {
+            throw new Exception("please check" +
+                    cmd + " exists and is executable");
+        }
+        return cmd;
+    }
+
+    static TestResult runUnpacker(File packFile) throws Exception {
+        if (!packFile.exists()) {
+            throw new Exception("please check" + packFile + " exists");
+        }
+        ArrayList<String> alist = new ArrayList<String>();
+        ProcessBuilder pb = new ProcessBuilder(getUnpack200Cmd(),
+                packFile.getName(), "testout.jar");
+        Map<String, String> env = pb.environment();
+        pb.directory(new File("."));
+        int retval = 0;
+        try {
+            pb.redirectErrorStream(true);
+            Process p = pb.start();
+            BufferedReader rd = new BufferedReader(
+                    new InputStreamReader(p.getInputStream()), 8192);
+            String in = rd.readLine();
+            while (in != null) {
+                alist.add(in);
+                System.out.println(in);
+                in = rd.readLine();
+            }
+            retval = p.waitFor();
+            p.destroy();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            throw new RuntimeException(ex.getMessage());
+        }
+        return new TestResult("", retval, alist);
+    }
+
+    /*
+     * The debug version builds of unpack200 call abort(3) which might set
+     * an unexpected return value, therefore this test is to determine
+     * if we are using a product or non-product build and check the
+     * return value appropriately.
+     */
+    static boolean isNonProductVersion() throws Exception {
+        ArrayList<String> alist = new ArrayList<String>();
+        ProcessBuilder pb = new ProcessBuilder(getUnpack200Cmd(), "--version");
+        Map<String, String> env = pb.environment();
+        pb.directory(new File("."));
+        int retval = 0;
+        try {
+            pb.redirectErrorStream(true);
+            Process p = pb.start();
+            BufferedReader rd = new BufferedReader(
+                    new InputStreamReader(p.getInputStream()), 8192);
+            String in = rd.readLine();
+            while (in != null) {
+                alist.add(in);
+                System.out.println(in);
+                in = rd.readLine();
+            }
+            retval = p.waitFor();
+            p.destroy();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            throw new RuntimeException(ex.getMessage());
+        }
+        for (String x : alist) {
+            if (x.contains("non-product")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @param args the command line arguments
+     * @throws java.lang.Exception 
+     */
+    public static void main(String[] args) throws Exception {
+
+        File packFile = new File("tiny.pack");
+        boolean isNPVersion = isNonProductVersion();
+
+        // Create a good pack file and test if everything is ok
+        createPackFile(true, packFile);
+        TestResult tr = runUnpacker(packFile);
+        tr.setDescription("a good pack file");
+        tr.checkPositive();
+        tr.isOK();
+        System.out.println(tr);
+
+        /*
+         * jprt systems on windows and linux seem to have abundant memory
+         * therefore can take a very long time to run, and even if it does
+         * the error message is not accurate for us to discern if the test
+         * passes successfully.
+         */
+        if (SIXTYFOUR_BIT && (LINUX || WINDOWS)) {
+            System.out.println("Warning: Windows/Linux 64bit tests passes vacuously");
+            return;
+        }
+        
+        /*
+         * debug builds call abort, the exit code under these conditions
+         * are not really relevant.
+         */
+        if (isNPVersion) {
+            System.out.println("Warning: non-product build: exit values not checked");
+        }
+    
+        // create a bad pack file
+        createPackFile(false, packFile);
+        tr = runUnpacker(packFile);
+        tr.setDescription("a wicked pack file");
+        tr.contains("Native allocation failed");
+        if(!isNPVersion) {
+            tr.checkValue(EXPECTED_EXIT_CODE);
+        }
+        System.out.println(tr);
+        int value = modifyPackFile(packFile);
+        tr.setDescription("value=" + value);
+
+        // continue creating bad pack files by modifying the specimen pack file.
+        while (value >= 0xc0) {
+            tr = runUnpacker(packFile);
+            tr.contains("Native allocation failed");
+            if (!isNPVersion) {
+                tr.checkValue(EXPECTED_EXIT_CODE);
+            }
+            tr.setDescription("wicked value=0x" +
+                    Integer.toHexString(value & 0xFF));
+            System.out.println(tr);
+            value = modifyPackFile(packFile);
+        }
+        if (testExitValue != 0) {
+            throw new Exception("Pack200 archive length tests(" +
+                    testExitValue + ") failed ");
+        } else {
+            System.out.println("All tests pass");
+        }
+    }
+
+    /*
+     * A class to encapsulate the test results and stuff, with some ease
+     * of use methods to check the test results.
+     */
+    static class TestResult {
+
+        StringBuilder status;
+        int exitValue;
+        List<String> testOutput;
+        String description;
+
+        public TestResult(String str, int rv, List<String> oList) {
+            status = new StringBuilder(str);
+            exitValue = rv;
+            testOutput = oList;
+        }
+
+        void setDescription(String description) {
+            this.description = description;
+        }
+
+        void checkValue(int value) {
+            if (exitValue != value) {
+                status =
+                        status.append("  Error: test expected exit value " +
+                        value + "got " + exitValue);
+                testExitValue++;
+            }
+        }
+
+        void checkNegative() {
+            if (exitValue == 0) {
+                status = status.append(
+                        "  Error: test did not expect 0 exit value");
+
+                testExitValue++;
+            }
+        }
+
+        void checkPositive() {
+            if (exitValue != 0) {
+                status = status.append(
+                        "  Error: test did not return 0 exit value");
+                testExitValue++;
+            }
+        }
+
+        boolean isOK() {
+            return exitValue == 0;
+        }
+
+        boolean isZeroOutput() {
+            if (!testOutput.isEmpty()) {
+                status = status.append("  Error: No message from cmd please");
+                testExitValue++;
+                return false;
+            }
+            return true;
+        }
+
+        boolean isNotZeroOutput() {
+            if (testOutput.isEmpty()) {
+                status = status.append("  Error: Missing message");
+                testExitValue++;
+                return false;
+            }
+            return true;
+        }
+
+        public String toString() {
+            if (debug) {
+                for (String x : testOutput) {
+                    status = status.append(x + "\n");
+                }
+            }
+            if (description != null) {
+                status.insert(0, description);
+            }
+            return status.append("\nexitValue = " + exitValue).toString();
+        }
+
+        boolean contains(String str) {
+            for (String x : testOutput) {
+                if (x.contains(str)) {
+                    return true;
+                }
+            }
+            status = status.append("   Error: string <" + str + "> not found ");
+            testExitValue++;
+            return false;
+        }
+    }
+}